X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_emulator.c;fp=palacios%2Fsrc%2Fpalacios%2Fvmm_emulator.c;h=db53ca8c8fd78fc3f11d13e53c9da68c12e1b295;hb=66a1a4c7a9edcd7d8bc207aca093d694a6e6b5b2;hp=3294aa0dec2d8bb3e816f4e6af29c464813e2661;hpb=f7cf9c19ecb0a589dd45ae0d2c91814bd3c2acc2;p=palacios-OLD.git diff --git a/palacios/src/palacios/vmm_emulator.c b/palacios/src/palacios/vmm_emulator.c index 3294aa0..db53ca8 100644 --- a/palacios/src/palacios/vmm_emulator.c +++ b/palacios/src/palacios/vmm_emulator.c @@ -33,7 +33,7 @@ static const char VMMCALL[3] = {0x0f, 0x01, 0xd9}; #endif -int init_emulator(struct guest_info * info) { +int v3_init_emulator(struct guest_info * info) { struct emulation_state * emulator = &(info->emulator); emulator->num_emulated_pages = 0; @@ -55,7 +55,7 @@ int 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; @@ -154,6 +154,11 @@ int v3_emulate_memory_read(struct guest_info * info, addr_t read_gva, ret = read_guest_va_memory(info, get_addr_linear(info, info->rip, &(info->segments.cs)), 15, instr); } + if (ret == -1) { + PrintError("Could not read guest memory\n"); + return -1; + } + #ifdef DEBUG_EMULATOR PrintDebug("Instr (15 bytes) at %x:\n", instr); PrintTraceMemDump(instr, 15); @@ -179,13 +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 - if (read(read_gpa, (void *)(data_page->page_addr + data_addr_offset), instr_info.op_size, private_data) != instr_info.op_size) { + 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; } @@ -269,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))); @@ -345,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);