vmm/cpu_config/x86_64/static_cpu_templates/t2a.rs
1// Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2// SPDX-License-Identifier: Apache-2.0
3
4use crate::cpu_config::templates::{CustomCpuTemplate, RegisterValueFilter};
5use crate::cpu_config::x86_64::cpuid::KvmCpuidFlags;
6use crate::cpu_config::x86_64::custom_cpu_template::{
7 CpuidLeafModifier, CpuidRegister, CpuidRegisterModifier,
8};
9
10/// T2A template
11///
12/// Provide instruction set feature partity with Intel Cascade Lake or later using T2CL template.
13///
14/// References:
15/// - Intel SDM: <https://cdrdv2.intel.com/v1/dl/getContent/671200>
16/// - AMD APM: <https://www.amd.com/system/files/TechDocs/40332.pdf>
17/// - CPUID Enumeration and Architectural MSRs: <https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/cpuid-enumeration-and-architectural-msrs.html>
18#[allow(clippy::unusual_byte_groupings)]
19pub fn t2a() -> CustomCpuTemplate {
20 CustomCpuTemplate {
21 cpuid_modifiers: vec![
22 CpuidLeafModifier {
23 leaf: 0x1,
24 subleaf: 0x0,
25 flags: KvmCpuidFlags(0),
26 modifiers: vec![
27 // EAX: Version Information
28 // - Bits 03-00: Stepping (AMD APM) / Stepping ID (Intel SDM)
29 // - Bits 07-04: BaseModel (AMD APM) / Model (Intel SDM)
30 // - Bits 11-08: BaseFamily (AMD APM) / Family (Intel SDM)
31 // - Bits 13-12: Reserved (AMD APM) / Processor Type (Intel SDM)
32 // - Bits 19-16: ExtModel (AMD APM) / Extended Model ID (Intel SDM)
33 // - Bits 27-20: ExtFamily (AMD APM) / Extended Family ID (Intel SDM)
34 CpuidRegisterModifier {
35 register: CpuidRegister::Eax,
36 bitmap: RegisterValueFilter {
37 filter: 0b0000_11111111_1111_00_11_1111_1111_1111,
38 value: 0b0000_00000000_0011_00_00_0110_1111_0010,
39 },
40 },
41 // ECX: Feature Information
42 // - Bit 02: Reserved (AMD APM) / DTES64 (Intel SDM)
43 // - Bit 03: MONITOR (AMD APM) / MONITOR (Intel SDM)
44 // - Bit 04: Reserved (AMD APM) / DS-CPL (Intel SDM)
45 // - Bit 05: Reserved (AMD APM) / VMX (Intel SDM)
46 // - Bit 06: Reserved (AMD APM) / SMX (Intel SDM)
47 // - Bit 07: Reserved (AMD APM) / EIST (Intel SDM)
48 // - Bit 08: Reserved (AMD APM) / TM2 (Intel SDM)
49 // - Bit 10: Reserved (AMD APM) / CNXT-ID (Intel SDM)
50 // - Bit 11: Reserved (AMD APM) / SDBG (Intel SDM)
51 // - Bit 14: Reserved (AMD APM) / xTPR Update Control (Intel SDM)
52 // - Bit 15: Reserved (AMD APM) / PDCM (Intel SDM)
53 // - Bit 18: Reserevd (AMD APM) / DCA (Intel SDM)
54 CpuidRegisterModifier {
55 register: CpuidRegister::Ecx,
56 bitmap: RegisterValueFilter {
57 filter: 0b0000_0000_0000_0100_1100_1101_1111_1100,
58 value: 0b0000_0000_0000_0000_0000_0000_0000_0000,
59 },
60 },
61 // EDX: Feature Information
62 // - Bit 07: MCE (AMD APM) / MCE (Intel SDM)
63 // - Bit 12: MTRR (AMD APM) / MTRR (Intel SDM)
64 // - Bit 18: Reserved (AMD APM) / PSN (Intel SDM)
65 // - Bit 21: Reserved (AMD APM) / DS (Intel SDM)
66 // - Bit 22: Reserved (AMD APM) / ACPI (Intel SDM)
67 // - Bit 27: Reserved (AMD APM) / SS (Intel SDM)
68 // - Bit 29: Reserved (AMD APM) / TM (Intel SDM)
69 // - Bit 30: Reserved (AMD APM) / IA-64 (deprecated) https://www.intel.com/content/dam/www/public/us/en/documents/manuals/itanium-architecture-vol-4-manual.pdf
70 // - Bit 31: Reserved (AMD APM) / PBE (Intel SDM)
71 CpuidRegisterModifier {
72 register: CpuidRegister::Edx,
73 bitmap: RegisterValueFilter {
74 filter: 0b1110_1000_0110_0100_0001_0000_1000_0000,
75 value: 0b0000_0000_0000_0000_0001_0000_1000_0000,
76 },
77 },
78 ],
79 },
80 CpuidLeafModifier {
81 leaf: 0x7,
82 subleaf: 0x0,
83 flags: KvmCpuidFlags(1),
84 modifiers: vec![
85 // EBX:
86 // - Bit 02: Reserved (AMD APM) / SGX (Intel SDM)
87 // - Bit 04: Reserved (AMD APM) / HLE (Intel SDM)
88 // - Bit 09: Reserved (AMD APM) / Enhanced REP MOVSB/STOSB (Intel SDM)
89 // - Bit 11: Reserved (AMD APM) / RTM (Intel SDM)
90 // - Bit 12: PQM (AMD APM) / RDT-M (Intel SDM)
91 // - Bit 14: Reserved (AMD APM) / MPX (Intel SDM)
92 // - Bit 15: PQE (AMD APM) / RDT-A (Intel SDM)
93 // - Bit 16: Reserved (AMD APM) / AVX512F (Intel SDM)
94 // - Bit 17: Reserved (AMD APM) / AVX512DQ (Intel SDM)
95 // - Bit 18: RDSEED (AMD APM) / RDSEED (Intel SDM)
96 // - Bit 19: ADX (AMD APM) / ADX (Intel SDM)
97 // - Bit 21: Reserved (AMD APM) / AVX512_IFMA (Intel SDM)
98 // - Bit 22: RDPID (AMD APM) / Reserved (Intel SDM)
99 // On kernel codebase and Intel SDM, RDPID is enumerated at CPUID.07h:ECX.RDPID[bit 22].
100 // https://elixir.bootlin.com/linux/v6.3.8/source/arch/x86/include/asm/cpufeatures.h#L389
101 // - Bit 23: CLFLUSHOPT (AMD APM) / CLFLUSHOPT (Intel SDM)
102 // - Bit 24: CLWB (AMD APM) / CLWB (Intel SDM)
103 // - Bit 25: Reserved (AMD APM) / Intel Processor Trace (Intel SDM)
104 // - Bit 26: Reserved (AMD APM) / AVX512PF (Intel SDM)
105 // - Bit 27: Reserved (AMD APM) / AVX512ER (Intel SDM)
106 // - Bit 28: Reserved (AMD APM) / AVX512CD (Intel SDM)
107 // - Bit 29: SHA (AMD APM) / SHA (Intel SDM)
108 // - Bit 30: Reserved (AMD APM) / AVX512BW (Intel SDM)
109 // - Bit 31: Reserved (AMD APM) / AVX512VL (Intel SDM)
110 CpuidRegisterModifier {
111 register: CpuidRegister::Ebx,
112 bitmap: RegisterValueFilter {
113 filter: 0b1111_1111_1110_1111_1101_1010_0001_0100,
114 value: 0b0000_0000_0000_0000_0000_0010_0000_0000,
115 },
116 },
117 // ECX:
118 // - Bit 01: Reserved (AMD APM) / AVX512_VBMI (Intel SDM)
119 // - Bit 02: UMIP (AMD APM) / UMIP (Intel SDM)
120 // - Bit 03: PKU (AMD APM) / PKU (Intel SDM)
121 // - Bit 04: OSPKE (AMD APM) / OSPKE (Intel SDM)
122 // - Bit 06: Reserved (AMD APM) / AVX512_VBMI2 (Intel SDM)
123 // - Bit 08: Reserved (AMD APM) / GFNI (Intel SDM)
124 // - Bit 09: VAES (AMD APM) / VAES (Intel SDM)
125 // - Bit 10: VPCLMULQDQ (AMD APM) / VPCLMULQDQ (Intel SDM)
126 // - Bit 11: Reserved (AMD APM) / AVX512_VNNI (Intel SDM)
127 // - Bit 12: Reserved (AMD APM) / AVX512_BITALG (Intel SDM)
128 // - Bit 14: Reserved (AMD APM) / AVX512_VPOPCNTDQ (Intel SDM)
129 // - Bit 16: LA57 (AMD APM) / LA57 (Intel SDM)
130 // - Bit 22: Reserved (AMD APM) / RDPID and IA32_TSC_AUX (Intel SDM)
131 // - Bit 30: Reserved (AMD APM) / SGX_LC (Intel SDM)
132 CpuidRegisterModifier {
133 register: CpuidRegister::Ecx,
134 bitmap: RegisterValueFilter {
135 filter: 0b0100_0000_0100_0001_0101_1111_0101_1110,
136 value: 0b0000_0000_0000_0000_0000_0000_0000_0000,
137 },
138 },
139 // EDX:
140 // - Bit 02: Reserved (AMD APM) / AVX512_4VNNIW (Intel SDM)
141 // - Bit 03: Reserved (AMD APM) / AVX512_4FMAPS (Intel SDM)
142 // - Bit 04: Reserved (AMD APM) / Fast Short REP MOV (Intel SDM)
143 // - Bit 08: Reserved (AMD APM) / AVX512_VP2INTERSECT (Intel SDM)
144 CpuidRegisterModifier {
145 register: CpuidRegister::Edx,
146 bitmap: RegisterValueFilter {
147 filter: 0b0000_0000_0000_0000_0000_0001_0001_1100,
148 value: 0b0000_0000_0000_0000_0000_0000_0000_0000,
149 },
150 },
151 ],
152 },
153 CpuidLeafModifier {
154 leaf: 0xd,
155 subleaf: 0x0,
156 flags: KvmCpuidFlags(1),
157 modifiers: vec![
158 // EAX:
159 // - Bits 04-03: Reserved (AMD APM) / MPX state (Intel SDM)
160 // - Bits 07-05: Reserved (AMD APM) / AVX-512 state (Intel SDM)
161 // - Bit 09: MPK (AMD APM) / PKRU state (Intel SDM)
162 CpuidRegisterModifier {
163 register: CpuidRegister::Eax,
164 bitmap: RegisterValueFilter {
165 filter: 0b0000_0000_0000_0000_0000_00_1_0_111_11_000,
166 value: 0b0000_0000_0000_0000_0000_00_0_0_000_00_000,
167 },
168 },
169 ],
170 },
171 CpuidLeafModifier {
172 leaf: 0xd,
173 subleaf: 0x1,
174 flags: KvmCpuidFlags(1),
175 modifiers: vec![
176 // EAX:
177 // - Bit 01: XSAVEC (AMD APM) / Supports XSAVEC and the compacted form of
178 // XRSTOR (Intel SDM)
179 // - Bit 02: XGETBV (AMD APM) / Supports XGETBV (Intel SDM)
180 // - Bit 03: XSAVES (AMD APM) / Supports XSAVES/XRSTORS and IA32_XSS (Intel
181 // SDM)
182 CpuidRegisterModifier {
183 register: CpuidRegister::Eax,
184 bitmap: RegisterValueFilter {
185 filter: 0b0000_0000_0000_0000_0000_0000_0000_1110,
186 value: 0b0000_0000_0000_0000_0000_0000_0000_0000,
187 },
188 },
189 ],
190 },
191 CpuidLeafModifier {
192 leaf: 0x80000001,
193 subleaf: 0x0,
194 flags: KvmCpuidFlags(0),
195 modifiers: vec![
196 // ECX:
197 // - Bit 02: SVM (AMD APM) / Reserved (Intel SDM)
198 // - Bit 06: SSE4A (AMD APM) / Reserved (Intel SDM)
199 // - Bit 07: MisAlignSse (AMD APM) / Reserved (Intel SDM)
200 // - Bit 08: 3DNowPrefetch (AMD APM) / PREFETCHW (Intel SDM)
201 // - Bit 29: MONITORX (AMD APM) / MONITORX and MWAITX (Intel SDM)
202 CpuidRegisterModifier {
203 register: CpuidRegister::Ecx,
204 bitmap: RegisterValueFilter {
205 filter: 0b0010_0000_0000_0000_0000_0001_1100_0100,
206 value: 0b0000_0000_0000_0000_0000_0000_0000_0000,
207 },
208 },
209 // EDX:
210 // - Bit 22: MmxExt (AMD APM) / Reserved (Intel SDM)
211 // - Bit 25: FFXSR (AMD APM) / Reserved (Intel SDM)
212 // - Bit 26: Page1GB (AMD APM) / 1-GByte pages (Intel SDM)
213 CpuidRegisterModifier {
214 register: CpuidRegister::Edx,
215 bitmap: RegisterValueFilter {
216 filter: 0b0000_0110_0100_0000_0000_0000_0000_0000,
217 value: 0b0000_0000_0000_0000_0000_0000_0000_0000,
218 },
219 },
220 ],
221 },
222 CpuidLeafModifier {
223 leaf: 0x80000008,
224 subleaf: 0x0,
225 flags: KvmCpuidFlags(0),
226 modifiers: vec![
227 // EBX:
228 // - Bit 00: CLZERO (AMD APM) / Reserved (Intel SDM)
229 // - Bit 02: RstrFpErrPtrs (AMD APM) / Reserved (Intel SDM)
230 // - Bit 09: WBNOINVD (AMD APM) / WBNOINVD (Intel SDM)
231 // - Bit 18: IbrsPreferred (ADM APM) / Reserved (Intel SDm)
232 // - Bit 19: IbrsSameMode (AMD APM) / Reserved (Intel SDM)
233 // - Bit 20: EferLmsleUnsupported (AMD APM) / Reserved (Intel SDM)
234 CpuidRegisterModifier {
235 register: CpuidRegister::Ebx,
236 bitmap: RegisterValueFilter {
237 filter: 0b0000_0000_0001_1100_0000_0010_0000_0101,
238 value: 0b0000_0000_0001_1100_0000_0000_0000_0100,
239 },
240 },
241 ],
242 },
243 ],
244 msr_modifiers: vec![],
245 ..Default::default()
246 }
247}