In some case of mce test, the injected data can be remained in the registers and ca affect to the result of following test cases. So add codes for clearing mce registers of given VCPU. mce registers of give VCPU could be cleared from kernel by calling the function in this patch. What need to be paid attention is that the status and mcg_status of mce must be set with 0. If not, mce registers will not be cleared. Signed-off-by: Jin Dongming <jin.dongming@xxxxxxxxxxxxxxxxxx> --- arch/x86/kvm/x86.c | 28 +++++++++++++++++++++++++++- 1 files changed, 27 insertions(+), 1 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 3a09c62..9c2cdfc 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -2246,6 +2246,25 @@ out: return r; } +static void kvm_vcpu_x86_clear_mce(struct kvm_vcpu *vcpu, + struct kvm_x86_mce *mce) +{ + u64 *banks = vcpu->arch.mce_banks; + u64 mcg_cap = vcpu->arch.mcg_cap; + + unsigned bank_num = mcg_cap & 0xff; + int i = 0; + + for (i = 0; i < bank_num; i++) { + banks[1] = 0; + banks[2] = 0; + banks[3] = 0; + banks += 4; + } + + vcpu->arch.mcg_status = 0; +} + static int kvm_vcpu_ioctl_x86_set_mce(struct kvm_vcpu *vcpu, struct kvm_x86_mce *mce) { @@ -2253,8 +2272,15 @@ static int kvm_vcpu_ioctl_x86_set_mce(struct kvm_vcpu *vcpu, unsigned bank_num = mcg_cap & 0xff; u64 *banks = vcpu->arch.mce_banks; - if (mce->bank >= bank_num || !(mce->status & MCI_STATUS_VAL)) + if (mce->bank >= bank_num) return -EINVAL; + if (!(mce->status & MCI_STATUS_VAL)) { + if (!mce->status && !mce->mcg_status) { + kvm_vcpu_x86_clear_mce(vcpu, mce); + return 0; + } + return -EINVAL; + } /* * if IA32_MCG_CTL is not all 1s, the uncorrected error * reporting is disabled -- 1.7.1.1 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html