There are a bunch of missing initializations of run->exit_reason and associated data.
kvm_hypercall wasn't setting exit_reason at all. When exit_reason is KVM_EXIT_MMIO, the mmio data isn't initialized. I don't know what it should be, so I just stuck a FIXME in there. There were some missing initializations of hardware_exit_reason with KVM_EXIT_UNKNOWN, so I added those. One case had exit_reason = 0, which I changed to KVM_EXIT_UNKNOWN. I did a pass over all of the return 0 paths in the exit handler callbacks, so this should cover everything. Signed-off-by: Jeff Dike <[EMAIL PROTECTED]> -- drivers/kvm/kvm_main.c | 3 +++ drivers/kvm/svm.c | 3 +++ drivers/kvm/vmx.c | 4 +++- 3 files changed, 9 insertions(+), 1 deletion(-) Index: kvm/drivers/kvm/kvm_main.c =================================================================== --- kvm.orig/drivers/kvm/kvm_main.c +++ kvm/drivers/kvm/kvm_main.c @@ -1370,6 +1370,7 @@ int kvm_hypercall(struct kvm_vcpu *vcpu, run->hypercall.ret = ret; run->hypercall.longmode = is_long_mode(vcpu); kvm_arch_ops->decache_regs(vcpu); + run->exit_reason = KVM_EXIT_HYPERCALL; return 0; } vcpu->regs[VCPU_REGS_RAX] = ret; @@ -1928,6 +1929,8 @@ static int kvm_vcpu_ioctl_run(struct kvm if (r == EMULATE_DO_MMIO) { /* * Read-modify-write. Back to userspace. + * + * FIXME - kvm_run->mmio not initialized */ kvm_run->exit_reason = KVM_EXIT_MMIO; r = 0; Index: kvm/drivers/kvm/svm.c =================================================================== --- kvm.orig/drivers/kvm/svm.c +++ kvm/drivers/kvm/svm.c @@ -929,6 +929,7 @@ static int pf_interception(struct kvm_vc return 1; case EMULATE_DO_MMIO: ++vcpu->stat.mmio_exits; + /* FIXME - kvm_run->mmio not initialized */ kvm_run->exit_reason = KVM_EXIT_MMIO; return 0; case EMULATE_FAIL: @@ -938,6 +939,7 @@ static int pf_interception(struct kvm_vc BUG(); } + kvm_run->hw.hardware_exit_reason = vcpu->svm->vmcb->control.exit_code; kvm_run->exit_reason = KVM_EXIT_UNKNOWN; return 0; } @@ -1135,6 +1137,7 @@ static int invalid_op_interception(struc static int task_switch_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) { printk(KERN_DEBUG "%s: task swiche is unsupported\n", __FUNCTION__); + kvm_run->hw.hardware_exit_reason = vcpu->svm->vmcb->control.exit_code; kvm_run->exit_reason = KVM_EXIT_UNKNOWN; return 0; } Index: kvm/drivers/kvm/vmx.c =================================================================== --- kvm.orig/drivers/kvm/vmx.c +++ kvm/drivers/kvm/vmx.c @@ -1610,6 +1610,7 @@ static int handle_exception(struct kvm_v return 1; case EMULATE_DO_MMIO: ++vcpu->stat.mmio_exits; + /* FIXME - kvm_run->mmio not initialized */ kvm_run->exit_reason = KVM_EXIT_MMIO; return 0; case EMULATE_FAIL: @@ -1807,7 +1808,8 @@ static int handle_cr(struct kvm_vcpu *vc default: break; } - kvm_run->exit_reason = 0; + kvm_run->exit_reason = KVM_EXIT_UNKNOWN; + kvm_run->hw.hardware_exit_reason = vmcs_read32(VM_EXIT_REASON); printk(KERN_ERR "kvm: unhandled control register: op %d cr %d\n", (int)(exit_qualification >> 4) & 3, cr); return 0; - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/