aboutsummaryrefslogtreecommitdiff
path: root/kernel/mm/virtual_mm/virtual_mm.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/mm/virtual_mm/virtual_mm.c')
-rw-r--r--kernel/mm/virtual_mm/virtual_mm.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/kernel/mm/virtual_mm/virtual_mm.c b/kernel/mm/virtual_mm/virtual_mm.c
index d8d3d70..cfa32e1 100644
--- a/kernel/mm/virtual_mm/virtual_mm.c
+++ b/kernel/mm/virtual_mm/virtual_mm.c
@@ -33,7 +33,7 @@ uint32_t *current_page_directory = 0;
ALWAYS_INLINE void
virtual_mm_load_page_directory(uint32_t *page_directory)
{
- __asm__("movl %0, %%eax" ::"r"(page_directory));
+ __asm__("movl %0, %%cr3" ::"r"(page_directory));
}
bool
@@ -64,10 +64,10 @@ virtual_mm_initialize(void)
ASSERT_NOT_REACHED();
for (uint32_t i = 0; i < 1024; i++)
- table[i] = 0;
+ table[i] = 0x2;
/* Identity map the first 4MiB (maps 4KiB 1024 times) */
- for (uint32_t i = 0, physical_addr = 0, virtual_addr = 0; i < 1024;
+ /* for (uint32_t i = 0, physical_addr = 0, virtual_addr = 0; i < 1024;
i++, physical_addr += 4096, virtual_addr += 4096) {
uint32_t pt_entry = 0;
ADD_ATTRIB(&pt_entry, SET_PTE_PRESENT(1));
@@ -76,7 +76,16 @@ virtual_mm_initialize(void)
table[PAGE_TABLE_INDEX(virtual_addr)] = pt_entry;
}
- printk("debug", "Page table is at: 0x%x", table);
+ printk("debug", "Page table is at: 0x%x", table); */
+
+ for (uint32_t i = 0; i < 1024; i++) {
+ uint32_t pt_entry = 0;
+ ADD_ATTRIB(&pt_entry, SET_PTE_PRESENT(1));
+ ADD_ATTRIB(&pt_entry, SET_PTE_WRITABLE(1));
+ ADD_ATTRIB(&pt_entry, SET_PTE_FRAME(i));
+
+ table[i] = pt_entry;
+ }
uint32_t *page_directory = physical_mm_allocate_block();
if (!page_directory)
@@ -85,13 +94,15 @@ virtual_mm_initialize(void)
for (uint32_t i = 0; i < 1024; i++)
page_directory[i] = 0;
- uint32_t *pd_entry = &page_directory[PAGE_DIRECTORY_INDEX(0)];
+ /* uint32_t *pd_entry = &page_directory[0];
ADD_ATTRIB(pd_entry, SET_PDE_PRESENT(1));
ADD_ATTRIB(pd_entry, SET_PDE_WRITABLE(1));
- ADD_ATTRIB(pd_entry, SET_PDE_FRAME((uint32_t) table));
+ ADD_ATTRIB(pd_entry, SET_PDE_FRAME((uint32_t) table)); */
+ page_directory[0] = ((uint32_t) table) | 3;
printk("debug", "Page directory is at: 0x%x", page_directory);
- printk("debug", "pd_entry: 0x%x", pd_entry);
+ // printk("debug", "pd_entry: 0x%x", pd_entry);
+ printk("debug", "513th entry: 0x%x", table[513]);
virtual_mm_switch_page_directory(page_directory);
virtual_mm_enable_paging();