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}