aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaghuram Subramani <raghus2247@gmail.com>2025-02-03 23:12:20 +0530
committerRaghuram Subramani <raghus2247@gmail.com>2025-02-03 23:19:04 +0530
commit1ac479c99f2d4548285893e76df4e0ffe9ce42cc (patch)
tree46bce112e0860cb9150d1d9d6eaca58061245ada
parenta5b61bbfc0111f5de1817d58d882692bb8eed760 (diff)
mm: virtual_mm: Fix the PTE_FRAME() macro
-rw-r--r--kernel/include/mm/virtual_mm.h4
-rw-r--r--kernel/kernel/kernel.cc8
-rw-r--r--kernel/mm/virtual_mm/pages.cc1
-rw-r--r--kernel/mm/virtual_mm/virtual_mm.cc10
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);