From: Peter Dinda Date: Thu, 3 Jul 2008 16:31:00 +0000 (+0000) Subject: svm_io.c: these now continue to operate on OUTS, INS even if the address type X-Git-Tag: boot386puppy-26-to-ide X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=e9bfcdfa725b34d81c48d713adf9d173f3168951 svm_io.c: these now continue to operate on OUTS, INS even if the address type given in exitinfo is undefined. They assume 32 bit addresses if no address type bit is set, display a warning, and continue. vmm_ctrl_regs.c: Tweaked handling of an instruction (CTLS) --- diff --git a/palacios/src/palacios/svm_io.c b/palacios/src/palacios/svm_io.c index ece437a..f6e9c62 100644 --- a/palacios/src/palacios/svm_io.c +++ b/palacios/src/palacios/svm_io.c @@ -104,9 +104,9 @@ int handle_svm_io_ins(struct guest_info * info) { // This value should be set depending on the host register size... mask = get_gpr_mask(info); - - PrintDebug("INS Aborted... Check implementation\n"); - return -1; + PrintDebug("INS io_info invalid address size, assuming 32, io_info=0x%x\n",*((uint_t*)(io_info))); + // PrintDebug("INS Aborted... Check implementation\n"); + //return -1; } if (io_info->rep) { @@ -237,15 +237,22 @@ int handle_svm_io_outs(struct guest_info * info) { } else if (io_info->addr64) { mask = 0xffffffffffffffffLL; } else { + // This value should be set depending on the host register size... + mask = get_gpr_mask(info); + + PrintDebug("OUTS io_info invalid address size, assuming 32, io_info=0x%x\n",*((uint_t*)(io_info))); + // PrintDebug("INS Aborted... Check implementation\n"); + //return -1; // should never happen - PrintDebug("Invalid Address length\n"); - return -1; + //PrintDebug("Invalid Address length\n"); + //return -1; } if (io_info->rep) { rep_num = info->vm_regs.rcx & mask; } + PrintDebug("OUTS size=%d for %d steps\n", write_size, rep_num); while (rep_num > 0) { addr_t host_addr; diff --git a/palacios/src/palacios/vmm_ctrl_regs.c b/palacios/src/palacios/vmm_ctrl_regs.c index 4b0ff65..91b0fc2 100644 --- a/palacios/src/palacios/vmm_ctrl_regs.c +++ b/palacios/src/palacios/vmm_ctrl_regs.c @@ -207,6 +207,7 @@ int handle_cr0_write(struct guest_info * info) { ret = read_guest_va_memory(info, get_addr_linear(info, info->rip, &(info->segments.cs)), 15, instr); } + if (ret != 15) { // I think we should inject a GPF into the guest PrintDebug("Could not read instruction (ret=%d)\n", ret);