Nucleus
Barry Basic paging bc5e11e (3 years, 3 months ago)
diff --git a/include/nucleus/cpu.h b/include/nucleus/cpu.h
index 69ef379..2a99c33 100644
--- a/include/nucleus/cpu.h
+++ b/include/nucleus/cpu.h
@@ -1,11 +1,16 @@
#ifndef _NUCLEUS_CPU_H
#define _NUCLEUS_CPU_H
+#include <stdint.h>
+
/* Structure for an Interrupt Frame */
struct InterruptFrame {
uint32_t eip, cs, eflags;
};
+typedef void (*exc_handler_t)(struct InterruptFrame *, uint32_t);
+typedef void (*int_handler_t)(struct InterruptFrame *);
+
extern uintptr_t lapicPtr, ioapicPtr;
#define LAPIC(off) (*((uint32_t *) ((uint32_t) lapicPtr + (off))))
#define IOAPIC(off) (*((uint32_t *) ((uint32_t) ioapicPtr + (off))))
@@ -14,4 +19,7 @@ extern uint8_t lapicNums[];
#define CPUID lapicNums[(uint8_t) (LAPIC(0x20) >> 24)]
#define MAX_CPUS 2
+void register_exception(int num, exc_handler_t addr);
+void register_interrupt(int num, int_handler_t addr);
+
#endif
diff --git a/include/nucleus/memory.h b/include/nucleus/memory.h
index c6446b0..fe54c39 100644
--- a/include/nucleus/memory.h
+++ b/include/nucleus/memory.h
@@ -6,8 +6,47 @@
#define PAGE_SIZE 0x1000
+#define PAGE_ADDR(pg) ((pg) & 0xFFFFF000)
+#define PAGE_ATTR(pg) ((pg) & 0x00000FFF)
+
+typedef uint32_t page_t;
+typedef uint32_t page_table_t;
+typedef uint32_t page_dir_t;
+
+/* Page Table Entry flags */
+enum PTEFlag {
+ PTE_PRESENT = (1 << 0),
+ PTE_WRITE = (1 << 1),
+ PTE_USER = (1 << 2),
+ PTE_THROUGH = (1 << 3),
+ PTE_NOCACHE = (1 << 4),
+ PTE_ACCESS = (1 << 5),
+ PTE_DIRTY = (1 << 6),
+ PTE_GLOBAL = (1 << 8),
+};
+
+/* Page Directory Entry flags */
+enum PDEFlag {
+ PDE_PRESENT = (1 << 0),
+ PDE_WRITE = (1 << 1),
+ PDE_USER = (1 << 2),
+ PDE_THROUGH = (1 << 3),
+ PDE_NOCACHE = (1 << 4),
+ PDE_ACCESS = (1 << 5),
+};
+
+/* Flush Translation Lookaside Buffer */
+static inline void
+flush_tlb(uintptr_t addr)
+{
+ asm volatile("invlpg (%0)" :: "r" (addr) : "memory");
+}
+
uintptr_t alloc_frame(void);
void free_frame(uintptr_t frame);
void init_frames(size_t memMapSize, void *memMap);
+void set_page(uintptr_t vaddr, page_t page);
+void init_paging(void);
+
#endif