KVM: x86: report negative values from wrmsr emulation to userspace
authorMaxim Levitsky <mlevitsk@redhat.com>
Thu, 1 Oct 2020 11:29:52 +0000 (14:29 +0300)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 21 Oct 2020 21:36:34 +0000 (17:36 -0400)
This will allow the KVM to report such errors (e.g -ENOMEM)
to the userspace.

Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
Message-Id: <20201001112954.6258-3-mlevitsk@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/emulate.c
arch/x86/kvm/x86.c

index 0cc0db5..0d917eb 100644 (file)
@@ -3712,10 +3712,10 @@ static int em_wrmsr(struct x86_emulate_ctxt *ctxt)
        if (r == X86EMUL_IO_NEEDED)
                return r;
 
-       if (r)
+       if (r > 0)
                return emulate_gp(ctxt, 0);
 
-       return X86EMUL_CONTINUE;
+       return r < 0 ? X86EMUL_UNHANDLEABLE : X86EMUL_CONTINUE;
 }
 
 static int em_rdmsr(struct x86_emulate_ctxt *ctxt)
index 3f5d08f..ecdeab8 100644 (file)
@@ -1737,13 +1737,16 @@ int kvm_emulate_wrmsr(struct kvm_vcpu *vcpu)
        r = kvm_set_msr(vcpu, ecx, data);
 
        /* MSR write failed? See if we should ask user space */
-       if (r && kvm_set_msr_user_space(vcpu, ecx, data, r)) {
+       if (r && kvm_set_msr_user_space(vcpu, ecx, data, r))
                /* Bounce to user space */
                return 0;
-       }
+
+       /* Signal all other negative errors to userspace */
+       if (r < 0)
+               return r;
 
        /* MSR write failed? Inject a #GP */
-       if (r) {
+       if (r > 0) {
                trace_kvm_msr_write_ex(ecx, data);
                kvm_inject_gp(vcpu, 0);
                return 1;