]>
Commit | Line | Data |
---|---|---|
dced7eec MM |
1 | /* |
2 | * S390 feature list generator | |
3 | * | |
4 | * Copyright 2016 IBM Corp. | |
5 | * | |
6 | * Author(s): Michael Mueller <[email protected]> | |
7 | * David Hildenbrand <[email protected]> | |
8 | * | |
9 | * This work is licensed under the terms of the GNU GPL, version 2 or (at | |
10 | * your option) any later version. See the COPYING file in the top-level | |
11 | * directory. | |
12 | * | |
13 | */ | |
14 | ||
15 | ||
16 | #include "inttypes.h" | |
17 | #include "stdio.h" | |
18 | #include "cpu_features_def.h" | |
19 | ||
20 | #define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) | |
21 | ||
22 | /***** BEGIN FEATURE DEFS *****/ | |
23 | ||
24 | #define S390_FEAT_GROUP_PLO \ | |
25 | S390_FEAT_PLO_CL, \ | |
26 | S390_FEAT_PLO_CLG, \ | |
27 | S390_FEAT_PLO_CLGR, \ | |
28 | S390_FEAT_PLO_CLX, \ | |
29 | S390_FEAT_PLO_CS, \ | |
30 | S390_FEAT_PLO_CSG, \ | |
31 | S390_FEAT_PLO_CSGR, \ | |
32 | S390_FEAT_PLO_CSX, \ | |
33 | S390_FEAT_PLO_DCS, \ | |
34 | S390_FEAT_PLO_DCSG, \ | |
35 | S390_FEAT_PLO_DCSGR, \ | |
36 | S390_FEAT_PLO_DCSX, \ | |
37 | S390_FEAT_PLO_CSST, \ | |
38 | S390_FEAT_PLO_CSSTG, \ | |
39 | S390_FEAT_PLO_CSSTGR, \ | |
40 | S390_FEAT_PLO_CSSTX, \ | |
41 | S390_FEAT_PLO_CSDST, \ | |
42 | S390_FEAT_PLO_CSDSTG, \ | |
43 | S390_FEAT_PLO_CSDSTGR, \ | |
44 | S390_FEAT_PLO_CSDSTX, \ | |
45 | S390_FEAT_PLO_CSTST, \ | |
46 | S390_FEAT_PLO_CSTSTG, \ | |
47 | S390_FEAT_PLO_CSTSTGR, \ | |
48 | S390_FEAT_PLO_CSTSTX | |
49 | ||
50 | #define S390_FEAT_GROUP_TOD_CLOCK_STEERING \ | |
51 | S390_FEAT_TOD_CLOCK_STEERING, \ | |
52 | S390_FEAT_PTFF_QTO, \ | |
53 | S390_FEAT_PTFF_QSI, \ | |
54 | S390_FEAT_PTFF_QPT, \ | |
55 | S390_FEAT_PTFF_STO | |
56 | ||
57 | #define S390_FEAT_GROUP_GEN13_PTFF \ | |
58 | S390_FEAT_PTFF_QUI, \ | |
59 | S390_FEAT_PTFF_QTOU, \ | |
60 | S390_FEAT_PTFF_STOU | |
61 | ||
62 | #define S390_FEAT_GROUP_MSA \ | |
63 | S390_FEAT_MSA, \ | |
64 | S390_FEAT_KMAC_DEA, \ | |
65 | S390_FEAT_KMAC_TDEA_128, \ | |
66 | S390_FEAT_KMAC_TDEA_192, \ | |
67 | S390_FEAT_KMC_DEA, \ | |
68 | S390_FEAT_KMC_TDEA_128, \ | |
69 | S390_FEAT_KMC_TDEA_192, \ | |
70 | S390_FEAT_KM_DEA, \ | |
71 | S390_FEAT_KM_TDEA_128, \ | |
72 | S390_FEAT_KM_TDEA_192, \ | |
73 | S390_FEAT_KIMD_SHA_1, \ | |
74 | S390_FEAT_KLMD_SHA_1 | |
75 | ||
76 | #define S390_FEAT_GROUP_MSA_EXT_1 \ | |
77 | S390_FEAT_KMC_AES_128, \ | |
78 | S390_FEAT_KM_AES_128, \ | |
79 | S390_FEAT_KIMD_SHA_256, \ | |
80 | S390_FEAT_KLMD_SHA_256 | |
81 | ||
82 | #define S390_FEAT_GROUP_MSA_EXT_2 \ | |
83 | S390_FEAT_KMC_AES_192, \ | |
84 | S390_FEAT_KMC_AES_256, \ | |
85 | S390_FEAT_KMC_PRNG, \ | |
86 | S390_FEAT_KM_AES_192, \ | |
87 | S390_FEAT_KM_AES_256, \ | |
88 | S390_FEAT_KIMD_SHA_512, \ | |
89 | S390_FEAT_KLMD_SHA_512 | |
90 | ||
91 | #define S390_FEAT_GROUP_MSA_EXT_3 \ | |
92 | S390_FEAT_MSA_EXT_3, \ | |
93 | S390_FEAT_KMAC_EDEA, \ | |
94 | S390_FEAT_KMAC_ETDEA_128, \ | |
95 | S390_FEAT_KMAC_ETDEA_192, \ | |
96 | S390_FEAT_KMC_EAES_128, \ | |
97 | S390_FEAT_KMC_EAES_192, \ | |
98 | S390_FEAT_KMC_EAES_256, \ | |
99 | S390_FEAT_KMC_EDEA, \ | |
100 | S390_FEAT_KMC_ETDEA_128, \ | |
101 | S390_FEAT_KMC_ETDEA_192, \ | |
102 | S390_FEAT_KM_EDEA, \ | |
103 | S390_FEAT_KM_ETDEA_128, \ | |
104 | S390_FEAT_KM_ETDEA_192, \ | |
105 | S390_FEAT_KM_EAES_128, \ | |
106 | S390_FEAT_KM_EAES_192, \ | |
107 | S390_FEAT_KM_EAES_256, \ | |
108 | S390_FEAT_PCKMO_EDEA, \ | |
109 | S390_FEAT_PCKMO_ETDEA_128, \ | |
110 | S390_FEAT_PCKMO_ETDEA_256, \ | |
111 | S390_FEAT_PCKMO_AES_128, \ | |
112 | S390_FEAT_PCKMO_AES_192, \ | |
113 | S390_FEAT_PCKMO_AES_256 | |
114 | ||
115 | #define S390_FEAT_GROUP_MSA_EXT_4 \ | |
116 | S390_FEAT_MSA_EXT_4, \ | |
117 | S390_FEAT_KMAC_AES_128, \ | |
118 | S390_FEAT_KMAC_AES_192, \ | |
119 | S390_FEAT_KMAC_AES_256, \ | |
120 | S390_FEAT_KMAC_EAES_128, \ | |
121 | S390_FEAT_KMAC_EAES_192, \ | |
122 | S390_FEAT_KMAC_EAES_256, \ | |
123 | S390_FEAT_KM_XTS_AES_128, \ | |
124 | S390_FEAT_KM_XTS_AES_256, \ | |
125 | S390_FEAT_KM_XTS_EAES_128, \ | |
126 | S390_FEAT_KM_XTS_EAES_256, \ | |
127 | S390_FEAT_KIMD_GHASH, \ | |
128 | S390_FEAT_KMCTR_DEA, \ | |
129 | S390_FEAT_KMCTR_TDEA_128, \ | |
130 | S390_FEAT_KMCTR_TDEA_192, \ | |
131 | S390_FEAT_KMCTR_EDEA, \ | |
132 | S390_FEAT_KMCTR_ETDEA_128, \ | |
133 | S390_FEAT_KMCTR_ETDEA_192, \ | |
134 | S390_FEAT_KMCTR_AES_128, \ | |
135 | S390_FEAT_KMCTR_AES_192, \ | |
136 | S390_FEAT_KMCTR_AES_256, \ | |
137 | S390_FEAT_KMCTR_EAES_128, \ | |
138 | S390_FEAT_KMCTR_EAES_192, \ | |
139 | S390_FEAT_KMCTR_EAES_256, \ | |
140 | S390_FEAT_KMF_DEA, \ | |
141 | S390_FEAT_KMF_TDEA_128, \ | |
142 | S390_FEAT_KMF_TDEA_192, \ | |
143 | S390_FEAT_KMF_EDEA, \ | |
144 | S390_FEAT_KMF_ETDEA_128, \ | |
145 | S390_FEAT_KMF_ETDEA_192, \ | |
146 | S390_FEAT_KMF_AES_128, \ | |
147 | S390_FEAT_KMF_AES_192, \ | |
148 | S390_FEAT_KMF_AES_256, \ | |
149 | S390_FEAT_KMF_EAES_128, \ | |
150 | S390_FEAT_KMF_EAES_192, \ | |
151 | S390_FEAT_KMF_EAES_256, \ | |
152 | S390_FEAT_KMO_DEA, \ | |
153 | S390_FEAT_KMO_TDEA_128, \ | |
154 | S390_FEAT_KMO_TDEA_192, \ | |
155 | S390_FEAT_KMO_EDEA, \ | |
156 | S390_FEAT_KMO_ETDEA_128, \ | |
157 | S390_FEAT_KMO_ETDEA_192, \ | |
158 | S390_FEAT_KMO_AES_128, \ | |
159 | S390_FEAT_KMO_AES_192, \ | |
160 | S390_FEAT_KMO_AES_256, \ | |
161 | S390_FEAT_KMO_EAES_128, \ | |
162 | S390_FEAT_KMO_EAES_192, \ | |
163 | S390_FEAT_KMO_EAES_256, \ | |
164 | S390_FEAT_PCC_CMAC_DEA, \ | |
165 | S390_FEAT_PCC_CMAC_TDEA_128, \ | |
166 | S390_FEAT_PCC_CMAC_TDEA_192, \ | |
167 | S390_FEAT_PCC_CMAC_ETDEA_128, \ | |
168 | S390_FEAT_PCC_CMAC_ETDEA_192, \ | |
169 | S390_FEAT_PCC_CMAC_TDEA, \ | |
170 | S390_FEAT_PCC_CMAC_AES_128, \ | |
171 | S390_FEAT_PCC_CMAC_AES_192, \ | |
172 | S390_FEAT_PCC_CMAC_AES_256, \ | |
173 | S390_FEAT_PCC_CMAC_EAES_128, \ | |
174 | S390_FEAT_PCC_CMAC_EAES_192, \ | |
175 | S390_FEAT_PCC_CMAC_EAES_256, \ | |
176 | S390_FEAT_PCC_XTS_AES_128, \ | |
177 | S390_FEAT_PCC_XTS_AES_256, \ | |
178 | S390_FEAT_PCC_XTS_EAES_128, \ | |
179 | S390_FEAT_PCC_XTS_EAES_256 | |
180 | ||
181 | #define S390_FEAT_GROUP_MSA_EXT_5 \ | |
182 | S390_FEAT_MSA_EXT_5, \ | |
183 | S390_FEAT_PPNO_SHA_512_DRNG | |
184 | ||
6da5c593 JH |
185 | #define S390_FEAT_GROUP_MSA_EXT_6 \ |
186 | S390_FEAT_KIMD_SHA3_224, \ | |
187 | S390_FEAT_KIMD_SHA3_256, \ | |
188 | S390_FEAT_KIMD_SHA3_384, \ | |
189 | S390_FEAT_KIMD_SHA3_512, \ | |
190 | S390_FEAT_KIMD_SHAKE_128, \ | |
191 | S390_FEAT_KIMD_SHAKE_256, \ | |
192 | S390_FEAT_KLMD_SHA3_224, \ | |
193 | S390_FEAT_KLMD_SHA3_256, \ | |
194 | S390_FEAT_KLMD_SHA3_384, \ | |
195 | S390_FEAT_KLMD_SHA3_512, \ | |
196 | S390_FEAT_KLMD_SHAKE_128, \ | |
197 | S390_FEAT_KLMD_SHAKE_256 | |
198 | ||
199 | #define S390_FEAT_GROUP_MSA_EXT_7 \ | |
200 | S390_FEAT_PRNO_TRNG_QRTCR, \ | |
201 | S390_FEAT_PRNO_TRNG | |
202 | ||
203 | #define S390_FEAT_GROUP_MSA_EXT_8 \ | |
204 | S390_FEAT_MSA_EXT_8, \ | |
205 | S390_FEAT_KMA_GCM_AES_128, \ | |
206 | S390_FEAT_KMA_GCM_AES_192, \ | |
207 | S390_FEAT_KMA_GCM_AES_256 , \ | |
208 | S390_FEAT_KMA_GCM_EAES_128, \ | |
209 | S390_FEAT_KMA_GCM_EAES_192, \ | |
210 | S390_FEAT_KMA_GCM_EAES_256 | |
211 | ||
90229ebb DH |
212 | /* cpu feature groups */ |
213 | static uint16_t group_PLO[] = { | |
214 | S390_FEAT_GROUP_PLO, | |
215 | }; | |
216 | static uint16_t group_TOD_CLOCK_STEERING[] = { | |
217 | S390_FEAT_GROUP_TOD_CLOCK_STEERING, | |
218 | }; | |
219 | static uint16_t group_GEN13_PTFF[] = { | |
220 | S390_FEAT_GROUP_GEN13_PTFF, | |
221 | }; | |
222 | static uint16_t group_MSA[] = { | |
223 | S390_FEAT_GROUP_MSA, | |
224 | }; | |
225 | static uint16_t group_MSA_EXT_1[] = { | |
226 | S390_FEAT_GROUP_MSA_EXT_1, | |
227 | }; | |
228 | static uint16_t group_MSA_EXT_2[] = { | |
229 | S390_FEAT_GROUP_MSA_EXT_2, | |
230 | }; | |
231 | static uint16_t group_MSA_EXT_3[] = { | |
232 | S390_FEAT_GROUP_MSA_EXT_3, | |
233 | }; | |
234 | static uint16_t group_MSA_EXT_4[] = { | |
235 | S390_FEAT_GROUP_MSA_EXT_4, | |
236 | }; | |
237 | static uint16_t group_MSA_EXT_5[] = { | |
238 | S390_FEAT_GROUP_MSA_EXT_5, | |
239 | }; | |
6da5c593 JH |
240 | static uint16_t group_MSA_EXT_6[] = { |
241 | S390_FEAT_GROUP_MSA_EXT_6, | |
242 | }; | |
243 | static uint16_t group_MSA_EXT_7[] = { | |
244 | S390_FEAT_GROUP_MSA_EXT_7, | |
245 | }; | |
246 | static uint16_t group_MSA_EXT_8[] = { | |
247 | S390_FEAT_GROUP_MSA_EXT_8, | |
248 | }; | |
90229ebb | 249 | |
ec3aadb1 JH |
250 | /* Base features (in order of release) |
251 | * Only non-hypervisor managed features belong here. | |
252 | * Base feature sets are static meaning they do not change in future QEMU | |
253 | * releases. | |
254 | */ | |
dced7eec MM |
255 | static uint16_t base_GEN7_GA1[] = { |
256 | S390_FEAT_GROUP_PLO, | |
257 | S390_FEAT_ESAN3, | |
258 | S390_FEAT_ZARCH, | |
259 | }; | |
ec3aadb1 | 260 | |
dced7eec MM |
261 | #define base_GEN7_GA2 EmptyFeat |
262 | #define base_GEN7_GA3 EmptyFeat | |
ec3aadb1 | 263 | |
dced7eec MM |
264 | static uint16_t base_GEN8_GA1[] = { |
265 | S390_FEAT_DAT_ENH, | |
266 | S390_FEAT_EXTENDED_TRANSLATION_2, | |
267 | S390_FEAT_GROUP_MSA, | |
268 | S390_FEAT_LONG_DISPLACEMENT, | |
269 | S390_FEAT_LONG_DISPLACEMENT_FAST, | |
270 | S390_FEAT_HFP_MADDSUB, | |
271 | }; | |
ec3aadb1 | 272 | |
dced7eec MM |
273 | #define base_GEN8_GA2 EmptyFeat |
274 | #define base_GEN8_GA3 EmptyFeat | |
275 | #define base_GEN8_GA4 EmptyFeat | |
276 | #define base_GEN8_GA5 EmptyFeat | |
ec3aadb1 | 277 | |
dced7eec MM |
278 | static uint16_t base_GEN9_GA1[] = { |
279 | S390_FEAT_IDTE_SEGMENT, | |
280 | S390_FEAT_ASN_LX_REUSE, | |
281 | S390_FEAT_STFLE, | |
282 | S390_FEAT_SENSE_RUNNING_STATUS, | |
283 | S390_FEAT_EXTENDED_IMMEDIATE, | |
284 | S390_FEAT_EXTENDED_TRANSLATION_3, | |
285 | S390_FEAT_HFP_UNNORMALIZED_EXT, | |
286 | S390_FEAT_ETF2_ENH, | |
287 | S390_FEAT_STORE_CLOCK_FAST, | |
288 | S390_FEAT_GROUP_TOD_CLOCK_STEERING, | |
289 | S390_FEAT_ETF3_ENH, | |
290 | S390_FEAT_DAT_ENH_2, | |
291 | }; | |
ec3aadb1 | 292 | |
dced7eec MM |
293 | #define base_GEN9_GA2 EmptyFeat |
294 | #define base_GEN9_GA3 EmptyFeat | |
ec3aadb1 | 295 | |
dced7eec MM |
296 | static uint16_t base_GEN10_GA1[] = { |
297 | S390_FEAT_CONDITIONAL_SSKE, | |
298 | S390_FEAT_PARSING_ENH, | |
299 | S390_FEAT_MOVE_WITH_OPTIONAL_SPEC, | |
300 | S390_FEAT_EXTRACT_CPU_TIME, | |
301 | S390_FEAT_COMPARE_AND_SWAP_AND_STORE, | |
302 | S390_FEAT_COMPARE_AND_SWAP_AND_STORE_2, | |
303 | S390_FEAT_GENERAL_INSTRUCTIONS_EXT, | |
304 | S390_FEAT_EXECUTE_EXT, | |
305 | S390_FEAT_FLOATING_POINT_SUPPPORT_ENH, | |
306 | S390_FEAT_DFP, | |
307 | S390_FEAT_DFP_FAST, | |
308 | S390_FEAT_PFPO, | |
309 | }; | |
310 | #define base_GEN10_GA2 EmptyFeat | |
311 | #define base_GEN10_GA3 EmptyFeat | |
ec3aadb1 | 312 | |
dced7eec MM |
313 | static uint16_t base_GEN11_GA1[] = { |
314 | S390_FEAT_NONQ_KEY_SETTING, | |
315 | S390_FEAT_ENHANCED_MONITOR, | |
316 | S390_FEAT_FLOATING_POINT_EXT, | |
317 | S390_FEAT_SET_PROGRAM_PARAMETERS, | |
318 | S390_FEAT_STFLE_45, | |
319 | S390_FEAT_CMPSC_ENH, | |
320 | S390_FEAT_INTERLOCKED_ACCESS_2, | |
321 | }; | |
ec3aadb1 | 322 | |
dced7eec | 323 | #define base_GEN11_GA2 EmptyFeat |
ec3aadb1 | 324 | |
dced7eec MM |
325 | static uint16_t base_GEN12_GA1[] = { |
326 | S390_FEAT_DFP_ZONED_CONVERSION, | |
327 | S390_FEAT_STFLE_49, | |
328 | S390_FEAT_LOCAL_TLB_CLEARING, | |
329 | }; | |
ec3aadb1 | 330 | |
dced7eec | 331 | #define base_GEN12_GA2 EmptyFeat |
ec3aadb1 | 332 | |
dced7eec MM |
333 | static uint16_t base_GEN13_GA1[] = { |
334 | S390_FEAT_STFLE_53, | |
335 | S390_FEAT_DFP_PACKED_CONVERSION, | |
336 | S390_FEAT_GROUP_GEN13_PTFF, | |
337 | }; | |
ec3aadb1 | 338 | |
dced7eec MM |
339 | #define base_GEN13_GA2 EmptyFeat |
340 | ||
ec3aadb1 JH |
341 | /* Full features (in order of release) |
342 | * Automatically includes corresponding base features. | |
343 | * Full features are all features this hardware supports even if kvm/QEMU do not | |
344 | * support these features yet. | |
345 | */ | |
dced7eec MM |
346 | static uint16_t full_GEN7_GA1[] = { |
347 | S390_FEAT_SIE_F2, | |
348 | S390_FEAT_SIE_SKEY, | |
349 | S390_FEAT_SIE_GPERE, | |
350 | S390_FEAT_SIE_IB, | |
351 | S390_FEAT_SIE_CEI, | |
352 | }; | |
ec3aadb1 | 353 | |
dced7eec MM |
354 | static uint16_t full_GEN7_GA2[] = { |
355 | S390_FEAT_EXTENDED_TRANSLATION_2, | |
356 | }; | |
ec3aadb1 | 357 | |
dced7eec MM |
358 | static uint16_t full_GEN7_GA3[] = { |
359 | S390_FEAT_LONG_DISPLACEMENT, | |
360 | S390_FEAT_SIE_SIIF, | |
361 | }; | |
ec3aadb1 | 362 | |
dced7eec MM |
363 | static uint16_t full_GEN8_GA1[] = { |
364 | S390_FEAT_SIE_GSLS, | |
365 | S390_FEAT_SIE_64BSCAO, | |
366 | }; | |
ec3aadb1 | 367 | |
dced7eec | 368 | #define full_GEN8_GA2 EmptyFeat |
ec3aadb1 | 369 | |
dced7eec MM |
370 | static uint16_t full_GEN8_GA3[] = { |
371 | S390_FEAT_ASN_LX_REUSE, | |
372 | S390_FEAT_EXTENDED_TRANSLATION_3, | |
373 | }; | |
ec3aadb1 | 374 | |
dced7eec MM |
375 | #define full_GEN8_GA4 EmptyFeat |
376 | #define full_GEN8_GA5 EmptyFeat | |
ec3aadb1 | 377 | |
dced7eec MM |
378 | static uint16_t full_GEN9_GA1[] = { |
379 | S390_FEAT_STORE_HYPERVISOR_INFO, | |
380 | S390_FEAT_GROUP_MSA_EXT_1, | |
381 | S390_FEAT_CMM, | |
382 | S390_FEAT_SIE_CMMA, | |
383 | }; | |
ec3aadb1 | 384 | |
dced7eec MM |
385 | static uint16_t full_GEN9_GA2[] = { |
386 | S390_FEAT_MOVE_WITH_OPTIONAL_SPEC, | |
387 | S390_FEAT_EXTRACT_CPU_TIME, | |
388 | S390_FEAT_COMPARE_AND_SWAP_AND_STORE, | |
389 | S390_FEAT_FLOATING_POINT_SUPPPORT_ENH, | |
390 | S390_FEAT_DFP, | |
391 | }; | |
ec3aadb1 | 392 | |
dced7eec MM |
393 | static uint16_t full_GEN9_GA3[] = { |
394 | S390_FEAT_CONDITIONAL_SSKE, | |
395 | S390_FEAT_PFPO, | |
396 | }; | |
ec3aadb1 | 397 | |
dced7eec MM |
398 | static uint16_t full_GEN10_GA1[] = { |
399 | S390_FEAT_EDAT, | |
400 | S390_FEAT_CONFIGURATION_TOPOLOGY, | |
401 | S390_FEAT_GROUP_MSA_EXT_2, | |
402 | S390_FEAT_ESOP, | |
403 | S390_FEAT_SIE_PFMFI, | |
404 | S390_FEAT_SIE_SIGPIF, | |
405 | }; | |
ec3aadb1 | 406 | |
dced7eec MM |
407 | static uint16_t full_GEN10_GA2[] = { |
408 | S390_FEAT_SET_PROGRAM_PARAMETERS, | |
409 | S390_FEAT_SIE_IBS, | |
410 | }; | |
ec3aadb1 | 411 | |
dced7eec MM |
412 | static uint16_t full_GEN10_GA3[] = { |
413 | S390_FEAT_GROUP_MSA_EXT_3, | |
414 | }; | |
ec3aadb1 | 415 | |
dced7eec MM |
416 | static uint16_t full_GEN11_GA1[] = { |
417 | S390_FEAT_IPTE_RANGE, | |
418 | S390_FEAT_ACCESS_EXCEPTION_FS_INDICATION, | |
419 | S390_FEAT_GROUP_MSA_EXT_4, | |
420 | }; | |
ec3aadb1 | 421 | |
dced7eec | 422 | #define full_GEN11_GA2 EmptyFeat |
ec3aadb1 | 423 | |
dced7eec MM |
424 | static uint16_t full_GEN12_GA1[] = { |
425 | S390_FEAT_CONSTRAINT_TRANSACTIONAL_EXE, | |
426 | S390_FEAT_TRANSACTIONAL_EXE, | |
427 | S390_FEAT_RUNTIME_INSTRUMENTATION, | |
3b00f702 YMZ |
428 | S390_FEAT_ZPCI, |
429 | S390_FEAT_ADAPTER_EVENT_NOTIFICATION, | |
430 | S390_FEAT_ADAPTER_INT_SUPPRESSION, | |
dced7eec MM |
431 | S390_FEAT_EDAT_2, |
432 | }; | |
ec3aadb1 | 433 | |
dced7eec MM |
434 | static uint16_t full_GEN12_GA2[] = { |
435 | S390_FEAT_GROUP_MSA_EXT_5, | |
436 | }; | |
ec3aadb1 | 437 | |
dced7eec MM |
438 | static uint16_t full_GEN13_GA1[] = { |
439 | S390_FEAT_VECTOR, | |
440 | }; | |
ec3aadb1 | 441 | |
dced7eec MM |
442 | #define full_GEN13_GA2 EmptyFeat |
443 | ||
ec3aadb1 JH |
444 | /* Default features (in order of release) |
445 | * Automatically includes corresponding base features. | |
446 | * Default features are all features this version of QEMU supports for this | |
447 | * hardware model. Default feature sets can grow with new QEMU releases. | |
448 | */ | |
dced7eec MM |
449 | #define default_GEN7_GA1 EmptyFeat |
450 | #define default_GEN7_GA2 EmptyFeat | |
451 | #define default_GEN7_GA3 EmptyFeat | |
452 | #define default_GEN8_GA1 EmptyFeat | |
453 | #define default_GEN8_GA2 EmptyFeat | |
454 | #define default_GEN8_GA3 EmptyFeat | |
455 | #define default_GEN8_GA4 EmptyFeat | |
456 | #define default_GEN8_GA5 EmptyFeat | |
ec3aadb1 | 457 | |
dced7eec MM |
458 | static uint16_t default_GEN9_GA1[] = { |
459 | S390_FEAT_STORE_HYPERVISOR_INFO, | |
460 | S390_FEAT_GROUP_MSA_EXT_1, | |
07059eff | 461 | S390_FEAT_CMM, |
dced7eec | 462 | }; |
ec3aadb1 | 463 | |
dced7eec MM |
464 | #define default_GEN9_GA2 EmptyFeat |
465 | #define default_GEN9_GA3 EmptyFeat | |
ec3aadb1 | 466 | |
dced7eec MM |
467 | static uint16_t default_GEN10_GA1[] = { |
468 | S390_FEAT_EDAT, | |
469 | S390_FEAT_GROUP_MSA_EXT_2, | |
470 | }; | |
ec3aadb1 | 471 | |
dced7eec MM |
472 | #define default_GEN10_GA2 EmptyFeat |
473 | #define default_GEN10_GA3 EmptyFeat | |
ec3aadb1 | 474 | |
dced7eec MM |
475 | static uint16_t default_GEN11_GA1[] = { |
476 | S390_FEAT_GROUP_MSA_EXT_3, | |
477 | S390_FEAT_IPTE_RANGE, | |
478 | S390_FEAT_ACCESS_EXCEPTION_FS_INDICATION, | |
479 | S390_FEAT_GROUP_MSA_EXT_4, | |
480 | }; | |
ec3aadb1 | 481 | |
dced7eec | 482 | #define default_GEN11_GA2 EmptyFeat |
ec3aadb1 | 483 | |
dced7eec MM |
484 | static uint16_t default_GEN12_GA1[] = { |
485 | S390_FEAT_CONSTRAINT_TRANSACTIONAL_EXE, | |
486 | S390_FEAT_TRANSACTIONAL_EXE, | |
487 | S390_FEAT_RUNTIME_INSTRUMENTATION, | |
3b00f702 YMZ |
488 | S390_FEAT_ZPCI, |
489 | S390_FEAT_ADAPTER_EVENT_NOTIFICATION, | |
dced7eec MM |
490 | S390_FEAT_EDAT_2, |
491 | }; | |
ec3aadb1 | 492 | |
dced7eec | 493 | #define default_GEN12_GA2 EmptyFeat |
ec3aadb1 | 494 | |
dced7eec MM |
495 | static uint16_t default_GEN13_GA1[] = { |
496 | S390_FEAT_GROUP_MSA_EXT_5, | |
497 | S390_FEAT_VECTOR, | |
498 | }; | |
ec3aadb1 | 499 | |
dced7eec MM |
500 | #define default_GEN13_GA2 EmptyFeat |
501 | ||
502 | /****** END FEATURE DEFS ******/ | |
503 | ||
504 | #define _YEARS "2016" | |
505 | #define _NAME_H "TARGET_S390X_GEN_FEATURES_H" | |
506 | ||
507 | #define CPU_FEAT_INITIALIZER(_name) \ | |
508 | { \ | |
509 | .name = "S390_FEAT_LIST_" #_name, \ | |
510 | .base_bits = \ | |
511 | { .data = base_##_name, \ | |
512 | .len = ARRAY_SIZE(base_##_name) }, \ | |
513 | .default_bits = \ | |
514 | { .data = default_##_name, \ | |
515 | .len = ARRAY_SIZE(default_##_name) }, \ | |
516 | .full_bits = \ | |
517 | { .data = full_##_name, \ | |
518 | .len = ARRAY_SIZE(full_##_name) }, \ | |
519 | } | |
520 | ||
521 | typedef struct BitSpec { | |
522 | uint16_t *data; | |
523 | uint32_t len; | |
524 | } BitSpec; | |
525 | ||
526 | typedef struct { | |
527 | const char *name; | |
528 | BitSpec base_bits; | |
529 | BitSpec default_bits; | |
530 | BitSpec full_bits; | |
531 | } CpuFeatDefSpec; | |
532 | ||
533 | static uint16_t EmptyFeat[] = {}; | |
534 | ||
535 | /******************************* | |
536 | * processor GA series | |
537 | *******************************/ | |
538 | static CpuFeatDefSpec CpuFeatDef[] = { | |
539 | CPU_FEAT_INITIALIZER(GEN7_GA1), | |
540 | CPU_FEAT_INITIALIZER(GEN7_GA2), | |
541 | CPU_FEAT_INITIALIZER(GEN7_GA3), | |
542 | CPU_FEAT_INITIALIZER(GEN8_GA1), | |
543 | CPU_FEAT_INITIALIZER(GEN8_GA2), | |
544 | CPU_FEAT_INITIALIZER(GEN8_GA3), | |
545 | CPU_FEAT_INITIALIZER(GEN8_GA4), | |
546 | CPU_FEAT_INITIALIZER(GEN8_GA5), | |
547 | CPU_FEAT_INITIALIZER(GEN9_GA1), | |
548 | CPU_FEAT_INITIALIZER(GEN9_GA2), | |
549 | CPU_FEAT_INITIALIZER(GEN9_GA3), | |
550 | CPU_FEAT_INITIALIZER(GEN10_GA1), | |
551 | CPU_FEAT_INITIALIZER(GEN10_GA2), | |
552 | CPU_FEAT_INITIALIZER(GEN10_GA3), | |
553 | CPU_FEAT_INITIALIZER(GEN11_GA1), | |
554 | CPU_FEAT_INITIALIZER(GEN11_GA2), | |
555 | CPU_FEAT_INITIALIZER(GEN12_GA1), | |
556 | CPU_FEAT_INITIALIZER(GEN12_GA2), | |
557 | CPU_FEAT_INITIALIZER(GEN13_GA1), | |
558 | CPU_FEAT_INITIALIZER(GEN13_GA2), | |
559 | }; | |
560 | ||
90229ebb DH |
561 | #define FEAT_GROUP_INITIALIZER(_name) \ |
562 | { \ | |
563 | .name = "S390_FEAT_GROUP_LIST_" #_name, \ | |
564 | .bits = \ | |
565 | { .data = group_##_name, \ | |
566 | .len = ARRAY_SIZE(group_##_name) }, \ | |
567 | } | |
568 | ||
569 | typedef struct { | |
570 | const char *name; | |
571 | BitSpec bits; | |
572 | } FeatGroupDefSpec; | |
573 | ||
574 | /******************************* | |
575 | * feature groups | |
576 | *******************************/ | |
577 | static FeatGroupDefSpec FeatGroupDef[] = { | |
578 | FEAT_GROUP_INITIALIZER(PLO), | |
579 | FEAT_GROUP_INITIALIZER(TOD_CLOCK_STEERING), | |
580 | FEAT_GROUP_INITIALIZER(GEN13_PTFF), | |
581 | FEAT_GROUP_INITIALIZER(MSA), | |
582 | FEAT_GROUP_INITIALIZER(MSA_EXT_1), | |
583 | FEAT_GROUP_INITIALIZER(MSA_EXT_2), | |
584 | FEAT_GROUP_INITIALIZER(MSA_EXT_3), | |
585 | FEAT_GROUP_INITIALIZER(MSA_EXT_4), | |
586 | FEAT_GROUP_INITIALIZER(MSA_EXT_5), | |
6da5c593 JH |
587 | FEAT_GROUP_INITIALIZER(MSA_EXT_6), |
588 | FEAT_GROUP_INITIALIZER(MSA_EXT_7), | |
589 | FEAT_GROUP_INITIALIZER(MSA_EXT_8), | |
90229ebb DH |
590 | }; |
591 | ||
dced7eec MM |
592 | static void set_bits(uint64_t list[], BitSpec bits) |
593 | { | |
594 | uint32_t i; | |
595 | ||
596 | for (i = 0; i < bits.len; i++) { | |
597 | list[bits.data[i] / 64] |= 1ULL << (bits.data[i] % 64); | |
598 | } | |
599 | } | |
600 | ||
601 | static void print_feature_defs(void) | |
602 | { | |
603 | uint64_t base_feat[S390_FEAT_MAX / 64 + 1] = {}; | |
604 | uint64_t default_feat[S390_FEAT_MAX / 64 + 1] = {}; | |
605 | uint64_t full_feat[S390_FEAT_MAX / 64 + 1] = {}; | |
606 | int i, j; | |
607 | ||
608 | printf("\n/* CPU model feature list data */\n"); | |
609 | ||
610 | for (i = 0; i < ARRAY_SIZE(CpuFeatDef); i++) { | |
611 | set_bits(base_feat, CpuFeatDef[i].base_bits); | |
612 | /* add the base to the default features */ | |
613 | set_bits(default_feat, CpuFeatDef[i].base_bits); | |
614 | set_bits(default_feat, CpuFeatDef[i].default_bits); | |
615 | /* add the base to the full features */ | |
616 | set_bits(full_feat, CpuFeatDef[i].base_bits); | |
617 | set_bits(full_feat, CpuFeatDef[i].full_bits); | |
618 | ||
619 | printf("#define %s_BASE\t", CpuFeatDef[i].name); | |
620 | for (j = 0; j < ARRAY_SIZE(base_feat); j++) { | |
621 | printf("0x%016"PRIx64"ULL", base_feat[j]); | |
622 | if (j < ARRAY_SIZE(base_feat) - 1) { | |
623 | printf(","); | |
624 | } else { | |
625 | printf("\n"); | |
626 | } | |
627 | } | |
628 | printf("#define %s_DEFAULT\t", CpuFeatDef[i].name); | |
629 | for (j = 0; j < ARRAY_SIZE(default_feat); j++) { | |
630 | printf("0x%016"PRIx64"ULL", default_feat[j]); | |
631 | if (j < ARRAY_SIZE(default_feat) - 1) { | |
632 | printf(","); | |
633 | } else { | |
634 | printf("\n"); | |
635 | } | |
636 | } | |
637 | printf("#define %s_FULL\t\t", CpuFeatDef[i].name); | |
638 | for (j = 0; j < ARRAY_SIZE(full_feat); j++) { | |
639 | printf("0x%016"PRIx64"ULL", full_feat[j]); | |
640 | if (j < ARRAY_SIZE(full_feat) - 1) { | |
641 | printf(","); | |
642 | } else { | |
643 | printf("\n"); | |
644 | } | |
645 | } | |
646 | } | |
647 | } | |
648 | ||
90229ebb DH |
649 | static void print_feature_group_defs(void) |
650 | { | |
651 | int i, j; | |
652 | ||
653 | printf("\n/* CPU feature group list data */\n"); | |
654 | ||
655 | for (i = 0; i < ARRAY_SIZE(FeatGroupDef); i++) { | |
656 | uint64_t feat[S390_FEAT_MAX / 64 + 1] = {}; | |
657 | ||
658 | set_bits(feat, FeatGroupDef[i].bits); | |
659 | printf("#define %s\t", FeatGroupDef[i].name); | |
660 | for (j = 0; j < ARRAY_SIZE(feat); j++) { | |
661 | printf("0x%016"PRIx64"ULL", feat[j]); | |
662 | if (j < ARRAY_SIZE(feat) - 1) { | |
663 | printf(","); | |
664 | } else { | |
665 | printf("\n"); | |
666 | } | |
667 | } | |
668 | } | |
669 | } | |
670 | ||
dced7eec MM |
671 | int main(int argc, char *argv[]) |
672 | { | |
673 | printf("/*\n" | |
674 | " * AUTOMATICALLY GENERATED, DO NOT MODIFY HERE, EDIT\n" | |
675 | " * SOURCE FILE \"%s\" INSTEAD.\n" | |
676 | " *\n" | |
677 | " * Copyright %s IBM Corp.\n" | |
678 | " *\n" | |
679 | " * This work is licensed under the terms of the GNU GPL, " | |
680 | "version 2 or (at\n * your option) any later version. See " | |
681 | "the COPYING file in the top-level\n * directory.\n" | |
682 | " */\n\n" | |
683 | "#ifndef %s\n#define %s\n", __FILE__, _YEARS, _NAME_H, _NAME_H); | |
684 | print_feature_defs(); | |
90229ebb | 685 | print_feature_group_defs(); |
dced7eec MM |
686 | printf("\n#endif\n"); |
687 | return 0; | |
688 | } |