Re: [RFC PATCH] KVM: SVM: Use do_machine_check to pass MCE to the host

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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(&regs, 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.

Paolo




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux