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