|
@@ -940,9 +940,13 @@ static int set_msr_mce(struct kvm_vcpu *vcpu, u32 msr, u64 data)
|
|
|
if (msr >= MSR_IA32_MC0_CTL &&
|
|
|
msr < MSR_IA32_MC0_CTL + 4 * bank_num) {
|
|
|
u32 offset = msr - MSR_IA32_MC0_CTL;
|
|
|
- /* only 0 or all 1s can be written to IA32_MCi_CTL */
|
|
|
+ /* only 0 or all 1s can be written to IA32_MCi_CTL
|
|
|
+ * some Linux kernels though clear bit 10 in bank 4 to
|
|
|
+ * workaround a BIOS/GART TBL issue on AMD K8s, ignore
|
|
|
+ * this to avoid an uncatched #GP in the guest
|
|
|
+ */
|
|
|
if ((offset & 0x3) == 0 &&
|
|
|
- data != 0 && data != ~(u64)0)
|
|
|
+ data != 0 && (data | (1 << 10)) != ~(u64)0)
|
|
|
return -1;
|
|
|
vcpu->arch.mce_banks[offset] = data;
|
|
|
break;
|