diff options
author | Raghuram Subramani <raghus2247@gmail.com> | 2025-02-03 23:12:20 +0530 |
---|---|---|
committer | Raghuram Subramani <raghus2247@gmail.com> | 2025-02-03 23:19:04 +0530 |
commit | 1ac479c99f2d4548285893e76df4e0ffe9ce42cc (patch) | |
tree | 46bce112e0860cb9150d1d9d6eaca58061245ada | |
parent | a5b61bbfc0111f5de1817d58d882692bb8eed760 (diff) |
mm: virtual_mm: Fix the PTE_FRAME() macro
-rw-r--r-- | kernel/include/mm/virtual_mm.h | 4 | ||||
-rw-r--r-- | kernel/kernel/kernel.cc | 8 | ||||
-rw-r--r-- | kernel/mm/virtual_mm/pages.cc | 1 | ||||
-rw-r--r-- | kernel/mm/virtual_mm/virtual_mm.cc | 10 |
4 files changed, 12 insertions, 11 deletions
diff --git a/kernel/include/mm/virtual_mm.h b/kernel/include/mm/virtual_mm.h index 29a7f2b..70c9510 100644 --- a/kernel/include/mm/virtual_mm.h +++ b/kernel/include/mm/virtual_mm.h @@ -39,7 +39,7 @@ /* NOTE: Unused by the CPU, free to be used by us! */ #define PDE_UNUSED(x) ((x) << 8) /* Page table address */ -#define PDE_FRAME(x) ((x) &0xFFFFF000) +#define PDE_FRAME(x) ((x) & 0x7ffff000) #define PDE_IS_PRESENT(pd_entry) ((*pd_entry) & 1) #define GET_PD_INDEX(virtual_address) (((uint32_t) virtual_address) >> 22) @@ -57,7 +57,7 @@ /* NOTE: Unused by the CPU, free to be used by us! */ #define PTE_UNUSED(x) ((x) << 9) /* Left shift by 12 because we only need the bits from the twelfth bit. */ -#define PTE_FRAME(x) ((x) << 12) +#define PTE_FRAME(x) ((x) & 0x7ffff000) #define PTE_IS_PRESENT(pt_entry) ((*pt_entry) & 1) #define GET_PTE_FRAME(x) ((x) >> 12) diff --git a/kernel/kernel/kernel.cc b/kernel/kernel/kernel.cc index 2a32d3d..c7a8fc5 100644 --- a/kernel/kernel/kernel.cc +++ b/kernel/kernel/kernel.cc @@ -53,9 +53,11 @@ kernel_main(uint32_t magic, multiboot_info_t *multiboot_info) for (uint32_t i = 0; i < 1024; i++) page[i] = i; - // for (uint32_t i = 0; i < 1024; i++) - // if (page[i] != i) - // printk("debug", "page[i](%lu) i(%lu)", page[i], i); + for (uint32_t i = 0; i < 1024; i++) + if (page[i] != i) { + printk("debug", "i(%lu) page[i](%lu)", i, page[i]); + halt(); + } // int *x = (int *) LibAlloc::kmalloc(sizeof(int) * 8192); // for (uint32_t i = 0; i < 8192; i++) diff --git a/kernel/mm/virtual_mm/pages.cc b/kernel/mm/virtual_mm/pages.cc index 1cf5ded..55b3e91 100644 --- a/kernel/mm/virtual_mm/pages.cc +++ b/kernel/mm/virtual_mm/pages.cc @@ -29,7 +29,6 @@ namespace VirtualMM void * alloc_pages(uint32_t n_pages) { - printk("virtual_mm", "Allocating 0x%x pages", n_pages); uint32_t starting_address = (uint32_t) find_free_addresses(n_pages); if (!starting_address) return NULL; diff --git a/kernel/mm/virtual_mm/virtual_mm.cc b/kernel/mm/virtual_mm/virtual_mm.cc index 30dabbc..12066f6 100644 --- a/kernel/mm/virtual_mm/virtual_mm.cc +++ b/kernel/mm/virtual_mm/virtual_mm.cc @@ -78,12 +78,13 @@ initialize(void) /* Identity map the first 4MiB, excluding the 4th MiB * (maps 4KiB 1024 times) */ for (uint32_t i = 0; i < 1024; i++) - l_fourMiB_page_table[i] = PTE_FRAME(i) | PTE_PRESENT(1) | PTE_WRITABLE(1); + l_fourMiB_page_table[i] + = PTE_FRAME(i << 12) | PTE_PRESENT(1) | PTE_WRITABLE(1); /* Identity map the next 4MiB */ for (uint32_t i = 0; i < 1024; i++) l_eightMiB_page_table[i] - = PTE_FRAME(i + 1024) | PTE_PRESENT(1) | PTE_WRITABLE(1); + = PTE_FRAME((i + 1024) << 12) | PTE_PRESENT(1) | PTE_WRITABLE(1); /* Set up the page directory entries */ uint32_t *fourMiB_pd_entry = &l_page_directory[0]; @@ -142,10 +143,9 @@ map_page(void *physical_address, void *virtual_address) uint32_t *table = get_or_make_table(pd_entry); uint32_t *pt_entry = &table[GET_PT_INDEX(virtual_address)]; - if (PTE_IS_PRESENT(pt_entry)) { - printk("debug", "Mapping previously mapped memory: 0x%x", pt_entry); + if (PTE_IS_PRESENT(pt_entry)) + /* Mapping previously mapped memory */ ASSERT_NOT_REACHED(); - } *pt_entry = PTE_FRAME((uint32_t) physical_address) | PTE_PRESENT(1) | PTE_WRITABLE(1); |