diff options
author | Nadav Amit <namit@cs.technion.ac.il> | 2014-07-15 17:37:46 +0300 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2014-07-21 17:17:52 +0200 |
commit | 6f43ed01e87c8a8dbd8c826eaf0f714c1342c039 (patch) | |
tree | 96064816637d154889b1b4bea5e6c5dd6062c9bf /arch/x86/kvm/cpuid.h | |
parent | 9a2a05b9ed618b1bb6d4cbec0c2e1f80d6636609 (diff) | |
download | op-kernel-dev-6f43ed01e87c8a8dbd8c826eaf0f714c1342c039.zip op-kernel-dev-6f43ed01e87c8a8dbd8c826eaf0f714c1342c039.tar.gz |
KVM: x86: DR6/7.RTM cannot be written
Haswell and newer Intel CPUs have support for RTM, and in that case DR6.RTM is
not fixed to 1 and DR7.RTM is not fixed to zero. That is not the case in the
current KVM implementation. This bug is apparent only if the MOV-DR instruction
is emulated or the host also debugs the guest.
This patch is a partial fix which enables DR6.RTM and DR7.RTM to be cleared and
set respectively. It also sets DR6.RTM upon every debug exception. Obviously,
it is not a complete fix, as debugging of RTM is still unsupported.
Signed-off-by: Nadav Amit <namit@cs.technion.ac.il>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'arch/x86/kvm/cpuid.h')
-rw-r--r-- | arch/x86/kvm/cpuid.h | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h index f908731..a538059 100644 --- a/arch/x86/kvm/cpuid.h +++ b/arch/x86/kvm/cpuid.h @@ -95,4 +95,12 @@ static inline bool guest_cpuid_has_gbpages(struct kvm_vcpu *vcpu) best = kvm_find_cpuid_entry(vcpu, 0x80000001, 0); return best && (best->edx & bit(X86_FEATURE_GBPAGES)); } + +static inline bool guest_cpuid_has_rtm(struct kvm_vcpu *vcpu) +{ + struct kvm_cpuid_entry2 *best; + + best = kvm_find_cpuid_entry(vcpu, 7, 0); + return best && (best->ebx & bit(X86_FEATURE_RTM)); +} #endif |