mirror of
https://github.com/JannisHeydemann/BoredOS.git
synced 2026-05-30 02:16:58 +00:00
core: update system boot logic for disk-based root and cmdline flags
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user