xref: /qemu/target/s390x/gen-features.c (revision 92fbc2ffc92f387c2ccb00b38ac800ca924c079a)
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