X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_mem_hook.c;h=a0753cf65eb8903be3b5848f4a390a5050adc33c;hb=93a8c8c46dc39c3994a8eec0076c28eb14a77da1;hp=aee8c33f2fdb556cdfd12a02c179daf050e989ff;hpb=0d4631b3eca360e9df2c94f3ba504836148d0eec;p=palacios-OLD.git diff --git a/palacios/src/palacios/vmm_mem_hook.c b/palacios/src/palacios/vmm_mem_hook.c index aee8c33..a0753cf 100644 --- a/palacios/src/palacios/vmm_mem_hook.c +++ b/palacios/src/palacios/vmm_mem_hook.c @@ -135,7 +135,7 @@ static int handle_mem_hook(struct guest_info * core, addr_t guest_va, addr_t gue } if (ret == -1) { - PrintError("Could not translate Instruction Address (%p)\n", (void *)core->rip); + PrintError("Could not translate Instruction Address (%p)\n", (void *)(addr_t)core->rip); return -1; } @@ -169,7 +169,7 @@ static int handle_mem_hook(struct guest_info * core, addr_t guest_va, addr_t gue src_reg = reg; } else { // Note that this should only trigger for string operations - src_reg = v3_get_mem_region(core->vm_info, core->cpu_id, src_mem_op_gpa); + src_reg = v3_get_mem_region(core->vm_info, core->vcpu_id, src_mem_op_gpa); } if (src_reg == NULL) { @@ -182,7 +182,7 @@ static int handle_mem_hook(struct guest_info * core, addr_t guest_va, addr_t gue // We don't check whether the region is a hook here because it doesn't yet matter. // These hva calculations will be true regardless if (src_reg->flags.alloced == 0) { - src_mem_op_hva = (addr_t)(hooks->hook_hvas_1 + (PAGE_SIZE * core->cpu_id)); + src_mem_op_hva = (addr_t)(hooks->hook_hvas_1 + (PAGE_SIZE * core->vcpu_id)); } else { // We already have the region so we can do the conversion ourselves src_mem_op_hva = (addr_t)V3_VAddr((void *)((src_mem_op_gpa - src_reg->guest_start) + src_reg->host_addr)); @@ -215,7 +215,7 @@ static int handle_mem_hook(struct guest_info * core, addr_t guest_va, addr_t gue dst_reg = reg; } else { // Note that this should only trigger for string operations - dst_reg = v3_get_mem_region(core->vm_info, core->cpu_id, dst_mem_op_gpa); + dst_reg = v3_get_mem_region(core->vm_info, core->vcpu_id, dst_mem_op_gpa); } if (dst_reg == NULL) { @@ -228,7 +228,7 @@ static int handle_mem_hook(struct guest_info * core, addr_t guest_va, addr_t gue // We don't check whether the region is a hook here because it doesn't yet matter. // These hva calculations will be true regardless if (dst_reg->flags.alloced == 0) { - dst_mem_op_hva = (addr_t)(hooks->hook_hvas_2 + (PAGE_SIZE * core->cpu_id)); + dst_mem_op_hva = (addr_t)(hooks->hook_hvas_2 + (PAGE_SIZE * core->vcpu_id)); } else { // We already have the region so we can do the conversion ourselves dst_mem_op_hva = (addr_t)V3_VAddr((void *)((dst_mem_op_gpa - dst_reg->guest_start) + dst_reg->host_addr)); @@ -394,7 +394,20 @@ static int free_hook(struct v3_vm_info * vm, struct mem_hook * hook) { // We do not support unhooking subregions int v3_unhook_mem(struct v3_vm_info * vm, uint16_t core_id, addr_t guest_addr_start) { struct v3_mem_region * reg = v3_get_mem_region(vm, core_id, guest_addr_start); - struct mem_hook * hook = reg->priv_data; + struct mem_hook * hook = NULL; + + if (reg == NULL) { + PrintError("Could not find region at %p\n", (void *)guest_addr_start); + return -1; + } + + hook = reg->priv_data; + + if (hook == NULL) { + PrintError("Trying to unhook region that is not a hook at %p\n", (void *)guest_addr_start); + return -1; + } + free_hook(vm, hook);