From a075fd0481f36e47da8152fba64d72c4974927e0 Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sun, 15 Mar 2026 09:31:29 +0530 Subject: [PATCH 1/9] Add get_vaddr_t_from_ptr --- include/kernel/memmgt.h | 8 ++++++++ src/kernel/memmgt.c | 13 +++++++++++++ 2 files changed, 21 insertions(+) diff --git a/include/kernel/memmgt.h b/include/kernel/memmgt.h index 6ecb9ad..be66b2c 100644 --- a/include/kernel/memmgt.h +++ b/include/kernel/memmgt.h @@ -76,6 +76,14 @@ typedef struct { uint8_t* map; } memmap_bitmap; +typedef struct { + uint8_t pml4_index; + uint8_t pdpt_index; + uint8_t pd_index; + uint8_t pt_index; + uint16_t offset; +} vaddr_t; + typedef uint64_t* paddr_t; void init_memmgt (uint64_t, struct limine_memmap_response*); diff --git a/src/kernel/memmgt.c b/src/kernel/memmgt.c index dd5a0f0..892ef31 100644 --- a/src/kernel/memmgt.c +++ b/src/kernel/memmgt.c @@ -30,6 +30,19 @@ uint64_t read_cr3 () { return cr3; } +vaddr_t get_vaddr_t_from_ptr (void* ptr) { + uint64_t ptr_64t = (uint64_t) ptr; + vaddr_t ret_vaddr; + + ret_vaddr.offset = ptr_64t & 0xFFF; + ret_vaddr.pt_index = (ptr_64t >> 12) & 0x1FF; + ret_vaddr.pd_index = (ptr_64t >> 21) & 0x1FF; + ret_vaddr.pdpt_index = (ptr_64t >> 30) & 0x1FF; + ret_vaddr.pml4_index = (ptr_64t >> 39) & 0x1FF; + + return ret_vaddr; +} + paddr_t alloc_ppage (memmap_bitmap* bitmap) { if (bitmap->pages_used >= bitmap->pages_maxlen) return NULL; From aecb6012cb6051afd7cc74c1d6b9ba0e25e24d26 Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sun, 15 Mar 2026 09:33:56 +0530 Subject: [PATCH 2/9] Use get_vaddr_t_from_ptr to simplify some code --- src/kernel/memmgt.c | 80 +++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 43 deletions(-) diff --git a/src/kernel/memmgt.c b/src/kernel/memmgt.c index 892ef31..ad8dc60 100644 --- a/src/kernel/memmgt.c +++ b/src/kernel/memmgt.c @@ -212,31 +212,25 @@ void walk_pagetable () { * @return The corresponding physical address, or NULL if not mapped. */ void* get_paddr (void* vaddr) { - uint64_t virtual_addr = (uint64_t)vaddr; + vaddr_t virtual_addr = get_vaddr_t_from_ptr (vaddr); - uint64_t pml4_index = (virtual_addr >> 39) & 0x1FF; - uint64_t pdpt_index = (virtual_addr >> 30) & 0x1FF; - uint64_t pd_index = (virtual_addr >> 21) & 0x1FF; - uint64_t pt_index = (virtual_addr >> 12) & 0x1FF; - uint64_t page_offset = virtual_addr & 0xFFF; - - pml4t_entry_t* pml4t_entry = &pml4_base_ptr[pml4_index]; + pml4t_entry_t* pml4t_entry = &pml4_base_ptr[virtual_addr.pml4_index]; if (!pml4t_entry->present) return NULL; pdpt_entry_t* pdpt_base_ptr = (pdpt_entry_t*)((pml4t_entry->pdpt_base_address << 12) + hhdm_offset); - pdpt_entry_t* pdpt_entry = &pdpt_base_ptr[pdpt_index]; + pdpt_entry_t* pdpt_entry = &pdpt_base_ptr[virtual_addr.pdpt_index]; if (!pdpt_entry->present) return NULL; pd_entry_t* pd_base_ptr = (pd_entry_t*)((pdpt_entry->pd_base_address << 12) + hhdm_offset); - pd_entry_t* pd_entry = &pd_base_ptr[pd_index]; + pd_entry_t* pd_entry = &pd_base_ptr[virtual_addr.pd_index]; if (!pd_entry->present) return NULL; pt_entry_t* pt_base_ptr = (pt_entry_t*)((pd_entry->pt_base_address << 12) + hhdm_offset); - pt_entry_t* pt_entry = &pt_base_ptr[pt_index]; + pt_entry_t* pt_entry = &pt_base_ptr[virtual_addr.pt_index]; if (!pt_entry->present) return NULL; @@ -301,36 +295,36 @@ void* liballoc_alloc (size_t count) { } int liballoc_free (void* ptr, size_t count) { - if (is_locked) - return -7; - if (get_paddr (ptr) == NULL) - return -1; - - uint64_t virtual_addr = (uint64_t)ptr; - - pml4t_entry_t* pml4t_entry = &pml4_base_ptr[(virtual_addr >> 39) & 0x1FF]; - if (!pml4t_entry->present || ((virtual_addr >> 39) & 0x1FF) != 1) - return -2; - pdpt_entry_t* pdpt_entry = &((pdpt_entry_t*)((pml4t_entry->pdpt_base_address << 12) + - hhdm_offset))[(virtual_addr >> 30) & 0x1FF]; - if (!pdpt_entry->present || ((virtual_addr >> 30) & 0x1FF) != 0) - return -3; - pd_entry_t* pd_entry = &((pd_entry_t*)((pdpt_entry->pd_base_address << 12) + - hhdm_offset))[(virtual_addr >> 21) & 0x1FF]; - if (!pd_entry->present || ((virtual_addr >> 21) & 0x1FF) != 0) - return -4; - pt_entry_t* pt_base_ptr = (pt_entry_t*)((pd_entry->pt_base_address << 12) + hhdm_offset); - - for (size_t i = 0; i < count; i++) { - if (i + ((virtual_addr >> 12) & 0x1FF) >= 512) - return -5; // out of bounds - - pt_entry_t* pt_entry = &pt_base_ptr[i + ((virtual_addr >> 12) & 0x1FF)]; - if (!pt_entry->allocated) - return -6; - - pt_entry->allocated = 0; - } - - return 0; + if (is_locked) + return -7; + if (get_paddr (ptr) == NULL) + return -1; + + vaddr_t vaddr = get_vaddr_t_from_ptr(ptr); + + pml4t_entry_t* pml4t_entry = &pml4_base_ptr[vaddr.pml4_index]; + if (!pml4t_entry->present || vaddr.pml4_index != 1) + return -2; + pdpt_entry_t* pdpt_entry = &((pdpt_entry_t*)((pml4t_entry->pdpt_base_address << 12) + + hhdm_offset))[vaddr.pdpt_index]; + if (!pdpt_entry->present || vaddr.pdpt_index != 0) + return -3; + pd_entry_t* pd_entry = &((pd_entry_t*)((pdpt_entry->pd_base_address << 12) + + hhdm_offset))[vaddr.pd_index]; + if (!pd_entry->present || vaddr.pd_index != 0) + return -4; + pt_entry_t* pt_base_ptr = (pt_entry_t*)((pd_entry->pt_base_address << 12) + hhdm_offset); + + for (size_t i = 0; i < count; i++) { + if (i + vaddr.pt_index >= 512) + return -5; // out of bounds + + pt_entry_t* pt_entry = &pt_base_ptr[i + vaddr.pt_index]; + if (!pt_entry->allocated) + return -6; + + pt_entry->allocated = 0; + } + + return 0; } \ No newline at end of file From 2d6fd19c07d3d9da62fbaa72720fad1ccc824acb Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sun, 15 Mar 2026 09:34:32 +0530 Subject: [PATCH 3/9] Format --- src/kernel/memmgt.c | 66 ++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/kernel/memmgt.c b/src/kernel/memmgt.c index ad8dc60..da4065d 100644 --- a/src/kernel/memmgt.c +++ b/src/kernel/memmgt.c @@ -31,7 +31,7 @@ uint64_t read_cr3 () { } vaddr_t get_vaddr_t_from_ptr (void* ptr) { - uint64_t ptr_64t = (uint64_t) ptr; + uint64_t ptr_64t = (uint64_t)ptr; vaddr_t ret_vaddr; ret_vaddr.offset = ptr_64t & 0xFFF; @@ -295,36 +295,36 @@ void* liballoc_alloc (size_t count) { } int liballoc_free (void* ptr, size_t count) { - if (is_locked) - return -7; - if (get_paddr (ptr) == NULL) - return -1; - - vaddr_t vaddr = get_vaddr_t_from_ptr(ptr); - - pml4t_entry_t* pml4t_entry = &pml4_base_ptr[vaddr.pml4_index]; - if (!pml4t_entry->present || vaddr.pml4_index != 1) - return -2; - pdpt_entry_t* pdpt_entry = &((pdpt_entry_t*)((pml4t_entry->pdpt_base_address << 12) + - hhdm_offset))[vaddr.pdpt_index]; - if (!pdpt_entry->present || vaddr.pdpt_index != 0) - return -3; - pd_entry_t* pd_entry = &((pd_entry_t*)((pdpt_entry->pd_base_address << 12) + - hhdm_offset))[vaddr.pd_index]; - if (!pd_entry->present || vaddr.pd_index != 0) - return -4; - pt_entry_t* pt_base_ptr = (pt_entry_t*)((pd_entry->pt_base_address << 12) + hhdm_offset); - - for (size_t i = 0; i < count; i++) { - if (i + vaddr.pt_index >= 512) - return -5; // out of bounds - - pt_entry_t* pt_entry = &pt_base_ptr[i + vaddr.pt_index]; - if (!pt_entry->allocated) - return -6; - - pt_entry->allocated = 0; - } - - return 0; + if (is_locked) + return -7; + if (get_paddr (ptr) == NULL) + return -1; + + vaddr_t vaddr = get_vaddr_t_from_ptr (ptr); + + pml4t_entry_t* pml4t_entry = &pml4_base_ptr[vaddr.pml4_index]; + if (!pml4t_entry->present || vaddr.pml4_index != 1) + return -2; + pdpt_entry_t* pdpt_entry = + &((pdpt_entry_t*)((pml4t_entry->pdpt_base_address << 12) + hhdm_offset))[vaddr.pdpt_index]; + if (!pdpt_entry->present || vaddr.pdpt_index != 0) + return -3; + pd_entry_t* pd_entry = + &((pd_entry_t*)((pdpt_entry->pd_base_address << 12) + hhdm_offset))[vaddr.pd_index]; + if (!pd_entry->present || vaddr.pd_index != 0) + return -4; + pt_entry_t* pt_base_ptr = (pt_entry_t*)((pd_entry->pt_base_address << 12) + hhdm_offset); + + for (size_t i = 0; i < count; i++) { + if (i + vaddr.pt_index >= 512) + return -5; // out of bounds + + pt_entry_t* pt_entry = &pt_base_ptr[i + vaddr.pt_index]; + if (!pt_entry->allocated) + return -6; + + pt_entry->allocated = 0; + } + + return 0; } \ No newline at end of file From a14660660e5279c8d42df40a0fecc1a5733189da Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sun, 15 Mar 2026 09:42:13 +0530 Subject: [PATCH 4/9] Add get_vaddr_hhdm --- src/kernel/memmgt.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/kernel/memmgt.c b/src/kernel/memmgt.c index da4065d..8a1017d 100644 --- a/src/kernel/memmgt.c +++ b/src/kernel/memmgt.c @@ -43,6 +43,15 @@ vaddr_t get_vaddr_t_from_ptr (void* ptr) { return ret_vaddr; } +/*! + * Convert a physical frame address to vaddr pointer with HHDM mapping + * @param phys_address the physical address + * @return pointer to virtual memory using HHDM mapping + */ +void* get_vaddr_hhdm (uint64_t phys_address) { + return (void*)((phys_address << 12) + hhdm_offset); +} + paddr_t alloc_ppage (memmap_bitmap* bitmap) { if (bitmap->pages_used >= bitmap->pages_maxlen) return NULL; From 347f64b8066d90454d0f3c4a21029c276beedcad Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sun, 15 Mar 2026 09:56:37 +0530 Subject: [PATCH 5/9] Format --- src/kernel/memmgt.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/kernel/memmgt.c b/src/kernel/memmgt.c index 8a1017d..4af015b 100644 --- a/src/kernel/memmgt.c +++ b/src/kernel/memmgt.c @@ -48,9 +48,7 @@ vaddr_t get_vaddr_t_from_ptr (void* ptr) { * @param phys_address the physical address * @return pointer to virtual memory using HHDM mapping */ -void* get_vaddr_hhdm (uint64_t phys_address) { - return (void*)((phys_address << 12) + hhdm_offset); -} +void* get_vaddr_hhdm (uint64_t phys_address) { return (void*)((phys_address << 12) + hhdm_offset); } paddr_t alloc_ppage (memmap_bitmap* bitmap) { if (bitmap->pages_used >= bitmap->pages_maxlen) From 7886940eb736198adcd05fcab7bd0baf30560c0c Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sun, 15 Mar 2026 09:58:12 +0530 Subject: [PATCH 6/9] Use get_vaddr_hhdm instead of inline address manipulation --- src/kernel/memmgt.c | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/kernel/memmgt.c b/src/kernel/memmgt.c index 4af015b..cd557f8 100644 --- a/src/kernel/memmgt.c +++ b/src/kernel/memmgt.c @@ -175,19 +175,18 @@ void walk_pagetable () { if (!pml4t_entry->present) return; - pdpt_entry_t* pdpt_base_ptr = - (pdpt_entry_t*)((pml4t_entry->pdpt_base_address << 12) + hhdm_offset); + pdpt_entry_t* pdpt_base_ptr = (pdpt_entry_t*)get_vaddr_hhdm (pml4t_entry->pdpt_base_address); pdpt_entry_t* pdpt_entry = &pdpt_base_ptr[0]; if (!pdpt_entry->present) return; - pd_entry_t* pd_base_ptr = (pd_entry_t*)((pdpt_entry->pd_base_address << 12) + hhdm_offset); + pd_entry_t* pd_base_ptr = (pd_entry_t*)get_vaddr_hhdm (pdpt_entry->pd_base_address); for (int k = 0; k < 512; k++) { pd_entry_t* pd_entry = &pd_base_ptr[k]; if (!pd_entry->present) continue; printf ("PD %d: PT Base Address: 0x%lx\n", k, pd_entry->pt_base_address << 12); - pt_entry_t* pt_base_ptr = (pt_entry_t*)((pd_entry->pt_base_address << 12) + hhdm_offset); + pt_entry_t* pt_base_ptr = (pt_entry_t*)get_vaddr_hhdm (pd_entry->pt_base_address); bool is_present_pt[512] = {false}; for (int k = 0; k < 512; k++) @@ -225,23 +224,22 @@ void* get_paddr (void* vaddr) { if (!pml4t_entry->present) return NULL; - pdpt_entry_t* pdpt_base_ptr = - (pdpt_entry_t*)((pml4t_entry->pdpt_base_address << 12) + hhdm_offset); + pdpt_entry_t* pdpt_base_ptr = (pdpt_entry_t*)get_vaddr_hhdm (pml4t_entry->pdpt_base_address); pdpt_entry_t* pdpt_entry = &pdpt_base_ptr[virtual_addr.pdpt_index]; if (!pdpt_entry->present) return NULL; - pd_entry_t* pd_base_ptr = (pd_entry_t*)((pdpt_entry->pd_base_address << 12) + hhdm_offset); + pd_entry_t* pd_base_ptr = (pd_entry_t*)get_vaddr_hhdm (pdpt_entry->pd_base_address); pd_entry_t* pd_entry = &pd_base_ptr[virtual_addr.pd_index]; if (!pd_entry->present) return NULL; - pt_entry_t* pt_base_ptr = (pt_entry_t*)((pd_entry->pt_base_address << 12) + hhdm_offset); + pt_entry_t* pt_base_ptr = (pt_entry_t*)get_vaddr_hhdm (pd_entry->pt_base_address); pt_entry_t* pt_entry = &pt_base_ptr[virtual_addr.pt_index]; if (!pt_entry->present) return NULL; - uint64_t phys_addr = (pt_entry->frame_base_address << 12) | page_offset; + uint64_t phys_addr = (pt_entry->frame_base_address << 12) | virtual_addr.offset; return (void*)phys_addr; } @@ -289,14 +287,13 @@ void* liballoc_alloc (size_t count) { pml4t_entry_t* pml4t_entry = &pml4_base_ptr[1]; if (!pml4t_entry->present) return NULL; - pdpt_entry_t* pdpt_entry = - &((pdpt_entry_t*)((pml4t_entry->pdpt_base_address << 12) + hhdm_offset))[0]; + pdpt_entry_t* pdpt_entry = &((pdpt_entry_t*)get_vaddr_hhdm (pml4t_entry->pdpt_base_address))[0]; if (!pdpt_entry->present) return NULL; - pd_entry_t* pd_entry = &((pd_entry_t*)((pdpt_entry->pd_base_address << 12) + hhdm_offset))[0]; + pd_entry_t* pd_entry = &((pd_entry_t*)get_vaddr_hhdm (pdpt_entry->pd_base_address))[0]; if (!pd_entry->present) return NULL; - pt_entry_t* pt_base_ptr = (pt_entry_t*)((pd_entry->pt_base_address << 12) + hhdm_offset); + pt_entry_t* pt_base_ptr = (pt_entry_t*)get_vaddr_hhdm (pd_entry->pt_base_address); return try_assign_pt (pt_base_ptr, count); } @@ -313,14 +310,14 @@ int liballoc_free (void* ptr, size_t count) { if (!pml4t_entry->present || vaddr.pml4_index != 1) return -2; pdpt_entry_t* pdpt_entry = - &((pdpt_entry_t*)((pml4t_entry->pdpt_base_address << 12) + hhdm_offset))[vaddr.pdpt_index]; + &((pdpt_entry_t*)get_vaddr_hhdm (pml4t_entry->pdpt_base_address))[vaddr.pdpt_index]; if (!pdpt_entry->present || vaddr.pdpt_index != 0) return -3; pd_entry_t* pd_entry = - &((pd_entry_t*)((pdpt_entry->pd_base_address << 12) + hhdm_offset))[vaddr.pd_index]; + &((pd_entry_t*)get_vaddr_hhdm (pdpt_entry->pd_base_address))[vaddr.pd_index]; if (!pd_entry->present || vaddr.pd_index != 0) return -4; - pt_entry_t* pt_base_ptr = (pt_entry_t*)((pd_entry->pt_base_address << 12) + hhdm_offset); + pt_entry_t* pt_base_ptr = (pt_entry_t*)get_vaddr_hhdm (pd_entry->pt_base_address); for (size_t i = 0; i < count; i++) { if (i + vaddr.pt_index >= 512) From e838a4914477dfc9d305ba742a28c34ba11c5841 Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sun, 15 Mar 2026 09:58:35 +0530 Subject: [PATCH 7/9] Mark get_vaddr_hhdm as inline --- src/kernel/memmgt.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/kernel/memmgt.c b/src/kernel/memmgt.c index cd557f8..52eee4d 100644 --- a/src/kernel/memmgt.c +++ b/src/kernel/memmgt.c @@ -48,7 +48,9 @@ vaddr_t get_vaddr_t_from_ptr (void* ptr) { * @param phys_address the physical address * @return pointer to virtual memory using HHDM mapping */ -void* get_vaddr_hhdm (uint64_t phys_address) { return (void*)((phys_address << 12) + hhdm_offset); } +inline void* get_vaddr_hhdm (uint64_t phys_address) { + return (void*)((phys_address << 12) + hhdm_offset); +} paddr_t alloc_ppage (memmap_bitmap* bitmap) { if (bitmap->pages_used >= bitmap->pages_maxlen) From c8ee133715dd97bec11efa727f4db2eb16dcb778 Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sun, 15 Mar 2026 09:59:28 +0530 Subject: [PATCH 8/9] Add functions to header file --- include/kernel/memmgt.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/kernel/memmgt.h b/include/kernel/memmgt.h index be66b2c..dec4167 100644 --- a/include/kernel/memmgt.h +++ b/include/kernel/memmgt.h @@ -86,6 +86,9 @@ typedef struct { typedef uint64_t* paddr_t; +vaddr_t get_vaddr_t_from_ptr (void* ptr); +void* get_vaddr_hhdm (uint64_t phys_address); + void init_memmgt (uint64_t, struct limine_memmap_response*); void walk_pagetable (void); void* get_paddr (void* vaddr); From 69911ce5f6f683751ef100a8a9c0650211057933 Mon Sep 17 00:00:00 2001 From: ryuukumar Date: Sun, 15 Mar 2026 10:02:11 +0530 Subject: [PATCH 9/9] Add comment for gvtfp --- src/kernel/memmgt.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/kernel/memmgt.c b/src/kernel/memmgt.c index 52eee4d..577d759 100644 --- a/src/kernel/memmgt.c +++ b/src/kernel/memmgt.c @@ -30,6 +30,11 @@ uint64_t read_cr3 () { return cr3; } +/*! + * Get a vaddr_t object from a virtual pointer + * @param ptr the virtual pointer + * @return corresponding vaddr_t object + */ vaddr_t get_vaddr_t_from_ptr (void* ptr) { uint64_t ptr_64t = (uint64_t)ptr; vaddr_t ret_vaddr;