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 S390_FEAT_STFLE_53,
888 S390_FEAT_VECTOR,
889 };
890
891 static uint16_t qemu_V6_0[] = {
892 S390_FEAT_ACCESS_EXCEPTION_FS_INDICATION,
893 S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2,
894 S390_FEAT_ESOP,
895 };
896
897 static uint16_t qemu_V6_2[] = {
898 S390_FEAT_INSTRUCTION_EXEC_PROT,
899 S390_FEAT_MISC_INSTRUCTION_EXT2,
900 S390_FEAT_MSA_EXT_8,
901 S390_FEAT_VECTOR_ENH,
902 };
903
904 static uint16_t qemu_V7_0[] = {
905 S390_FEAT_MISC_INSTRUCTION_EXT3,
906 };
907
908 static uint16_t qemu_V7_1[] = {
909 S390_FEAT_VECTOR_ENH2,
910 };
911
912 /*
913 * Features for the "qemu" CPU model of the latest QEMU machine and the "max"
914 * CPU model under TCG. Don't include features that are not part of the full
915 * feature set of the current "max" CPU model generation.
916 */
917 static uint16_t qemu_MAX[] = {
918 S390_FEAT_MSA_EXT_5,
919 S390_FEAT_KIMD_SHA_512,
920 S390_FEAT_KLMD_SHA_512,
921 S390_FEAT_PRNO_TRNG,
922 };
923
924 /****** END FEATURE DEFS ******/
925
926 #define _YEARS "2016"
927 #define _NAME_H "TARGET_S390X_GEN_FEATURES_H"
928
929 #define CPU_FEAT_INITIALIZER(_name) \
930 { \
931 .name = "S390_FEAT_LIST_" #_name, \
932 .base_bits = \
933 { .data = base_##_name, \
934 .len = ARRAY_SIZE(base_##_name) }, \
935 .default_bits = \
936 { .data = default_##_name, \
937 .len = ARRAY_SIZE(default_##_name) }, \
938 .full_bits = \
939 { .data = full_##_name, \
940 .len = ARRAY_SIZE(full_##_name) }, \
941 }
942
943 typedef struct BitSpec {
944 uint16_t *data;
945 uint32_t len;
946 } BitSpec;
947
948 typedef struct {
949 const char *name;
950 BitSpec base_bits;
951 BitSpec default_bits;
952 BitSpec full_bits;
953 } CpuFeatDefSpec;
954
955 static uint16_t EmptyFeat[] = {};
956
957 /*******************************
958 * processor GA series
959 *******************************/
960 static CpuFeatDefSpec CpuFeatDef[] = {
961 CPU_FEAT_INITIALIZER(GEN7_GA1),
962 CPU_FEAT_INITIALIZER(GEN7_GA2),
963 CPU_FEAT_INITIALIZER(GEN7_GA3),
964 CPU_FEAT_INITIALIZER(GEN8_GA1),
965 CPU_FEAT_INITIALIZER(GEN8_GA2),
966 CPU_FEAT_INITIALIZER(GEN8_GA3),
967 CPU_FEAT_INITIALIZER(GEN8_GA4),
968 CPU_FEAT_INITIALIZER(GEN8_GA5),
969 CPU_FEAT_INITIALIZER(GEN9_GA1),
970 CPU_FEAT_INITIALIZER(GEN9_GA2),
971 CPU_FEAT_INITIALIZER(GEN9_GA3),
972 CPU_FEAT_INITIALIZER(GEN10_GA1),
973 CPU_FEAT_INITIALIZER(GEN10_GA2),
974 CPU_FEAT_INITIALIZER(GEN10_GA3),
975 CPU_FEAT_INITIALIZER(GEN11_GA1),
976 CPU_FEAT_INITIALIZER(GEN11_GA2),
977 CPU_FEAT_INITIALIZER(GEN12_GA1),
978 CPU_FEAT_INITIALIZER(GEN12_GA2),
979 CPU_FEAT_INITIALIZER(GEN13_GA1),
980 CPU_FEAT_INITIALIZER(GEN13_GA2),
981 CPU_FEAT_INITIALIZER(GEN14_GA1),
982 CPU_FEAT_INITIALIZER(GEN14_GA2),
983 CPU_FEAT_INITIALIZER(GEN15_GA1),
984 CPU_FEAT_INITIALIZER(GEN16_GA1),
985 CPU_FEAT_INITIALIZER(GEN17_GA1),
986 };
987
988 #define FEAT_GROUP_INITIALIZER(_name) \
989 { \
990 .name = "S390_FEAT_GROUP_LIST_" #_name, \
991 .enum_name = "S390_FEAT_GROUP_" #_name, \
992 .bits = \
993 { .data = group_##_name, \
994 .len = ARRAY_SIZE(group_##_name) }, \
995 }
996
997 typedef struct {
998 const char *name;
999 const char *enum_name;
1000 BitSpec bits;
1001 } FeatGroupDefSpec;
1002
1003 /*******************************
1004 * feature groups
1005 *******************************/
1006 static FeatGroupDefSpec FeatGroupDef[] = {
1007 FEAT_GROUP_INITIALIZER(PLO),
1008 FEAT_GROUP_INITIALIZER(PLO_EXT),
1009 FEAT_GROUP_INITIALIZER(TOD_CLOCK_STEERING),
1010 FEAT_GROUP_INITIALIZER(GEN13_PTFF),
1011 FEAT_GROUP_INITIALIZER(GEN17_PTFF),
1012 FEAT_GROUP_INITIALIZER(MSA),
1013 FEAT_GROUP_INITIALIZER(MSA_EXT_1),
1014 FEAT_GROUP_INITIALIZER(MSA_EXT_2),
1015 FEAT_GROUP_INITIALIZER(MSA_EXT_3),
1016 FEAT_GROUP_INITIALIZER(MSA_EXT_4),
1017 FEAT_GROUP_INITIALIZER(MSA_EXT_5),
1018 FEAT_GROUP_INITIALIZER(MSA_EXT_6),
1019 FEAT_GROUP_INITIALIZER(MSA_EXT_7),
1020 FEAT_GROUP_INITIALIZER(MSA_EXT_8),
1021 FEAT_GROUP_INITIALIZER(MSA_EXT_9),
1022 FEAT_GROUP_INITIALIZER(MSA_EXT_9_PCKMO),
1023 FEAT_GROUP_INITIALIZER(MSA_EXT_10),
1024 FEAT_GROUP_INITIALIZER(MSA_EXT_10_PCKMO),
1025 FEAT_GROUP_INITIALIZER(MSA_EXT_11),
1026 FEAT_GROUP_INITIALIZER(MSA_EXT_11_PCKMO),
1027 FEAT_GROUP_INITIALIZER(MSA_EXT_12),
1028 FEAT_GROUP_INITIALIZER(MSA_EXT_13),
1029 FEAT_GROUP_INITIALIZER(MSA_EXT_13_PCKMO),
1030 FEAT_GROUP_INITIALIZER(MULTIPLE_EPOCH_PTFF),
1031 FEAT_GROUP_INITIALIZER(ENH_SORT),
1032 FEAT_GROUP_INITIALIZER(DEFLATE_CONVERSION),
1033 FEAT_GROUP_INITIALIZER(CONCURRENT_FUNCTIONS),
1034 };
1035
1036 #define QEMU_FEAT_INITIALIZER(_name) \
1037 { \
1038 .name = "S390_FEAT_LIST_QEMU_" #_name, \
1039 .bits = \
1040 { .data = qemu_##_name, \
1041 .len = ARRAY_SIZE(qemu_##_name) }, \
1042 }
1043
1044 /*******************************
1045 * QEMU (CPU model) features
1046 *******************************/
1047 static FeatGroupDefSpec QemuFeatDef[] = {
1048 QEMU_FEAT_INITIALIZER(MIN),
1049 QEMU_FEAT_INITIALIZER(V6_0),
1050 QEMU_FEAT_INITIALIZER(V6_2),
1051 QEMU_FEAT_INITIALIZER(V7_0),
1052 QEMU_FEAT_INITIALIZER(V7_1),
1053 QEMU_FEAT_INITIALIZER(MAX),
1054 };
1055
1056
set_bits(uint64_t list[],BitSpec bits)1057 static void set_bits(uint64_t list[], BitSpec bits)
1058 {
1059 uint32_t i;
1060
1061 for (i = 0; i < bits.len; i++) {
1062 list[bits.data[i] / 64] |= 1ULL << (bits.data[i] % 64);
1063 }
1064 }
1065
clear_bit(uint64_t list[],unsigned long nr)1066 static inline void clear_bit(uint64_t list[], unsigned long nr)
1067 {
1068 list[nr / 64] &= ~(1ULL << (nr % 64));
1069 }
1070
print_feature_defs(void)1071 static void print_feature_defs(void)
1072 {
1073 uint64_t base_feat[S390_FEAT_MAX / 64 + 1] = {};
1074 uint64_t default_feat[S390_FEAT_MAX / 64 + 1] = {};
1075 uint64_t full_feat[S390_FEAT_MAX / 64 + 1] = {};
1076 int i, j;
1077
1078 printf("\n/* CPU model feature list data */\n");
1079
1080 for (i = 0; i < ARRAY_SIZE(CpuFeatDef); i++) {
1081 /* With gen15 CSSKE and BPB are deprecated */
1082 if (strcmp(CpuFeatDef[i].name, "S390_FEAT_LIST_GEN15_GA1") == 0) {
1083 clear_bit(base_feat, S390_FEAT_CONDITIONAL_SSKE);
1084 clear_bit(default_feat, S390_FEAT_CONDITIONAL_SSKE);
1085 clear_bit(default_feat, S390_FEAT_BPB);
1086 }
1087 set_bits(base_feat, CpuFeatDef[i].base_bits);
1088 /* add the base to the default features */
1089 set_bits(default_feat, CpuFeatDef[i].base_bits);
1090 set_bits(default_feat, CpuFeatDef[i].default_bits);
1091 /* add the base to the full features */
1092 set_bits(full_feat, CpuFeatDef[i].base_bits);
1093 set_bits(full_feat, CpuFeatDef[i].full_bits);
1094
1095 printf("#define %s_BASE\t", CpuFeatDef[i].name);
1096 for (j = 0; j < ARRAY_SIZE(base_feat); j++) {
1097 printf("0x%016"PRIx64"ULL", base_feat[j]);
1098 if (j < ARRAY_SIZE(base_feat) - 1) {
1099 printf(",");
1100 } else {
1101 printf("\n");
1102 }
1103 }
1104 printf("#define %s_DEFAULT\t", CpuFeatDef[i].name);
1105 for (j = 0; j < ARRAY_SIZE(default_feat); j++) {
1106 printf("0x%016"PRIx64"ULL", default_feat[j]);
1107 if (j < ARRAY_SIZE(default_feat) - 1) {
1108 printf(",");
1109 } else {
1110 printf("\n");
1111 }
1112 }
1113 printf("#define %s_FULL\t\t", CpuFeatDef[i].name);
1114 for (j = 0; j < ARRAY_SIZE(full_feat); j++) {
1115 printf("0x%016"PRIx64"ULL", full_feat[j]);
1116 if (j < ARRAY_SIZE(full_feat) - 1) {
1117 printf(",");
1118 } else {
1119 printf("\n");
1120 }
1121 }
1122 }
1123 }
1124
print_qemu_feature_defs(void)1125 static void print_qemu_feature_defs(void)
1126 {
1127 uint64_t feat[S390_FEAT_MAX / 64 + 1] = {};
1128 int i, j;
1129
1130 printf("\n/* QEMU (CPU model) feature list data */\n");
1131
1132 /* for now we assume that we only add new features */
1133 for (i = 0; i < ARRAY_SIZE(QemuFeatDef); i++) {
1134 set_bits(feat, QemuFeatDef[i].bits);
1135
1136 printf("#define %s\t", QemuFeatDef[i].name);
1137 for (j = 0; j < ARRAY_SIZE(feat); j++) {
1138 printf("0x%016"PRIx64"ULL", feat[j]);
1139 if (j < ARRAY_SIZE(feat) - 1) {
1140 printf(",");
1141 } else {
1142 printf("\n");
1143 }
1144 }
1145 }
1146 }
1147
print_feature_group_defs(void)1148 static void print_feature_group_defs(void)
1149 {
1150 int i, j;
1151
1152 printf("\n/* CPU feature group list data */\n");
1153
1154 for (i = 0; i < ARRAY_SIZE(FeatGroupDef); i++) {
1155 uint64_t feat[S390_FEAT_MAX / 64 + 1] = {};
1156
1157 set_bits(feat, FeatGroupDef[i].bits);
1158 printf("#define %s\t", FeatGroupDef[i].name);
1159 for (j = 0; j < ARRAY_SIZE(feat); j++) {
1160 printf("0x%016"PRIx64"ULL", feat[j]);
1161 if (j < ARRAY_SIZE(feat) - 1) {
1162 printf(",");
1163 } else {
1164 printf("\n");
1165 }
1166 }
1167 }
1168 }
1169
print_feature_group_enum_type(void)1170 static void print_feature_group_enum_type(void)
1171 {
1172 int i;
1173
1174 printf("\n/* CPU feature group enum type */\n"
1175 "typedef enum {\n");
1176 for (i = 0; i < ARRAY_SIZE(FeatGroupDef); i++) {
1177 printf("\t%s,\n", FeatGroupDef[i].enum_name);
1178 }
1179 printf("\tS390_FEAT_GROUP_MAX,\n"
1180 "} S390FeatGroup;\n");
1181 }
1182
main(int argc,char * argv[])1183 int main(int argc, char *argv[])
1184 {
1185 printf("/*\n"
1186 " * AUTOMATICALLY GENERATED, DO NOT MODIFY HERE, EDIT\n"
1187 " * SOURCE FILE \"%s\" INSTEAD.\n"
1188 " *\n"
1189 " * Copyright %s IBM Corp.\n"
1190 " *\n"
1191 " * This work is licensed under the terms of the GNU GPL, "
1192 "version 2 or (at\n * your option) any later version. See "
1193 "the COPYING file in the top-level\n * directory.\n"
1194 " */\n\n"
1195 "#ifndef %s\n#define %s\n", __FILE__, _YEARS, _NAME_H, _NAME_H);
1196 print_feature_defs();
1197 print_feature_group_defs();
1198 print_qemu_feature_defs();
1199 print_feature_group_enum_type();
1200 printf("\n#endif\n");
1201 return 0;
1202 }
1203