Skip to content

Commit 276499b

Browse files
bp3tk0vgregkh
authored andcommitted
KVM: SVM: Advertise TSA CPUID bits to guests
Commit 31272ab upstream. Synthesize the TSA CPUID feature bits for guests. Set TSA_{SQ,L1}_NO on unaffected machines. Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 9029304 commit 276499b

2 files changed

Lines changed: 15 additions & 1 deletion

File tree

arch/x86/kvm/cpuid.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -780,6 +780,7 @@ void kvm_set_cpu_caps(void)
780780

781781
kvm_cpu_cap_mask(CPUID_8000_0021_EAX,
782782
F(NO_NESTED_DATA_BP) | F(LFENCE_RDTSC) | 0 /* SmmPgCfgLock */ |
783+
F(VERW_CLEAR) |
783784
F(NULL_SEL_CLR_BASE) | F(AUTOIBRS) | 0 /* PrefetchCtlMsr */
784785
);
785786

@@ -790,6 +791,10 @@ void kvm_set_cpu_caps(void)
790791
F(PERFMON_V2)
791792
);
792793

794+
kvm_cpu_cap_init_kvm_defined(CPUID_8000_0021_ECX,
795+
F(TSA_SQ_NO) | F(TSA_L1_NO)
796+
);
797+
793798
/*
794799
* Synthesize "LFENCE is serializing" into the AMD-defined entry in
795800
* KVM's supported CPUID if the feature is reported as supported by the
@@ -1296,8 +1301,9 @@ static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function)
12961301
entry->eax = entry->ebx = entry->ecx = entry->edx = 0;
12971302
break;
12981303
case 0x80000021:
1299-
entry->ebx = entry->ecx = entry->edx = 0;
1304+
entry->ebx = entry->edx = 0;
13001305
cpuid_entry_override(entry, CPUID_8000_0021_EAX);
1306+
cpuid_entry_override(entry, CPUID_8000_0021_ECX);
13011307
break;
13021308
/* AMD Extended Performance Monitoring and Debug */
13031309
case 0x80000022: {

arch/x86/kvm/reverse_cpuid.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ enum kvm_only_cpuid_leafs {
1717
CPUID_8000_0007_EDX,
1818
CPUID_8000_0022_EAX,
1919
CPUID_7_2_EDX,
20+
CPUID_8000_0021_ECX,
2021
NR_KVM_CPU_CAPS,
2122

2223
NKVMCAPINTS = NR_KVM_CPU_CAPS - NCAPINTS,
@@ -61,6 +62,10 @@ enum kvm_only_cpuid_leafs {
6162
/* CPUID level 0x80000022 (EAX) */
6263
#define KVM_X86_FEATURE_PERFMON_V2 KVM_X86_FEATURE(CPUID_8000_0022_EAX, 0)
6364

65+
/* CPUID level 0x80000021 (ECX) */
66+
#define KVM_X86_FEATURE_TSA_SQ_NO KVM_X86_FEATURE(CPUID_8000_0021_ECX, 1)
67+
#define KVM_X86_FEATURE_TSA_L1_NO KVM_X86_FEATURE(CPUID_8000_0021_ECX, 2)
68+
6469
struct cpuid_reg {
6570
u32 function;
6671
u32 index;
@@ -90,6 +95,7 @@ static const struct cpuid_reg reverse_cpuid[] = {
9095
[CPUID_8000_0021_EAX] = {0x80000021, 0, CPUID_EAX},
9196
[CPUID_8000_0022_EAX] = {0x80000022, 0, CPUID_EAX},
9297
[CPUID_7_2_EDX] = { 7, 2, CPUID_EDX},
98+
[CPUID_8000_0021_ECX] = {0x80000021, 0, CPUID_ECX},
9399
};
94100

95101
/*
@@ -129,6 +135,8 @@ static __always_inline u32 __feature_translate(int x86_feature)
129135
KVM_X86_TRANSLATE_FEATURE(PERFMON_V2);
130136
KVM_X86_TRANSLATE_FEATURE(RRSBA_CTRL);
131137
KVM_X86_TRANSLATE_FEATURE(BHI_CTRL);
138+
KVM_X86_TRANSLATE_FEATURE(TSA_SQ_NO);
139+
KVM_X86_TRANSLATE_FEATURE(TSA_L1_NO);
132140
default:
133141
return x86_feature;
134142
}

0 commit comments

Comments
 (0)