From: Peter Dinda Date: Sun, 2 Aug 2015 23:12:33 +0000 (-0500) Subject: Avoid physical/virtual contiguity assumptions using new guest memory access functions X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=a34275476494aeabed460b284a70cfc9b66a9896 Avoid physical/virtual contiguity assumptions using new guest memory access functions --- diff --git a/palacios/src/palacios/vmm_bios.c b/palacios/src/palacios/vmm_bios.c index 5402231..d799f5d 100644 --- a/palacios/src/palacios/vmm_bios.c +++ b/palacios/src/palacios/vmm_bios.c @@ -40,15 +40,13 @@ int v3_setup_bioses(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { extern uint8_t v3_vgabios_start[]; extern uint8_t v3_vgabios_end[]; - void * vgabios_dst = 0; - if (v3_gpa_to_hva(&(vm->cores[0]), VGABIOS_START, (addr_t *)&vgabios_dst) == -1) { - PrintError(vm, VCORE_NONE, "Could not find VGABIOS destination address\n"); - return -1; - } + V3_Print(vm,VCORE_NONE,"Mapping VGA BIOS of %llu bytes at gpa %p\n", (uint64_t)(v3_vgabios_end-v3_vgabios_start), (void*)VGABIOS_START); - V3_Print(vm,VCORE_NONE,"Mapping VGA BIOS of %llu bytes at gpa %p (hva %p)\n", (uint64_t)(v3_vgabios_end-v3_vgabios_start), (void*)VGABIOS_START,vgabios_dst); - memcpy(vgabios_dst, v3_vgabios_start, v3_vgabios_end - v3_vgabios_start); + if (v3_write_gpa_memory(&(vm->cores[0]), VGABIOS_START, v3_vgabios_end - v3_vgabios_start, v3_vgabios_start) != (v3_vgabios_end - v3_vgabios_start)) { + PrintError(vm, VCORE_NONE, "Could not write VGA BIOS\n"); + return -1; + } } #endif @@ -62,22 +60,20 @@ int v3_setup_bioses(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { extern uint8_t v3_rombios_start[]; extern uint8_t v3_rombios_end[]; - void * rombios_dst = 0; - + V3_Print(vm,VCORE_NONE,"Mapping BIOS of %llu bytes at gpa %p\n", (uint64_t)(v3_rombios_end-v3_rombios_start), (void*)V3_CONFIG_BIOS_START); - if (v3_gpa_to_hva(&(vm->cores[0]), V3_CONFIG_BIOS_START, (addr_t *)&rombios_dst) == -1) { - PrintError(vm, VCORE_NONE, "Could not find ROMBIOS destination address\n"); - return -1; - } - - V3_Print(vm,VCORE_NONE,"Mapping BIOS of %llu bytes at gpa %p (hva %p)\n", (uint64_t)(v3_rombios_end-v3_rombios_start), (void*)V3_CONFIG_BIOS_START,rombios_dst); - memcpy(rombios_dst, v3_rombios_start, v3_rombios_end - v3_rombios_start); + if (v3_write_gpa_memory(&(vm->cores[0]), V3_CONFIG_BIOS_START, v3_rombios_end - v3_rombios_start, v3_rombios_start) != (v3_rombios_end - v3_rombios_start)) { + PrintError(vm, VCORE_NONE, "Could not write ROM BIOS\n"); + return -1; + } #ifdef V3_CONFIG_SEABIOS -#define SEABIOS_HIGH_START 0xfffe0000 -#define SEABIOS_HIGH_END 0xffffffff +#define SEABIOS_HIGH_START 0xfffe0000ULL +#define SEABIOS_HIGH_END 0x100000000ULL + + V3_Print(vm,VCORE_NONE,"Additionally mapping SEABIOS of %llu bytes at gpa %p\n", (uint64_t)(v3_rombios_end-v3_rombios_start), (void*)SEABIOS_HIGH_START); if (v3_get_mem_region(vm,V3_MEM_CORE_ANY, SEABIOS_HIGH_START)) { // it is already mapped, we are done @@ -85,22 +81,36 @@ int v3_setup_bioses(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) // so it's now pointing to the fresh copy V3_Print(vm,VCORE_NONE,"BIOS is already mapped\n"); } else { + extern uint64_t v3_mem_block_size; + void *rombios_dst; + + if (v3_gpa_to_hva(&(vm->cores[0]), V3_CONFIG_BIOS_START, (addr_t *)&rombios_dst) == -1) { + PrintError(vm, VCORE_NONE, "Could not find ROMBIOS destination address\n"); + return -1; + } + if (v3_add_shadow_mem(vm, V3_MEM_CORE_ANY, SEABIOS_HIGH_START, SEABIOS_HIGH_END, (addr_t)V3_PAddr(rombios_dst)) == -1) { PrintError(vm, VCORE_NONE, "Error mapping SEABIOS to end of memory\n"); return -1; } + + if ((V3_CONFIG_BIOS_START / v3_mem_block_size) != + ((V3_CONFIG_BIOS_START+(SEABIOS_HIGH_END-SEABIOS_HIGH_START-1)) / v3_mem_block_size)) { + PrintError(vm,VCORE_NONE, "ALERT: MAPPING OF SEABIOS SPANS MEMORY BLOCKS: %llx %llx %llx\n", + (uint64_t) V3_CONFIG_BIOS_START,(uint64_t)(V3_CONFIG_BIOS_START+(SEABIOS_HIGH_END-SEABIOS_HIGH_START-1)), v3_mem_block_size); + } + V3_Print(vm,VCORE_NONE,"BIOS mapped\n"); + } - V3_Print(vm,VCORE_NONE,"Additionally mapping SEABIOS of %llu bytes at gpa %p\n", (uint64_t)(v3_rombios_end-v3_rombios_start), (void*)SEABIOS_HIGH_START); #endif } { - void *ba; // traditional BIOS data area (and IVT, etc). Technically only 0x400-0x4ff is the BDA #define BDA_START 0x0 @@ -111,23 +121,21 @@ int v3_setup_bioses(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) #define EBDA_START 0x9f000 #define EBDA_END 0x9ffff - if (v3_gpa_to_hva(&(vm->cores[0]), BDA_START, (addr_t *)&ba) == -1) { - PrintError(vm, VCORE_NONE, "Could not find BDA destination address\n"); - return -1; - } - - memset(ba,0,(BDA_END-BDA_START+1)); + V3_Print(vm,VCORE_NONE,"Clearing BDA %p through %p\n",(void*)BDA_START,(void*)BDA_END); - V3_Print(vm,VCORE_NONE,"Cleared BDA %p (HVA %p) through %p\n",(void*)BDA_START,ba,(void*)BDA_END); + if (v3_set_gpa_memory(&vm->cores[0],BDA_START,BDA_END-BDA_START,0)!=BDA_END-BDA_START) { + PrintError(vm, VCORE_NONE, "Could not zero BDA\n"); + return -1; + } + + V3_Print(vm,VCORE_NONE,"Clearing EBDA %p through %p\n",(void*)EBDA_START,(void*)EBDA_END); + + if (v3_set_gpa_memory(&vm->cores[0],EBDA_START,EBDA_END-EBDA_START,0)!=EBDA_END-EBDA_START) { + PrintError(vm, VCORE_NONE, "Could not zero eBDA\n"); + return -1; + } - if (v3_gpa_to_hva(&(vm->cores[0]), EBDA_START, (addr_t *)&ba) == -1) { - PrintError(vm, VCORE_NONE, "Could not find EBDA destination address\n"); - return -1; - } - - memset(ba,0,(EBDA_END-EBDA_START+1)); - V3_Print(vm,VCORE_NONE,"Cleared EBDA %p (HVA %p) through %p\n",(void*)EBDA_START,ba,(void*)EBDA_END); } } @@ -140,7 +148,6 @@ int v3_setup_bioses(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) char * id = v3_cfg_val(bios_list, "file"); char * addr = v3_cfg_val(bios_list, "address"); uint64_t file_ptr = 0; - void * dest = NULL; struct v3_cfg_file * file = NULL; if (!id) { @@ -166,12 +173,10 @@ int v3_setup_bioses(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) (void*)file_ptr, file->size); - if (v3_gpa_to_hva(&(vm->cores[0]), (addr_t)file_ptr, (addr_t *)&dest) == -1) { - PrintError(vm, VCORE_NONE, "Could not find BIOS (%s) destination address\n", id); - continue; - } - - memcpy((void*)dest, file->data, file->size); + if (v3_write_gpa_memory(&vm->cores[0],(addr_t)file_ptr,file->size,file->data)!=file->size) { + PrintError(vm, VCORE_NONE, "Could not copy BIOS (%s)\n",id); + return -1; + } V3_Print(vm, VCORE_NONE, "Moving on to next BIOS file\n"); bios_list = v3_cfg_next_branch(bios_list); diff --git a/palacios/src/palacios/vmx_assist.c b/palacios/src/palacios/vmx_assist.c index fa67d97..5766b15 100644 --- a/palacios/src/palacios/vmx_assist.c +++ b/palacios/src/palacios/vmx_assist.c @@ -304,14 +304,10 @@ int v3_vmxassist_init(struct guest_info * core, struct vmx_data * vmx_state) { }; - addr_t vmxassist_gdt = 0; - - if (v3_gpa_to_hva(core, VMXASSIST_GDT, &vmxassist_gdt) == -1) { - PrintError(core->vm_info, core, "Could not find VMXASSIST GDT destination\n"); + if (v3_write_gpa_memory(core, VMXASSIST_GDT, sizeof(uint64_t)*5, (void*)gdt)!=sizeof(uint64_t)*5) { + PrintError(core->vm_info, core, "Could not write VMXASSIST GDT\n"); return -1; } - - memcpy((void *)vmxassist_gdt, gdt, sizeof(uint64_t) * 5); core->segments.gdtr.base = VMXASSIST_GDT; @@ -366,15 +362,12 @@ int v3_vmxassist_init(struct guest_info * core, struct vmx_data * vmx_state) { extern uint8_t v3_vmxassist_start[]; extern uint8_t v3_vmxassist_end[]; - addr_t vmxassist_dst = 0; - if (v3_gpa_to_hva(core, VMXASSIST_START, &vmxassist_dst) == -1) { - PrintError(core->vm_info, core, "Could not find VMXASSIST destination\n"); + if (v3_write_gpa_memory(core, VMXASSIST_START, v3_vmxassist_end-v3_vmxassist_start,v3_vmxassist_start)!=v3_vmxassist_end-v3_vmxassist_start) { + PrintError(core->vm_info, core, "Could not write VMXASSIST\n"); return -1; } - memcpy((void *)vmxassist_dst, v3_vmxassist_start, v3_vmxassist_end - v3_vmxassist_start); - vmx_state->assist_state = VMXASSIST_OFF; }