aboutsummaryrefslogtreecommitdiff
path: root/src/mem/vmm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/vmm.c')
-rw-r--r--src/mem/vmm.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/mem/vmm.c b/src/mem/vmm.c
new file mode 100644
index 0000000..431f0df
--- /dev/null
+++ b/src/mem/vmm.c
@@ -0,0 +1,49 @@
+#include "../mem.h"
+#include "paging.h"
+
+extern struct DirectoryEntry k_pagedir[1024];
+extern struct TableEntry k_ptable0x300[1024];
+
+extern const unsigned MULTIBOOT_SIZE;
+extern const unsigned VADDR_BASE;
+
+unsigned
+to_vaddr(unsigned paddr)
+{
+ return paddr + (unsigned)&VADDR_BASE - (unsigned)&MULTIBOOT_SIZE;
+}
+
+unsigned int
+vmm_map(unsigned int paddr, unsigned int vaddr)
+{
+ if (paddr & 0xfff || vaddr & 0xfff) return 0;
+
+ const unsigned table_idx = vaddr >> 22; // high 10 bits
+ const unsigned entry_idx = (vaddr >> 12) & 0x3ff; // low 10 bits
+
+ if (k_pagedir[table_idx].present == 0) return 0;
+ struct TableEntry *table = (struct TableEntry *)to_vaddr(k_pagedir[table_idx].address << 12);
+
+ table[entry_idx].address = paddr >> 12;
+ table[entry_idx].present = 1;
+ table[entry_idx].writeable = 1;
+
+ return vaddr;
+}
+
+void
+alloc4M()
+{
+ // enable pse in cr4
+ asm volatile(R"(
+ movl %cr4, %eax
+ orl $0x10, %eax
+ movl %eax, %cr4
+)");
+
+ struct DirectoryEntry4MB *directory = (struct DirectoryEntry4MB *)&k_pagedir[0x301];
+ directory->address_low = 0x1;
+ directory->present = 1;
+ directory->writeable = 1;
+ directory->pagesize = 1;
+}