status_t vmi_translate_uv2p (vmi_instance_t vmi, addr_t virt_address, vmi_pid_t pid, addr_t *paddr) { status_t ret = VMI_FAILURE; addr_t dtb = 0; if ( VMI_FAILURE == vmi_pid_to_dtb(vmi, pid, &dtb) || !dtb ) { dbprint(VMI_DEBUG_PTLOOKUP, "--early bail on v2p lookup because dtb not found\n"); return VMI_FAILURE; } ret = vmi_pagetable_lookup_cache(vmi, dtb, virt_address, paddr); if ( VMI_FAILURE == ret) { if ( VMI_FAILURE == pid_cache_del(vmi, pid) ) return VMI_FAILURE; ret = vmi_pid_to_dtb(vmi, pid, &dtb); if (VMI_SUCCESS == ret) { page_info_t info = {0}; /* _extended() skips the v2p_cache lookup that must have already failed */ ret = vmi_pagetable_lookup_extended(vmi, dtb, virt_address, &info); if ( VMI_SUCCESS == ret ) *paddr = info.paddr; } } return ret; }
addr_t vmi_translate_uv2p (vmi_instance_t vmi, addr_t virt_address, vmi_pid_t pid) { addr_t paddr = 0; addr_t dtb = vmi_pid_to_dtb(vmi, pid); if (!dtb) { dbprint(VMI_DEBUG_PTLOOKUP, "--early bail on v2p lookup because dtb is zero\n"); return 0; } if (VMI_SUCCESS != vmi_pagetable_lookup_cache(vmi, dtb, virt_address, &paddr)) { if ( VMI_FAILURE == pid_cache_del(vmi, pid) ) return 0; dtb = vmi_pid_to_dtb(vmi, pid); if (dtb) { page_info_t info = {0}; /* _extended() skips the v2p_cache lookup that must have already failed */ if (VMI_SUCCESS == vmi_pagetable_lookup_extended(vmi, dtb, virt_address, &info)) { paddr = info.paddr; } } } return paddr; }
/* expose virtual to physical mapping for user space via api call */ addr_t vmi_translate_uv2p_nocache (vmi_instance_t vmi, addr_t virt_address, vmi_pid_t pid) { addr_t dtb = vmi_pid_to_dtb(vmi, pid); if (!dtb) { dbprint(VMI_DEBUG_PTLOOKUP, "--early bail on v2p lookup because dtb is zero\n"); return 0; } else { addr_t rtnval = vmi_pagetable_lookup(vmi, dtb, virt_address); if (!rtnval) { pid_cache_del(vmi, pid); } return rtnval; } }