]>
Commit | Line | Data |
---|---|---|
dced7eec MM |
1 | /* |
2 | * S390 feature list generator | |
3 | * | |
27e84d4e | 4 | * Copyright IBM Corp. 2016, 2018 |
dced7eec MM |
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. | |
dced7eec MM |
12 | */ |
13 | ||
d8e39b70 MA |
14 | #include <inttypes.h> |
15 | #include <stdio.h> | |
caef6243 | 16 | #include <string.h> |
dced7eec MM |
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 | ||
46a99c9f DH |
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 | ||
dced7eec MM |
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 | ||
6da5c593 JH |
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 | ||
5dacbe23 CB |
217 | #define S390_FEAT_GROUP_MSA_EXT_9 \ |
218 | S390_FEAT_MSA_EXT_9, \ | |
ef506f80 DH |
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, \ | |
5dacbe23 CB |
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 | ||
d220fabf CB |
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 | ||
afc7b866 CB |
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 | ||
90229ebb DH |
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 | }; | |
46a99c9f DH |
275 | static uint16_t group_MULTIPLE_EPOCH_PTFF[] = { |
276 | S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF, | |
277 | }; | |
90229ebb DH |
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 | }; | |
6da5c593 JH |
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 | }; | |
90229ebb | 305 | |
5dacbe23 CB |
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 | ||
d220fabf CB |
314 | static uint16_t group_ENH_SORT[] = { |
315 | S390_FEAT_GROUP_ENH_SORT, | |
316 | }; | |
317 | ||
afc7b866 CB |
318 | static uint16_t group_DEFLATE_CONVERSION[] = { |
319 | S390_FEAT_GROUP_DEFLATE_CONVERSION, | |
320 | }; | |
321 | ||
ec3aadb1 JH |
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 | */ | |
dced7eec MM |
327 | static uint16_t base_GEN7_GA1[] = { |
328 | S390_FEAT_GROUP_PLO, | |
329 | S390_FEAT_ESAN3, | |
330 | S390_FEAT_ZARCH, | |
331 | }; | |
ec3aadb1 | 332 | |
dced7eec MM |
333 | #define base_GEN7_GA2 EmptyFeat |
334 | #define base_GEN7_GA3 EmptyFeat | |
ec3aadb1 | 335 | |
dced7eec MM |
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 | }; | |
ec3aadb1 | 344 | |
dced7eec MM |
345 | #define base_GEN8_GA2 EmptyFeat |
346 | #define base_GEN8_GA3 EmptyFeat | |
347 | #define base_GEN8_GA4 EmptyFeat | |
348 | #define base_GEN8_GA5 EmptyFeat | |
ec3aadb1 | 349 | |
dced7eec MM |
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 | }; | |
ec3aadb1 | 364 | |
dced7eec MM |
365 | #define base_GEN9_GA2 EmptyFeat |
366 | #define base_GEN9_GA3 EmptyFeat | |
ec3aadb1 | 367 | |
dced7eec MM |
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 | |
ec3aadb1 | 384 | |
dced7eec MM |
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 | }; | |
ec3aadb1 | 394 | |
dced7eec | 395 | #define base_GEN11_GA2 EmptyFeat |
ec3aadb1 | 396 | |
dced7eec MM |
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 | }; | |
ec3aadb1 | 402 | |
dced7eec | 403 | #define base_GEN12_GA2 EmptyFeat |
ec3aadb1 | 404 | |
dced7eec MM |
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 | }; | |
ec3aadb1 | 410 | |
dced7eec MM |
411 | #define base_GEN13_GA2 EmptyFeat |
412 | ||
cc28a594 JH |
413 | static uint16_t base_GEN14_GA1[] = { |
414 | S390_FEAT_ENTROPY_ENC_COMP, | |
98998cda | 415 | S390_FEAT_MISC_INSTRUCTION_EXT2, |
cc28a594 JH |
416 | S390_FEAT_SEMAPHORE_ASSIST, |
417 | S390_FEAT_TIME_SLICE_INSTRUMENTATION, | |
418 | S390_FEAT_ORDER_PRESERVING_COMPRESSION, | |
419 | }; | |
420 | ||
f2a7d157 CW |
421 | #define base_GEN14_GA2 EmptyFeat |
422 | ||
caef6243 CB |
423 | static uint16_t base_GEN15_GA1[] = { |
424 | S390_FEAT_MISC_INSTRUCTION_EXT3, | |
425 | }; | |
426 | ||
ec3aadb1 JH |
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 | */ | |
dced7eec | 432 | static uint16_t full_GEN7_GA1[] = { |
9f0d13f4 | 433 | S390_FEAT_PPA15, |
b073c875 | 434 | S390_FEAT_BPB, |
dced7eec MM |
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 | }; | |
ec3aadb1 | 441 | |
dced7eec MM |
442 | static uint16_t full_GEN7_GA2[] = { |
443 | S390_FEAT_EXTENDED_TRANSLATION_2, | |
444 | }; | |
ec3aadb1 | 445 | |
dced7eec MM |
446 | static uint16_t full_GEN7_GA3[] = { |
447 | S390_FEAT_LONG_DISPLACEMENT, | |
448 | S390_FEAT_SIE_SIIF, | |
449 | }; | |
ec3aadb1 | 450 | |
dced7eec MM |
451 | static uint16_t full_GEN8_GA1[] = { |
452 | S390_FEAT_SIE_GSLS, | |
453 | S390_FEAT_SIE_64BSCAO, | |
454 | }; | |
ec3aadb1 | 455 | |
dced7eec | 456 | #define full_GEN8_GA2 EmptyFeat |
ec3aadb1 | 457 | |
dced7eec MM |
458 | static uint16_t full_GEN8_GA3[] = { |
459 | S390_FEAT_ASN_LX_REUSE, | |
460 | S390_FEAT_EXTENDED_TRANSLATION_3, | |
461 | }; | |
ec3aadb1 | 462 | |
dced7eec MM |
463 | #define full_GEN8_GA4 EmptyFeat |
464 | #define full_GEN8_GA5 EmptyFeat | |
ec3aadb1 | 465 | |
dced7eec MM |
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 | }; | |
ec3aadb1 | 472 | |
dced7eec MM |
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 | }; | |
ec3aadb1 | 480 | |
dced7eec MM |
481 | static uint16_t full_GEN9_GA3[] = { |
482 | S390_FEAT_CONDITIONAL_SSKE, | |
483 | S390_FEAT_PFPO, | |
484 | }; | |
ec3aadb1 | 485 | |
dced7eec MM |
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 | }; | |
ec3aadb1 | 494 | |
dced7eec MM |
495 | static uint16_t full_GEN10_GA2[] = { |
496 | S390_FEAT_SET_PROGRAM_PARAMETERS, | |
497 | S390_FEAT_SIE_IBS, | |
498 | }; | |
ec3aadb1 | 499 | |
dced7eec MM |
500 | static uint16_t full_GEN10_GA3[] = { |
501 | S390_FEAT_GROUP_MSA_EXT_3, | |
502 | }; | |
ec3aadb1 | 503 | |
dced7eec MM |
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 | }; | |
ec3aadb1 | 509 | |
dced7eec | 510 | #define full_GEN11_GA2 EmptyFeat |
ec3aadb1 | 511 | |
dced7eec MM |
512 | static uint16_t full_GEN12_GA1[] = { |
513 | S390_FEAT_CONSTRAINT_TRANSACTIONAL_EXE, | |
514 | S390_FEAT_TRANSACTIONAL_EXE, | |
515 | S390_FEAT_RUNTIME_INSTRUMENTATION, | |
3b00f702 YMZ |
516 | S390_FEAT_ZPCI, |
517 | S390_FEAT_ADAPTER_EVENT_NOTIFICATION, | |
518 | S390_FEAT_ADAPTER_INT_SUPPRESSION, | |
dced7eec | 519 | S390_FEAT_EDAT_2, |
7223bcce | 520 | S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2, |
c5cd17af | 521 | S390_FEAT_AP_QUERY_CONFIG_INFO, |
9ef2d19e | 522 | S390_FEAT_AP_QUEUE_INTERRUPT_CONTROL, |
c5cd17af TK |
523 | S390_FEAT_AP_FACILITIES_TEST, |
524 | S390_FEAT_AP, | |
1ecd6078 | 525 | S390_FEAT_EXTENDED_LENGTH_SCCB, |
fabdada9 | 526 | S390_FEAT_DIAG_318, |
dced7eec | 527 | }; |
ec3aadb1 | 528 | |
dced7eec MM |
529 | static uint16_t full_GEN12_GA2[] = { |
530 | S390_FEAT_GROUP_MSA_EXT_5, | |
531 | }; | |
ec3aadb1 | 532 | |
dced7eec MM |
533 | static uint16_t full_GEN13_GA1[] = { |
534 | S390_FEAT_VECTOR, | |
535 | }; | |
ec3aadb1 | 536 | |
dced7eec MM |
537 | #define full_GEN13_GA2 EmptyFeat |
538 | ||
cc28a594 JH |
539 | static uint16_t full_GEN14_GA1[] = { |
540 | S390_FEAT_INSTRUCTION_EXEC_PROT, | |
541 | S390_FEAT_GUARDED_STORAGE, | |
542 | S390_FEAT_VECTOR_PACKED_DECIMAL, | |
543 | S390_FEAT_VECTOR_ENH, | |
544 | S390_FEAT_MULTIPLE_EPOCH, | |
545 | S390_FEAT_TEST_PENDING_EXT_INTERRUPTION, | |
546 | S390_FEAT_INSERT_REFERENCE_BITS_MULT, | |
547 | S390_FEAT_GROUP_MSA_EXT_6, | |
548 | S390_FEAT_GROUP_MSA_EXT_7, | |
549 | S390_FEAT_GROUP_MSA_EXT_8, | |
550 | S390_FEAT_CMM_NT, | |
27e84d4e | 551 | S390_FEAT_ETOKEN, |
cc28a594 JH |
552 | S390_FEAT_HPMA2, |
553 | S390_FEAT_SIE_KSS, | |
46a99c9f | 554 | S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF, |
cc28a594 JH |
555 | }; |
556 | ||
f2a7d157 CW |
557 | #define full_GEN14_GA2 EmptyFeat |
558 | ||
caef6243 CB |
559 | static uint16_t full_GEN15_GA1[] = { |
560 | S390_FEAT_VECTOR_ENH2, | |
561 | S390_FEAT_GROUP_ENH_SORT, | |
562 | S390_FEAT_GROUP_DEFLATE_CONVERSION, | |
5d8866c8 | 563 | S390_FEAT_VECTOR_PACKED_DECIMAL_ENH, |
caef6243 CB |
564 | S390_FEAT_GROUP_MSA_EXT_9, |
565 | S390_FEAT_GROUP_MSA_EXT_9_PCKMO, | |
566 | S390_FEAT_ETOKEN, | |
572c0826 | 567 | S390_FEAT_UNPACK, |
caef6243 CB |
568 | }; |
569 | ||
ec3aadb1 JH |
570 | /* Default features (in order of release) |
571 | * Automatically includes corresponding base features. | |
572 | * Default features are all features this version of QEMU supports for this | |
573 | * hardware model. Default feature sets can grow with new QEMU releases. | |
574 | */ | |
dced7eec MM |
575 | #define default_GEN7_GA1 EmptyFeat |
576 | #define default_GEN7_GA2 EmptyFeat | |
577 | #define default_GEN7_GA3 EmptyFeat | |
578 | #define default_GEN8_GA1 EmptyFeat | |
579 | #define default_GEN8_GA2 EmptyFeat | |
580 | #define default_GEN8_GA3 EmptyFeat | |
581 | #define default_GEN8_GA4 EmptyFeat | |
582 | #define default_GEN8_GA5 EmptyFeat | |
ec3aadb1 | 583 | |
dced7eec MM |
584 | static uint16_t default_GEN9_GA1[] = { |
585 | S390_FEAT_STORE_HYPERVISOR_INFO, | |
586 | S390_FEAT_GROUP_MSA_EXT_1, | |
07059eff | 587 | S390_FEAT_CMM, |
dced7eec | 588 | }; |
ec3aadb1 | 589 | |
dced7eec MM |
590 | #define default_GEN9_GA2 EmptyFeat |
591 | #define default_GEN9_GA3 EmptyFeat | |
ec3aadb1 | 592 | |
dced7eec MM |
593 | static uint16_t default_GEN10_GA1[] = { |
594 | S390_FEAT_EDAT, | |
595 | S390_FEAT_GROUP_MSA_EXT_2, | |
596 | }; | |
ec3aadb1 | 597 | |
dced7eec MM |
598 | #define default_GEN10_GA2 EmptyFeat |
599 | #define default_GEN10_GA3 EmptyFeat | |
ec3aadb1 | 600 | |
dced7eec MM |
601 | static uint16_t default_GEN11_GA1[] = { |
602 | S390_FEAT_GROUP_MSA_EXT_3, | |
603 | S390_FEAT_IPTE_RANGE, | |
604 | S390_FEAT_ACCESS_EXCEPTION_FS_INDICATION, | |
605 | S390_FEAT_GROUP_MSA_EXT_4, | |
87273151 CB |
606 | S390_FEAT_PPA15, |
607 | S390_FEAT_BPB, | |
dced7eec | 608 | }; |
ec3aadb1 | 609 | |
dced7eec | 610 | #define default_GEN11_GA2 EmptyFeat |
ec3aadb1 | 611 | |
dced7eec MM |
612 | static uint16_t default_GEN12_GA1[] = { |
613 | S390_FEAT_CONSTRAINT_TRANSACTIONAL_EXE, | |
614 | S390_FEAT_TRANSACTIONAL_EXE, | |
615 | S390_FEAT_RUNTIME_INSTRUMENTATION, | |
3b00f702 YMZ |
616 | S390_FEAT_ZPCI, |
617 | S390_FEAT_ADAPTER_EVENT_NOTIFICATION, | |
dced7eec | 618 | S390_FEAT_EDAT_2, |
7223bcce JH |
619 | S390_FEAT_ESOP, |
620 | S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2, | |
dced7eec | 621 | }; |
ec3aadb1 | 622 | |
dced7eec | 623 | #define default_GEN12_GA2 EmptyFeat |
ec3aadb1 | 624 | |
dced7eec MM |
625 | static uint16_t default_GEN13_GA1[] = { |
626 | S390_FEAT_GROUP_MSA_EXT_5, | |
627 | S390_FEAT_VECTOR, | |
628 | }; | |
ec3aadb1 | 629 | |
dced7eec MM |
630 | #define default_GEN13_GA2 EmptyFeat |
631 | ||
cc28a594 | 632 | static uint16_t default_GEN14_GA1[] = { |
cc28a594 JH |
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_GROUP_MSA_EXT_6, | |
638 | S390_FEAT_GROUP_MSA_EXT_7, | |
639 | S390_FEAT_GROUP_MSA_EXT_8, | |
84176c79 CW |
640 | S390_FEAT_MULTIPLE_EPOCH, |
641 | S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF, | |
cc28a594 JH |
642 | }; |
643 | ||
f2a7d157 CW |
644 | #define default_GEN14_GA2 EmptyFeat |
645 | ||
caef6243 CB |
646 | static uint16_t default_GEN15_GA1[] = { |
647 | S390_FEAT_VECTOR_ENH2, | |
caef6243 | 648 | S390_FEAT_GROUP_DEFLATE_CONVERSION, |
5d8866c8 | 649 | S390_FEAT_VECTOR_PACKED_DECIMAL_ENH, |
caef6243 CB |
650 | S390_FEAT_GROUP_MSA_EXT_9, |
651 | S390_FEAT_GROUP_MSA_EXT_9_PCKMO, | |
652 | S390_FEAT_ETOKEN, | |
653 | }; | |
654 | ||
35b4df64 DH |
655 | /* QEMU (CPU model) features */ |
656 | ||
657 | static uint16_t qemu_V2_11[] = { | |
658 | S390_FEAT_GROUP_PLO, | |
659 | S390_FEAT_ESAN3, | |
660 | S390_FEAT_ZARCH, | |
661 | }; | |
662 | ||
d646b16b | 663 | static uint16_t qemu_V3_1[] = { |
35b4df64 DH |
664 | S390_FEAT_DAT_ENH, |
665 | S390_FEAT_IDTE_SEGMENT, | |
666 | S390_FEAT_STFLE, | |
667 | S390_FEAT_SENSE_RUNNING_STATUS, | |
668 | S390_FEAT_EXTENDED_TRANSLATION_2, | |
669 | S390_FEAT_MSA, | |
670 | S390_FEAT_LONG_DISPLACEMENT, | |
671 | S390_FEAT_LONG_DISPLACEMENT_FAST, | |
672 | S390_FEAT_EXTENDED_IMMEDIATE, | |
673 | S390_FEAT_EXTENDED_TRANSLATION_3, | |
674 | S390_FEAT_ETF2_ENH, | |
675 | S390_FEAT_STORE_CLOCK_FAST, | |
676 | S390_FEAT_MOVE_WITH_OPTIONAL_SPEC, | |
677 | S390_FEAT_ETF3_ENH, | |
678 | S390_FEAT_EXTRACT_CPU_TIME, | |
679 | S390_FEAT_COMPARE_AND_SWAP_AND_STORE, | |
680 | S390_FEAT_COMPARE_AND_SWAP_AND_STORE_2, | |
681 | S390_FEAT_GENERAL_INSTRUCTIONS_EXT, | |
682 | S390_FEAT_EXECUTE_EXT, | |
683 | S390_FEAT_SET_PROGRAM_PARAMETERS, | |
684 | S390_FEAT_FLOATING_POINT_SUPPPORT_ENH, | |
685 | S390_FEAT_STFLE_45, | |
686 | S390_FEAT_STFLE_49, | |
687 | S390_FEAT_LOCAL_TLB_CLEARING, | |
688 | S390_FEAT_INTERLOCKED_ACCESS_2, | |
e3fd586d CH |
689 | S390_FEAT_ADAPTER_EVENT_NOTIFICATION, |
690 | S390_FEAT_ADAPTER_INT_SUPPRESSION, | |
35b4df64 | 691 | S390_FEAT_MSA_EXT_3, |
e3fd586d | 692 | S390_FEAT_MSA_EXT_4, |
35b4df64 DH |
693 | }; |
694 | ||
08ef92d5 | 695 | static uint16_t qemu_V4_0[] = { |
df192fbc DH |
696 | /* |
697 | * Only BFP bits are implemented (HFP, DFP, PFPO and DIVIDE TO INTEGER not | |
698 | * implemented yet). | |
699 | */ | |
700 | S390_FEAT_FLOATING_POINT_EXT, | |
d646b16b DH |
701 | S390_FEAT_ZPCI, |
702 | }; | |
703 | ||
faa40177 | 704 | static uint16_t qemu_V4_1[] = { |
35b4df64 | 705 | S390_FEAT_STFLE_53, |
c7f22b31 | 706 | S390_FEAT_VECTOR, |
08ef92d5 DH |
707 | }; |
708 | ||
faa40177 | 709 | static uint16_t qemu_LATEST[] = { |
b580b6ee DH |
710 | S390_FEAT_ACCESS_EXCEPTION_FS_INDICATION, |
711 | S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2, | |
712 | S390_FEAT_ESOP, | |
faa40177 DH |
713 | }; |
714 | ||
08ef92d5 DH |
715 | /* add all new definitions before this point */ |
716 | static uint16_t qemu_MAX[] = { | |
35b4df64 DH |
717 | /* generates a dependency warning, leave it out for now */ |
718 | S390_FEAT_MSA_EXT_5, | |
b580b6ee DH |
719 | /* features introduced after the z13 */ |
720 | S390_FEAT_INSTRUCTION_EXEC_PROT, | |
e0f28bb2 | 721 | S390_FEAT_MISC_INSTRUCTION_EXT2, |
be2b5670 | 722 | S390_FEAT_MSA_EXT_8, |
8a9b7ed3 | 723 | S390_FEAT_VECTOR_ENH, |
35b4df64 DH |
724 | }; |
725 | ||
dced7eec MM |
726 | /****** END FEATURE DEFS ******/ |
727 | ||
728 | #define _YEARS "2016" | |
729 | #define _NAME_H "TARGET_S390X_GEN_FEATURES_H" | |
730 | ||
731 | #define CPU_FEAT_INITIALIZER(_name) \ | |
732 | { \ | |
733 | .name = "S390_FEAT_LIST_" #_name, \ | |
734 | .base_bits = \ | |
735 | { .data = base_##_name, \ | |
736 | .len = ARRAY_SIZE(base_##_name) }, \ | |
737 | .default_bits = \ | |
738 | { .data = default_##_name, \ | |
739 | .len = ARRAY_SIZE(default_##_name) }, \ | |
740 | .full_bits = \ | |
741 | { .data = full_##_name, \ | |
742 | .len = ARRAY_SIZE(full_##_name) }, \ | |
743 | } | |
744 | ||
745 | typedef struct BitSpec { | |
746 | uint16_t *data; | |
747 | uint32_t len; | |
748 | } BitSpec; | |
749 | ||
750 | typedef struct { | |
751 | const char *name; | |
752 | BitSpec base_bits; | |
753 | BitSpec default_bits; | |
754 | BitSpec full_bits; | |
755 | } CpuFeatDefSpec; | |
756 | ||
757 | static uint16_t EmptyFeat[] = {}; | |
758 | ||
759 | /******************************* | |
760 | * processor GA series | |
761 | *******************************/ | |
762 | static CpuFeatDefSpec CpuFeatDef[] = { | |
763 | CPU_FEAT_INITIALIZER(GEN7_GA1), | |
764 | CPU_FEAT_INITIALIZER(GEN7_GA2), | |
765 | CPU_FEAT_INITIALIZER(GEN7_GA3), | |
766 | CPU_FEAT_INITIALIZER(GEN8_GA1), | |
767 | CPU_FEAT_INITIALIZER(GEN8_GA2), | |
768 | CPU_FEAT_INITIALIZER(GEN8_GA3), | |
769 | CPU_FEAT_INITIALIZER(GEN8_GA4), | |
770 | CPU_FEAT_INITIALIZER(GEN8_GA5), | |
771 | CPU_FEAT_INITIALIZER(GEN9_GA1), | |
772 | CPU_FEAT_INITIALIZER(GEN9_GA2), | |
773 | CPU_FEAT_INITIALIZER(GEN9_GA3), | |
774 | CPU_FEAT_INITIALIZER(GEN10_GA1), | |
775 | CPU_FEAT_INITIALIZER(GEN10_GA2), | |
776 | CPU_FEAT_INITIALIZER(GEN10_GA3), | |
777 | CPU_FEAT_INITIALIZER(GEN11_GA1), | |
778 | CPU_FEAT_INITIALIZER(GEN11_GA2), | |
779 | CPU_FEAT_INITIALIZER(GEN12_GA1), | |
780 | CPU_FEAT_INITIALIZER(GEN12_GA2), | |
781 | CPU_FEAT_INITIALIZER(GEN13_GA1), | |
782 | CPU_FEAT_INITIALIZER(GEN13_GA2), | |
cc28a594 | 783 | CPU_FEAT_INITIALIZER(GEN14_GA1), |
f2a7d157 | 784 | CPU_FEAT_INITIALIZER(GEN14_GA2), |
caef6243 | 785 | CPU_FEAT_INITIALIZER(GEN15_GA1), |
dced7eec MM |
786 | }; |
787 | ||
90229ebb DH |
788 | #define FEAT_GROUP_INITIALIZER(_name) \ |
789 | { \ | |
790 | .name = "S390_FEAT_GROUP_LIST_" #_name, \ | |
a5f9ecc4 | 791 | .enum_name = "S390_FEAT_GROUP_" #_name, \ |
90229ebb DH |
792 | .bits = \ |
793 | { .data = group_##_name, \ | |
794 | .len = ARRAY_SIZE(group_##_name) }, \ | |
795 | } | |
796 | ||
797 | typedef struct { | |
798 | const char *name; | |
a5f9ecc4 | 799 | const char *enum_name; |
90229ebb DH |
800 | BitSpec bits; |
801 | } FeatGroupDefSpec; | |
802 | ||
803 | /******************************* | |
804 | * feature groups | |
805 | *******************************/ | |
806 | static FeatGroupDefSpec FeatGroupDef[] = { | |
807 | FEAT_GROUP_INITIALIZER(PLO), | |
808 | FEAT_GROUP_INITIALIZER(TOD_CLOCK_STEERING), | |
809 | FEAT_GROUP_INITIALIZER(GEN13_PTFF), | |
810 | FEAT_GROUP_INITIALIZER(MSA), | |
811 | FEAT_GROUP_INITIALIZER(MSA_EXT_1), | |
812 | FEAT_GROUP_INITIALIZER(MSA_EXT_2), | |
813 | FEAT_GROUP_INITIALIZER(MSA_EXT_3), | |
814 | FEAT_GROUP_INITIALIZER(MSA_EXT_4), | |
815 | FEAT_GROUP_INITIALIZER(MSA_EXT_5), | |
6da5c593 JH |
816 | FEAT_GROUP_INITIALIZER(MSA_EXT_6), |
817 | FEAT_GROUP_INITIALIZER(MSA_EXT_7), | |
818 | FEAT_GROUP_INITIALIZER(MSA_EXT_8), | |
5dacbe23 CB |
819 | FEAT_GROUP_INITIALIZER(MSA_EXT_9), |
820 | FEAT_GROUP_INITIALIZER(MSA_EXT_9_PCKMO), | |
a5f9ecc4 | 821 | FEAT_GROUP_INITIALIZER(MULTIPLE_EPOCH_PTFF), |
d220fabf | 822 | FEAT_GROUP_INITIALIZER(ENH_SORT), |
afc7b866 | 823 | FEAT_GROUP_INITIALIZER(DEFLATE_CONVERSION), |
90229ebb DH |
824 | }; |
825 | ||
35b4df64 DH |
826 | #define QEMU_FEAT_INITIALIZER(_name) \ |
827 | { \ | |
828 | .name = "S390_FEAT_LIST_QEMU_" #_name, \ | |
829 | .bits = \ | |
830 | { .data = qemu_##_name, \ | |
831 | .len = ARRAY_SIZE(qemu_##_name) }, \ | |
832 | } | |
833 | ||
834 | /******************************* | |
835 | * QEMU (CPU model) features | |
836 | *******************************/ | |
837 | static FeatGroupDefSpec QemuFeatDef[] = { | |
838 | QEMU_FEAT_INITIALIZER(V2_11), | |
d646b16b | 839 | QEMU_FEAT_INITIALIZER(V3_1), |
08ef92d5 | 840 | QEMU_FEAT_INITIALIZER(V4_0), |
faa40177 | 841 | QEMU_FEAT_INITIALIZER(V4_1), |
35b4df64 DH |
842 | QEMU_FEAT_INITIALIZER(LATEST), |
843 | QEMU_FEAT_INITIALIZER(MAX), | |
844 | }; | |
845 | ||
846 | ||
dced7eec MM |
847 | static void set_bits(uint64_t list[], BitSpec bits) |
848 | { | |
849 | uint32_t i; | |
850 | ||
851 | for (i = 0; i < bits.len; i++) { | |
852 | list[bits.data[i] / 64] |= 1ULL << (bits.data[i] % 64); | |
853 | } | |
854 | } | |
855 | ||
caef6243 CB |
856 | static inline void clear_bit(uint64_t list[], unsigned long nr) |
857 | { | |
858 | list[nr / 64] &= ~(1ULL << (nr % 64)); | |
859 | } | |
860 | ||
dced7eec MM |
861 | static void print_feature_defs(void) |
862 | { | |
863 | uint64_t base_feat[S390_FEAT_MAX / 64 + 1] = {}; | |
864 | uint64_t default_feat[S390_FEAT_MAX / 64 + 1] = {}; | |
865 | uint64_t full_feat[S390_FEAT_MAX / 64 + 1] = {}; | |
866 | int i, j; | |
867 | ||
868 | printf("\n/* CPU model feature list data */\n"); | |
869 | ||
870 | for (i = 0; i < ARRAY_SIZE(CpuFeatDef); i++) { | |
caef6243 CB |
871 | /* With gen15 CSSKE and BPB are deprecated */ |
872 | if (strcmp(CpuFeatDef[i].name, "S390_FEAT_LIST_GEN15_GA1") == 0) { | |
873 | clear_bit(base_feat, S390_FEAT_CONDITIONAL_SSKE); | |
874 | clear_bit(default_feat, S390_FEAT_CONDITIONAL_SSKE); | |
875 | clear_bit(default_feat, S390_FEAT_BPB); | |
876 | } | |
dced7eec MM |
877 | set_bits(base_feat, CpuFeatDef[i].base_bits); |
878 | /* add the base to the default features */ | |
879 | set_bits(default_feat, CpuFeatDef[i].base_bits); | |
880 | set_bits(default_feat, CpuFeatDef[i].default_bits); | |
881 | /* add the base to the full features */ | |
882 | set_bits(full_feat, CpuFeatDef[i].base_bits); | |
883 | set_bits(full_feat, CpuFeatDef[i].full_bits); | |
884 | ||
885 | printf("#define %s_BASE\t", CpuFeatDef[i].name); | |
886 | for (j = 0; j < ARRAY_SIZE(base_feat); j++) { | |
887 | printf("0x%016"PRIx64"ULL", base_feat[j]); | |
888 | if (j < ARRAY_SIZE(base_feat) - 1) { | |
889 | printf(","); | |
890 | } else { | |
891 | printf("\n"); | |
892 | } | |
893 | } | |
894 | printf("#define %s_DEFAULT\t", CpuFeatDef[i].name); | |
895 | for (j = 0; j < ARRAY_SIZE(default_feat); j++) { | |
896 | printf("0x%016"PRIx64"ULL", default_feat[j]); | |
897 | if (j < ARRAY_SIZE(default_feat) - 1) { | |
898 | printf(","); | |
899 | } else { | |
900 | printf("\n"); | |
901 | } | |
902 | } | |
903 | printf("#define %s_FULL\t\t", CpuFeatDef[i].name); | |
904 | for (j = 0; j < ARRAY_SIZE(full_feat); j++) { | |
905 | printf("0x%016"PRIx64"ULL", full_feat[j]); | |
906 | if (j < ARRAY_SIZE(full_feat) - 1) { | |
907 | printf(","); | |
908 | } else { | |
909 | printf("\n"); | |
910 | } | |
911 | } | |
912 | } | |
913 | } | |
914 | ||
35b4df64 DH |
915 | static void print_qemu_feature_defs(void) |
916 | { | |
917 | uint64_t feat[S390_FEAT_MAX / 64 + 1] = {}; | |
918 | int i, j; | |
919 | ||
920 | printf("\n/* QEMU (CPU model) feature list data */\n"); | |
921 | ||
922 | /* for now we assume that we only add new features */ | |
923 | for (i = 0; i < ARRAY_SIZE(QemuFeatDef); i++) { | |
924 | set_bits(feat, QemuFeatDef[i].bits); | |
925 | ||
926 | printf("#define %s\t", QemuFeatDef[i].name); | |
927 | for (j = 0; j < ARRAY_SIZE(feat); j++) { | |
928 | printf("0x%016"PRIx64"ULL", feat[j]); | |
929 | if (j < ARRAY_SIZE(feat) - 1) { | |
930 | printf(","); | |
931 | } else { | |
932 | printf("\n"); | |
933 | } | |
934 | } | |
935 | } | |
936 | } | |
937 | ||
90229ebb DH |
938 | static void print_feature_group_defs(void) |
939 | { | |
940 | int i, j; | |
941 | ||
942 | printf("\n/* CPU feature group list data */\n"); | |
943 | ||
944 | for (i = 0; i < ARRAY_SIZE(FeatGroupDef); i++) { | |
945 | uint64_t feat[S390_FEAT_MAX / 64 + 1] = {}; | |
946 | ||
947 | set_bits(feat, FeatGroupDef[i].bits); | |
948 | printf("#define %s\t", FeatGroupDef[i].name); | |
949 | for (j = 0; j < ARRAY_SIZE(feat); j++) { | |
950 | printf("0x%016"PRIx64"ULL", feat[j]); | |
951 | if (j < ARRAY_SIZE(feat) - 1) { | |
952 | printf(","); | |
953 | } else { | |
954 | printf("\n"); | |
955 | } | |
956 | } | |
957 | } | |
958 | } | |
959 | ||
a5f9ecc4 MM |
960 | static void print_feature_group_enum_type(void) |
961 | { | |
962 | int i; | |
963 | ||
964 | printf("\n/* CPU feature group enum type */\n" | |
965 | "typedef enum {\n"); | |
966 | for (i = 0; i < ARRAY_SIZE(FeatGroupDef); i++) { | |
967 | printf("\t%s,\n", FeatGroupDef[i].enum_name); | |
968 | } | |
969 | printf("\tS390_FEAT_GROUP_MAX,\n" | |
970 | "} S390FeatGroup;\n"); | |
971 | } | |
972 | ||
dced7eec MM |
973 | int main(int argc, char *argv[]) |
974 | { | |
975 | printf("/*\n" | |
976 | " * AUTOMATICALLY GENERATED, DO NOT MODIFY HERE, EDIT\n" | |
977 | " * SOURCE FILE \"%s\" INSTEAD.\n" | |
978 | " *\n" | |
979 | " * Copyright %s IBM Corp.\n" | |
980 | " *\n" | |
981 | " * This work is licensed under the terms of the GNU GPL, " | |
982 | "version 2 or (at\n * your option) any later version. See " | |
983 | "the COPYING file in the top-level\n * directory.\n" | |
984 | " */\n\n" | |
985 | "#ifndef %s\n#define %s\n", __FILE__, _YEARS, _NAME_H, _NAME_H); | |
986 | print_feature_defs(); | |
90229ebb | 987 | print_feature_group_defs(); |
35b4df64 | 988 | print_qemu_feature_defs(); |
a5f9ecc4 | 989 | print_feature_group_enum_type(); |
dced7eec MM |
990 | printf("\n#endif\n"); |
991 | return 0; | |
992 | } |