From: Maxim Levitsky <mlevitsk@redhat.com>
To: Sean Christopherson <sean.j.christopherson@intel.com>
Cc: kvm@vger.kernel.org, Vitaly Kuznetsov <vkuznets@redhat.com>,
"H. Peter Anvin" <hpa@zytor.com>, Joerg Roedel <joro@8bytes.org>,
Ingo Molnar <mingo@redhat.com>,
"maintainer:X86 ARCHITECTURE (32-BIT AND 64-BIT)"
<x86@kernel.org>, Wanpeng Li <wanpengli@tencent.com>,
Borislav Petkov <bp@alien8.de>, Jim Mattson <jmattson@google.com>,
linux-kernel@vger.kernel.org, Paolo Bonzini <pbonzini@redhat.com>,
Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [PATCH v5 2/4] KVM: x86: report negative values from wrmsr to userspace
Date: Tue, 22 Sep 2020 19:13:49 +0300 [thread overview]
Message-ID: <83dc0dc731ba7348af05a5124da3435024185594.camel@redhat.com> (raw)
In-Reply-To: <20200921160812.GA23989@linux.intel.com>
On Mon, 2020-09-21 at 09:08 -0700, Sean Christopherson wrote:
> On Mon, Sep 21, 2020 at 04:19:21PM +0300, Maxim Levitsky wrote:
> > This will allow us to make some MSR writes fatal to the guest
> > (e.g when out of memory condition occurs)
> >
> > Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
> > ---
> > arch/x86/kvm/emulate.c | 7 +++++--
> > arch/x86/kvm/x86.c | 5 +++--
> > 2 files changed, 8 insertions(+), 4 deletions(-)
> >
> > diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
> > index 1d450d7710d63..d855304f5a509 100644
> > --- a/arch/x86/kvm/emulate.c
> > +++ b/arch/x86/kvm/emulate.c
> > @@ -3702,13 +3702,16 @@ static int em_dr_write(struct x86_emulate_ctxt *ctxt)
> > static int em_wrmsr(struct x86_emulate_ctxt *ctxt)
> > {
> > u64 msr_data;
> > + int ret;
> >
> > msr_data = (u32)reg_read(ctxt, VCPU_REGS_RAX)
> > | ((u64)reg_read(ctxt, VCPU_REGS_RDX) << 32);
> > - if (ctxt->ops->set_msr(ctxt, reg_read(ctxt, VCPU_REGS_RCX), msr_data))
> > +
> > + ret = ctxt->ops->set_msr(ctxt, reg_read(ctxt, VCPU_REGS_RCX), msr_data);
> > + if (ret > 0)
> > return emulate_gp(ctxt, 0);
> >
> > - return X86EMUL_CONTINUE;
> > + return ret < 0 ? X86EMUL_UNHANDLEABLE : X86EMUL_CONTINUE;
> > }
> >
> > static int em_rdmsr(struct x86_emulate_ctxt *ctxt)
> > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> > index 063d70e736f7f..b6c67ab7c4f34 100644
> > --- a/arch/x86/kvm/x86.c
> > +++ b/arch/x86/kvm/x86.c
> > @@ -1612,15 +1612,16 @@ int kvm_emulate_wrmsr(struct kvm_vcpu *vcpu)
> > {
> > u32 ecx = kvm_rcx_read(vcpu);
> > u64 data = kvm_read_edx_eax(vcpu);
> > + int ret = kvm_set_msr(vcpu, ecx, data);
> >
> > - if (kvm_set_msr(vcpu, ecx, data)) {
> > + if (ret > 0) {
> > trace_kvm_msr_write_ex(ecx, data);
> > kvm_inject_gp(vcpu, 0);
> > return 1;
> > }
> >
> > trace_kvm_msr_write(ecx, data);
>
> Tracing the access as non-faulting feels wrong. The WRMSR has not completed,
> e.g. if userspace cleanly handles -ENOMEM and restarts the guest, KVM would
> trace the WRMSR twice.
I guess you are right. Since in this case we didn't actually executed the
instruction (exception can also be thought as an execution of an instruction,
since it leads to the exception handler), but in
this case we just fail
and let the userspace do something so we can restart from the same point again.
So I'll go with your suggestion.
Thanks for the review,
Best regards,
Maxim Levitsky
>
> What about:
>
> int ret = kvm_set_msr(vcpu, ecx, data);
>
> if (ret < 0)
> return ret;
>
> if (ret) {
> trace_kvm_msr_write_ex(ecx, data);
> kvm_inject_gp(vcpu, 0);
> return 1;
> }
>
> trace_kvm_msr_write(ecx, data);
> return kvm_skip_emulated_instruction(vcpu);
>
> > - return kvm_skip_emulated_instruction(vcpu);
> > + return ret < 0 ? ret : kvm_skip_emulated_instruction(vcpu);
> > }
> > EXPORT_SYMBOL_GPL(kvm_emulate_wrmsr);
> >
> > --
> > 2.26.2
> >
next prev parent reply other threads:[~2020-09-22 16:14 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-21 13:19 [PATCH v5 0/4] KVM: nSVM: ondemand nested state allocation Maxim Levitsky
2020-09-21 13:19 ` [PATCH v5 1/4] KVM: x86: xen_hvm_config: cleanup return values Maxim Levitsky
2020-09-21 13:19 ` [PATCH v5 2/4] KVM: x86: report negative values from wrmsr to userspace Maxim Levitsky
2020-09-21 16:08 ` Sean Christopherson
2020-09-22 16:13 ` Maxim Levitsky [this message]
2020-09-21 13:19 ` [PATCH v5 3/4] KVM: x86: allow kvm_x86_ops.set_efer to return a value Maxim Levitsky
[not found] ` <20200921154151.GA23807@linux.intel.com>
2020-09-22 16:05 ` Maxim Levitsky
2020-09-21 13:19 ` [PATCH v5 4/4] KVM: nSVM: implement ondemand allocation of the nested state Maxim Levitsky
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=83dc0dc731ba7348af05a5124da3435024185594.camel@redhat.com \
--to=mlevitsk@redhat.com \
--cc=bp@alien8.de \
--cc=hpa@zytor.com \
--cc=jmattson@google.com \
--cc=joro@8bytes.org \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=pbonzini@redhat.com \
--cc=sean.j.christopherson@intel.com \
--cc=tglx@linutronix.de \
--cc=vkuznets@redhat.com \
--cc=wanpengli@tencent.com \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®