- target/i386: Add EPYC-Genoa model to support Zen 4 processor series - target/i386: Add VNMI and automatic IBRS feature bits - target/i386: Add missing feature bits in EPYC-Milan model - target/i386: Add feature bits for CPUID_Fn80000021_EAX - target/i386: Add a couple of feature bits in 8000_0008_EBX - target/i386: Add new EPYC CPU versions with updated cache_info - target/i386: allow versioned CPUs to specify new cache_info Signed-off-by: AlexChen <alex.chen@huawei.com> (cherry picked from commit 941be8259b4a01d66f0c9c9d16c7acf8933688eb)
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
|
||
|