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