i386: Add support for SUCCOR feature
Add cpuid bit definition for the SUCCOR feature. This cpuid bit is required to be exposed to guests to allow them to handle machine check exceptions on AMD hosts. ---- v2: - Add "succor" feature word. - Add case to kvm_arch_get_supported_cpuid for the SUCCOR feature. Reported-by: William Roche <william.roche@oracle.com> Reviewed-by: Joao Martins <joao.m.martins@oracle.com> Signed-off-by: John Allen <john.allen@amd.com> Message-ID: <20240603193622.47156-3-john.allen@amd.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
4b77512b27
commit
2ba8b7ee63
@ -1180,6 +1180,22 @@ FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
|
||||
.tcg_features = TCG_APM_FEATURES,
|
||||
.unmigratable_flags = CPUID_APM_INVTSC,
|
||||
},
|
||||
[FEAT_8000_0007_EBX] = {
|
||||
.type = CPUID_FEATURE_WORD,
|
||||
.feat_names = {
|
||||
NULL, "succor", NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
},
|
||||
.cpuid = { .eax = 0x80000007, .reg = R_EBX, },
|
||||
.tcg_features = 0,
|
||||
.unmigratable_flags = 0,
|
||||
},
|
||||
[FEAT_8000_0008_EBX] = {
|
||||
.type = CPUID_FEATURE_WORD,
|
||||
.feat_names = {
|
||||
@ -6887,7 +6903,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
break;
|
||||
case 0x80000007:
|
||||
*eax = 0;
|
||||
*ebx = 0;
|
||||
*ebx = env->features[FEAT_8000_0007_EBX];
|
||||
*ecx = 0;
|
||||
*edx = env->features[FEAT_8000_0007_EDX];
|
||||
break;
|
||||
|
@ -630,6 +630,7 @@ typedef enum FeatureWord {
|
||||
FEAT_7_1_EAX, /* CPUID[EAX=7,ECX=1].EAX */
|
||||
FEAT_8000_0001_EDX, /* CPUID[8000_0001].EDX */
|
||||
FEAT_8000_0001_ECX, /* CPUID[8000_0001].ECX */
|
||||
FEAT_8000_0007_EBX, /* CPUID[8000_0007].EBX */
|
||||
FEAT_8000_0007_EDX, /* CPUID[8000_0007].EDX */
|
||||
FEAT_8000_0008_EBX, /* CPUID[8000_0008].EBX */
|
||||
FEAT_8000_0021_EAX, /* CPUID[8000_0021].EAX */
|
||||
@ -982,6 +983,9 @@ uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
|
||||
/* Packets which contain IP payload have LIP values */
|
||||
#define CPUID_14_0_ECX_LIP (1U << 31)
|
||||
|
||||
/* RAS Features */
|
||||
#define CPUID_8000_0007_EBX_SUCCOR (1U << 1)
|
||||
|
||||
/* CLZERO instruction */
|
||||
#define CPUID_8000_0008_EBX_CLZERO (1U << 0)
|
||||
/* Always save/restore FP error pointers */
|
||||
|
@ -532,6 +532,8 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function,
|
||||
*/
|
||||
cpuid_1_edx = kvm_arch_get_supported_cpuid(s, 1, 0, R_EDX);
|
||||
ret |= cpuid_1_edx & CPUID_EXT2_AMD_ALIASES;
|
||||
} else if (function == 0x80000007 && reg == R_EBX) {
|
||||
ret |= CPUID_8000_0007_EBX_SUCCOR;
|
||||
} else if (function == KVM_CPUID_FEATURES && reg == R_EAX) {
|
||||
/* kvm_pv_unhalt is reported by GET_SUPPORTED_CPUID, but it can't
|
||||
* be enabled without the in-kernel irqchip
|
||||
|
Loading…
Reference in New Issue
Block a user