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