addr_t v2p_ia32e (vmi_instance_t vmi, addr_t dtb, addr_t vaddr, page_info_t *info) { uint64_t pml4e = 0, pdpte = 0, pde = 0, pte = 0; // are we in compatibility mode OR 64-bit mode ??? // validate address based on above (e.g., is it canonical?) // determine what MAXPHYADDR is dbprint(VMI_DEBUG_PTLOOKUP, "--PTLookup: lookup vaddr = 0x%.16"PRIx64"\n", vaddr); dbprint(VMI_DEBUG_PTLOOKUP, "--PTLookup: dtb = 0x%.16"PRIx64"\n", dtb); pml4e = get_pml4e(vmi, vaddr, dtb, &info->l4_a); dbprint(VMI_DEBUG_PTLOOKUP, "--PTLookup: pml4e = 0x%.16"PRIx64"\n", pml4e); if (ENTRY_PRESENT(vmi->os_type, pml4e)) { info->l4_v = pml4e; pdpte = get_pdpte_ia32e(vmi, vaddr, pml4e, &info->l3_a); dbprint(VMI_DEBUG_PTLOOKUP, "--PTLookup: pdpte = 0x%.16"PRIx64"\n", pdpte); if (ENTRY_PRESENT(vmi->os_type, pdpte)) { info->l3_v = pdpte; if (PAGE_SIZE_FLAG(pdpte)) { // pdpte maps a 1GB page info->paddr = get_gigpage_ia32e(vaddr, pdpte); info->size = VMI_PS_1GB; dbprint(VMI_DEBUG_PTLOOKUP, "--PTLookup: 1GB page\n"); } else { pde = get_pde_ia32e(vmi, vaddr, pdpte, &info->l2_a); dbprint(VMI_DEBUG_PTLOOKUP, "--PTLookup: pde = 0x%.16"PRIx64"\n", pde); } if (ENTRY_PRESENT(vmi->os_type, pde)) { info->l2_v = pde; if (PAGE_SIZE_FLAG(pde)) { // pde maps a 2MB page info->paddr = get_2megpage_ia32e(vaddr, pde); info->size = VMI_PS_2MB; dbprint(VMI_DEBUG_PTLOOKUP, "--PTLookup: 2MB page\n"); } else { pte = get_pte_ia32e(vmi, vaddr, pde, &info->l1_a); dbprint(VMI_DEBUG_PTLOOKUP, "--PTLookup: pte = 0x%.16"PRIx64"\n", pte); } if (ENTRY_PRESENT(vmi->os_type, pte)) { info->l1_v = pte; info->size = VMI_PS_4KB; info->paddr = get_paddr_ia32e(vaddr, pte); } } } } dbprint(VMI_DEBUG_PTLOOKUP, "--PTLookup: paddr = 0x%.16"PRIx64"\n", info->paddr); return info->paddr; }
status_t v2p_ia32e (vmi_instance_t vmi, addr_t dtb, addr_t vaddr, page_info_t *info) { status_t status = VMI_FAILURE; // are we in compatibility mode OR 64-bit mode ??? // validate address based on above (e.g., is it canonical?) // determine what MAXPHYADDR is dbprint(VMI_DEBUG_PTLOOKUP, "--PTLookup: lookup vaddr = 0x%.16"PRIx64"\n", vaddr); dbprint(VMI_DEBUG_PTLOOKUP, "--PTLookup: dtb = 0x%.16"PRIx64"\n", dtb); status = get_pml4e(vmi, vaddr, dtb, &info->x86_ia32e.pml4e_location, &info->x86_ia32e.pml4e_value); if (status != VMI_SUCCESS) { goto done; } if (!ENTRY_PRESENT(vmi->os_type, info->x86_ia32e.pml4e_value)) { status = VMI_FAILURE; goto done; } status = get_pdpte_ia32e(vmi, vaddr, info->x86_ia32e.pml4e_value, &info->x86_ia32e.pdpte_location, &info->x86_ia32e.pdpte_value); if (status != VMI_SUCCESS) { goto done; } if (!ENTRY_PRESENT(vmi->os_type, info->x86_ia32e.pdpte_value)) { status = VMI_FAILURE; goto done; } if (PAGE_SIZE(info->x86_ia32e.pdpte_value)) { // pdpte maps a 1GB page info->size = VMI_PS_1GB; info->paddr = get_gigpage_ia32e(vaddr, info->x86_ia32e.pdpte_value); status = VMI_SUCCESS; dbprint(VMI_DEBUG_PTLOOKUP, "--PTLookup: 1GB page\n"); goto done; } status = get_pde_ia32e(vmi, vaddr, info->x86_ia32e.pdpte_value, &info->x86_ia32e.pgd_location, &info->x86_ia32e.pgd_value); if (status != VMI_SUCCESS) { goto done; } if (!ENTRY_PRESENT(vmi->os_type, info->x86_ia32e.pgd_value)) { status = VMI_FAILURE; goto done; } if (PAGE_SIZE(info->x86_ia32e.pgd_value)) { // pde maps a 2MB page info->size = VMI_PS_2MB; info->paddr = get_2megpage_ia32e(vaddr, info->x86_ia32e.pgd_value); status = VMI_SUCCESS; dbprint(VMI_DEBUG_PTLOOKUP, "--PTLookup: 2MB page\n"); goto done; } status = get_pte_ia32e(vmi, vaddr, info->x86_ia32e.pgd_value, &info->x86_ia32e.pte_location, &info->x86_ia32e.pte_value); if (status != VMI_SUCCESS) { goto done; } if (!ENTRY_PRESENT(vmi->os_type, info->x86_ia32e.pte_value)) { status = VMI_FAILURE; goto done; } info->size = VMI_PS_4KB; info->paddr = get_paddr_ia32e(vaddr, info->x86_ia32e.pte_value); status = VMI_SUCCESS; done: dbprint(VMI_DEBUG_PTLOOKUP, "--PTLookup: paddr = 0x%.16"PRIx64"\n", info->paddr); return status; }