- uintptr_t pd_offset = PD_INDEX(va);
- uintptr_t pt_offset = PT_INDEX(va);
- uintptr_t po = PG_OFFSET(va);
- ptd_t* self_pde = (ptd_t*)PTD_BASE_VADDR;
-
- ptd_t pde = self_pde[pd_offset];
- if (pde) {
- pt_t pte = ((pt_t*)PT_VADDR(pd_offset))[pt_offset];
- if (pte) {
- uintptr_t ppn = pte >> 12;
- return (void*)P_ADDR(ppn, po);
+ assert(((uintptr_t)va & 0xFFFU) == 0)
+
+ uint32_t l1_index = L1_INDEX(va);
+ uint32_t l2_index = L2_INDEX(va);
+ uint32_t po = PG_OFFSET(va);
+ ptd_t* l1pt = (ptd_t*)L1_BASE_VADDR;
+
+ ptd_t l1pte = l1pt[l1_index];
+
+ v_mapping mapping = { .flags = 0, .pa = 0, .pn = 0 };
+ if (l1pte) {
+ pt_t l2pte = ((pt_t*)L2_VADDR(l1_index))[l2_index];
+ if (l2pte) {
+ uintptr_t ppn = l2pte >> PG_SIZE_BITS;
+ mapping.flags = PG_ENTRY_FLAGS(l2pte);
+ mapping.pa = PG_ENTRY_ADDR(l2pte);
+ mapping.pn = mapping.pa >> PG_SIZE_BITS;