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 /* cpu feature groups */ 312 static uint16_t group_PLO[] = { 313 S390_FEAT_GROUP_PLO, 314 }; 315 static uint16_t group_TOD_CLOCK_STEERING[] = { 316 S390_FEAT_GROUP_TOD_CLOCK_STEERING, 317 }; 318 static uint16_t group_GEN13_PTFF[] = { 319 S390_FEAT_GROUP_GEN13_PTFF, 320 }; 321 static uint16_t group_MULTIPLE_EPOCH_PTFF[] = { 322 S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF, 323 }; 324 325 static uint16_t group_GEN17_PTFF[] = { 326 S390_FEAT_GROUP_GEN17_PTFF, 327 }; 328 329 static uint16_t group_MSA[] = { 330 S390_FEAT_GROUP_MSA, 331 }; 332 static uint16_t group_MSA_EXT_1[] = { 333 S390_FEAT_GROUP_MSA_EXT_1, 334 }; 335 static uint16_t group_MSA_EXT_2[] = { 336 S390_FEAT_GROUP_MSA_EXT_2, 337 }; 338 static uint16_t group_MSA_EXT_3[] = { 339 S390_FEAT_GROUP_MSA_EXT_3, 340 }; 341 static uint16_t group_MSA_EXT_4[] = { 342 S390_FEAT_GROUP_MSA_EXT_4, 343 }; 344 static uint16_t group_MSA_EXT_5[] = { 345 S390_FEAT_GROUP_MSA_EXT_5, 346 }; 347 static uint16_t group_MSA_EXT_6[] = { 348 S390_FEAT_GROUP_MSA_EXT_6, 349 }; 350 static uint16_t group_MSA_EXT_7[] = { 351 S390_FEAT_GROUP_MSA_EXT_7, 352 }; 353 static uint16_t group_MSA_EXT_8[] = { 354 S390_FEAT_GROUP_MSA_EXT_8, 355 }; 356 357 static uint16_t group_MSA_EXT_9[] = { 358 S390_FEAT_GROUP_MSA_EXT_9, 359 }; 360 361 static uint16_t group_MSA_EXT_10[] = { 362 S390_FEAT_GROUP_MSA_EXT_10, 363 }; 364 365 static uint16_t group_MSA_EXT_11[] = { 366 S390_FEAT_GROUP_MSA_EXT_11, 367 }; 368 369 static uint16_t group_MSA_EXT_12[] = { 370 S390_FEAT_GROUP_MSA_EXT_12, 371 }; 372 373 static uint16_t group_MSA_EXT_13[] = { 374 S390_FEAT_GROUP_MSA_EXT_13, 375 }; 376 377 static uint16_t group_MSA_EXT_9_PCKMO[] = { 378 S390_FEAT_GROUP_MSA_EXT_9_PCKMO, 379 }; 380 381 static uint16_t group_MSA_EXT_10_PCKMO[] = { 382 S390_FEAT_GROUP_MSA_EXT_10_PCKMO, 383 }; 384 385 static uint16_t group_MSA_EXT_11_PCKMO[] = { 386 S390_FEAT_GROUP_MSA_EXT_11_PCKMO, 387 }; 388 389 static uint16_t group_MSA_EXT_13_PCKMO[] = { 390 S390_FEAT_GROUP_MSA_EXT_13_PCKMO, 391 }; 392 393 static uint16_t group_ENH_SORT[] = { 394 S390_FEAT_GROUP_ENH_SORT, 395 }; 396 397 static uint16_t group_DEFLATE_CONVERSION[] = { 398 S390_FEAT_GROUP_DEFLATE_CONVERSION, 399 }; 400 401 /* Base features (in order of release) 402 * Only non-hypervisor managed features belong here. 403 * Base feature sets are static meaning they do not change in future QEMU 404 * releases. 405 */ 406 static uint16_t base_GEN7_GA1[] = { 407 S390_FEAT_GROUP_PLO, 408 S390_FEAT_ESAN3, 409 S390_FEAT_ZARCH, 410 }; 411 412 #define base_GEN7_GA2 EmptyFeat 413 #define base_GEN7_GA3 EmptyFeat 414 415 static uint16_t base_GEN8_GA1[] = { 416 S390_FEAT_DAT_ENH, 417 S390_FEAT_EXTENDED_TRANSLATION_2, 418 S390_FEAT_GROUP_MSA, 419 S390_FEAT_LONG_DISPLACEMENT, 420 S390_FEAT_LONG_DISPLACEMENT_FAST, 421 S390_FEAT_HFP_MADDSUB, 422 }; 423 424 #define base_GEN8_GA2 EmptyFeat 425 #define base_GEN8_GA3 EmptyFeat 426 #define base_GEN8_GA4 EmptyFeat 427 #define base_GEN8_GA5 EmptyFeat 428 429 static uint16_t base_GEN9_GA1[] = { 430 S390_FEAT_IDTE_SEGMENT, 431 S390_FEAT_ASN_LX_REUSE, 432 S390_FEAT_STFLE, 433 S390_FEAT_SENSE_RUNNING_STATUS, 434 S390_FEAT_EXTENDED_IMMEDIATE, 435 S390_FEAT_EXTENDED_TRANSLATION_3, 436 S390_FEAT_HFP_UNNORMALIZED_EXT, 437 S390_FEAT_ETF2_ENH, 438 S390_FEAT_STORE_CLOCK_FAST, 439 S390_FEAT_GROUP_TOD_CLOCK_STEERING, 440 S390_FEAT_ETF3_ENH, 441 S390_FEAT_DAT_ENH_2, 442 }; 443 444 #define base_GEN9_GA2 EmptyFeat 445 #define base_GEN9_GA3 EmptyFeat 446 447 static uint16_t base_GEN10_GA1[] = { 448 S390_FEAT_CONDITIONAL_SSKE, 449 S390_FEAT_PARSING_ENH, 450 S390_FEAT_MOVE_WITH_OPTIONAL_SPEC, 451 S390_FEAT_EXTRACT_CPU_TIME, 452 S390_FEAT_COMPARE_AND_SWAP_AND_STORE, 453 S390_FEAT_COMPARE_AND_SWAP_AND_STORE_2, 454 S390_FEAT_GENERAL_INSTRUCTIONS_EXT, 455 S390_FEAT_EXECUTE_EXT, 456 S390_FEAT_FLOATING_POINT_SUPPORT_ENH, 457 S390_FEAT_DFP, 458 S390_FEAT_DFP_FAST, 459 S390_FEAT_PFPO, 460 }; 461 #define base_GEN10_GA2 EmptyFeat 462 #define base_GEN10_GA3 EmptyFeat 463 464 static uint16_t base_GEN11_GA1[] = { 465 S390_FEAT_NONQ_KEY_SETTING, 466 S390_FEAT_ENHANCED_MONITOR, 467 S390_FEAT_FLOATING_POINT_EXT, 468 S390_FEAT_SET_PROGRAM_PARAMETERS, 469 S390_FEAT_STFLE_45, 470 S390_FEAT_CMPSC_ENH, 471 S390_FEAT_INTERLOCKED_ACCESS_2, 472 }; 473 474 #define base_GEN11_GA2 EmptyFeat 475 476 static uint16_t base_GEN12_GA1[] = { 477 S390_FEAT_DFP_ZONED_CONVERSION, 478 S390_FEAT_STFLE_49, 479 S390_FEAT_LOCAL_TLB_CLEARING, 480 }; 481 482 #define base_GEN12_GA2 EmptyFeat 483 484 static uint16_t base_GEN13_GA1[] = { 485 S390_FEAT_STFLE_53, 486 S390_FEAT_DFP_PACKED_CONVERSION, 487 S390_FEAT_GROUP_GEN13_PTFF, 488 }; 489 490 #define base_GEN13_GA2 EmptyFeat 491 492 static uint16_t base_GEN14_GA1[] = { 493 S390_FEAT_ENTROPY_ENC_COMP, 494 S390_FEAT_MISC_INSTRUCTION_EXT2, 495 S390_FEAT_SEMAPHORE_ASSIST, 496 S390_FEAT_TIME_SLICE_INSTRUMENTATION, 497 S390_FEAT_ORDER_PRESERVING_COMPRESSION, 498 }; 499 500 #define base_GEN14_GA2 EmptyFeat 501 502 static uint16_t base_GEN15_GA1[] = { 503 S390_FEAT_MISC_INSTRUCTION_EXT3, 504 }; 505 506 #define base_GEN16_GA1 EmptyFeat 507 508 /* Full features (in order of release) 509 * Automatically includes corresponding base features. 510 * Full features are all features this hardware supports even if kvm/QEMU do not 511 * support these features yet. 512 */ 513 static uint16_t full_GEN7_GA1[] = { 514 S390_FEAT_PPA15, 515 S390_FEAT_BPB, 516 S390_FEAT_SIE_F2, 517 S390_FEAT_SIE_SKEY, 518 S390_FEAT_SIE_GPERE, 519 S390_FEAT_SIE_IB, 520 S390_FEAT_SIE_CEI, 521 }; 522 523 static uint16_t full_GEN7_GA2[] = { 524 S390_FEAT_EXTENDED_TRANSLATION_2, 525 }; 526 527 static uint16_t full_GEN7_GA3[] = { 528 S390_FEAT_LONG_DISPLACEMENT, 529 S390_FEAT_SIE_SIIF, 530 }; 531 532 static uint16_t full_GEN8_GA1[] = { 533 S390_FEAT_SIE_GSLS, 534 S390_FEAT_SIE_64BSCAO, 535 }; 536 537 #define full_GEN8_GA2 EmptyFeat 538 539 static uint16_t full_GEN8_GA3[] = { 540 S390_FEAT_ASN_LX_REUSE, 541 S390_FEAT_EXTENDED_TRANSLATION_3, 542 }; 543 544 #define full_GEN8_GA4 EmptyFeat 545 #define full_GEN8_GA5 EmptyFeat 546 547 static uint16_t full_GEN9_GA1[] = { 548 S390_FEAT_STORE_HYPERVISOR_INFO, 549 S390_FEAT_GROUP_MSA_EXT_1, 550 S390_FEAT_CMM, 551 S390_FEAT_SIE_CMMA, 552 }; 553 554 static uint16_t full_GEN9_GA2[] = { 555 S390_FEAT_MOVE_WITH_OPTIONAL_SPEC, 556 S390_FEAT_EXTRACT_CPU_TIME, 557 S390_FEAT_COMPARE_AND_SWAP_AND_STORE, 558 S390_FEAT_FLOATING_POINT_SUPPORT_ENH, 559 S390_FEAT_DFP, 560 }; 561 562 static uint16_t full_GEN9_GA3[] = { 563 S390_FEAT_CONDITIONAL_SSKE, 564 S390_FEAT_PFPO, 565 }; 566 567 static uint16_t full_GEN10_GA1[] = { 568 S390_FEAT_EDAT, 569 S390_FEAT_CONFIGURATION_TOPOLOGY, 570 S390_FEAT_GROUP_MSA_EXT_2, 571 S390_FEAT_ESOP, 572 S390_FEAT_SIE_PFMFI, 573 S390_FEAT_SIE_SIGPIF, 574 }; 575 576 static uint16_t full_GEN10_GA2[] = { 577 S390_FEAT_SET_PROGRAM_PARAMETERS, 578 S390_FEAT_SIE_IBS, 579 }; 580 581 static uint16_t full_GEN10_GA3[] = { 582 S390_FEAT_GROUP_MSA_EXT_3, 583 }; 584 585 static uint16_t full_GEN11_GA1[] = { 586 S390_FEAT_IPTE_RANGE, 587 S390_FEAT_ACCESS_EXCEPTION_FS_INDICATION, 588 S390_FEAT_GROUP_MSA_EXT_4, 589 }; 590 591 #define full_GEN11_GA2 EmptyFeat 592 593 static uint16_t full_GEN12_GA1[] = { 594 S390_FEAT_CONSTRAINT_TRANSACTIONAL_EXE, 595 S390_FEAT_TRANSACTIONAL_EXE, 596 S390_FEAT_RUNTIME_INSTRUMENTATION, 597 S390_FEAT_ZPCI, 598 S390_FEAT_ADAPTER_EVENT_NOTIFICATION, 599 S390_FEAT_ADAPTER_INT_SUPPRESSION, 600 S390_FEAT_EDAT_2, 601 S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2, 602 S390_FEAT_AP_QUERY_CONFIG_INFO, 603 S390_FEAT_AP_QUEUE_INTERRUPT_CONTROL, 604 S390_FEAT_AP_FACILITIES_TEST, 605 S390_FEAT_AP, 606 S390_FEAT_EXTENDED_LENGTH_SCCB, 607 S390_FEAT_DIAG_318, 608 }; 609 610 static uint16_t full_GEN12_GA2[] = { 611 S390_FEAT_GROUP_MSA_EXT_5, 612 }; 613 614 static uint16_t full_GEN13_GA1[] = { 615 S390_FEAT_VECTOR, 616 }; 617 618 #define full_GEN13_GA2 EmptyFeat 619 620 static uint16_t full_GEN14_GA1[] = { 621 S390_FEAT_INSTRUCTION_EXEC_PROT, 622 S390_FEAT_GUARDED_STORAGE, 623 S390_FEAT_VECTOR_PACKED_DECIMAL, 624 S390_FEAT_VECTOR_ENH, 625 S390_FEAT_MULTIPLE_EPOCH, 626 S390_FEAT_TEST_PENDING_EXT_INTERRUPTION, 627 S390_FEAT_INSERT_REFERENCE_BITS_MULT, 628 S390_FEAT_GROUP_MSA_EXT_6, 629 S390_FEAT_GROUP_MSA_EXT_7, 630 S390_FEAT_GROUP_MSA_EXT_8, 631 S390_FEAT_CMM_NT, 632 S390_FEAT_ETOKEN, 633 S390_FEAT_HPMA2, 634 S390_FEAT_SIE_KSS, 635 S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF, 636 }; 637 638 #define full_GEN14_GA2 EmptyFeat 639 640 static uint16_t full_GEN15_GA1[] = { 641 S390_FEAT_VECTOR_ENH2, 642 S390_FEAT_GROUP_ENH_SORT, 643 S390_FEAT_GROUP_DEFLATE_CONVERSION, 644 S390_FEAT_VECTOR_PACKED_DECIMAL_ENH, 645 S390_FEAT_GROUP_MSA_EXT_9, 646 S390_FEAT_GROUP_MSA_EXT_9_PCKMO, 647 S390_FEAT_ETOKEN, 648 S390_FEAT_UNPACK, 649 }; 650 651 static uint16_t full_GEN16_GA1[] = { 652 S390_FEAT_NNPA, 653 S390_FEAT_VECTOR_PACKED_DECIMAL_ENH2, 654 S390_FEAT_BEAR_ENH, 655 S390_FEAT_RDP, 656 S390_FEAT_PAI, 657 S390_FEAT_PAIE, 658 S390_FEAT_UV_FEAT_AP, 659 S390_FEAT_UV_FEAT_AP_INTR, 660 }; 661 662 663 /* Default features (in order of release) 664 * Automatically includes corresponding base features. 665 * Default features are all features this version of QEMU supports for this 666 * hardware model. Default feature sets can grow with new QEMU releases. 667 */ 668 #define default_GEN7_GA1 EmptyFeat 669 #define default_GEN7_GA2 EmptyFeat 670 #define default_GEN7_GA3 EmptyFeat 671 #define default_GEN8_GA1 EmptyFeat 672 #define default_GEN8_GA2 EmptyFeat 673 #define default_GEN8_GA3 EmptyFeat 674 #define default_GEN8_GA4 EmptyFeat 675 #define default_GEN8_GA5 EmptyFeat 676 677 static uint16_t default_GEN9_GA1[] = { 678 S390_FEAT_STORE_HYPERVISOR_INFO, 679 S390_FEAT_GROUP_MSA_EXT_1, 680 S390_FEAT_CMM, 681 }; 682 683 #define default_GEN9_GA2 EmptyFeat 684 #define default_GEN9_GA3 EmptyFeat 685 686 static uint16_t default_GEN10_GA1[] = { 687 S390_FEAT_EDAT, 688 S390_FEAT_GROUP_MSA_EXT_2, 689 }; 690 691 #define default_GEN10_GA2 EmptyFeat 692 #define default_GEN10_GA3 EmptyFeat 693 694 static uint16_t default_GEN11_GA1[] = { 695 S390_FEAT_GROUP_MSA_EXT_3, 696 S390_FEAT_IPTE_RANGE, 697 S390_FEAT_ACCESS_EXCEPTION_FS_INDICATION, 698 S390_FEAT_GROUP_MSA_EXT_4, 699 S390_FEAT_PPA15, 700 S390_FEAT_BPB, 701 }; 702 703 #define default_GEN11_GA2 EmptyFeat 704 705 static uint16_t default_GEN12_GA1[] = { 706 S390_FEAT_CONSTRAINT_TRANSACTIONAL_EXE, 707 S390_FEAT_TRANSACTIONAL_EXE, 708 S390_FEAT_RUNTIME_INSTRUMENTATION, 709 S390_FEAT_ZPCI, 710 S390_FEAT_ADAPTER_EVENT_NOTIFICATION, 711 S390_FEAT_EDAT_2, 712 S390_FEAT_ESOP, 713 S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2, 714 }; 715 716 #define default_GEN12_GA2 EmptyFeat 717 718 static uint16_t default_GEN13_GA1[] = { 719 S390_FEAT_GROUP_MSA_EXT_5, 720 S390_FEAT_VECTOR, 721 }; 722 723 #define default_GEN13_GA2 EmptyFeat 724 725 static uint16_t default_GEN14_GA1[] = { 726 S390_FEAT_INSTRUCTION_EXEC_PROT, 727 S390_FEAT_GUARDED_STORAGE, 728 S390_FEAT_VECTOR_PACKED_DECIMAL, 729 S390_FEAT_VECTOR_ENH, 730 S390_FEAT_GROUP_MSA_EXT_6, 731 S390_FEAT_GROUP_MSA_EXT_7, 732 S390_FEAT_GROUP_MSA_EXT_8, 733 S390_FEAT_MULTIPLE_EPOCH, 734 S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF, 735 }; 736 737 #define default_GEN14_GA2 EmptyFeat 738 739 static uint16_t default_GEN15_GA1[] = { 740 S390_FEAT_VECTOR_ENH2, 741 S390_FEAT_GROUP_DEFLATE_CONVERSION, 742 S390_FEAT_VECTOR_PACKED_DECIMAL_ENH, 743 S390_FEAT_GROUP_MSA_EXT_9, 744 S390_FEAT_GROUP_MSA_EXT_9_PCKMO, 745 S390_FEAT_ETOKEN, 746 }; 747 748 static uint16_t default_GEN16_GA1[] = { 749 S390_FEAT_NNPA, 750 S390_FEAT_VECTOR_PACKED_DECIMAL_ENH2, 751 S390_FEAT_BEAR_ENH, 752 S390_FEAT_RDP, 753 S390_FEAT_PAI, 754 S390_FEAT_PAIE, 755 }; 756 757 /* QEMU (CPU model) features */ 758 759 static uint16_t qemu_V2_11[] = { 760 S390_FEAT_GROUP_PLO, 761 S390_FEAT_ESAN3, 762 S390_FEAT_ZARCH, 763 }; 764 765 static uint16_t qemu_V3_1[] = { 766 S390_FEAT_DAT_ENH, 767 S390_FEAT_IDTE_SEGMENT, 768 S390_FEAT_STFLE, 769 S390_FEAT_SENSE_RUNNING_STATUS, 770 S390_FEAT_EXTENDED_TRANSLATION_2, 771 S390_FEAT_MSA, 772 S390_FEAT_LONG_DISPLACEMENT, 773 S390_FEAT_LONG_DISPLACEMENT_FAST, 774 S390_FEAT_EXTENDED_IMMEDIATE, 775 S390_FEAT_EXTENDED_TRANSLATION_3, 776 S390_FEAT_ETF2_ENH, 777 S390_FEAT_STORE_CLOCK_FAST, 778 S390_FEAT_MOVE_WITH_OPTIONAL_SPEC, 779 S390_FEAT_ETF3_ENH, 780 S390_FEAT_EXTRACT_CPU_TIME, 781 S390_FEAT_COMPARE_AND_SWAP_AND_STORE, 782 S390_FEAT_COMPARE_AND_SWAP_AND_STORE_2, 783 S390_FEAT_GENERAL_INSTRUCTIONS_EXT, 784 S390_FEAT_EXECUTE_EXT, 785 S390_FEAT_SET_PROGRAM_PARAMETERS, 786 S390_FEAT_FLOATING_POINT_SUPPORT_ENH, 787 S390_FEAT_STFLE_45, 788 S390_FEAT_STFLE_49, 789 S390_FEAT_LOCAL_TLB_CLEARING, 790 S390_FEAT_INTERLOCKED_ACCESS_2, 791 S390_FEAT_ADAPTER_EVENT_NOTIFICATION, 792 S390_FEAT_ADAPTER_INT_SUPPRESSION, 793 S390_FEAT_MSA_EXT_3, 794 S390_FEAT_MSA_EXT_4, 795 }; 796 797 static uint16_t qemu_V4_0[] = { 798 /* 799 * Only BFP bits are implemented (HFP, DFP, PFPO and DIVIDE TO INTEGER not 800 * implemented yet). 801 */ 802 S390_FEAT_FLOATING_POINT_EXT, 803 S390_FEAT_ZPCI, 804 }; 805 806 static uint16_t qemu_V4_1[] = { 807 S390_FEAT_STFLE_53, 808 S390_FEAT_VECTOR, 809 }; 810 811 static uint16_t qemu_V6_0[] = { 812 S390_FEAT_ACCESS_EXCEPTION_FS_INDICATION, 813 S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2, 814 S390_FEAT_ESOP, 815 }; 816 817 static uint16_t qemu_V6_2[] = { 818 S390_FEAT_INSTRUCTION_EXEC_PROT, 819 S390_FEAT_MISC_INSTRUCTION_EXT2, 820 S390_FEAT_MSA_EXT_8, 821 S390_FEAT_VECTOR_ENH, 822 }; 823 824 static uint16_t qemu_V7_0[] = { 825 S390_FEAT_MISC_INSTRUCTION_EXT3, 826 }; 827 828 static uint16_t qemu_V7_1[] = { 829 S390_FEAT_VECTOR_ENH2, 830 }; 831 832 /* 833 * Features for the "qemu" CPU model of the latest QEMU machine and the "max" 834 * CPU model under TCG. Don't include features that are not part of the full 835 * feature set of the current "max" CPU model generation. 836 */ 837 static uint16_t qemu_MAX[] = { 838 S390_FEAT_MSA_EXT_5, 839 S390_FEAT_KIMD_SHA_512, 840 S390_FEAT_KLMD_SHA_512, 841 S390_FEAT_PRNO_TRNG, 842 }; 843 844 /****** END FEATURE DEFS ******/ 845 846 #define _YEARS "2016" 847 #define _NAME_H "TARGET_S390X_GEN_FEATURES_H" 848 849 #define CPU_FEAT_INITIALIZER(_name) \ 850 { \ 851 .name = "S390_FEAT_LIST_" #_name, \ 852 .base_bits = \ 853 { .data = base_##_name, \ 854 .len = ARRAY_SIZE(base_##_name) }, \ 855 .default_bits = \ 856 { .data = default_##_name, \ 857 .len = ARRAY_SIZE(default_##_name) }, \ 858 .full_bits = \ 859 { .data = full_##_name, \ 860 .len = ARRAY_SIZE(full_##_name) }, \ 861 } 862 863 typedef struct BitSpec { 864 uint16_t *data; 865 uint32_t len; 866 } BitSpec; 867 868 typedef struct { 869 const char *name; 870 BitSpec base_bits; 871 BitSpec default_bits; 872 BitSpec full_bits; 873 } CpuFeatDefSpec; 874 875 static uint16_t EmptyFeat[] = {}; 876 877 /******************************* 878 * processor GA series 879 *******************************/ 880 static CpuFeatDefSpec CpuFeatDef[] = { 881 CPU_FEAT_INITIALIZER(GEN7_GA1), 882 CPU_FEAT_INITIALIZER(GEN7_GA2), 883 CPU_FEAT_INITIALIZER(GEN7_GA3), 884 CPU_FEAT_INITIALIZER(GEN8_GA1), 885 CPU_FEAT_INITIALIZER(GEN8_GA2), 886 CPU_FEAT_INITIALIZER(GEN8_GA3), 887 CPU_FEAT_INITIALIZER(GEN8_GA4), 888 CPU_FEAT_INITIALIZER(GEN8_GA5), 889 CPU_FEAT_INITIALIZER(GEN9_GA1), 890 CPU_FEAT_INITIALIZER(GEN9_GA2), 891 CPU_FEAT_INITIALIZER(GEN9_GA3), 892 CPU_FEAT_INITIALIZER(GEN10_GA1), 893 CPU_FEAT_INITIALIZER(GEN10_GA2), 894 CPU_FEAT_INITIALIZER(GEN10_GA3), 895 CPU_FEAT_INITIALIZER(GEN11_GA1), 896 CPU_FEAT_INITIALIZER(GEN11_GA2), 897 CPU_FEAT_INITIALIZER(GEN12_GA1), 898 CPU_FEAT_INITIALIZER(GEN12_GA2), 899 CPU_FEAT_INITIALIZER(GEN13_GA1), 900 CPU_FEAT_INITIALIZER(GEN13_GA2), 901 CPU_FEAT_INITIALIZER(GEN14_GA1), 902 CPU_FEAT_INITIALIZER(GEN14_GA2), 903 CPU_FEAT_INITIALIZER(GEN15_GA1), 904 CPU_FEAT_INITIALIZER(GEN16_GA1), 905 }; 906 907 #define FEAT_GROUP_INITIALIZER(_name) \ 908 { \ 909 .name = "S390_FEAT_GROUP_LIST_" #_name, \ 910 .enum_name = "S390_FEAT_GROUP_" #_name, \ 911 .bits = \ 912 { .data = group_##_name, \ 913 .len = ARRAY_SIZE(group_##_name) }, \ 914 } 915 916 typedef struct { 917 const char *name; 918 const char *enum_name; 919 BitSpec bits; 920 } FeatGroupDefSpec; 921 922 /******************************* 923 * feature groups 924 *******************************/ 925 static FeatGroupDefSpec FeatGroupDef[] = { 926 FEAT_GROUP_INITIALIZER(PLO), 927 FEAT_GROUP_INITIALIZER(TOD_CLOCK_STEERING), 928 FEAT_GROUP_INITIALIZER(GEN13_PTFF), 929 FEAT_GROUP_INITIALIZER(GEN17_PTFF), 930 FEAT_GROUP_INITIALIZER(MSA), 931 FEAT_GROUP_INITIALIZER(MSA_EXT_1), 932 FEAT_GROUP_INITIALIZER(MSA_EXT_2), 933 FEAT_GROUP_INITIALIZER(MSA_EXT_3), 934 FEAT_GROUP_INITIALIZER(MSA_EXT_4), 935 FEAT_GROUP_INITIALIZER(MSA_EXT_5), 936 FEAT_GROUP_INITIALIZER(MSA_EXT_6), 937 FEAT_GROUP_INITIALIZER(MSA_EXT_7), 938 FEAT_GROUP_INITIALIZER(MSA_EXT_8), 939 FEAT_GROUP_INITIALIZER(MSA_EXT_9), 940 FEAT_GROUP_INITIALIZER(MSA_EXT_9_PCKMO), 941 FEAT_GROUP_INITIALIZER(MSA_EXT_10), 942 FEAT_GROUP_INITIALIZER(MSA_EXT_10_PCKMO), 943 FEAT_GROUP_INITIALIZER(MSA_EXT_11), 944 FEAT_GROUP_INITIALIZER(MSA_EXT_11_PCKMO), 945 FEAT_GROUP_INITIALIZER(MSA_EXT_12), 946 FEAT_GROUP_INITIALIZER(MSA_EXT_13), 947 FEAT_GROUP_INITIALIZER(MSA_EXT_13_PCKMO), 948 FEAT_GROUP_INITIALIZER(MULTIPLE_EPOCH_PTFF), 949 FEAT_GROUP_INITIALIZER(ENH_SORT), 950 FEAT_GROUP_INITIALIZER(DEFLATE_CONVERSION), 951 }; 952 953 #define QEMU_FEAT_INITIALIZER(_name) \ 954 { \ 955 .name = "S390_FEAT_LIST_QEMU_" #_name, \ 956 .bits = \ 957 { .data = qemu_##_name, \ 958 .len = ARRAY_SIZE(qemu_##_name) }, \ 959 } 960 961 /******************************* 962 * QEMU (CPU model) features 963 *******************************/ 964 static FeatGroupDefSpec QemuFeatDef[] = { 965 QEMU_FEAT_INITIALIZER(V2_11), 966 QEMU_FEAT_INITIALIZER(V3_1), 967 QEMU_FEAT_INITIALIZER(V4_0), 968 QEMU_FEAT_INITIALIZER(V4_1), 969 QEMU_FEAT_INITIALIZER(V6_0), 970 QEMU_FEAT_INITIALIZER(V6_2), 971 QEMU_FEAT_INITIALIZER(V7_0), 972 QEMU_FEAT_INITIALIZER(V7_1), 973 QEMU_FEAT_INITIALIZER(MAX), 974 }; 975 976 977 static void set_bits(uint64_t list[], BitSpec bits) 978 { 979 uint32_t i; 980 981 for (i = 0; i < bits.len; i++) { 982 list[bits.data[i] / 64] |= 1ULL << (bits.data[i] % 64); 983 } 984 } 985 986 static inline void clear_bit(uint64_t list[], unsigned long nr) 987 { 988 list[nr / 64] &= ~(1ULL << (nr % 64)); 989 } 990 991 static void print_feature_defs(void) 992 { 993 uint64_t base_feat[S390_FEAT_MAX / 64 + 1] = {}; 994 uint64_t default_feat[S390_FEAT_MAX / 64 + 1] = {}; 995 uint64_t full_feat[S390_FEAT_MAX / 64 + 1] = {}; 996 int i, j; 997 998 printf("\n/* CPU model feature list data */\n"); 999 1000 for (i = 0; i < ARRAY_SIZE(CpuFeatDef); i++) { 1001 /* With gen15 CSSKE and BPB are deprecated */ 1002 if (strcmp(CpuFeatDef[i].name, "S390_FEAT_LIST_GEN15_GA1") == 0) { 1003 clear_bit(base_feat, S390_FEAT_CONDITIONAL_SSKE); 1004 clear_bit(default_feat, S390_FEAT_CONDITIONAL_SSKE); 1005 clear_bit(default_feat, S390_FEAT_BPB); 1006 } 1007 set_bits(base_feat, CpuFeatDef[i].base_bits); 1008 /* add the base to the default features */ 1009 set_bits(default_feat, CpuFeatDef[i].base_bits); 1010 set_bits(default_feat, CpuFeatDef[i].default_bits); 1011 /* add the base to the full features */ 1012 set_bits(full_feat, CpuFeatDef[i].base_bits); 1013 set_bits(full_feat, CpuFeatDef[i].full_bits); 1014 1015 printf("#define %s_BASE\t", CpuFeatDef[i].name); 1016 for (j = 0; j < ARRAY_SIZE(base_feat); j++) { 1017 printf("0x%016"PRIx64"ULL", base_feat[j]); 1018 if (j < ARRAY_SIZE(base_feat) - 1) { 1019 printf(","); 1020 } else { 1021 printf("\n"); 1022 } 1023 } 1024 printf("#define %s_DEFAULT\t", CpuFeatDef[i].name); 1025 for (j = 0; j < ARRAY_SIZE(default_feat); j++) { 1026 printf("0x%016"PRIx64"ULL", default_feat[j]); 1027 if (j < ARRAY_SIZE(default_feat) - 1) { 1028 printf(","); 1029 } else { 1030 printf("\n"); 1031 } 1032 } 1033 printf("#define %s_FULL\t\t", CpuFeatDef[i].name); 1034 for (j = 0; j < ARRAY_SIZE(full_feat); j++) { 1035 printf("0x%016"PRIx64"ULL", full_feat[j]); 1036 if (j < ARRAY_SIZE(full_feat) - 1) { 1037 printf(","); 1038 } else { 1039 printf("\n"); 1040 } 1041 } 1042 } 1043 } 1044 1045 static void print_qemu_feature_defs(void) 1046 { 1047 uint64_t feat[S390_FEAT_MAX / 64 + 1] = {}; 1048 int i, j; 1049 1050 printf("\n/* QEMU (CPU model) feature list data */\n"); 1051 1052 /* for now we assume that we only add new features */ 1053 for (i = 0; i < ARRAY_SIZE(QemuFeatDef); i++) { 1054 set_bits(feat, QemuFeatDef[i].bits); 1055 1056 printf("#define %s\t", QemuFeatDef[i].name); 1057 for (j = 0; j < ARRAY_SIZE(feat); j++) { 1058 printf("0x%016"PRIx64"ULL", feat[j]); 1059 if (j < ARRAY_SIZE(feat) - 1) { 1060 printf(","); 1061 } else { 1062 printf("\n"); 1063 } 1064 } 1065 } 1066 } 1067 1068 static void print_feature_group_defs(void) 1069 { 1070 int i, j; 1071 1072 printf("\n/* CPU feature group list data */\n"); 1073 1074 for (i = 0; i < ARRAY_SIZE(FeatGroupDef); i++) { 1075 uint64_t feat[S390_FEAT_MAX / 64 + 1] = {}; 1076 1077 set_bits(feat, FeatGroupDef[i].bits); 1078 printf("#define %s\t", FeatGroupDef[i].name); 1079 for (j = 0; j < ARRAY_SIZE(feat); j++) { 1080 printf("0x%016"PRIx64"ULL", feat[j]); 1081 if (j < ARRAY_SIZE(feat) - 1) { 1082 printf(","); 1083 } else { 1084 printf("\n"); 1085 } 1086 } 1087 } 1088 } 1089 1090 static void print_feature_group_enum_type(void) 1091 { 1092 int i; 1093 1094 printf("\n/* CPU feature group enum type */\n" 1095 "typedef enum {\n"); 1096 for (i = 0; i < ARRAY_SIZE(FeatGroupDef); i++) { 1097 printf("\t%s,\n", FeatGroupDef[i].enum_name); 1098 } 1099 printf("\tS390_FEAT_GROUP_MAX,\n" 1100 "} S390FeatGroup;\n"); 1101 } 1102 1103 int main(int argc, char *argv[]) 1104 { 1105 printf("/*\n" 1106 " * AUTOMATICALLY GENERATED, DO NOT MODIFY HERE, EDIT\n" 1107 " * SOURCE FILE \"%s\" INSTEAD.\n" 1108 " *\n" 1109 " * Copyright %s IBM Corp.\n" 1110 " *\n" 1111 " * This work is licensed under the terms of the GNU GPL, " 1112 "version 2 or (at\n * your option) any later version. See " 1113 "the COPYING file in the top-level\n * directory.\n" 1114 " */\n\n" 1115 "#ifndef %s\n#define %s\n", __FILE__, _YEARS, _NAME_H, _NAME_H); 1116 print_feature_defs(); 1117 print_feature_group_defs(); 1118 print_qemu_feature_defs(); 1119 print_feature_group_enum_type(); 1120 printf("\n#endif\n"); 1121 return 0; 1122 } 1123