| From b9923c3716a1a53090c0edd173bc889273c83c96 Mon Sep 17 00:00:00 2001 |
| From: Joerg Roedel <joerg.roedel@amd.com> |
| Date: Mon, 17 May 2010 14:43:34 +0200 |
| Subject: KVM: SVM: Handle MCEs early in the vmexit process |
| |
| This patch moves handling of the MC vmexits to an earlier |
| point in the vmexit. The handle_exit function is too late |
| because the vcpu might alreadry have changed its physical |
| cpu. |
| |
| Cc: stable@kernel.org |
| Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> |
| Signed-off-by: Avi Kivity <avi@redhat.com> |
| (cherry picked from commit fe5913e4e1700cbfc337f4b1da9ddb26f6a55586) |
| --- |
| arch/x86/kvm/svm.c | 15 ++++++++++++++- |
| 1 file changed, 14 insertions(+), 1 deletion(-) |
| |
| --- a/arch/x86/kvm/svm.c |
| +++ b/arch/x86/kvm/svm.c |
| @@ -1255,7 +1255,7 @@ static int nm_interception(struct vcpu_s |
| return 1; |
| } |
| |
| -static int mc_interception(struct vcpu_svm *svm) |
| +static void svm_handle_mce(struct vcpu_svm *svm) |
| { |
| /* |
| * On an #MC intercept the MCE handler is not called automatically in |
| @@ -1265,6 +1265,11 @@ static int mc_interception(struct vcpu_s |
| "int $0x12\n"); |
| /* not sure if we ever come back to this point */ |
| |
| + return; |
| +} |
| + |
| +static int mc_interception(struct vcpu_svm *svm) |
| +{ |
| return 1; |
| } |
| |
| @@ -2820,6 +2825,14 @@ static void svm_vcpu_run(struct kvm_vcpu |
| vcpu->arch.regs_avail &= ~(1 << VCPU_EXREG_PDPTR); |
| vcpu->arch.regs_dirty &= ~(1 << VCPU_EXREG_PDPTR); |
| } |
| + |
| + /* |
| + * We need to handle MC intercepts here before the vcpu has a chance to |
| + * change the physical cpu |
| + */ |
| + if (unlikely(svm->vmcb->control.exit_code == |
| + SVM_EXIT_EXCP_BASE + MC_VECTOR)) |
| + svm_handle_mce(svm); |
| } |
| |
| #undef R |