core: update system boot logic for disk-based root and cmdline flags

This commit is contained in:
boreddevnl
2026-05-08 21:05:33 +02:00
parent 0fbc3a5fc8
commit 6e1eb7768d
7 changed files with 181 additions and 35 deletions

View File

@@ -155,3 +155,29 @@ void paging_destroy_user_pml4_phys(uint64_t pml4_phys) {
extern void kfree(void* ptr);
kfree((void*)pml4);
}
uint64_t paging_virt2phys(uint64_t pml4_phys, uint64_t virtual_addr) {
if (!pml4_phys) return 0;
if (virtual_addr >= 0xFFFF800000000000ULL) {
return v2p(virtual_addr);
}
page_table_t* pml4 = (page_table_t*)p2v(pml4_phys);
uint64_t pml4_index = (virtual_addr >> 39) & 0x1FF;
if (!(pml4->entries[pml4_index] & PT_PRESENT)) return 0;
page_table_t* pdpt = (page_table_t*)p2v(pml4->entries[pml4_index] & PT_ADDR_MASK);
uint64_t pdpt_index = (virtual_addr >> 30) & 0x1FF;
if (!(pdpt->entries[pdpt_index] & PT_PRESENT)) return 0;
page_table_t* pd = (page_table_t*)p2v(pdpt->entries[pdpt_index] & PT_ADDR_MASK);
uint64_t pd_index = (virtual_addr >> 21) & 0x1FF;
if (!(pd->entries[pd_index] & PT_PRESENT)) return 0;
page_table_t* pt = (page_table_t*)p2v(pd->entries[pd_index] & PT_ADDR_MASK);
uint64_t pt_index = (virtual_addr >> 12) & 0x1FF;
if (!(pt->entries[pt_index] & PT_PRESENT)) return 0;
return (pt->entries[pt_index] & PT_ADDR_MASK) | (virtual_addr & 0xFFF);
}