On Tue, Apr 14, 2020 at 10:28 AM Paolo Bonzini <pbonzini@xxxxxxxxxx> wrote: > > On 11/04/20 17:36, Uros Bizjak wrote: > > Use do_machine_check instead of INT $12 to pass MCE to the host, > > the same approach VMX uses. > > > > On a related note, there is no reason to limit the use of do_machine_check > > to 64 bit targets, as is currently done for VMX. MCE handling works > > for both target families. > > > > The patch is only compile tested, for both, 64 and 32 bit targets, > > someone should test the passing of the exception by injecting > > some MCEs into the guest. > > > > For future non-RFC patch, kvm_machine_check should be moved to some > > appropriate header file. > > > > Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx> > > Cc: Joerg Roedel <joro@xxxxxxxxxx> > > Cc: Sean Christopherson <sean.j.christopherson@xxxxxxxxx> > > Signed-off-by: Uros Bizjak <ubizjak@xxxxxxxxx> > > --- > > arch/x86/kvm/svm/svm.c | 26 +++++++++++++++++++++----- > > arch/x86/kvm/vmx/vmx.c | 2 +- > > 2 files changed, 22 insertions(+), 6 deletions(-) > > > > diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c > > index 061d19e69c73..cd773f6261e3 100644 > > --- a/arch/x86/kvm/svm/svm.c > > +++ b/arch/x86/kvm/svm/svm.c > > @@ -33,6 +33,7 @@ > > #include <asm/debugreg.h> > > #include <asm/kvm_para.h> > > #include <asm/irq_remapping.h> > > +#include <asm/mce.h> > > #include <asm/spec-ctrl.h> > > #include <asm/cpu_device_id.h> > > > > @@ -1839,6 +1840,25 @@ static bool is_erratum_383(void) > > return true; > > } > > > > +/* > > + * Trigger machine check on the host. We assume all the MSRs are already set up > > + * by the CPU and that we still run on the same CPU as the MCE occurred on. > > + * We pass a fake environment to the machine check handler because we want > > + * the guest to be always treated like user space, no matter what context > > + * it used internally. > > + */ > > +static void kvm_machine_check(void) > > +{ > > +#if defined(CONFIG_X86_MCE) > > + struct pt_regs regs = { > > + .cs = 3, /* Fake ring 3 no matter what the guest ran on */ > > + .flags = X86_EFLAGS_IF, > > + }; > > + > > + do_machine_check(®s, 0); > > +#endif > > +} > > + > > static void svm_handle_mce(struct vcpu_svm *svm) > > { > > if (is_erratum_383()) { > > @@ -1857,11 +1877,7 @@ static void svm_handle_mce(struct vcpu_svm *svm) > > * On an #MC intercept the MCE handler is not called automatically in > > * the host. So do it by hand here. > > */ > > - asm volatile ( > > - "int $0x12\n"); > > - /* not sure if we ever come back to this point */ > > - > > - return; > > + kvm_machine_check(); > > } > > > > static int mc_interception(struct vcpu_svm *svm) > > Looks good, but please move kvm_machine_check() to x86.c instead. Will do, after the confirmation that the patch works for AMD hosts. OTOH, the function is just a simple wrapper around do_machine_check, so I was thinking to move it to a kvm_host.h header as a static inline. This way, we could save a call to a wrapper function. Uros.