|
@@ -1730,6 +1730,22 @@ static FeatureDep feature_dependencies[] = {
|
|
|
.from = { FEAT_7_1_EAX, CPUID_7_1_EAX_WRMSRNS },
|
|
|
.to = { FEAT_7_1_EAX, CPUID_7_1_EAX_FRED },
|
|
|
},
|
|
|
+ {
|
|
|
+ .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_SGX },
|
|
|
+ .to = { FEAT_7_0_ECX, CPUID_7_0_ECX_SGX_LC },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_SGX },
|
|
|
+ .to = { FEAT_SGX_12_0_EAX, ~0ull },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_SGX },
|
|
|
+ .to = { FEAT_SGX_12_0_EBX, ~0ull },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_SGX },
|
|
|
+ .to = { FEAT_SGX_12_1_EAX, ~0ull },
|
|
|
+ },
|
|
|
};
|
|
|
|
|
|
typedef struct X86RegisterInfo32 {
|
|
@@ -6039,7 +6055,7 @@ uint64_t x86_cpu_get_supported_feature_word(X86CPU *cpu, FeatureWord w)
|
|
|
{
|
|
|
FeatureWordInfo *wi = &feature_word_info[w];
|
|
|
uint64_t r = 0;
|
|
|
- uint32_t unavail = 0;
|
|
|
+ uint64_t unavail = 0;
|
|
|
|
|
|
if (kvm_enabled()) {
|
|
|
switch (wi->type) {
|
|
@@ -6087,6 +6103,21 @@ uint64_t x86_cpu_get_supported_feature_word(X86CPU *cpu, FeatureWord w)
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
+ case FEAT_7_0_EBX:
|
|
|
+#ifndef CONFIG_USER_ONLY
|
|
|
+ if (!check_sgx_support()) {
|
|
|
+ unavail = CPUID_7_0_EBX_SGX;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ break;
|
|
|
+ case FEAT_7_0_ECX:
|
|
|
+#ifndef CONFIG_USER_ONLY
|
|
|
+ if (!check_sgx_support()) {
|
|
|
+ unavail = CPUID_7_0_ECX_SGX_LC;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ break;
|
|
|
+
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
@@ -6537,8 +6568,6 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
|
|
case 7:
|
|
|
/* Structured Extended Feature Flags Enumeration Leaf */
|
|
|
if (count == 0) {
|
|
|
- uint32_t eax_0_unused, ebx_0, ecx_0, edx_0_unused;
|
|
|
-
|
|
|
/* Maximum ECX value for sub-leaves */
|
|
|
*eax = env->cpuid_level_func7;
|
|
|
*ebx = env->features[FEAT_7_0_EBX]; /* Feature flags */
|
|
@@ -6547,23 +6576,6 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
|
|
*ecx |= CPUID_7_0_ECX_OSPKE;
|
|
|
}
|
|
|
*edx = env->features[FEAT_7_0_EDX]; /* Feature flags */
|
|
|
-
|
|
|
- /*
|
|
|
- * SGX cannot be emulated in software. If hardware does not
|
|
|
- * support enabling SGX and/or SGX flexible launch control,
|
|
|
- * then we need to update the VM's CPUID values accordingly.
|
|
|
- */
|
|
|
- x86_cpu_get_supported_cpuid(0x7, 0,
|
|
|
- &eax_0_unused, &ebx_0,
|
|
|
- &ecx_0, &edx_0_unused);
|
|
|
- if ((*ebx & CPUID_7_0_EBX_SGX) && !(ebx_0 & CPUID_7_0_EBX_SGX)) {
|
|
|
- *ebx &= ~CPUID_7_0_EBX_SGX;
|
|
|
- }
|
|
|
-
|
|
|
- if ((*ecx & CPUID_7_0_ECX_SGX_LC)
|
|
|
- && (!(*ebx & CPUID_7_0_EBX_SGX) || !(ecx_0 & CPUID_7_0_ECX_SGX_LC))) {
|
|
|
- *ecx &= ~CPUID_7_0_ECX_SGX_LC;
|
|
|
- }
|
|
|
} else if (count == 1) {
|
|
|
*eax = env->features[FEAT_7_1_EAX];
|
|
|
*edx = env->features[FEAT_7_1_EDX];
|