diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2014-08-29 12:56:01 -0400 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2014-08-29 12:56:24 -0400 |
commit | fd2752352bbc98850d83b5448a288d8991590317 (patch) | |
tree | a465339e30e3c5416b247f1c54418b77b0d854dc | |
parent | 13a34e067eab24fec882e1834fbf2cc31911d474 (diff) |
KVM: x86: use guest maxphyaddr to check MTRR values
The check introduced in commit d7a2a246a1b5 (KVM: x86: #GP when attempts to write reserved bits of Variable Range MTRRs, 2014-08-19)
will break if the guest maxphyaddr is higher than the host's (which
sometimes happens depending on your hardware and how QEMU is
configured).
To fix this, use cpuid_maxphyaddr similar to how the APIC_BASE MSR
does already.
Reported-by: Jan Kiszka <jan.kiszka@siemens.com>
Tested-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r-- | arch/x86/kvm/x86.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index a375dfc42f6a..916e89515210 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -1726,7 +1726,7 @@ static bool valid_mtrr_type(unsigned t) | |||
1726 | static bool mtrr_valid(struct kvm_vcpu *vcpu, u32 msr, u64 data) | 1726 | static bool mtrr_valid(struct kvm_vcpu *vcpu, u32 msr, u64 data) |
1727 | { | 1727 | { |
1728 | int i; | 1728 | int i; |
1729 | u64 mask = 0; | 1729 | u64 mask; |
1730 | 1730 | ||
1731 | if (!msr_mtrr_valid(msr)) | 1731 | if (!msr_mtrr_valid(msr)) |
1732 | return false; | 1732 | return false; |
@@ -1750,8 +1750,7 @@ static bool mtrr_valid(struct kvm_vcpu *vcpu, u32 msr, u64 data) | |||
1750 | /* variable MTRRs */ | 1750 | /* variable MTRRs */ |
1751 | WARN_ON(!(msr >= 0x200 && msr < 0x200 + 2 * KVM_NR_VAR_MTRR)); | 1751 | WARN_ON(!(msr >= 0x200 && msr < 0x200 + 2 * KVM_NR_VAR_MTRR)); |
1752 | 1752 | ||
1753 | for (i = 63; i > boot_cpu_data.x86_phys_bits; i--) | 1753 | mask = (~0ULL) << cpuid_maxphyaddr(vcpu); |
1754 | mask |= (1ULL << i); | ||
1755 | if ((msr & 1) == 0) { | 1754 | if ((msr & 1) == 0) { |
1756 | /* MTRR base */ | 1755 | /* MTRR base */ |
1757 | if (!valid_mtrr_type(data & 0xff)) | 1756 | if (!valid_mtrr_type(data & 0xff)) |