From: Jack Lange Date: Tue, 21 Oct 2008 23:44:50 +0000 (-0500) Subject: updated to use pa_to_va address conversion X-Git-Tag: 1.0^2~27^2 X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=a2b7cc4f2d739213d1edefb85ff941c41c86907b updated to use pa_to_va address conversion now bombs out on first instruction of guest --- diff --git a/palacios/include/palacios/vmm.h b/palacios/include/palacios/vmm.h index 5fcfeb3..cafc5ab 100644 --- a/palacios/include/palacios/vmm.h +++ b/palacios/include/palacios/vmm.h @@ -104,6 +104,25 @@ } 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) ({ \ diff --git a/palacios/include/palacios/vmm_paging.h b/palacios/include/palacios/vmm_paging.h index 93059e1..1721760 100644 --- a/palacios/include/palacios/vmm_paging.h +++ b/palacios/include/palacios/vmm_paging.h @@ -129,9 +129,9 @@ the host state in the vmcs before entering the guest. -#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))) diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index bb0e217..28eadc7 100644 --- a/palacios/src/palacios/svm.c +++ b/palacios/src/palacios/svm.c @@ -50,7 +50,7 @@ extern int v3_svm_launch(vmcb_t * vmcb, struct v3_gprs * vm_regs); 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); @@ -164,10 +164,10 @@ static void Init_VMCB_BIOS(vmcb_t * vmcb, struct guest_info *vm_info) { 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); @@ -307,7 +307,7 @@ static int start_svm_guest(struct guest_info *info) { 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"); diff --git a/palacios/src/palacios/vm_guest_mem.c b/palacios/src/palacios/vm_guest_mem.c index f89e321..51393d6 100644 --- a/palacios/src/palacios/vm_guest_mem.c +++ b/palacios/src/palacios/vm_guest_mem.c @@ -151,9 +151,9 @@ int guest_va_to_guest_pa(struct guest_info * guest_info, addr_t guest_va, addr_t 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) { diff --git a/palacios/src/palacios/vmm_config.c b/palacios/src/palacios/vmm_config.c index 10742f7..37c5312 100644 --- a/palacios/src/palacios/vmm_config.c +++ b/palacios/src/palacios/vmm_config.c @@ -105,7 +105,7 @@ int v3_config_guest(struct guest_info * info, struct v3_vm_config * config_ptr) 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); @@ -122,7 +122,7 @@ int v3_config_guest(struct guest_info * info, struct v3_vm_config * config_ptr) 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); diff --git a/palacios/src/palacios/vmm_ctrl_regs.c b/palacios/src/palacios/vmm_ctrl_regs.c index 01c66a7..31d0000 100644 --- a/palacios/src/palacios/vmm_ctrl_regs.c +++ b/palacios/src/palacios/vmm_ctrl_regs.c @@ -261,7 +261,7 @@ int v3_handle_cr3_write(struct guest_info * info) { *(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"); @@ -275,7 +275,7 @@ int v3_handle_cr3_write(struct guest_info * info) { 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"); } diff --git a/palacios/src/palacios/vmm_emulator.c b/palacios/src/palacios/vmm_emulator.c index b539490..db53ca8 100644 --- a/palacios/src/palacios/vmm_emulator.c +++ b/palacios/src/palacios/vmm_emulator.c @@ -55,7 +55,7 @@ int v3_init_emulator(struct guest_info * info) { } 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; @@ -184,14 +184,14 @@ int v3_emulate_memory_read(struct guest_info * info, addr_t read_gva, 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; } @@ -275,7 +275,7 @@ int v3_emulate_memory_write(struct guest_info * info, addr_t write_gva, 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))); @@ -351,7 +351,7 @@ int v3_emulation_exit_handler(struct guest_info * info) { 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); diff --git a/palacios/src/palacios/vmm_paging.c b/palacios/src/palacios/vmm_paging.c index 58d3359..e850f88 100644 --- a/palacios/src/palacios/vmm_paging.c +++ b/palacios/src/palacios/vmm_paging.c @@ -51,7 +51,7 @@ void delete_page_tables_pde32(pde32_t * pde) { } // PrintDebug("Deleting PDE (%x)\n", pde); - V3_FreePage(pde); + V3_FreePage(V3_PAddr(pde)); } @@ -170,11 +170,11 @@ pde32_t * create_passthrough_pde32_pts(struct guest_info * guest_info) { 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++) { @@ -225,7 +225,7 @@ pde32_t * create_passthrough_pde32_pts(struct guest_info * guest_info) { } if (pte_present == 0) { - V3_FreePage(pte); + V3_FreePage(V3_PAddr(pte)); pde[i].present = 0; pde[i].writable = 0; @@ -249,7 +249,7 @@ pde32_t * create_passthrough_pde32_pts(struct guest_info * guest_info) { 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)); } } @@ -335,7 +335,7 @@ void PrintDebugPageTables(pde32_t * pde) 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))); } } } diff --git a/palacios/src/palacios/vmm_shadow_paging.c b/palacios/src/palacios/vmm_shadow_paging.c index 6c8e1fe..2f91b96 100644 --- a/palacios/src/palacios/vmm_shadow_paging.c +++ b/palacios/src/palacios/vmm_shadow_paging.c @@ -247,7 +247,7 @@ int v3_handle_shadow_pagefault(struct guest_info * info, addr_t fault_addr, pf_e 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; @@ -385,7 +385,7 @@ static int handle_large_pagefault32(struct guest_info * info, 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; @@ -434,7 +434,7 @@ static int handle_shadow_pagefault32(struct guest_info * info, addr_t fault_addr 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; @@ -696,7 +696,7 @@ int v3_handle_shadow_invlpg(struct guest_info * info) { 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;