-/* Northwestern University */
-/* (c) 2008, Jack Lange <jarusl@cs.northwestern.edu> */
+/*
+ * This file is part of the Palacios Virtual Machine Monitor developed
+ * by the V3VEE Project with funding from the United States National
+ * Science Foundation and the Department of Energy.
+ *
+ * The V3VEE Project is a joint project between Northwestern University
+ * and the University of New Mexico. You can find out more at
+ * http://www.v3vee.org
+ *
+ * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
+ * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
+ * All rights reserved.
+ *
+ * Author: Jack Lange <jarusl@cs.northwestern.edu>
+ *
+ * This is free software. You are permitted to use,
+ * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
+ */
#include <palacios/vmm.h>
#include <palacios/vmm_emulator.h>
#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;
}
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;
int (*read)(addr_t read_addr, void * dst, uint_t length, void * priv_data),
addr_t read_gpa, void * private_data) {
struct basic_instr_info instr_info;
- char instr[15];
+ uchar_t instr[15];
int ret;
struct emulated_page * data_page = V3_Malloc(sizeof(struct emulated_page));
addr_t data_addr_offset = PT32_PAGE_OFFSET(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);
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;
}
addr_t write_gpa, void * private_data) {
struct basic_instr_info instr_info;
- char instr[15];
+ uchar_t instr[15];
int ret;
struct write_region * write_op = V3_Malloc(sizeof(struct write_region ));
struct emulated_page * data_page = V3_Malloc(sizeof(struct emulated_page));
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);