]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: x86: Add kvm_msr_{read,write}() helpers
authorYang Weijiang <weijiang.yang@intel.com>
Tue, 12 Aug 2025 02:55:11 +0000 (19:55 -0700)
committerSean Christopherson <seanjc@google.com>
Tue, 19 Aug 2025 18:59:49 +0000 (11:59 -0700)
Wrap __kvm_{get,set}_msr() into two new helpers for KVM usage and use the
helpers to replace existing usage of the raw functions.
kvm_msr_{read,write}() are KVM-internal helpers, i.e. used when KVM needs
to get/set a MSR value for emulating CPU behavior, i.e., host_initiated ==
%true in the helpers.

Suggested-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Yang Weijiang <weijiang.yang@intel.com>
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
Tested-by: Mathias Krause <minipli@grsecurity.net>
Tested-by: John Allen <john.allen@amd.com>
Signed-off-by: Chao Gao <chao.gao@intel.com>
Tested-by: Rick Edgecombe <rick.p.edgecombe@intel.com>
Link: https://lore.kernel.org/r/20250812025606.74625-4-chao.gao@intel.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/include/asm/kvm_host.h
arch/x86/kvm/cpuid.c
arch/x86/kvm/x86.c

index 3f59554df6b134a23fcad2dfd818e900f6b23362..b1f87b5750f8c511a7d3dbe9a948a347c4d62450 100644 (file)
@@ -2156,9 +2156,10 @@ void kvm_enable_efer_bits(u64);
 bool kvm_valid_efer(struct kvm_vcpu *vcpu, u64 efer);
 int kvm_emulate_msr_read(struct kvm_vcpu *vcpu, u32 index, u64 *data);
 int kvm_emulate_msr_write(struct kvm_vcpu *vcpu, u32 index, u64 data);
-int __kvm_get_msr(struct kvm_vcpu *vcpu, u32 index, u64 *data, bool host_initiated);
 int __kvm_emulate_msr_read(struct kvm_vcpu *vcpu, u32 index, u64 *data);
 int __kvm_emulate_msr_write(struct kvm_vcpu *vcpu, u32 index, u64 data);
+int kvm_msr_read(struct kvm_vcpu *vcpu, u32 index, u64 *data);
+int kvm_msr_write(struct kvm_vcpu *vcpu, u32 index, u64 data);
 int kvm_emulate_rdmsr(struct kvm_vcpu *vcpu);
 int kvm_emulate_rdmsr_imm(struct kvm_vcpu *vcpu, u32 msr, int reg);
 int kvm_emulate_wrmsr(struct kvm_vcpu *vcpu);
index 2705545f67feea1ad0014b5b1913c0be94d948b2..ad6cadf099305c6b4db9c72b2546b3afdb50a0af 100644 (file)
@@ -2006,7 +2006,7 @@ bool kvm_cpuid(struct kvm_vcpu *vcpu, u32 *eax, u32 *ebx,
                if (function == 7 && index == 0) {
                        u64 data;
                        if ((*ebx & (feature_bit(RTM) | feature_bit(HLE))) &&
-                           !__kvm_get_msr(vcpu, MSR_IA32_TSX_CTRL, &data, true) &&
+                           !kvm_msr_read(vcpu, MSR_IA32_TSX_CTRL, &data) &&
                            (data & TSX_CTRL_CPUID_CLEAR))
                                *ebx &= ~(feature_bit(RTM) | feature_bit(HLE));
                } else if (function == 0x80000007) {
index 52ad2d2f41cba8180ab5f9b36ec18074be79717d..59a431dce015b0acd6288d11a728c7448e8da3ad 100644 (file)
@@ -1899,8 +1899,8 @@ static int kvm_set_msr_ignored_check(struct kvm_vcpu *vcpu,
  * Returns 0 on success, non-0 otherwise.
  * Assumes vcpu_load() was already called.
  */
-int __kvm_get_msr(struct kvm_vcpu *vcpu, u32 index, u64 *data,
-                 bool host_initiated)
+static int __kvm_get_msr(struct kvm_vcpu *vcpu, u32 index, u64 *data,
+                        bool host_initiated)
 {
        struct msr_data msr;
        int ret;
@@ -1926,6 +1926,16 @@ int __kvm_get_msr(struct kvm_vcpu *vcpu, u32 index, u64 *data,
        return ret;
 }
 
+int kvm_msr_write(struct kvm_vcpu *vcpu, u32 index, u64 data)
+{
+       return __kvm_set_msr(vcpu, index, data, true);
+}
+
+int kvm_msr_read(struct kvm_vcpu *vcpu, u32 index, u64 *data)
+{
+       return __kvm_get_msr(vcpu, index, data, true);
+}
+
 static int kvm_get_msr_ignored_check(struct kvm_vcpu *vcpu,
                                     u32 index, u64 *data, bool host_initiated)
 {
@@ -12472,7 +12482,7 @@ void kvm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
                                                  MSR_IA32_MISC_ENABLE_BTS_UNAVAIL;
 
                __kvm_set_xcr(vcpu, 0, XFEATURE_MASK_FP);
-               __kvm_set_msr(vcpu, MSR_IA32_XSS, 0, true);
+               kvm_msr_write(vcpu, MSR_IA32_XSS, 0);
        }
 
        /* All GPRs except RDX (handled below) are zeroed on RESET/INIT. */