119 lines
4.6 KiB
Diff
119 lines
4.6 KiB
Diff
|
|
From c006e700cf6f1925dc9400d37e2e6c9c53b7bc92 Mon Sep 17 00:00:00 2001
|
|||
|
|
From: Babu Moger <babu.moger@amd.com>
|
|||
|
|
Date: Thu, 4 May 2023 15:53:09 -0500
|
|||
|
|
Subject: [PATCH] target/i386: Add feature bits for CPUID_Fn80000021_EAX
|
|||
|
|
MIME-Version: 1.0
|
|||
|
|
Content-Type: text/plain; charset=UTF-8
|
|||
|
|
Content-Transfer-Encoding: 8bit
|
|||
|
|
|
|||
|
|
mainline inclusion
|
|||
|
|
from mainline-8.1.0
|
|||
|
|
commit b70eec312b185197d639bff689007727e596afd1
|
|||
|
|
category: feature
|
|||
|
|
bugzilla: https://gitee.com/openeuler/qemu/issues/IAUSKJ
|
|||
|
|
Reference: https://gitlab.com/qemu-project/qemu/-/commit/b70eec312b185197d639bff689007727e596afd1
|
|||
|
|
|
|||
|
|
commit b70eec312b185197d639bff689007727e596afd1 upstream
|
|||
|
|
|
|||
|
|
Add the following feature bits.
|
|||
|
|
no-nested-data-bp : Processor ignores nested data breakpoints.
|
|||
|
|
lfence-always-serializing : LFENCE instruction is always serializing.
|
|||
|
|
null-sel-cls-base : Null Selector Clears Base. When this bit is
|
|||
|
|
set, a null segment load clears the segment base.
|
|||
|
|
|
|||
|
|
The documentation for the features are available in the links below.
|
|||
|
|
a. Processor Programming Reference (PPR) for AMD Family 19h Model 01h,
|
|||
|
|
Revision B1 Processors
|
|||
|
|
b. AMD64 Architecture Programmer’s Manual Volumes 1–5 Publication No. Revision
|
|||
|
|
40332 4.05 Date October 2022
|
|||
|
|
|
|||
|
|
Signed-off-by: Babu Moger <babu.moger@amd.com>
|
|||
|
|
Acked-by: Michael S. Tsirkin <mst@redhat.com>
|
|||
|
|
Link: https://www.amd.com/system/files/TechDocs/55898_B1_pub_0.50.zip
|
|||
|
|
Link: https://www.amd.com/system/files/TechDocs/40332_4.05.pdf
|
|||
|
|
Message-Id: <20230504205313.225073-5-babu.moger@amd.com>
|
|||
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|||
|
|
---
|
|||
|
|
target/i386/cpu.c | 24 ++++++++++++++++++++++++
|
|||
|
|
target/i386/cpu.h | 8 ++++++++
|
|||
|
|
2 files changed, 32 insertions(+)
|
|||
|
|
|
|||
|
|
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
|||
|
|
index 02d19c2b4e..527135ca9d 100644
|
|||
|
|
--- a/target/i386/cpu.c
|
|||
|
|
+++ b/target/i386/cpu.c
|
|||
|
|
@@ -958,6 +958,22 @@ FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
|
|||
|
|
.tcg_features = 0,
|
|||
|
|
.unmigratable_flags = 0,
|
|||
|
|
},
|
|||
|
|
+ [FEAT_8000_0021_EAX] = {
|
|||
|
|
+ .type = CPUID_FEATURE_WORD,
|
|||
|
|
+ .feat_names = {
|
|||
|
|
+ "no-nested-data-bp", NULL, "lfence-always-serializing", NULL,
|
|||
|
|
+ NULL, NULL, "null-sel-clr-base", 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 = 0x80000021, .reg = R_EAX, },
|
|||
|
|
+ .tcg_features = 0,
|
|||
|
|
+ .unmigratable_flags = 0,
|
|||
|
|
+ },
|
|||
|
|
[FEAT_XSAVE] = {
|
|||
|
|
.type = CPUID_FEATURE_WORD,
|
|||
|
|
.feat_names = {
|
|||
|
|
@@ -6542,6 +6558,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
|||
|
|
*ebx |= sev_get_reduced_phys_bits() << 6;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
+ case 0x80000021:
|
|||
|
|
+ *eax = env->features[FEAT_8000_0021_EAX];
|
|||
|
|
+ *ebx = *ecx = *edx = 0;
|
|||
|
|
+ break;
|
|||
|
|
default:
|
|||
|
|
/* reserved values: zero */
|
|||
|
|
*eax = 0;
|
|||
|
|
@@ -6949,6 +6969,10 @@ void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
|
|||
|
|
x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000001F);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
+ if (env->features[FEAT_8000_0021_EAX]) {
|
|||
|
|
+ x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x80000021);
|
|||
|
|
+ }
|
|||
|
|
+
|
|||
|
|
/* SGX requires CPUID[0x12] for EPC enumeration */
|
|||
|
|
if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_SGX) {
|
|||
|
|
x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x12);
|
|||
|
|
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
|||
|
|
index 623bd0e4d6..7b1190c3f2 100644
|
|||
|
|
--- a/target/i386/cpu.h
|
|||
|
|
+++ b/target/i386/cpu.h
|
|||
|
|
@@ -585,6 +585,7 @@ typedef enum FeatureWord {
|
|||
|
|
FEAT_8000_0001_ECX, /* CPUID[8000_0001].ECX */
|
|||
|
|
FEAT_8000_0007_EDX, /* CPUID[8000_0007].EDX */
|
|||
|
|
FEAT_8000_0008_EBX, /* CPUID[8000_0008].EBX */
|
|||
|
|
+ FEAT_8000_0021_EAX, /* CPUID[8000_0021].EAX */
|
|||
|
|
FEAT_C000_0001_EDX, /* CPUID[C000_0001].EDX */
|
|||
|
|
FEAT_KVM, /* CPUID[4000_0001].EAX (KVM_CPUID_FEATURES) */
|
|||
|
|
FEAT_KVM_HINTS, /* CPUID[4000_0001].EDX */
|
|||
|
|
@@ -941,6 +942,13 @@ uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
|
|||
|
|
/* Predictive Store Forwarding Disable */
|
|||
|
|
#define CPUID_8000_0008_EBX_AMD_PSFD (1U << 28)
|
|||
|
|
|
|||
|
|
+/* Processor ignores nested data breakpoints */
|
|||
|
|
+#define CPUID_8000_0021_EAX_No_NESTED_DATA_BP (1U << 0)
|
|||
|
|
+/* LFENCE is always serializing */
|
|||
|
|
+#define CPUID_8000_0021_EAX_LFENCE_ALWAYS_SERIALIZING (1U << 2)
|
|||
|
|
+/* Null Selector Clears Base */
|
|||
|
|
+#define CPUID_8000_0021_EAX_NULL_SEL_CLR_BASE (1U << 6)
|
|||
|
|
+
|
|||
|
|
#define CPUID_XSAVE_XSAVEOPT (1U << 0)
|
|||
|
|
#define CPUID_XSAVE_XSAVEC (1U << 1)
|
|||
|
|
#define CPUID_XSAVE_XGETBV1 (1U << 2)
|
|||
|
|
--
|
|||
|
|
2.45.1.windows.1
|
|||
|
|
|