qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

gen-features.c (28417B)


      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_SUPPORT_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_EXT2,
    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 #define base_GEN16_GA1 EmptyFeat
    428 
    429 /* Full features (in order of release)
    430  * Automatically includes corresponding base features.
    431  * Full features are all features this hardware supports even if kvm/QEMU do not
    432  * support these features yet.
    433  */
    434 static uint16_t full_GEN7_GA1[] = {
    435     S390_FEAT_PPA15,
    436     S390_FEAT_BPB,
    437     S390_FEAT_SIE_F2,
    438     S390_FEAT_SIE_SKEY,
    439     S390_FEAT_SIE_GPERE,
    440     S390_FEAT_SIE_IB,
    441     S390_FEAT_SIE_CEI,
    442 };
    443 
    444 static uint16_t full_GEN7_GA2[] = {
    445     S390_FEAT_EXTENDED_TRANSLATION_2,
    446 };
    447 
    448 static uint16_t full_GEN7_GA3[] = {
    449     S390_FEAT_LONG_DISPLACEMENT,
    450     S390_FEAT_SIE_SIIF,
    451 };
    452 
    453 static uint16_t full_GEN8_GA1[] = {
    454     S390_FEAT_SIE_GSLS,
    455     S390_FEAT_SIE_64BSCAO,
    456 };
    457 
    458 #define full_GEN8_GA2 EmptyFeat
    459 
    460 static uint16_t full_GEN8_GA3[] = {
    461     S390_FEAT_ASN_LX_REUSE,
    462     S390_FEAT_EXTENDED_TRANSLATION_3,
    463 };
    464 
    465 #define full_GEN8_GA4 EmptyFeat
    466 #define full_GEN8_GA5 EmptyFeat
    467 
    468 static uint16_t full_GEN9_GA1[] = {
    469     S390_FEAT_STORE_HYPERVISOR_INFO,
    470     S390_FEAT_GROUP_MSA_EXT_1,
    471     S390_FEAT_CMM,
    472     S390_FEAT_SIE_CMMA,
    473 };
    474 
    475 static uint16_t full_GEN9_GA2[] = {
    476     S390_FEAT_MOVE_WITH_OPTIONAL_SPEC,
    477     S390_FEAT_EXTRACT_CPU_TIME,
    478     S390_FEAT_COMPARE_AND_SWAP_AND_STORE,
    479     S390_FEAT_FLOATING_POINT_SUPPORT_ENH,
    480     S390_FEAT_DFP,
    481 };
    482 
    483 static uint16_t full_GEN9_GA3[] = {
    484     S390_FEAT_CONDITIONAL_SSKE,
    485     S390_FEAT_PFPO,
    486 };
    487 
    488 static uint16_t full_GEN10_GA1[] = {
    489     S390_FEAT_EDAT,
    490     S390_FEAT_CONFIGURATION_TOPOLOGY,
    491     S390_FEAT_GROUP_MSA_EXT_2,
    492     S390_FEAT_ESOP,
    493     S390_FEAT_SIE_PFMFI,
    494     S390_FEAT_SIE_SIGPIF,
    495 };
    496 
    497 static uint16_t full_GEN10_GA2[] = {
    498     S390_FEAT_SET_PROGRAM_PARAMETERS,
    499     S390_FEAT_SIE_IBS,
    500 };
    501 
    502 static uint16_t full_GEN10_GA3[] = {
    503     S390_FEAT_GROUP_MSA_EXT_3,
    504 };
    505 
    506 static uint16_t full_GEN11_GA1[] = {
    507     S390_FEAT_IPTE_RANGE,
    508     S390_FEAT_ACCESS_EXCEPTION_FS_INDICATION,
    509     S390_FEAT_GROUP_MSA_EXT_4,
    510 };
    511 
    512 #define full_GEN11_GA2 EmptyFeat
    513 
    514 static uint16_t full_GEN12_GA1[] = {
    515     S390_FEAT_CONSTRAINT_TRANSACTIONAL_EXE,
    516     S390_FEAT_TRANSACTIONAL_EXE,
    517     S390_FEAT_RUNTIME_INSTRUMENTATION,
    518     S390_FEAT_ZPCI,
    519     S390_FEAT_ADAPTER_EVENT_NOTIFICATION,
    520     S390_FEAT_ADAPTER_INT_SUPPRESSION,
    521     S390_FEAT_EDAT_2,
    522     S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2,
    523     S390_FEAT_AP_QUERY_CONFIG_INFO,
    524     S390_FEAT_AP_QUEUE_INTERRUPT_CONTROL,
    525     S390_FEAT_AP_FACILITIES_TEST,
    526     S390_FEAT_AP,
    527     S390_FEAT_EXTENDED_LENGTH_SCCB,
    528     S390_FEAT_DIAG_318,
    529 };
    530 
    531 static uint16_t full_GEN12_GA2[] = {
    532     S390_FEAT_GROUP_MSA_EXT_5,
    533 };
    534 
    535 static uint16_t full_GEN13_GA1[] = {
    536     S390_FEAT_VECTOR,
    537 };
    538 
    539 #define full_GEN13_GA2 EmptyFeat
    540 
    541 static uint16_t full_GEN14_GA1[] = {
    542     S390_FEAT_INSTRUCTION_EXEC_PROT,
    543     S390_FEAT_GUARDED_STORAGE,
    544     S390_FEAT_VECTOR_PACKED_DECIMAL,
    545     S390_FEAT_VECTOR_ENH,
    546     S390_FEAT_MULTIPLE_EPOCH,
    547     S390_FEAT_TEST_PENDING_EXT_INTERRUPTION,
    548     S390_FEAT_INSERT_REFERENCE_BITS_MULT,
    549     S390_FEAT_GROUP_MSA_EXT_6,
    550     S390_FEAT_GROUP_MSA_EXT_7,
    551     S390_FEAT_GROUP_MSA_EXT_8,
    552     S390_FEAT_CMM_NT,
    553     S390_FEAT_ETOKEN,
    554     S390_FEAT_HPMA2,
    555     S390_FEAT_SIE_KSS,
    556     S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF,
    557 };
    558 
    559 #define full_GEN14_GA2 EmptyFeat
    560 
    561 static uint16_t full_GEN15_GA1[] = {
    562     S390_FEAT_VECTOR_ENH2,
    563     S390_FEAT_GROUP_ENH_SORT,
    564     S390_FEAT_GROUP_DEFLATE_CONVERSION,
    565     S390_FEAT_VECTOR_PACKED_DECIMAL_ENH,
    566     S390_FEAT_GROUP_MSA_EXT_9,
    567     S390_FEAT_GROUP_MSA_EXT_9_PCKMO,
    568     S390_FEAT_ETOKEN,
    569     S390_FEAT_UNPACK,
    570 };
    571 
    572 static uint16_t full_GEN16_GA1[] = {
    573     S390_FEAT_NNPA,
    574     S390_FEAT_VECTOR_PACKED_DECIMAL_ENH2,
    575     S390_FEAT_BEAR_ENH,
    576     S390_FEAT_RDP,
    577     S390_FEAT_PAI,
    578     S390_FEAT_PAIE,
    579 };
    580 
    581 
    582 /* Default features (in order of release)
    583  * Automatically includes corresponding base features.
    584  * Default features are all features this version of QEMU supports for this
    585  * hardware model. Default feature sets can grow with new QEMU releases.
    586  */
    587 #define default_GEN7_GA1 EmptyFeat
    588 #define default_GEN7_GA2 EmptyFeat
    589 #define default_GEN7_GA3 EmptyFeat
    590 #define default_GEN8_GA1 EmptyFeat
    591 #define default_GEN8_GA2 EmptyFeat
    592 #define default_GEN8_GA3 EmptyFeat
    593 #define default_GEN8_GA4 EmptyFeat
    594 #define default_GEN8_GA5 EmptyFeat
    595 
    596 static uint16_t default_GEN9_GA1[] = {
    597     S390_FEAT_STORE_HYPERVISOR_INFO,
    598     S390_FEAT_GROUP_MSA_EXT_1,
    599     S390_FEAT_CMM,
    600 };
    601 
    602 #define default_GEN9_GA2 EmptyFeat
    603 #define default_GEN9_GA3 EmptyFeat
    604 
    605 static uint16_t default_GEN10_GA1[] = {
    606     S390_FEAT_EDAT,
    607     S390_FEAT_GROUP_MSA_EXT_2,
    608 };
    609 
    610 #define default_GEN10_GA2 EmptyFeat
    611 #define default_GEN10_GA3 EmptyFeat
    612 
    613 static uint16_t default_GEN11_GA1[] = {
    614     S390_FEAT_GROUP_MSA_EXT_3,
    615     S390_FEAT_IPTE_RANGE,
    616     S390_FEAT_ACCESS_EXCEPTION_FS_INDICATION,
    617     S390_FEAT_GROUP_MSA_EXT_4,
    618     S390_FEAT_PPA15,
    619     S390_FEAT_BPB,
    620 };
    621 
    622 #define default_GEN11_GA2 EmptyFeat
    623 
    624 static uint16_t default_GEN12_GA1[] = {
    625     S390_FEAT_CONSTRAINT_TRANSACTIONAL_EXE,
    626     S390_FEAT_TRANSACTIONAL_EXE,
    627     S390_FEAT_RUNTIME_INSTRUMENTATION,
    628     S390_FEAT_ZPCI,
    629     S390_FEAT_ADAPTER_EVENT_NOTIFICATION,
    630     S390_FEAT_EDAT_2,
    631     S390_FEAT_ESOP,
    632     S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2,
    633 };
    634 
    635 #define default_GEN12_GA2 EmptyFeat
    636 
    637 static uint16_t default_GEN13_GA1[] = {
    638     S390_FEAT_GROUP_MSA_EXT_5,
    639     S390_FEAT_VECTOR,
    640 };
    641 
    642 #define default_GEN13_GA2 EmptyFeat
    643 
    644 static uint16_t default_GEN14_GA1[] = {
    645     S390_FEAT_INSTRUCTION_EXEC_PROT,
    646     S390_FEAT_GUARDED_STORAGE,
    647     S390_FEAT_VECTOR_PACKED_DECIMAL,
    648     S390_FEAT_VECTOR_ENH,
    649     S390_FEAT_GROUP_MSA_EXT_6,
    650     S390_FEAT_GROUP_MSA_EXT_7,
    651     S390_FEAT_GROUP_MSA_EXT_8,
    652     S390_FEAT_MULTIPLE_EPOCH,
    653     S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF,
    654 };
    655 
    656 #define default_GEN14_GA2 EmptyFeat
    657 
    658 static uint16_t default_GEN15_GA1[] = {
    659     S390_FEAT_VECTOR_ENH2,
    660     S390_FEAT_GROUP_DEFLATE_CONVERSION,
    661     S390_FEAT_VECTOR_PACKED_DECIMAL_ENH,
    662     S390_FEAT_GROUP_MSA_EXT_9,
    663     S390_FEAT_GROUP_MSA_EXT_9_PCKMO,
    664     S390_FEAT_ETOKEN,
    665 };
    666 
    667 static uint16_t default_GEN16_GA1[] = {
    668     S390_FEAT_NNPA,
    669     S390_FEAT_VECTOR_PACKED_DECIMAL_ENH2,
    670     S390_FEAT_BEAR_ENH,
    671     S390_FEAT_RDP,
    672     S390_FEAT_PAI,
    673     S390_FEAT_PAIE,
    674 };
    675 
    676 /* QEMU (CPU model) features */
    677 
    678 static uint16_t qemu_V2_11[] = {
    679     S390_FEAT_GROUP_PLO,
    680     S390_FEAT_ESAN3,
    681     S390_FEAT_ZARCH,
    682 };
    683 
    684 static uint16_t qemu_V3_1[] = {
    685     S390_FEAT_DAT_ENH,
    686     S390_FEAT_IDTE_SEGMENT,
    687     S390_FEAT_STFLE,
    688     S390_FEAT_SENSE_RUNNING_STATUS,
    689     S390_FEAT_EXTENDED_TRANSLATION_2,
    690     S390_FEAT_MSA,
    691     S390_FEAT_LONG_DISPLACEMENT,
    692     S390_FEAT_LONG_DISPLACEMENT_FAST,
    693     S390_FEAT_EXTENDED_IMMEDIATE,
    694     S390_FEAT_EXTENDED_TRANSLATION_3,
    695     S390_FEAT_ETF2_ENH,
    696     S390_FEAT_STORE_CLOCK_FAST,
    697     S390_FEAT_MOVE_WITH_OPTIONAL_SPEC,
    698     S390_FEAT_ETF3_ENH,
    699     S390_FEAT_EXTRACT_CPU_TIME,
    700     S390_FEAT_COMPARE_AND_SWAP_AND_STORE,
    701     S390_FEAT_COMPARE_AND_SWAP_AND_STORE_2,
    702     S390_FEAT_GENERAL_INSTRUCTIONS_EXT,
    703     S390_FEAT_EXECUTE_EXT,
    704     S390_FEAT_SET_PROGRAM_PARAMETERS,
    705     S390_FEAT_FLOATING_POINT_SUPPORT_ENH,
    706     S390_FEAT_STFLE_45,
    707     S390_FEAT_STFLE_49,
    708     S390_FEAT_LOCAL_TLB_CLEARING,
    709     S390_FEAT_INTERLOCKED_ACCESS_2,
    710     S390_FEAT_ADAPTER_EVENT_NOTIFICATION,
    711     S390_FEAT_ADAPTER_INT_SUPPRESSION,
    712     S390_FEAT_MSA_EXT_3,
    713     S390_FEAT_MSA_EXT_4,
    714 };
    715 
    716 static uint16_t qemu_V4_0[] = {
    717     /*
    718      * Only BFP bits are implemented (HFP, DFP, PFPO and DIVIDE TO INTEGER not
    719      * implemented yet).
    720      */
    721     S390_FEAT_FLOATING_POINT_EXT,
    722     S390_FEAT_ZPCI,
    723 };
    724 
    725 static uint16_t qemu_V4_1[] = {
    726     S390_FEAT_STFLE_53,
    727     S390_FEAT_VECTOR,
    728 };
    729 
    730 static uint16_t qemu_V6_0[] = {
    731     S390_FEAT_ACCESS_EXCEPTION_FS_INDICATION,
    732     S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2,
    733     S390_FEAT_ESOP,
    734 };
    735 
    736 static uint16_t qemu_V6_2[] = {
    737     S390_FEAT_INSTRUCTION_EXEC_PROT,
    738     S390_FEAT_MISC_INSTRUCTION_EXT2,
    739     S390_FEAT_MSA_EXT_8,
    740     S390_FEAT_VECTOR_ENH,
    741 };
    742 
    743 static uint16_t qemu_V7_0[] = {
    744     S390_FEAT_MISC_INSTRUCTION_EXT3,
    745 };
    746 
    747 static uint16_t qemu_V7_1[] = {
    748     S390_FEAT_VECTOR_ENH2,
    749 };
    750 
    751 /*
    752  * Features for the "qemu" CPU model of the latest QEMU machine and the "max"
    753  * CPU model under TCG. Don't include features that are not part of the full
    754  * feature set of the current "max" CPU model generation.
    755  */
    756 static uint16_t qemu_MAX[] = {
    757     S390_FEAT_MSA_EXT_5,
    758     S390_FEAT_KIMD_SHA_512,
    759     S390_FEAT_KLMD_SHA_512,
    760     S390_FEAT_PRNO_TRNG,
    761 };
    762 
    763 /****** END FEATURE DEFS ******/
    764 
    765 #define _YEARS  "2016"
    766 #define _NAME_H "TARGET_S390X_GEN_FEATURES_H"
    767 
    768 #define CPU_FEAT_INITIALIZER(_name)                    \
    769     {                                                  \
    770         .name = "S390_FEAT_LIST_" #_name,              \
    771         .base_bits =                                   \
    772             { .data = base_##_name,                    \
    773               .len = ARRAY_SIZE(base_##_name) },       \
    774         .default_bits =                                \
    775             { .data = default_##_name,                 \
    776               .len = ARRAY_SIZE(default_##_name) },    \
    777         .full_bits =                                   \
    778             { .data = full_##_name,                    \
    779               .len = ARRAY_SIZE(full_##_name) },       \
    780     }
    781 
    782 typedef struct BitSpec {
    783     uint16_t *data;
    784     uint32_t len;
    785 } BitSpec;
    786 
    787 typedef struct {
    788     const char *name;
    789     BitSpec base_bits;
    790     BitSpec default_bits;
    791     BitSpec full_bits;
    792 } CpuFeatDefSpec;
    793 
    794 static uint16_t EmptyFeat[] = {};
    795 
    796 /*******************************
    797  * processor GA series
    798  *******************************/
    799 static CpuFeatDefSpec CpuFeatDef[] = {
    800     CPU_FEAT_INITIALIZER(GEN7_GA1),
    801     CPU_FEAT_INITIALIZER(GEN7_GA2),
    802     CPU_FEAT_INITIALIZER(GEN7_GA3),
    803     CPU_FEAT_INITIALIZER(GEN8_GA1),
    804     CPU_FEAT_INITIALIZER(GEN8_GA2),
    805     CPU_FEAT_INITIALIZER(GEN8_GA3),
    806     CPU_FEAT_INITIALIZER(GEN8_GA4),
    807     CPU_FEAT_INITIALIZER(GEN8_GA5),
    808     CPU_FEAT_INITIALIZER(GEN9_GA1),
    809     CPU_FEAT_INITIALIZER(GEN9_GA2),
    810     CPU_FEAT_INITIALIZER(GEN9_GA3),
    811     CPU_FEAT_INITIALIZER(GEN10_GA1),
    812     CPU_FEAT_INITIALIZER(GEN10_GA2),
    813     CPU_FEAT_INITIALIZER(GEN10_GA3),
    814     CPU_FEAT_INITIALIZER(GEN11_GA1),
    815     CPU_FEAT_INITIALIZER(GEN11_GA2),
    816     CPU_FEAT_INITIALIZER(GEN12_GA1),
    817     CPU_FEAT_INITIALIZER(GEN12_GA2),
    818     CPU_FEAT_INITIALIZER(GEN13_GA1),
    819     CPU_FEAT_INITIALIZER(GEN13_GA2),
    820     CPU_FEAT_INITIALIZER(GEN14_GA1),
    821     CPU_FEAT_INITIALIZER(GEN14_GA2),
    822     CPU_FEAT_INITIALIZER(GEN15_GA1),
    823     CPU_FEAT_INITIALIZER(GEN16_GA1),
    824 };
    825 
    826 #define FEAT_GROUP_INITIALIZER(_name)                  \
    827     {                                                  \
    828         .name = "S390_FEAT_GROUP_LIST_" #_name,        \
    829         .enum_name = "S390_FEAT_GROUP_" #_name,        \
    830         .bits =                                        \
    831             { .data = group_##_name,                   \
    832               .len = ARRAY_SIZE(group_##_name) },      \
    833     }
    834 
    835 typedef struct {
    836     const char *name;
    837     const char *enum_name;
    838     BitSpec bits;
    839 } FeatGroupDefSpec;
    840 
    841 /*******************************
    842  * feature groups
    843  *******************************/
    844 static FeatGroupDefSpec FeatGroupDef[] = {
    845     FEAT_GROUP_INITIALIZER(PLO),
    846     FEAT_GROUP_INITIALIZER(TOD_CLOCK_STEERING),
    847     FEAT_GROUP_INITIALIZER(GEN13_PTFF),
    848     FEAT_GROUP_INITIALIZER(MSA),
    849     FEAT_GROUP_INITIALIZER(MSA_EXT_1),
    850     FEAT_GROUP_INITIALIZER(MSA_EXT_2),
    851     FEAT_GROUP_INITIALIZER(MSA_EXT_3),
    852     FEAT_GROUP_INITIALIZER(MSA_EXT_4),
    853     FEAT_GROUP_INITIALIZER(MSA_EXT_5),
    854     FEAT_GROUP_INITIALIZER(MSA_EXT_6),
    855     FEAT_GROUP_INITIALIZER(MSA_EXT_7),
    856     FEAT_GROUP_INITIALIZER(MSA_EXT_8),
    857     FEAT_GROUP_INITIALIZER(MSA_EXT_9),
    858     FEAT_GROUP_INITIALIZER(MSA_EXT_9_PCKMO),
    859     FEAT_GROUP_INITIALIZER(MULTIPLE_EPOCH_PTFF),
    860     FEAT_GROUP_INITIALIZER(ENH_SORT),
    861     FEAT_GROUP_INITIALIZER(DEFLATE_CONVERSION),
    862 };
    863 
    864 #define QEMU_FEAT_INITIALIZER(_name)                   \
    865     {                                                  \
    866         .name = "S390_FEAT_LIST_QEMU_" #_name,         \
    867         .bits =                                        \
    868             { .data = qemu_##_name,                    \
    869               .len = ARRAY_SIZE(qemu_##_name) },       \
    870     }
    871 
    872 /*******************************
    873  * QEMU (CPU model) features
    874  *******************************/
    875 static FeatGroupDefSpec QemuFeatDef[] = {
    876     QEMU_FEAT_INITIALIZER(V2_11),
    877     QEMU_FEAT_INITIALIZER(V3_1),
    878     QEMU_FEAT_INITIALIZER(V4_0),
    879     QEMU_FEAT_INITIALIZER(V4_1),
    880     QEMU_FEAT_INITIALIZER(V6_0),
    881     QEMU_FEAT_INITIALIZER(V6_2),
    882     QEMU_FEAT_INITIALIZER(V7_0),
    883     QEMU_FEAT_INITIALIZER(V7_1),
    884     QEMU_FEAT_INITIALIZER(MAX),
    885 };
    886 
    887 
    888 static void set_bits(uint64_t list[], BitSpec bits)
    889 {
    890     uint32_t i;
    891 
    892     for (i = 0; i < bits.len; i++) {
    893         list[bits.data[i] / 64] |= 1ULL << (bits.data[i] % 64);
    894     }
    895 }
    896 
    897 static inline void clear_bit(uint64_t list[], unsigned long nr)
    898 {
    899     list[nr / 64] &= ~(1ULL << (nr % 64));
    900 }
    901 
    902 static void print_feature_defs(void)
    903 {
    904     uint64_t base_feat[S390_FEAT_MAX / 64 + 1] = {};
    905     uint64_t default_feat[S390_FEAT_MAX / 64 + 1] = {};
    906     uint64_t full_feat[S390_FEAT_MAX / 64 + 1] = {};
    907     int i, j;
    908 
    909     printf("\n/* CPU model feature list data */\n");
    910 
    911     for (i = 0; i < ARRAY_SIZE(CpuFeatDef); i++) {
    912         /* With gen15 CSSKE and BPB are deprecated */
    913         if (strcmp(CpuFeatDef[i].name, "S390_FEAT_LIST_GEN15_GA1") == 0) {
    914             clear_bit(base_feat, S390_FEAT_CONDITIONAL_SSKE);
    915             clear_bit(default_feat, S390_FEAT_CONDITIONAL_SSKE);
    916             clear_bit(default_feat, S390_FEAT_BPB);
    917         }
    918         set_bits(base_feat, CpuFeatDef[i].base_bits);
    919         /* add the base to the default features */
    920         set_bits(default_feat, CpuFeatDef[i].base_bits);
    921         set_bits(default_feat, CpuFeatDef[i].default_bits);
    922         /* add the base to the full features */
    923         set_bits(full_feat, CpuFeatDef[i].base_bits);
    924         set_bits(full_feat, CpuFeatDef[i].full_bits);
    925 
    926         printf("#define %s_BASE\t", CpuFeatDef[i].name);
    927         for (j = 0; j < ARRAY_SIZE(base_feat); j++) {
    928             printf("0x%016"PRIx64"ULL", base_feat[j]);
    929             if (j < ARRAY_SIZE(base_feat) - 1) {
    930                 printf(",");
    931             } else {
    932                 printf("\n");
    933             }
    934         }
    935         printf("#define %s_DEFAULT\t", CpuFeatDef[i].name);
    936         for (j = 0; j < ARRAY_SIZE(default_feat); j++) {
    937             printf("0x%016"PRIx64"ULL", default_feat[j]);
    938             if (j < ARRAY_SIZE(default_feat) - 1) {
    939                 printf(",");
    940             } else {
    941                 printf("\n");
    942             }
    943         }
    944         printf("#define %s_FULL\t\t", CpuFeatDef[i].name);
    945         for (j = 0; j < ARRAY_SIZE(full_feat); j++) {
    946             printf("0x%016"PRIx64"ULL", full_feat[j]);
    947             if (j < ARRAY_SIZE(full_feat) - 1) {
    948                 printf(",");
    949             } else {
    950                 printf("\n");
    951             }
    952         }
    953     }
    954 }
    955 
    956 static void print_qemu_feature_defs(void)
    957 {
    958     uint64_t feat[S390_FEAT_MAX / 64 + 1] = {};
    959     int i, j;
    960 
    961     printf("\n/* QEMU (CPU model) feature list data */\n");
    962 
    963     /* for now we assume that we only add new features */
    964     for (i = 0; i < ARRAY_SIZE(QemuFeatDef); i++) {
    965         set_bits(feat, QemuFeatDef[i].bits);
    966 
    967         printf("#define %s\t", QemuFeatDef[i].name);
    968         for (j = 0; j < ARRAY_SIZE(feat); j++) {
    969             printf("0x%016"PRIx64"ULL", feat[j]);
    970             if (j < ARRAY_SIZE(feat) - 1) {
    971                 printf(",");
    972             } else {
    973                 printf("\n");
    974             }
    975         }
    976     }
    977 }
    978 
    979 static void print_feature_group_defs(void)
    980 {
    981     int i, j;
    982 
    983     printf("\n/* CPU feature group list data */\n");
    984 
    985     for (i = 0; i < ARRAY_SIZE(FeatGroupDef); i++) {
    986         uint64_t feat[S390_FEAT_MAX / 64 + 1] = {};
    987 
    988         set_bits(feat, FeatGroupDef[i].bits);
    989         printf("#define %s\t", FeatGroupDef[i].name);
    990         for (j = 0; j < ARRAY_SIZE(feat); j++) {
    991             printf("0x%016"PRIx64"ULL", feat[j]);
    992             if (j < ARRAY_SIZE(feat) - 1) {
    993                 printf(",");
    994             } else {
    995                 printf("\n");
    996             }
    997         }
    998     }
    999 }
   1000 
   1001 static void print_feature_group_enum_type(void)
   1002 {
   1003     int i;
   1004 
   1005     printf("\n/* CPU feature group enum type */\n"
   1006            "typedef enum {\n");
   1007     for (i = 0; i < ARRAY_SIZE(FeatGroupDef); i++) {
   1008         printf("\t%s,\n", FeatGroupDef[i].enum_name);
   1009     }
   1010     printf("\tS390_FEAT_GROUP_MAX,\n"
   1011            "} S390FeatGroup;\n");
   1012 }
   1013 
   1014 int main(int argc, char *argv[])
   1015 {
   1016     printf("/*\n"
   1017            " * AUTOMATICALLY GENERATED, DO NOT MODIFY HERE, EDIT\n"
   1018            " * SOURCE FILE \"%s\" INSTEAD.\n"
   1019            " *\n"
   1020            " * Copyright %s IBM Corp.\n"
   1021            " *\n"
   1022            " * This work is licensed under the terms of the GNU GPL, "
   1023            "version 2 or (at\n * your option) any later version. See "
   1024            "the COPYING file in the top-level\n * directory.\n"
   1025            " */\n\n"
   1026            "#ifndef %s\n#define %s\n", __FILE__, _YEARS, _NAME_H, _NAME_H);
   1027     print_feature_defs();
   1028     print_feature_group_defs();
   1029     print_qemu_feature_defs();
   1030     print_feature_group_enum_type();
   1031     printf("\n#endif\n");
   1032     return 0;
   1033 }