1 /*
2 * S390 feature list generator
3 *
4 * Copyright IBM Corp. 2016, 2018
5 *
6 * Author(s): Michael Mueller <mimu@linux.vnet.ibm.com>
7 * David Hildenbrand <dahi@linux.vnet.ibm.com>
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 #include <inttypes.h>
15 #include <stdio.h>
16 #include <string.h>
17 #include "cpu_features_def.h"
18
19 #define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
20
21 /***** BEGIN FEATURE DEFS *****/
22
23 #define S390_FEAT_GROUP_PLO \
24 S390_FEAT_PLO_CL, \
25 S390_FEAT_PLO_CLG, \
26 S390_FEAT_PLO_CLGR, \
27 S390_FEAT_PLO_CLX, \
28 S390_FEAT_PLO_CS, \
29 S390_FEAT_PLO_CSG, \
30 S390_FEAT_PLO_CSGR, \
31 S390_FEAT_PLO_CSX, \
32 S390_FEAT_PLO_DCS, \
33 S390_FEAT_PLO_DCSG, \
34 S390_FEAT_PLO_DCSGR, \
35 S390_FEAT_PLO_DCSX, \
36 S390_FEAT_PLO_CSST, \
37 S390_FEAT_PLO_CSSTG, \
38 S390_FEAT_PLO_CSSTGR, \
39 S390_FEAT_PLO_CSSTX, \
40 S390_FEAT_PLO_CSDST, \
41 S390_FEAT_PLO_CSDSTG, \
42 S390_FEAT_PLO_CSDSTGR, \
43 S390_FEAT_PLO_CSDSTX, \
44 S390_FEAT_PLO_CSTST, \
45 S390_FEAT_PLO_CSTSTG, \
46 S390_FEAT_PLO_CSTSTGR, \
47 S390_FEAT_PLO_CSTSTX
48
49 #define S390_FEAT_GROUP_PLO_EXT \
50 S390_FEAT_PLO_EXT, \
51 S390_FEAT_PLO_CLO, \
52 S390_FEAT_PLO_CSO, \
53 S390_FEAT_PLO_DCSO, \
54 S390_FEAT_PLO_CSSTO, \
55 S390_FEAT_PLO_CSDSTO, \
56 S390_FEAT_PLO_CSTSTO, \
57 S390_FEAT_PLO_TCS, \
58 S390_FEAT_PLO_TCSG, \
59 S390_FEAT_PLO_TCSX, \
60 S390_FEAT_PLO_TCSO, \
61 S390_FEAT_PLO_QCS, \
62 S390_FEAT_PLO_QCSG, \
63 S390_FEAT_PLO_QCSX, \
64 S390_FEAT_PLO_QCSO, \
65 S390_FEAT_PLO_LO, \
66 S390_FEAT_PLO_DLX, \
67 S390_FEAT_PLO_DLO, \
68 S390_FEAT_PLO_TL, \
69 S390_FEAT_PLO_TLG, \
70 S390_FEAT_PLO_TLX, \
71 S390_FEAT_PLO_TLO, \
72 S390_FEAT_PLO_QL, \
73 S390_FEAT_PLO_QLG, \
74 S390_FEAT_PLO_QLX, \
75 S390_FEAT_PLO_QLO, \
76 S390_FEAT_PLO_STO, \
77 S390_FEAT_PLO_DST, \
78 S390_FEAT_PLO_DSTG, \
79 S390_FEAT_PLO_DSTX, \
80 S390_FEAT_PLO_DSTO, \
81 S390_FEAT_PLO_TST, \
82 S390_FEAT_PLO_TSTG, \
83 S390_FEAT_PLO_TSTX, \
84 S390_FEAT_PLO_TSTO, \
85 S390_FEAT_PLO_QST, \
86 S390_FEAT_PLO_QSTG, \
87 S390_FEAT_PLO_QSTX, \
88 S390_FEAT_PLO_QSTO
89
90 #define S390_FEAT_GROUP_TOD_CLOCK_STEERING \
91 S390_FEAT_TOD_CLOCK_STEERING, \
92 S390_FEAT_PTFF_QTO, \
93 S390_FEAT_PTFF_QSI, \
94 S390_FEAT_PTFF_QPT, \
95 S390_FEAT_PTFF_STO
96
97 #define S390_FEAT_GROUP_GEN13_PTFF \
98 S390_FEAT_PTFF_QUI, \
99 S390_FEAT_PTFF_QTOU, \
100 S390_FEAT_PTFF_STOU
101
102 #define S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF \
103 S390_FEAT_PTFF_QSIE, \
104 S390_FEAT_PTFF_QTOUE, \
105 S390_FEAT_PTFF_STOE, \
106 S390_FEAT_PTFF_STOUE
107
108 #define S390_FEAT_GROUP_GEN17_PTFF \
109 S390_FEAT_PTFF_QTSE
110
111 #define S390_FEAT_GROUP_MSA \
112 S390_FEAT_MSA, \
113 S390_FEAT_KMAC_DEA, \
114 S390_FEAT_KMAC_TDEA_128, \
115 S390_FEAT_KMAC_TDEA_192, \
116 S390_FEAT_KMC_DEA, \
117 S390_FEAT_KMC_TDEA_128, \
118 S390_FEAT_KMC_TDEA_192, \
119 S390_FEAT_KM_DEA, \
120 S390_FEAT_KM_TDEA_128, \
121 S390_FEAT_KM_TDEA_192, \
122 S390_FEAT_KIMD_SHA_1, \
123 S390_FEAT_KLMD_SHA_1
124
125 #define S390_FEAT_GROUP_MSA_EXT_1 \
126 S390_FEAT_KMC_AES_128, \
127 S390_FEAT_KM_AES_128, \
128 S390_FEAT_KIMD_SHA_256, \
129 S390_FEAT_KLMD_SHA_256
130
131 #define S390_FEAT_GROUP_MSA_EXT_2 \
132 S390_FEAT_KMC_AES_192, \
133 S390_FEAT_KMC_AES_256, \
134 S390_FEAT_KMC_PRNG, \
135 S390_FEAT_KM_AES_192, \
136 S390_FEAT_KM_AES_256, \
137 S390_FEAT_KIMD_SHA_512, \
138 S390_FEAT_KLMD_SHA_512
139
140 #define S390_FEAT_GROUP_MSA_EXT_3 \
141 S390_FEAT_MSA_EXT_3, \
142 S390_FEAT_KMAC_EDEA, \
143 S390_FEAT_KMAC_ETDEA_128, \
144 S390_FEAT_KMAC_ETDEA_192, \
145 S390_FEAT_KMC_EAES_128, \
146 S390_FEAT_KMC_EAES_192, \
147 S390_FEAT_KMC_EAES_256, \
148 S390_FEAT_KMC_EDEA, \
149 S390_FEAT_KMC_ETDEA_128, \
150 S390_FEAT_KMC_ETDEA_192, \
151 S390_FEAT_KM_EDEA, \
152 S390_FEAT_KM_ETDEA_128, \
153 S390_FEAT_KM_ETDEA_192, \
154 S390_FEAT_KM_EAES_128, \
155 S390_FEAT_KM_EAES_192, \
156 S390_FEAT_KM_EAES_256, \
157 S390_FEAT_PCKMO_EDEA, \
158 S390_FEAT_PCKMO_ETDEA_128, \
159 S390_FEAT_PCKMO_ETDEA_256, \
160 S390_FEAT_PCKMO_AES_128, \
161 S390_FEAT_PCKMO_AES_192, \
162 S390_FEAT_PCKMO_AES_256
163
164 #define S390_FEAT_GROUP_MSA_EXT_4 \
165 S390_FEAT_MSA_EXT_4, \
166 S390_FEAT_KMAC_AES_128, \
167 S390_FEAT_KMAC_AES_192, \
168 S390_FEAT_KMAC_AES_256, \
169 S390_FEAT_KMAC_EAES_128, \
170 S390_FEAT_KMAC_EAES_192, \
171 S390_FEAT_KMAC_EAES_256, \
172 S390_FEAT_KM_XTS_AES_128, \
173 S390_FEAT_KM_XTS_AES_256, \
174 S390_FEAT_KM_XTS_EAES_128, \
175 S390_FEAT_KM_XTS_EAES_256, \
176 S390_FEAT_KIMD_GHASH, \
177 S390_FEAT_KMCTR_DEA, \
178 S390_FEAT_KMCTR_TDEA_128, \
179 S390_FEAT_KMCTR_TDEA_192, \
180 S390_FEAT_KMCTR_EDEA, \
181 S390_FEAT_KMCTR_ETDEA_128, \
182 S390_FEAT_KMCTR_ETDEA_192, \
183 S390_FEAT_KMCTR_AES_128, \
184 S390_FEAT_KMCTR_AES_192, \
185 S390_FEAT_KMCTR_AES_256, \
186 S390_FEAT_KMCTR_EAES_128, \
187 S390_FEAT_KMCTR_EAES_192, \
188 S390_FEAT_KMCTR_EAES_256, \
189 S390_FEAT_KMF_DEA, \
190 S390_FEAT_KMF_TDEA_128, \
191 S390_FEAT_KMF_TDEA_192, \
192 S390_FEAT_KMF_EDEA, \
193 S390_FEAT_KMF_ETDEA_128, \
194 S390_FEAT_KMF_ETDEA_192, \
195 S390_FEAT_KMF_AES_128, \
196 S390_FEAT_KMF_AES_192, \
197 S390_FEAT_KMF_AES_256, \
198 S390_FEAT_KMF_EAES_128, \
199 S390_FEAT_KMF_EAES_192, \
200 S390_FEAT_KMF_EAES_256, \
201 S390_FEAT_KMO_DEA, \
202 S390_FEAT_KMO_TDEA_128, \
203 S390_FEAT_KMO_TDEA_192, \
204 S390_FEAT_KMO_EDEA, \
205 S390_FEAT_KMO_ETDEA_128, \
206 S390_FEAT_KMO_ETDEA_192, \
207 S390_FEAT_KMO_AES_128, \
208 S390_FEAT_KMO_AES_192, \
209 S390_FEAT_KMO_AES_256, \
210 S390_FEAT_KMO_EAES_128, \
211 S390_FEAT_KMO_EAES_192, \
212 S390_FEAT_KMO_EAES_256, \
213 S390_FEAT_PCC_CMAC_DEA, \
214 S390_FEAT_PCC_CMAC_TDEA_128, \
215 S390_FEAT_PCC_CMAC_TDEA_192, \
216 S390_FEAT_PCC_CMAC_ETDEA_128, \
217 S390_FEAT_PCC_CMAC_ETDEA_192, \
218 S390_FEAT_PCC_CMAC_TDEA, \
219 S390_FEAT_PCC_CMAC_AES_128, \
220 S390_FEAT_PCC_CMAC_AES_192, \
221 S390_FEAT_PCC_CMAC_AES_256, \
222 S390_FEAT_PCC_CMAC_EAES_128, \
223 S390_FEAT_PCC_CMAC_EAES_192, \
224 S390_FEAT_PCC_CMAC_EAES_256, \
225 S390_FEAT_PCC_XTS_AES_128, \
226 S390_FEAT_PCC_XTS_AES_256, \
227 S390_FEAT_PCC_XTS_EAES_128, \
228 S390_FEAT_PCC_XTS_EAES_256
229
230 #define S390_FEAT_GROUP_MSA_EXT_5 \
231 S390_FEAT_MSA_EXT_5, \
232 S390_FEAT_PPNO_SHA_512_DRNG
233
234 #define S390_FEAT_GROUP_MSA_EXT_6 \
235 S390_FEAT_KIMD_SHA3_224, \
236 S390_FEAT_KIMD_SHA3_256, \
237 S390_FEAT_KIMD_SHA3_384, \
238 S390_FEAT_KIMD_SHA3_512, \
239 S390_FEAT_KIMD_SHAKE_128, \
240 S390_FEAT_KIMD_SHAKE_256, \
241 S390_FEAT_KLMD_SHA3_224, \
242 S390_FEAT_KLMD_SHA3_256, \
243 S390_FEAT_KLMD_SHA3_384, \
244 S390_FEAT_KLMD_SHA3_512, \
245 S390_FEAT_KLMD_SHAKE_128, \
246 S390_FEAT_KLMD_SHAKE_256
247
248 #define S390_FEAT_GROUP_MSA_EXT_7 \
249 S390_FEAT_PRNO_TRNG_QRTCR, \
250 S390_FEAT_PRNO_TRNG
251
252 #define S390_FEAT_GROUP_MSA_EXT_8 \
253 S390_FEAT_MSA_EXT_8, \
254 S390_FEAT_KMA_GCM_AES_128, \
255 S390_FEAT_KMA_GCM_AES_192, \
256 S390_FEAT_KMA_GCM_AES_256 , \
257 S390_FEAT_KMA_GCM_EAES_128, \
258 S390_FEAT_KMA_GCM_EAES_192, \
259 S390_FEAT_KMA_GCM_EAES_256
260
261 #define S390_FEAT_GROUP_MSA_EXT_9 \
262 S390_FEAT_MSA_EXT_9, \
263 S390_FEAT_KDSA_ECDSA_VERIFY_P256, \
264 S390_FEAT_KDSA_ECDSA_VERIFY_P384, \
265 S390_FEAT_KDSA_ECDSA_VERIFY_P512, \
266 S390_FEAT_KDSA_ECDSA_SIGN_P256, \
267 S390_FEAT_KDSA_ECDSA_SIGN_P384, \
268 S390_FEAT_KDSA_ECDSA_SIGN_P512, \
269 S390_FEAT_KDSA_EECDSA_SIGN_P256, \
270 S390_FEAT_KDSA_EECDSA_SIGN_P384, \
271 S390_FEAT_KDSA_EECDSA_SIGN_P512, \
272 S390_FEAT_KDSA_EDDSA_VERIFY_ED25519, \
273 S390_FEAT_KDSA_EDDSA_VERIFY_ED448, \
274 S390_FEAT_KDSA_EDDSA_SIGN_ED25519, \
275 S390_FEAT_KDSA_EDDSA_SIGN_ED448, \
276 S390_FEAT_KDSA_EEDDSA_SIGN_ED25519, \
277 S390_FEAT_KDSA_EEDDSA_SIGN_ED448, \
278 S390_FEAT_PCC_SCALAR_MULT_P256, \
279 S390_FEAT_PCC_SCALAR_MULT_P384, \
280 S390_FEAT_PCC_SCALAR_MULT_P512, \
281 S390_FEAT_PCC_SCALAR_MULT_ED25519, \
282 S390_FEAT_PCC_SCALAR_MULT_ED448, \
283 S390_FEAT_PCC_SCALAR_MULT_X25519, \
284 S390_FEAT_PCC_SCALAR_MULT_X448
285
286 #define S390_FEAT_GROUP_MSA_EXT_9_PCKMO \
287 S390_FEAT_PCKMO_ECC_P256, \
288 S390_FEAT_PCKMO_ECC_P384, \
289 S390_FEAT_PCKMO_ECC_P521, \
290 S390_FEAT_PCKMO_ECC_ED25519, \
291 S390_FEAT_PCKMO_ECC_ED448
292
293 #define S390_FEAT_GROUP_MSA_EXT_10 \
294 S390_FEAT_KM_FULL_XTS_AES_128, \
295 S390_FEAT_KM_FULL_XTS_AES_256, \
296 S390_FEAT_KM_FULL_XTS_EAES_128, \
297 S390_FEAT_KM_FULL_XTS_EAES_256
298
299 #define S390_FEAT_GROUP_MSA_EXT_10_PCKMO \
300 S390_FEAT_PCKMO_AES_XTS_128_DK, \
301 S390_FEAT_PCKMO_AES_XTS_256_DK
302
303 #define S390_FEAT_GROUP_MSA_EXT_11 \
304 S390_FEAT_KMAC_HMAC_SHA_224, \
305 S390_FEAT_KMAC_HMAC_SHA_256, \
306 S390_FEAT_KMAC_HMAC_SHA_384, \
307 S390_FEAT_KMAC_HMAC_SHA_512, \
308 S390_FEAT_KMAC_HMAC_ESHA_224, \
309 S390_FEAT_KMAC_HMAC_ESHA_256, \
310 S390_FEAT_KMAC_HMAC_ESHA_384, \
311 S390_FEAT_KMAC_HMAC_ESHA_512
312
313 #define S390_FEAT_GROUP_MSA_EXT_11_PCKMO \
314 S390_FEAT_PCKMO_HMAC_512, \
315 S390_FEAT_PCKMO_HMAC_1024
316
317 #define S390_FEAT_GROUP_MSA_EXT_12 \
318 S390_FEAT_MSA_EXT_12
319
320 #define S390_FEAT_GROUP_MSA_EXT_13 \
321 S390_FEAT_KDSA_QAI, \
322 S390_FEAT_KIMD_QAI, \
323 S390_FEAT_KLMD_QAI, \
324 S390_FEAT_KMAC_QAI, \
325 S390_FEAT_KMA_QAI, \
326 S390_FEAT_KMCTR_QAI, \
327 S390_FEAT_KMF_QAI, \
328 S390_FEAT_KMO_QAI, \
329 S390_FEAT_KM_QAI, \
330 S390_FEAT_PCC_QAI, \
331 S390_FEAT_PRNO_QAI
332
333 #define S390_FEAT_GROUP_MSA_EXT_13_PCKMO \
334 S390_FEAT_PCKMO_QAI
335
336 #define S390_FEAT_GROUP_ENH_SORT \
337 S390_FEAT_ESORT_BASE, \
338 S390_FEAT_SORTL_SFLR, \
339 S390_FEAT_SORTL_SVLR, \
340 S390_FEAT_SORTL_32, \
341 S390_FEAT_SORTL_128, \
342 S390_FEAT_SORTL_F0
343
344
345 #define S390_FEAT_GROUP_DEFLATE_CONVERSION \
346 S390_FEAT_DEFLATE_BASE, \
347 S390_FEAT_DEFLATE_GHDT, \
348 S390_FEAT_DEFLATE_CMPR, \
349 S390_FEAT_DEFLATE_XPND, \
350 S390_FEAT_DEFLATE_F0
351
352 #define S390_FEAT_GROUP_CONCURRENT_FUNCTIONS \
353 S390_FEAT_CCF_BASE, \
354 S390_FEAT_PFCR_QAF, \
355 S390_FEAT_PFCR_CSDST, \
356 S390_FEAT_PFCR_CSDSTG, \
357 S390_FEAT_PFCR_CSTST, \
358 S390_FEAT_PFCR_CSTSTG
359
360 /* cpu feature groups */
361 static uint16_t group_PLO[] = {
362 S390_FEAT_GROUP_PLO,
363 };
364 static uint16_t group_PLO_EXT[] = {
365 S390_FEAT_GROUP_PLO_EXT,
366 };
367 static uint16_t group_TOD_CLOCK_STEERING[] = {
368 S390_FEAT_GROUP_TOD_CLOCK_STEERING,
369 };
370 static uint16_t group_GEN13_PTFF[] = {
371 S390_FEAT_GROUP_GEN13_PTFF,
372 };
373 static uint16_t group_MULTIPLE_EPOCH_PTFF[] = {
374 S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF,
375 };
376
377 static uint16_t group_GEN17_PTFF[] = {
378 S390_FEAT_GROUP_GEN17_PTFF,
379 };
380
381 static uint16_t group_MSA[] = {
382 S390_FEAT_GROUP_MSA,
383 };
384 static uint16_t group_MSA_EXT_1[] = {
385 S390_FEAT_GROUP_MSA_EXT_1,
386 };
387 static uint16_t group_MSA_EXT_2[] = {
388 S390_FEAT_GROUP_MSA_EXT_2,
389 };
390 static uint16_t group_MSA_EXT_3[] = {
391 S390_FEAT_GROUP_MSA_EXT_3,
392 };
393 static uint16_t group_MSA_EXT_4[] = {
394 S390_FEAT_GROUP_MSA_EXT_4,
395 };
396 static uint16_t group_MSA_EXT_5[] = {
397 S390_FEAT_GROUP_MSA_EXT_5,
398 };
399 static uint16_t group_MSA_EXT_6[] = {
400 S390_FEAT_GROUP_MSA_EXT_6,
401 };
402 static uint16_t group_MSA_EXT_7[] = {
403 S390_FEAT_GROUP_MSA_EXT_7,
404 };
405 static uint16_t group_MSA_EXT_8[] = {
406 S390_FEAT_GROUP_MSA_EXT_8,
407 };
408
409 static uint16_t group_MSA_EXT_9[] = {
410 S390_FEAT_GROUP_MSA_EXT_9,
411 };
412
413 static uint16_t group_MSA_EXT_10[] = {
414 S390_FEAT_GROUP_MSA_EXT_10,
415 };
416
417 static uint16_t group_MSA_EXT_11[] = {
418 S390_FEAT_GROUP_MSA_EXT_11,
419 };
420
421 static uint16_t group_MSA_EXT_12[] = {
422 S390_FEAT_GROUP_MSA_EXT_12,
423 };
424
425 static uint16_t group_MSA_EXT_13[] = {
426 S390_FEAT_GROUP_MSA_EXT_13,
427 };
428
429 static uint16_t group_MSA_EXT_9_PCKMO[] = {
430 S390_FEAT_GROUP_MSA_EXT_9_PCKMO,
431 };
432
433 static uint16_t group_MSA_EXT_10_PCKMO[] = {
434 S390_FEAT_GROUP_MSA_EXT_10_PCKMO,
435 };
436
437 static uint16_t group_MSA_EXT_11_PCKMO[] = {
438 S390_FEAT_GROUP_MSA_EXT_11_PCKMO,
439 };
440
441 static uint16_t group_MSA_EXT_13_PCKMO[] = {
442 S390_FEAT_GROUP_MSA_EXT_13_PCKMO,
443 };
444
445 static uint16_t group_ENH_SORT[] = {
446 S390_FEAT_GROUP_ENH_SORT,
447 };
448
449 static uint16_t group_DEFLATE_CONVERSION[] = {
450 S390_FEAT_GROUP_DEFLATE_CONVERSION,
451 };
452
453 static uint16_t group_CONCURRENT_FUNCTIONS[] = {
454 S390_FEAT_GROUP_CONCURRENT_FUNCTIONS,
455 };
456
457 /* Base features (in order of release)
458 * Only non-hypervisor managed features belong here.
459 * Base feature sets are static meaning they do not change in future QEMU
460 * releases.
461 */
462 static uint16_t base_GEN7_GA1[] = {
463 S390_FEAT_GROUP_PLO,
464 S390_FEAT_ESAN3,
465 S390_FEAT_ZARCH,
466 };
467
468 #define base_GEN7_GA2 EmptyFeat
469 #define base_GEN7_GA3 EmptyFeat
470
471 static uint16_t base_GEN8_GA1[] = {
472 S390_FEAT_DAT_ENH,
473 S390_FEAT_EXTENDED_TRANSLATION_2,
474 S390_FEAT_GROUP_MSA,
475 S390_FEAT_LONG_DISPLACEMENT,
476 S390_FEAT_LONG_DISPLACEMENT_FAST,
477 S390_FEAT_HFP_MADDSUB,
478 };
479
480 #define base_GEN8_GA2 EmptyFeat
481 #define base_GEN8_GA3 EmptyFeat
482 #define base_GEN8_GA4 EmptyFeat
483 #define base_GEN8_GA5 EmptyFeat
484
485 static uint16_t base_GEN9_GA1[] = {
486 S390_FEAT_IDTE_SEGMENT,
487 S390_FEAT_ASN_LX_REUSE,
488 S390_FEAT_STFLE,
489 S390_FEAT_SENSE_RUNNING_STATUS,
490 S390_FEAT_EXTENDED_IMMEDIATE,
491 S390_FEAT_EXTENDED_TRANSLATION_3,
492 S390_FEAT_HFP_UNNORMALIZED_EXT,
493 S390_FEAT_ETF2_ENH,
494 S390_FEAT_STORE_CLOCK_FAST,
495 S390_FEAT_GROUP_TOD_CLOCK_STEERING,
496 S390_FEAT_ETF3_ENH,
497 S390_FEAT_DAT_ENH_2,
498 };
499
500 #define base_GEN9_GA2 EmptyFeat
501 #define base_GEN9_GA3 EmptyFeat
502
503 static uint16_t base_GEN10_GA1[] = {
504 S390_FEAT_CONDITIONAL_SSKE,
505 S390_FEAT_PARSING_ENH,
506 S390_FEAT_MOVE_WITH_OPTIONAL_SPEC,
507 S390_FEAT_EXTRACT_CPU_TIME,
508 S390_FEAT_COMPARE_AND_SWAP_AND_STORE,
509 S390_FEAT_COMPARE_AND_SWAP_AND_STORE_2,
510 S390_FEAT_GENERAL_INSTRUCTIONS_EXT,
511 S390_FEAT_EXECUTE_EXT,
512 S390_FEAT_FLOATING_POINT_SUPPORT_ENH,
513 S390_FEAT_DFP,
514 S390_FEAT_DFP_FAST,
515 S390_FEAT_PFPO,
516 };
517 #define base_GEN10_GA2 EmptyFeat
518 #define base_GEN10_GA3 EmptyFeat
519
520 static uint16_t base_GEN11_GA1[] = {
521 S390_FEAT_NONQ_KEY_SETTING,
522 S390_FEAT_ENHANCED_MONITOR,
523 S390_FEAT_FLOATING_POINT_EXT,
524 S390_FEAT_SET_PROGRAM_PARAMETERS,
525 S390_FEAT_STFLE_45,
526 S390_FEAT_CMPSC_ENH,
527 S390_FEAT_INTERLOCKED_ACCESS_2,
528 };
529
530 #define base_GEN11_GA2 EmptyFeat
531
532 static uint16_t base_GEN12_GA1[] = {
533 S390_FEAT_DFP_ZONED_CONVERSION,
534 S390_FEAT_STFLE_49,
535 S390_FEAT_LOCAL_TLB_CLEARING,
536 };
537
538 #define base_GEN12_GA2 EmptyFeat
539
540 static uint16_t base_GEN13_GA1[] = {
541 S390_FEAT_STFLE_53,
542 S390_FEAT_DFP_PACKED_CONVERSION,
543 S390_FEAT_GROUP_GEN13_PTFF,
544 };
545
546 #define base_GEN13_GA2 EmptyFeat
547
548 static uint16_t base_GEN14_GA1[] = {
549 S390_FEAT_ENTROPY_ENC_COMP,
550 S390_FEAT_MISC_INSTRUCTION_EXT2,
551 S390_FEAT_SEMAPHORE_ASSIST,
552 S390_FEAT_TIME_SLICE_INSTRUMENTATION,
553 S390_FEAT_ORDER_PRESERVING_COMPRESSION,
554 };
555
556 #define base_GEN14_GA2 EmptyFeat
557
558 static uint16_t base_GEN15_GA1[] = {
559 S390_FEAT_MISC_INSTRUCTION_EXT3,
560 };
561
562 #define base_GEN16_GA1 EmptyFeat
563
564 static uint16_t base_GEN17_GA1[] = {
565 S390_FEAT_MISC_INSTRUCTION_EXT4,
566 S390_FEAT_SIF,
567 S390_FEAT_GROUP_MSA_EXT_12,
568 S390_FEAT_GROUP_PLO_EXT,
569 };
570
571 /* Full features (in order of release)
572 * Automatically includes corresponding base features.
573 * Full features are all features this hardware supports even if kvm/QEMU do not
574 * support these features yet.
575 */
576 static uint16_t full_GEN7_GA1[] = {
577 S390_FEAT_PPA15,
578 S390_FEAT_BPB,
579 S390_FEAT_SIE_F2,
580 S390_FEAT_SIE_SKEY,
581 S390_FEAT_SIE_GPERE,
582 S390_FEAT_SIE_IB,
583 S390_FEAT_SIE_CEI,
584 };
585
586 static uint16_t full_GEN7_GA2[] = {
587 S390_FEAT_EXTENDED_TRANSLATION_2,
588 };
589
590 static uint16_t full_GEN7_GA3[] = {
591 S390_FEAT_LONG_DISPLACEMENT,
592 S390_FEAT_SIE_SIIF,
593 };
594
595 static uint16_t full_GEN8_GA1[] = {
596 S390_FEAT_SIE_GSLS,
597 S390_FEAT_SIE_64BSCAO,
598 };
599
600 #define full_GEN8_GA2 EmptyFeat
601
602 static uint16_t full_GEN8_GA3[] = {
603 S390_FEAT_ASN_LX_REUSE,
604 S390_FEAT_EXTENDED_TRANSLATION_3,
605 };
606
607 #define full_GEN8_GA4 EmptyFeat
608 #define full_GEN8_GA5 EmptyFeat
609
610 static uint16_t full_GEN9_GA1[] = {
611 S390_FEAT_STORE_HYPERVISOR_INFO,
612 S390_FEAT_GROUP_MSA_EXT_1,
613 S390_FEAT_CMM,
614 S390_FEAT_SIE_CMMA,
615 };
616
617 static uint16_t full_GEN9_GA2[] = {
618 S390_FEAT_MOVE_WITH_OPTIONAL_SPEC,
619 S390_FEAT_EXTRACT_CPU_TIME,
620 S390_FEAT_COMPARE_AND_SWAP_AND_STORE,
621 S390_FEAT_FLOATING_POINT_SUPPORT_ENH,
622 S390_FEAT_DFP,
623 };
624
625 static uint16_t full_GEN9_GA3[] = {
626 S390_FEAT_CONDITIONAL_SSKE,
627 S390_FEAT_PFPO,
628 };
629
630 static uint16_t full_GEN10_GA1[] = {
631 S390_FEAT_EDAT,
632 S390_FEAT_CONFIGURATION_TOPOLOGY,
633 S390_FEAT_GROUP_MSA_EXT_2,
634 S390_FEAT_ESOP,
635 S390_FEAT_SIE_PFMFI,
636 S390_FEAT_SIE_SIGPIF,
637 };
638
639 static uint16_t full_GEN10_GA2[] = {
640 S390_FEAT_SET_PROGRAM_PARAMETERS,
641 S390_FEAT_SIE_IBS,
642 };
643
644 static uint16_t full_GEN10_GA3[] = {
645 S390_FEAT_GROUP_MSA_EXT_3,
646 };
647
648 static uint16_t full_GEN11_GA1[] = {
649 S390_FEAT_IPTE_RANGE,
650 S390_FEAT_ACCESS_EXCEPTION_FS_INDICATION,
651 S390_FEAT_GROUP_MSA_EXT_4,
652 };
653
654 #define full_GEN11_GA2 EmptyFeat
655
656 static uint16_t full_GEN12_GA1[] = {
657 S390_FEAT_CONSTRAINT_TRANSACTIONAL_EXE,
658 S390_FEAT_TRANSACTIONAL_EXE,
659 S390_FEAT_RUNTIME_INSTRUMENTATION,
660 S390_FEAT_ZPCI,
661 S390_FEAT_ADAPTER_EVENT_NOTIFICATION,
662 S390_FEAT_ADAPTER_INT_SUPPRESSION,
663 S390_FEAT_EDAT_2,
664 S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2,
665 S390_FEAT_AP_QUERY_CONFIG_INFO,
666 S390_FEAT_AP_QUEUE_INTERRUPT_CONTROL,
667 S390_FEAT_AP_FACILITIES_TEST,
668 S390_FEAT_AP,
669 S390_FEAT_EXTENDED_LENGTH_SCCB,
670 S390_FEAT_DIAG_318,
671 };
672
673 static uint16_t full_GEN12_GA2[] = {
674 S390_FEAT_GROUP_MSA_EXT_5,
675 };
676
677 static uint16_t full_GEN13_GA1[] = {
678 S390_FEAT_VECTOR,
679 };
680
681 #define full_GEN13_GA2 EmptyFeat
682
683 static uint16_t full_GEN14_GA1[] = {
684 S390_FEAT_INSTRUCTION_EXEC_PROT,
685 S390_FEAT_GUARDED_STORAGE,
686 S390_FEAT_VECTOR_PACKED_DECIMAL,
687 S390_FEAT_VECTOR_ENH,
688 S390_FEAT_MULTIPLE_EPOCH,
689 S390_FEAT_TEST_PENDING_EXT_INTERRUPTION,
690 S390_FEAT_INSERT_REFERENCE_BITS_MULT,
691 S390_FEAT_GROUP_MSA_EXT_6,
692 S390_FEAT_GROUP_MSA_EXT_7,
693 S390_FEAT_GROUP_MSA_EXT_8,
694 S390_FEAT_CMM_NT,
695 S390_FEAT_ETOKEN,
696 S390_FEAT_HPMA2,
697 S390_FEAT_SIE_KSS,
698 S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF,
699 };
700
701 #define full_GEN14_GA2 EmptyFeat
702
703 static uint16_t full_GEN15_GA1[] = {
704 S390_FEAT_VECTOR_ENH2,
705 S390_FEAT_GROUP_ENH_SORT,
706 S390_FEAT_GROUP_DEFLATE_CONVERSION,
707 S390_FEAT_VECTOR_PACKED_DECIMAL_ENH,
708 S390_FEAT_GROUP_MSA_EXT_9,
709 S390_FEAT_GROUP_MSA_EXT_9_PCKMO,
710 S390_FEAT_ETOKEN,
711 S390_FEAT_UNPACK,
712 };
713
714 static uint16_t full_GEN16_GA1[] = {
715 S390_FEAT_NNPA,
716 S390_FEAT_VECTOR_PACKED_DECIMAL_ENH2,
717 S390_FEAT_BEAR_ENH,
718 S390_FEAT_RDP,
719 S390_FEAT_PAI,
720 S390_FEAT_PAIE,
721 S390_FEAT_UV_FEAT_AP,
722 S390_FEAT_UV_FEAT_AP_INTR,
723 };
724
725 static uint16_t full_GEN17_GA1[] = {
726 S390_FEAT_VECTOR_ENH3,
727 S390_FEAT_VECTOR_PACKED_DECIMAL_ENH3,
728 S390_FEAT_INEFF_NC_TX,
729 S390_FEAT_GROUP_GEN17_PTFF,
730 S390_FEAT_GROUP_MSA_EXT_10,
731 S390_FEAT_GROUP_MSA_EXT_10_PCKMO,
732 S390_FEAT_GROUP_MSA_EXT_11,
733 S390_FEAT_GROUP_MSA_EXT_11_PCKMO,
734 S390_FEAT_GROUP_MSA_EXT_13,
735 S390_FEAT_GROUP_MSA_EXT_13_PCKMO,
736 S390_FEAT_GROUP_CONCURRENT_FUNCTIONS,
737 };
738
739
740 /* Default features (in order of release)
741 * Automatically includes corresponding base features.
742 * Default features are all features this version of QEMU supports for this
743 * hardware model. Default feature sets can grow with new QEMU releases.
744 */
745 #define default_GEN7_GA1 EmptyFeat
746 #define default_GEN7_GA2 EmptyFeat
747 #define default_GEN7_GA3 EmptyFeat
748 #define default_GEN8_GA1 EmptyFeat
749 #define default_GEN8_GA2 EmptyFeat
750 #define default_GEN8_GA3 EmptyFeat
751 #define default_GEN8_GA4 EmptyFeat
752 #define default_GEN8_GA5 EmptyFeat
753
754 static uint16_t default_GEN9_GA1[] = {
755 S390_FEAT_STORE_HYPERVISOR_INFO,
756 S390_FEAT_GROUP_MSA_EXT_1,
757 S390_FEAT_CMM,
758 };
759
760 #define default_GEN9_GA2 EmptyFeat
761 #define default_GEN9_GA3 EmptyFeat
762
763 static uint16_t default_GEN10_GA1[] = {
764 S390_FEAT_EDAT,
765 S390_FEAT_GROUP_MSA_EXT_2,
766 };
767
768 #define default_GEN10_GA2 EmptyFeat
769 #define default_GEN10_GA3 EmptyFeat
770
771 static uint16_t default_GEN11_GA1[] = {
772 S390_FEAT_GROUP_MSA_EXT_3,
773 S390_FEAT_IPTE_RANGE,
774 S390_FEAT_ACCESS_EXCEPTION_FS_INDICATION,
775 S390_FEAT_GROUP_MSA_EXT_4,
776 S390_FEAT_PPA15,
777 S390_FEAT_BPB,
778 };
779
780 #define default_GEN11_GA2 EmptyFeat
781
782 static uint16_t default_GEN12_GA1[] = {
783 S390_FEAT_CONSTRAINT_TRANSACTIONAL_EXE,
784 S390_FEAT_TRANSACTIONAL_EXE,
785 S390_FEAT_RUNTIME_INSTRUMENTATION,
786 S390_FEAT_ZPCI,
787 S390_FEAT_ADAPTER_EVENT_NOTIFICATION,
788 S390_FEAT_EDAT_2,
789 S390_FEAT_ESOP,
790 S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2,
791 };
792
793 #define default_GEN12_GA2 EmptyFeat
794
795 static uint16_t default_GEN13_GA1[] = {
796 S390_FEAT_GROUP_MSA_EXT_5,
797 S390_FEAT_VECTOR,
798 };
799
800 #define default_GEN13_GA2 EmptyFeat
801
802 static uint16_t default_GEN14_GA1[] = {
803 S390_FEAT_INSTRUCTION_EXEC_PROT,
804 S390_FEAT_GUARDED_STORAGE,
805 S390_FEAT_VECTOR_PACKED_DECIMAL,
806 S390_FEAT_VECTOR_ENH,
807 S390_FEAT_GROUP_MSA_EXT_6,
808 S390_FEAT_GROUP_MSA_EXT_7,
809 S390_FEAT_GROUP_MSA_EXT_8,
810 S390_FEAT_MULTIPLE_EPOCH,
811 S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF,
812 };
813
814 #define default_GEN14_GA2 EmptyFeat
815
816 static uint16_t default_GEN15_GA1[] = {
817 S390_FEAT_VECTOR_ENH2,
818 S390_FEAT_GROUP_DEFLATE_CONVERSION,
819 S390_FEAT_VECTOR_PACKED_DECIMAL_ENH,
820 S390_FEAT_GROUP_MSA_EXT_9,
821 S390_FEAT_GROUP_MSA_EXT_9_PCKMO,
822 S390_FEAT_ETOKEN,
823 };
824
825 static uint16_t default_GEN16_GA1[] = {
826 S390_FEAT_NNPA,
827 S390_FEAT_VECTOR_PACKED_DECIMAL_ENH2,
828 S390_FEAT_BEAR_ENH,
829 S390_FEAT_RDP,
830 S390_FEAT_PAI,
831 S390_FEAT_PAIE,
832 };
833
834 static uint16_t default_GEN17_GA1[] = {
835 S390_FEAT_VECTOR_ENH3,
836 S390_FEAT_VECTOR_PACKED_DECIMAL_ENH3,
837 S390_FEAT_GROUP_MSA_EXT_10,
838 S390_FEAT_GROUP_MSA_EXT_10_PCKMO,
839 S390_FEAT_GROUP_MSA_EXT_11,
840 S390_FEAT_GROUP_MSA_EXT_11_PCKMO,
841 S390_FEAT_GROUP_MSA_EXT_13,
842 S390_FEAT_GROUP_MSA_EXT_13_PCKMO,
843 };
844
845 /* QEMU (CPU model) features */
846
847 static uint16_t qemu_MIN[] = {
848 /* Features supported by the default CPU of the oldest machine type */
849 S390_FEAT_GROUP_PLO,
850 S390_FEAT_ESAN3,
851 S390_FEAT_ZARCH,
852 S390_FEAT_DAT_ENH,
853 S390_FEAT_IDTE_SEGMENT,
854 S390_FEAT_STFLE,
855 S390_FEAT_SENSE_RUNNING_STATUS,
856 S390_FEAT_EXTENDED_TRANSLATION_2,
857 S390_FEAT_MSA,
858 S390_FEAT_LONG_DISPLACEMENT,
859 S390_FEAT_LONG_DISPLACEMENT_FAST,
860 S390_FEAT_EXTENDED_IMMEDIATE,
861 S390_FEAT_EXTENDED_TRANSLATION_3,
862 S390_FEAT_ETF2_ENH,
863 S390_FEAT_STORE_CLOCK_FAST,
864 S390_FEAT_MOVE_WITH_OPTIONAL_SPEC,
865 S390_FEAT_ETF3_ENH,
866 S390_FEAT_EXTRACT_CPU_TIME,
867 S390_FEAT_COMPARE_AND_SWAP_AND_STORE,
868 S390_FEAT_COMPARE_AND_SWAP_AND_STORE_2,
869 S390_FEAT_GENERAL_INSTRUCTIONS_EXT,
870 S390_FEAT_EXECUTE_EXT,
871 S390_FEAT_SET_PROGRAM_PARAMETERS,
872 S390_FEAT_FLOATING_POINT_SUPPORT_ENH,
873 S390_FEAT_STFLE_45,
874 S390_FEAT_STFLE_49,
875 S390_FEAT_LOCAL_TLB_CLEARING,
876 S390_FEAT_INTERLOCKED_ACCESS_2,
877 S390_FEAT_ADAPTER_EVENT_NOTIFICATION,
878 S390_FEAT_ADAPTER_INT_SUPPRESSION,
879 S390_FEAT_MSA_EXT_3,
880 S390_FEAT_MSA_EXT_4,
881 /*
882 * Only BFP bits are implemented (HFP, DFP, PFPO and DIVIDE TO INTEGER not
883 * implemented yet).
884 */
885 S390_FEAT_FLOATING_POINT_EXT,
886 S390_FEAT_ZPCI,
887 };
888
889 static uint16_t qemu_V4_1[] = {
890 S390_FEAT_STFLE_53,
891 S390_FEAT_VECTOR,
892 };
893
894 static uint16_t qemu_V6_0[] = {
895 S390_FEAT_ACCESS_EXCEPTION_FS_INDICATION,
896 S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2,
897 S390_FEAT_ESOP,
898 };
899
900 static uint16_t qemu_V6_2[] = {
901 S390_FEAT_INSTRUCTION_EXEC_PROT,
902 S390_FEAT_MISC_INSTRUCTION_EXT2,
903 S390_FEAT_MSA_EXT_8,
904 S390_FEAT_VECTOR_ENH,
905 };
906
907 static uint16_t qemu_V7_0[] = {
908 S390_FEAT_MISC_INSTRUCTION_EXT3,
909 };
910
911 static uint16_t qemu_V7_1[] = {
912 S390_FEAT_VECTOR_ENH2,
913 };
914
915 /*
916 * Features for the "qemu" CPU model of the latest QEMU machine and the "max"
917 * CPU model under TCG. Don't include features that are not part of the full
918 * feature set of the current "max" CPU model generation.
919 */
920 static uint16_t qemu_MAX[] = {
921 S390_FEAT_MSA_EXT_5,
922 S390_FEAT_KIMD_SHA_512,
923 S390_FEAT_KLMD_SHA_512,
924 S390_FEAT_PRNO_TRNG,
925 };
926
927 /****** END FEATURE DEFS ******/
928
929 #define _YEARS "2016"
930 #define _NAME_H "TARGET_S390X_GEN_FEATURES_H"
931
932 #define CPU_FEAT_INITIALIZER(_name) \
933 { \
934 .name = "S390_FEAT_LIST_" #_name, \
935 .base_bits = \
936 { .data = base_##_name, \
937 .len = ARRAY_SIZE(base_##_name) }, \
938 .default_bits = \
939 { .data = default_##_name, \
940 .len = ARRAY_SIZE(default_##_name) }, \
941 .full_bits = \
942 { .data = full_##_name, \
943 .len = ARRAY_SIZE(full_##_name) }, \
944 }
945
946 typedef struct BitSpec {
947 uint16_t *data;
948 uint32_t len;
949 } BitSpec;
950
951 typedef struct {
952 const char *name;
953 BitSpec base_bits;
954 BitSpec default_bits;
955 BitSpec full_bits;
956 } CpuFeatDefSpec;
957
958 static uint16_t EmptyFeat[] = {};
959
960 /*******************************
961 * processor GA series
962 *******************************/
963 static CpuFeatDefSpec CpuFeatDef[] = {
964 CPU_FEAT_INITIALIZER(GEN7_GA1),
965 CPU_FEAT_INITIALIZER(GEN7_GA2),
966 CPU_FEAT_INITIALIZER(GEN7_GA3),
967 CPU_FEAT_INITIALIZER(GEN8_GA1),
968 CPU_FEAT_INITIALIZER(GEN8_GA2),
969 CPU_FEAT_INITIALIZER(GEN8_GA3),
970 CPU_FEAT_INITIALIZER(GEN8_GA4),
971 CPU_FEAT_INITIALIZER(GEN8_GA5),
972 CPU_FEAT_INITIALIZER(GEN9_GA1),
973 CPU_FEAT_INITIALIZER(GEN9_GA2),
974 CPU_FEAT_INITIALIZER(GEN9_GA3),
975 CPU_FEAT_INITIALIZER(GEN10_GA1),
976 CPU_FEAT_INITIALIZER(GEN10_GA2),
977 CPU_FEAT_INITIALIZER(GEN10_GA3),
978 CPU_FEAT_INITIALIZER(GEN11_GA1),
979 CPU_FEAT_INITIALIZER(GEN11_GA2),
980 CPU_FEAT_INITIALIZER(GEN12_GA1),
981 CPU_FEAT_INITIALIZER(GEN12_GA2),
982 CPU_FEAT_INITIALIZER(GEN13_GA1),
983 CPU_FEAT_INITIALIZER(GEN13_GA2),
984 CPU_FEAT_INITIALIZER(GEN14_GA1),
985 CPU_FEAT_INITIALIZER(GEN14_GA2),
986 CPU_FEAT_INITIALIZER(GEN15_GA1),
987 CPU_FEAT_INITIALIZER(GEN16_GA1),
988 CPU_FEAT_INITIALIZER(GEN17_GA1),
989 };
990
991 #define FEAT_GROUP_INITIALIZER(_name) \
992 { \
993 .name = "S390_FEAT_GROUP_LIST_" #_name, \
994 .enum_name = "S390_FEAT_GROUP_" #_name, \
995 .bits = \
996 { .data = group_##_name, \
997 .len = ARRAY_SIZE(group_##_name) }, \
998 }
999
1000 typedef struct {
1001 const char *name;
1002 const char *enum_name;
1003 BitSpec bits;
1004 } FeatGroupDefSpec;
1005
1006 /*******************************
1007 * feature groups
1008 *******************************/
1009 static FeatGroupDefSpec FeatGroupDef[] = {
1010 FEAT_GROUP_INITIALIZER(PLO),
1011 FEAT_GROUP_INITIALIZER(PLO_EXT),
1012 FEAT_GROUP_INITIALIZER(TOD_CLOCK_STEERING),
1013 FEAT_GROUP_INITIALIZER(GEN13_PTFF),
1014 FEAT_GROUP_INITIALIZER(GEN17_PTFF),
1015 FEAT_GROUP_INITIALIZER(MSA),
1016 FEAT_GROUP_INITIALIZER(MSA_EXT_1),
1017 FEAT_GROUP_INITIALIZER(MSA_EXT_2),
1018 FEAT_GROUP_INITIALIZER(MSA_EXT_3),
1019 FEAT_GROUP_INITIALIZER(MSA_EXT_4),
1020 FEAT_GROUP_INITIALIZER(MSA_EXT_5),
1021 FEAT_GROUP_INITIALIZER(MSA_EXT_6),
1022 FEAT_GROUP_INITIALIZER(MSA_EXT_7),
1023 FEAT_GROUP_INITIALIZER(MSA_EXT_8),
1024 FEAT_GROUP_INITIALIZER(MSA_EXT_9),
1025 FEAT_GROUP_INITIALIZER(MSA_EXT_9_PCKMO),
1026 FEAT_GROUP_INITIALIZER(MSA_EXT_10),
1027 FEAT_GROUP_INITIALIZER(MSA_EXT_10_PCKMO),
1028 FEAT_GROUP_INITIALIZER(MSA_EXT_11),
1029 FEAT_GROUP_INITIALIZER(MSA_EXT_11_PCKMO),
1030 FEAT_GROUP_INITIALIZER(MSA_EXT_12),
1031 FEAT_GROUP_INITIALIZER(MSA_EXT_13),
1032 FEAT_GROUP_INITIALIZER(MSA_EXT_13_PCKMO),
1033 FEAT_GROUP_INITIALIZER(MULTIPLE_EPOCH_PTFF),
1034 FEAT_GROUP_INITIALIZER(ENH_SORT),
1035 FEAT_GROUP_INITIALIZER(DEFLATE_CONVERSION),
1036 FEAT_GROUP_INITIALIZER(CONCURRENT_FUNCTIONS),
1037 };
1038
1039 #define QEMU_FEAT_INITIALIZER(_name) \
1040 { \
1041 .name = "S390_FEAT_LIST_QEMU_" #_name, \
1042 .bits = \
1043 { .data = qemu_##_name, \
1044 .len = ARRAY_SIZE(qemu_##_name) }, \
1045 }
1046
1047 /*******************************
1048 * QEMU (CPU model) features
1049 *******************************/
1050 static FeatGroupDefSpec QemuFeatDef[] = {
1051 QEMU_FEAT_INITIALIZER(MIN),
1052 QEMU_FEAT_INITIALIZER(V4_1),
1053 QEMU_FEAT_INITIALIZER(V6_0),
1054 QEMU_FEAT_INITIALIZER(V6_2),
1055 QEMU_FEAT_INITIALIZER(V7_0),
1056 QEMU_FEAT_INITIALIZER(V7_1),
1057 QEMU_FEAT_INITIALIZER(MAX),
1058 };
1059
1060
set_bits(uint64_t list[],BitSpec bits)1061 static void set_bits(uint64_t list[], BitSpec bits)
1062 {
1063 uint32_t i;
1064
1065 for (i = 0; i < bits.len; i++) {
1066 list[bits.data[i] / 64] |= 1ULL << (bits.data[i] % 64);
1067 }
1068 }
1069
clear_bit(uint64_t list[],unsigned long nr)1070 static inline void clear_bit(uint64_t list[], unsigned long nr)
1071 {
1072 list[nr / 64] &= ~(1ULL << (nr % 64));
1073 }
1074
print_feature_defs(void)1075 static void print_feature_defs(void)
1076 {
1077 uint64_t base_feat[S390_FEAT_MAX / 64 + 1] = {};
1078 uint64_t default_feat[S390_FEAT_MAX / 64 + 1] = {};
1079 uint64_t full_feat[S390_FEAT_MAX / 64 + 1] = {};
1080 int i, j;
1081
1082 printf("\n/* CPU model feature list data */\n");
1083
1084 for (i = 0; i < ARRAY_SIZE(CpuFeatDef); i++) {
1085 /* With gen15 CSSKE and BPB are deprecated */
1086 if (strcmp(CpuFeatDef[i].name, "S390_FEAT_LIST_GEN15_GA1") == 0) {
1087 clear_bit(base_feat, S390_FEAT_CONDITIONAL_SSKE);
1088 clear_bit(default_feat, S390_FEAT_CONDITIONAL_SSKE);
1089 clear_bit(default_feat, S390_FEAT_BPB);
1090 }
1091 set_bits(base_feat, CpuFeatDef[i].base_bits);
1092 /* add the base to the default features */
1093 set_bits(default_feat, CpuFeatDef[i].base_bits);
1094 set_bits(default_feat, CpuFeatDef[i].default_bits);
1095 /* add the base to the full features */
1096 set_bits(full_feat, CpuFeatDef[i].base_bits);
1097 set_bits(full_feat, CpuFeatDef[i].full_bits);
1098
1099 printf("#define %s_BASE\t", CpuFeatDef[i].name);
1100 for (j = 0; j < ARRAY_SIZE(base_feat); j++) {
1101 printf("0x%016"PRIx64"ULL", base_feat[j]);
1102 if (j < ARRAY_SIZE(base_feat) - 1) {
1103 printf(",");
1104 } else {
1105 printf("\n");
1106 }
1107 }
1108 printf("#define %s_DEFAULT\t", CpuFeatDef[i].name);
1109 for (j = 0; j < ARRAY_SIZE(default_feat); j++) {
1110 printf("0x%016"PRIx64"ULL", default_feat[j]);
1111 if (j < ARRAY_SIZE(default_feat) - 1) {
1112 printf(",");
1113 } else {
1114 printf("\n");
1115 }
1116 }
1117 printf("#define %s_FULL\t\t", CpuFeatDef[i].name);
1118 for (j = 0; j < ARRAY_SIZE(full_feat); j++) {
1119 printf("0x%016"PRIx64"ULL", full_feat[j]);
1120 if (j < ARRAY_SIZE(full_feat) - 1) {
1121 printf(",");
1122 } else {
1123 printf("\n");
1124 }
1125 }
1126 }
1127 }
1128
print_qemu_feature_defs(void)1129 static void print_qemu_feature_defs(void)
1130 {
1131 uint64_t feat[S390_FEAT_MAX / 64 + 1] = {};
1132 int i, j;
1133
1134 printf("\n/* QEMU (CPU model) feature list data */\n");
1135
1136 /* for now we assume that we only add new features */
1137 for (i = 0; i < ARRAY_SIZE(QemuFeatDef); i++) {
1138 set_bits(feat, QemuFeatDef[i].bits);
1139
1140 printf("#define %s\t", QemuFeatDef[i].name);
1141 for (j = 0; j < ARRAY_SIZE(feat); j++) {
1142 printf("0x%016"PRIx64"ULL", feat[j]);
1143 if (j < ARRAY_SIZE(feat) - 1) {
1144 printf(",");
1145 } else {
1146 printf("\n");
1147 }
1148 }
1149 }
1150 }
1151
print_feature_group_defs(void)1152 static void print_feature_group_defs(void)
1153 {
1154 int i, j;
1155
1156 printf("\n/* CPU feature group list data */\n");
1157
1158 for (i = 0; i < ARRAY_SIZE(FeatGroupDef); i++) {
1159 uint64_t feat[S390_FEAT_MAX / 64 + 1] = {};
1160
1161 set_bits(feat, FeatGroupDef[i].bits);
1162 printf("#define %s\t", FeatGroupDef[i].name);
1163 for (j = 0; j < ARRAY_SIZE(feat); j++) {
1164 printf("0x%016"PRIx64"ULL", feat[j]);
1165 if (j < ARRAY_SIZE(feat) - 1) {
1166 printf(",");
1167 } else {
1168 printf("\n");
1169 }
1170 }
1171 }
1172 }
1173
print_feature_group_enum_type(void)1174 static void print_feature_group_enum_type(void)
1175 {
1176 int i;
1177
1178 printf("\n/* CPU feature group enum type */\n"
1179 "typedef enum {\n");
1180 for (i = 0; i < ARRAY_SIZE(FeatGroupDef); i++) {
1181 printf("\t%s,\n", FeatGroupDef[i].enum_name);
1182 }
1183 printf("\tS390_FEAT_GROUP_MAX,\n"
1184 "} S390FeatGroup;\n");
1185 }
1186
main(int argc,char * argv[])1187 int main(int argc, char *argv[])
1188 {
1189 printf("/*\n"
1190 " * AUTOMATICALLY GENERATED, DO NOT MODIFY HERE, EDIT\n"
1191 " * SOURCE FILE \"%s\" INSTEAD.\n"
1192 " *\n"
1193 " * Copyright %s IBM Corp.\n"
1194 " *\n"
1195 " * This work is licensed under the terms of the GNU GPL, "
1196 "version 2 or (at\n * your option) any later version. See "
1197 "the COPYING file in the top-level\n * directory.\n"
1198 " */\n\n"
1199 "#ifndef %s\n#define %s\n", __FILE__, _YEARS, _NAME_H, _NAME_H);
1200 print_feature_defs();
1201 print_feature_group_defs();
1202 print_qemu_feature_defs();
1203 print_feature_group_enum_type();
1204 printf("\n#endif\n");
1205 return 0;
1206 }
1207