]>
Commit | Line | Data |
---|---|---|
3dcc8d3b WB |
1 | From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
2 | From: Eduardo Habkost <ehabkost@redhat.com> | |
3 | Date: Tue, 9 Jan 2018 13:45:16 -0200 | |
4 | Subject: [PATCH] i386: Add FEAT_8000_0008_EBX CPUID feature word | |
5 | ||
6 | Add the new feature word and the "ibpb" feature flag. | |
7 | ||
8 | Based on a patch by Paolo Bonzini. | |
9 | ||
10 | Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> | |
11 | --- | |
12 | target/i386/cpu.c | 19 ++++++++++++++++++- | |
13 | target/i386/cpu.h | 3 +++ | |
14 | 2 files changed, 21 insertions(+), 1 deletion(-) | |
15 | ||
16 | diff --git a/target/i386/cpu.c b/target/i386/cpu.c | |
17 | index faf1ff6dcc..eee365b78d 100644 | |
18 | --- a/target/i386/cpu.c | |
19 | +++ b/target/i386/cpu.c | |
20 | @@ -484,6 +484,22 @@ static FeatureWordInfo feature_word_info[FEATURE_WORDS] = { | |
21 | .tcg_features = TCG_APM_FEATURES, | |
22 | .unmigratable_flags = CPUID_APM_INVTSC, | |
23 | }, | |
24 | + [FEAT_8000_0008_EBX] = { | |
25 | + .feat_names = { | |
26 | + NULL, NULL, NULL, NULL, | |
27 | + NULL, NULL, NULL, NULL, | |
28 | + NULL, NULL, NULL, NULL, | |
29 | + "ibpb", NULL, NULL, NULL, | |
30 | + NULL, NULL, NULL, NULL, | |
31 | + NULL, NULL, NULL, NULL, | |
32 | + NULL, NULL, NULL, NULL, | |
33 | + NULL, NULL, NULL, NULL, | |
34 | + }, | |
35 | + .cpuid_eax = 0x80000008, | |
36 | + .cpuid_reg = R_EBX, | |
37 | + .tcg_features = 0, | |
38 | + .unmigratable_flags = 0, | |
39 | + }, | |
40 | [FEAT_XSAVE] = { | |
41 | .feat_names = { | |
42 | "xsaveopt", "xsavec", "xgetbv1", "xsaves", | |
43 | @@ -2984,7 +3000,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, | |
44 | } else { | |
45 | *eax = cpu->phys_bits; | |
46 | } | |
47 | - *ebx = 0; | |
48 | + *ebx = env->features[FEAT_8000_0008_EBX]; | |
49 | *ecx = 0; | |
50 | *edx = 0; | |
51 | if (cs->nr_cores * cs->nr_threads > 1) { | |
52 | @@ -3440,6 +3456,7 @@ static void x86_cpu_expand_features(X86CPU *cpu, Error **errp) | |
53 | x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_EDX); | |
54 | x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_ECX); | |
55 | x86_cpu_adjust_feat_level(cpu, FEAT_8000_0007_EDX); | |
56 | + x86_cpu_adjust_feat_level(cpu, FEAT_8000_0008_EBX); | |
57 | x86_cpu_adjust_feat_level(cpu, FEAT_C000_0001_EDX); | |
58 | x86_cpu_adjust_feat_level(cpu, FEAT_SVM); | |
59 | x86_cpu_adjust_feat_level(cpu, FEAT_XSAVE); | |
60 | diff --git a/target/i386/cpu.h b/target/i386/cpu.h | |
61 | index 71261f4819..1ebee91930 100644 | |
62 | --- a/target/i386/cpu.h | |
63 | +++ b/target/i386/cpu.h | |
64 | @@ -452,6 +452,7 @@ typedef enum FeatureWord { | |
65 | FEAT_8000_0001_EDX, /* CPUID[8000_0001].EDX */ | |
66 | FEAT_8000_0001_ECX, /* CPUID[8000_0001].ECX */ | |
67 | FEAT_8000_0007_EDX, /* CPUID[8000_0007].EDX */ | |
68 | + FEAT_8000_0008_EBX, /* CPUID[8000_0008].EBX */ | |
69 | FEAT_C000_0001_EDX, /* CPUID[C000_0001].EDX */ | |
70 | FEAT_KVM, /* CPUID[4000_0001].EAX (KVM_CPUID_FEATURES) */ | |
71 | FEAT_HYPERV_EAX, /* CPUID[4000_0003].EAX */ | |
72 | @@ -642,6 +643,8 @@ typedef uint32_t FeatureWordArray[FEATURE_WORDS]; | |
73 | #define CPUID_7_0_EDX_AVX512_4FMAPS (1U << 3) /* AVX512 Multiply Accumulation Single Precision */ | |
74 | #define CPUID_7_0_EDX_SPEC_CTRL (1U << 26) /* Speculation Control */ | |
75 | ||
76 | +#define CPUID_8000_0008_EBX_IBPB (1U << 12) /* Indirect Branch Prediction Barrier */ | |
77 | + | |
78 | #define CPUID_XSAVE_XSAVEOPT (1U << 0) | |
79 | #define CPUID_XSAVE_XSAVEC (1U << 1) | |
80 | #define CPUID_XSAVE_XGETBV1 (1U << 2) | |
81 | -- | |
82 | 2.11.0 | |
83 |