} while(0) \
+#define V3_VAddr(addr) ({ \
+ extern struct v3_os_hooks * os_hooks; \
+ void * var = 0; \
+ if ((os_hooks) && (os_hooks)->paddr_to_vaddr) { \
+ var = (os_hooks)->paddr_to_vaddr(addr); \
+ } \
+ var; \
+ })
+
+
+#define V3_PAddr(addr) ({ \
+ extern struct v3_os_hooks * os_hooks; \
+ void * var = 0; \
+ if ((os_hooks) && (os_hooks)->vaddr_to_paddr) { \
+ var = (os_hooks)->vaddr_to_paddr(addr); \
+ } \
+ var; \
+ })
+
#define V3_Malloc(size) ({ \
-#define CR3_TO_PDE32(cr3) (((ulong_t)cr3) & 0xfffff000)
-#define CR3_TO_PDPTRE(cr3) (((ulong_t)cr3) & 0xffffffe0)
-#define CR3_TO_PML4E64(cr3) (((ullong_t)cr3) & 0x000ffffffffff000LL)
+#define CR3_TO_PDE32(cr3) (V3_VAddr((void *)(((ulong_t)cr3) & 0xfffff000)))
+#define CR3_TO_PDPTRE(cr3) (V3_VAddr((void *)(((ulong_t)cr3) & 0xffffffe0)))
+#define CR3_TO_PML4E64(cr3) (V3_VAddr((void *)(((ullong_t)cr3) & 0x000ffffffffff000LL)))
static vmcb_t * Allocate_VMCB() {
- vmcb_t * vmcb_page = (vmcb_t *)V3_AllocPages(1);
+ vmcb_t * vmcb_page = (vmcb_t *)V3_VAddr(V3_AllocPages(1));
memset(vmcb_page, 0, 4096);
struct vmm_io_hook * iter;
addr_t io_port_bitmap;
- io_port_bitmap = (addr_t)V3_AllocPages(3);
+ io_port_bitmap = (addr_t)V3_VAddr(V3_AllocPages(3));
memset((uchar_t*)io_port_bitmap, 0, PAGE_SIZE * 3);
- ctrl_area->IOPM_BASE_PA = io_port_bitmap;
+ ctrl_area->IOPM_BASE_PA = (addr_t)V3_PAddr((void *)io_port_bitmap);
//PrintDebug("Setting up IO Map at 0x%x\n", io_port_bitmap);
rdtscll(info->time_state.cached_host_tsc);
guest_ctrl->TSC_OFFSET = info->time_state.guest_tsc - info->time_state.cached_host_tsc;
- v3_svm_launch((vmcb_t*)(info->vmm_data), &(info->vm_regs));
+ v3_svm_launch((vmcb_t*)V3_PAddr(info->vmm_data), &(info->vm_regs));
rdtscll(tmp_tsc);
//PrintDebug("SVM Returned\n");
addr_t guest_pde = 0;
if (guest_info->shdw_pg_mode == SHADOW_PAGING) {
- guest_pde = CR3_TO_PDE32(guest_info->shdw_pg_state.guest_cr3);
+ guest_pde = (addr_t)CR3_TO_PDE32((void *)(guest_info->shdw_pg_state.guest_cr3));
} else if (guest_info->shdw_pg_mode == NESTED_PAGING) {
- guest_pde = CR3_TO_PDE32(guest_info->ctrl_regs.cr3);
+ guest_pde = (addr_t)CR3_TO_PDE32((void *)(guest_info->ctrl_regs.cr3));
}
if (guest_pa_to_host_va(guest_info, guest_pde, (addr_t *)&pde) == -1) {
void * guest_mem = V3_AllocPages(num_pages);
PrintDebug("Layout Region %d bytes\n", config_ptr->rombios_size);
- memcpy(guest_mem, config_ptr->rombios, config_ptr->rombios_size);
+ memcpy(V3_VAddr(guest_mem), config_ptr->rombios, config_ptr->rombios_size);
add_shadow_region_passthrough(info, ROMBIOS_START, ROMBIOS_START + (num_pages * PAGE_SIZE), (addr_t)guest_mem);
void * guest_mem = V3_AllocPages(num_pages);
PrintDebug("Layout Region %d bytes\n", config_ptr->vgabios_size);
- memcpy(guest_mem, config_ptr->vgabios, config_ptr->vgabios_size);
+ memcpy(V3_VAddr(guest_mem), config_ptr->vgabios, config_ptr->vgabios_size);
add_shadow_region_passthrough(info, VGABIOS_START, VGABIOS_START + (num_pages * PAGE_SIZE), (addr_t)guest_mem);
*(uint_t*)shadow_cr3, *(uint_t*)guest_cr3);
- cached = v3_cache_page_tables32(info, CR3_TO_PDE32(*(addr_t *)new_cr3));
+ cached = v3_cache_page_tables32(info, (addr_t)CR3_TO_PDE32((void *)*(addr_t *)new_cr3));
if (cached == -1) {
PrintError("CR3 Cache failed\n");
shadow_pt = v3_create_new_shadow_pt32();
- shadow_cr3->pdt_base_addr = PD32_BASE_ADDR(shadow_pt);
+ shadow_cr3->pdt_base_addr = (addr_t)V3_PAddr((void *)(addr_t)PD32_BASE_ADDR(shadow_pt));
} else {
PrintDebug("Reusing cached shadow Page table\n");
}
}
static addr_t get_new_page() {
- void * page = V3_AllocPages(1);
+ void * page = V3_VAddr(V3_AllocPages(1));
memset(page, 0, PAGE_SIZE);
return (addr_t)page;
data_page->pte.present = 1;
data_page->pte.writable = 0;
data_page->pte.user_page = 1;
- data_page->pte.page_base_addr = PT32_BASE_ADDR(data_page->page_addr);
+ data_page->pte.page_base_addr = PT32_BASE_ADDR((addr_t)V3_PAddr((void *)(addr_t)(data_page->page_addr)));
// Read the data directly onto the emulated page
ret = read(read_gpa, (void *)(data_page->page_addr + data_addr_offset), instr_info.op_size, private_data);
if ((ret == -1) || ((uint_t)ret != instr_info.op_size)) {
PrintError("Read error in emulator\n");
- V3_FreePage((void *)(data_page->page_addr));
+ V3_FreePage((void *)V3_PAddr((void *)(data_page->page_addr)));
V3_Free(data_page);
return -1;
}
data_page->pte.present = 1;
data_page->pte.writable = 1;
data_page->pte.user_page = 1;
- data_page->pte.page_base_addr = PT32_BASE_ADDR(data_page->page_addr);
+ data_page->pte.page_base_addr = PT32_BASE_ADDR((addr_t)V3_PAddr((void *)(addr_t)(data_page->page_addr)));
PrintDebug("wiping page %x\n", empg->va);
v3_replace_shdw_page32(info, empg->va, &dummy_pte, &empte32_t);
- V3_FreePage((void *)(empg->page_addr));
+ V3_FreePage((void *)(V3_PAddr((void *)(empg->page_addr))));
list_del(&(empg->page_list));
V3_Free(empg);
}
// PrintDebug("Deleting PDE (%x)\n", pde);
- V3_FreePage(pde);
+ V3_FreePage(V3_PAddr(pde));
}
int i, j;
struct shadow_map * map = &(guest_info->mem_map);
- pde32_t * pde = V3_AllocPages(1);
+ pde32_t * pde = V3_VAddr(V3_AllocPages(1));
for (i = 0; i < MAX_PDE32_ENTRIES; i++) {
int pte_present = 0;
- pte32_t * pte = V3_AllocPages(1);
+ pte32_t * pte = V3_VAddr(V3_AllocPages(1));
for (j = 0; j < MAX_PTE32_ENTRIES; j++) {
}
if (pte_present == 0) {
- V3_FreePage(pte);
+ V3_FreePage(V3_PAddr(pte));
pde[i].present = 0;
pde[i].writable = 0;
pde[i].large_page = 0;
pde[i].global_page = 0;
pde[i].vmm_info = 0;
- pde[i].pt_base_addr = PAGE_ALIGNED_ADDR((addr_t)pte);
+ pde[i].pt_base_addr = PAGE_ALIGNED_ADDR((addr_t)V3_PAddr(pte));
}
}
for (i = 0; (i < MAX_PDE32_ENTRIES); i++) {
if (pde[i].present) {
PrintPDE32((addr_t)(PAGE_SIZE * MAX_PTE32_ENTRIES * i), &(pde[i]));
- PrintPT32((addr_t)(PAGE_SIZE * MAX_PTE32_ENTRIES * i), (pte32_t *)(addr_t)(pde[i].pt_base_addr << PAGE_POWER));
+ PrintPT32((addr_t)(PAGE_SIZE * MAX_PTE32_ENTRIES * i), (pte32_t *)V3_VAddr((void *)(addr_t)(pde[i].pt_base_addr << PAGE_POWER)));
}
}
}
addr_t v3_create_new_shadow_pt32() {
void * host_pde = 0;
- host_pde = V3_AllocPages(1);
+ host_pde = V3_VAddr(V3_AllocPages(1));
memset(host_pde, 0, PAGE_SIZE);
return (addr_t)host_pde;
static int handle_shadow_pagefault32(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) {
pde32_t * guest_pd = NULL;
pde32_t * shadow_pd = (pde32_t *)CR3_TO_PDE32(info->shdw_pg_state.shadow_cr3);
- addr_t guest_cr3 = CR3_TO_PDE32(info->shdw_pg_state.guest_cr3);
+ addr_t guest_cr3 = (addr_t)CR3_TO_PDE32(info->shdw_pg_state.guest_cr3);
pt_access_status_t guest_pde_access;
pt_access_status_t shadow_pde_access;
pde32_t * guest_pde = NULL;
guest_pde->accessed = 1;
- shadow_pde->pt_base_addr = PD32_BASE_ADDR((addr_t)shadow_pt);
+ shadow_pde->pt_base_addr = PD32_BASE_ADDR((addr_t)V3_PAddr(shadow_pt));
if (guest_pde->large_page == 0) {
shadow_pde->writable = guest_pde->writable;
addr_t first_operand;
addr_t second_operand;
v3_operand_type_t addr_type;
- addr_t guest_cr3 = CR3_TO_PDE32(info->shdw_pg_state.guest_cr3);
+ addr_t guest_cr3 = (addr_t)CR3_TO_PDE32(info->shdw_pg_state.guest_cr3);
pde32_t * guest_pd = NULL;