qemu/target-s390x/gen-features.c
<<
>>
Prefs
   1/*
   2 * S390 feature list generator
   3 *
   4 * Copyright 2016 IBM Corp.
   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
  15
  16#include "inttypes.h"
  17#include "stdio.h"
  18#include "cpu_features_def.h"
  19
  20#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
  21
  22/***** BEGIN FEATURE DEFS *****/
  23
  24#define S390_FEAT_GROUP_PLO \
  25    S390_FEAT_PLO_CL, \
  26    S390_FEAT_PLO_CLG, \
  27    S390_FEAT_PLO_CLGR, \
  28    S390_FEAT_PLO_CLX, \
  29    S390_FEAT_PLO_CS, \
  30    S390_FEAT_PLO_CSG, \
  31    S390_FEAT_PLO_CSGR, \
  32    S390_FEAT_PLO_CSX, \
  33    S390_FEAT_PLO_DCS, \
  34    S390_FEAT_PLO_DCSG, \
  35    S390_FEAT_PLO_DCSGR, \
  36    S390_FEAT_PLO_DCSX, \
  37    S390_FEAT_PLO_CSST, \
  38    S390_FEAT_PLO_CSSTG, \
  39    S390_FEAT_PLO_CSSTGR, \
  40    S390_FEAT_PLO_CSSTX, \
  41    S390_FEAT_PLO_CSDST, \
  42    S390_FEAT_PLO_CSDSTG, \
  43    S390_FEAT_PLO_CSDSTGR, \
  44    S390_FEAT_PLO_CSDSTX, \
  45    S390_FEAT_PLO_CSTST, \
  46    S390_FEAT_PLO_CSTSTG, \
  47    S390_FEAT_PLO_CSTSTGR, \
  48    S390_FEAT_PLO_CSTSTX
  49
  50#define S390_FEAT_GROUP_TOD_CLOCK_STEERING \
  51    S390_FEAT_TOD_CLOCK_STEERING, \
  52    S390_FEAT_PTFF_QTO, \
  53    S390_FEAT_PTFF_QSI, \
  54    S390_FEAT_PTFF_QPT, \
  55    S390_FEAT_PTFF_STO
  56
  57#define S390_FEAT_GROUP_GEN13_PTFF \
  58    S390_FEAT_PTFF_QUI, \
  59    S390_FEAT_PTFF_QTOU, \
  60    S390_FEAT_PTFF_STOU
  61
  62#define S390_FEAT_GROUP_MSA \
  63    S390_FEAT_MSA, \
  64    S390_FEAT_KMAC_DEA, \
  65    S390_FEAT_KMAC_TDEA_128, \
  66    S390_FEAT_KMAC_TDEA_192, \
  67    S390_FEAT_KMC_DEA, \
  68    S390_FEAT_KMC_TDEA_128, \
  69    S390_FEAT_KMC_TDEA_192, \
  70    S390_FEAT_KM_DEA, \
  71    S390_FEAT_KM_TDEA_128, \
  72    S390_FEAT_KM_TDEA_192, \
  73    S390_FEAT_KIMD_SHA_1, \
  74    S390_FEAT_KLMD_SHA_1
  75
  76#define S390_FEAT_GROUP_MSA_EXT_1 \
  77    S390_FEAT_KMC_AES_128, \
  78    S390_FEAT_KM_AES_128, \
  79    S390_FEAT_KIMD_SHA_256, \
  80    S390_FEAT_KLMD_SHA_256
  81
  82#define S390_FEAT_GROUP_MSA_EXT_2 \
  83    S390_FEAT_KMC_AES_192, \
  84    S390_FEAT_KMC_AES_256, \
  85    S390_FEAT_KMC_PRNG, \
  86    S390_FEAT_KM_AES_192, \
  87    S390_FEAT_KM_AES_256, \
  88    S390_FEAT_KIMD_SHA_512, \
  89    S390_FEAT_KLMD_SHA_512
  90
  91#define S390_FEAT_GROUP_MSA_EXT_3 \
  92    S390_FEAT_MSA_EXT_3, \
  93    S390_FEAT_KMAC_EDEA, \
  94    S390_FEAT_KMAC_ETDEA_128, \
  95    S390_FEAT_KMAC_ETDEA_192, \
  96    S390_FEAT_KMC_EAES_128, \
  97    S390_FEAT_KMC_EAES_192, \
  98    S390_FEAT_KMC_EAES_256, \
  99    S390_FEAT_KMC_EDEA, \
 100    S390_FEAT_KMC_ETDEA_128, \
 101    S390_FEAT_KMC_ETDEA_192, \
 102    S390_FEAT_KM_EDEA, \
 103    S390_FEAT_KM_ETDEA_128, \
 104    S390_FEAT_KM_ETDEA_192, \
 105    S390_FEAT_KM_EAES_128, \
 106    S390_FEAT_KM_EAES_192, \
 107    S390_FEAT_KM_EAES_256, \
 108    S390_FEAT_PCKMO_EDEA, \
 109    S390_FEAT_PCKMO_ETDEA_128, \
 110    S390_FEAT_PCKMO_ETDEA_256, \
 111    S390_FEAT_PCKMO_AES_128, \
 112    S390_FEAT_PCKMO_AES_192, \
 113    S390_FEAT_PCKMO_AES_256
 114
 115#define S390_FEAT_GROUP_MSA_EXT_4 \
 116    S390_FEAT_MSA_EXT_4, \
 117    S390_FEAT_KMAC_AES_128, \
 118    S390_FEAT_KMAC_AES_192, \
 119    S390_FEAT_KMAC_AES_256, \
 120    S390_FEAT_KMAC_EAES_128, \
 121    S390_FEAT_KMAC_EAES_192, \
 122    S390_FEAT_KMAC_EAES_256, \
 123    S390_FEAT_KM_XTS_AES_128, \
 124    S390_FEAT_KM_XTS_AES_256, \
 125    S390_FEAT_KM_XTS_EAES_128, \
 126    S390_FEAT_KM_XTS_EAES_256, \
 127    S390_FEAT_KIMD_GHASH, \
 128    S390_FEAT_KMCTR_DEA, \
 129    S390_FEAT_KMCTR_TDEA_128, \
 130    S390_FEAT_KMCTR_TDEA_192, \
 131    S390_FEAT_KMCTR_EDEA, \
 132    S390_FEAT_KMCTR_ETDEA_128, \
 133    S390_FEAT_KMCTR_ETDEA_192, \
 134    S390_FEAT_KMCTR_AES_128, \
 135    S390_FEAT_KMCTR_AES_192, \
 136    S390_FEAT_KMCTR_AES_256, \
 137    S390_FEAT_KMCTR_EAES_128, \
 138    S390_FEAT_KMCTR_EAES_192, \
 139    S390_FEAT_KMCTR_EAES_256, \
 140    S390_FEAT_KMF_DEA, \
 141    S390_FEAT_KMF_TDEA_128, \
 142    S390_FEAT_KMF_TDEA_192, \
 143    S390_FEAT_KMF_EDEA, \
 144    S390_FEAT_KMF_ETDEA_128, \
 145    S390_FEAT_KMF_ETDEA_192, \
 146    S390_FEAT_KMF_AES_128, \
 147    S390_FEAT_KMF_AES_192, \
 148    S390_FEAT_KMF_AES_256, \
 149    S390_FEAT_KMF_EAES_128, \
 150    S390_FEAT_KMF_EAES_192, \
 151    S390_FEAT_KMF_EAES_256, \
 152    S390_FEAT_KMO_DEA, \
 153    S390_FEAT_KMO_TDEA_128, \
 154    S390_FEAT_KMO_TDEA_192, \
 155    S390_FEAT_KMO_EDEA, \
 156    S390_FEAT_KMO_ETDEA_128, \
 157    S390_FEAT_KMO_ETDEA_192, \
 158    S390_FEAT_KMO_AES_128, \
 159    S390_FEAT_KMO_AES_192, \
 160    S390_FEAT_KMO_AES_256, \
 161    S390_FEAT_KMO_EAES_128, \
 162    S390_FEAT_KMO_EAES_192, \
 163    S390_FEAT_KMO_EAES_256, \
 164    S390_FEAT_PCC_CMAC_DEA, \
 165    S390_FEAT_PCC_CMAC_TDEA_128, \
 166    S390_FEAT_PCC_CMAC_TDEA_192, \
 167    S390_FEAT_PCC_CMAC_ETDEA_128, \
 168    S390_FEAT_PCC_CMAC_ETDEA_192, \
 169    S390_FEAT_PCC_CMAC_TDEA, \
 170    S390_FEAT_PCC_CMAC_AES_128, \
 171    S390_FEAT_PCC_CMAC_AES_192, \
 172    S390_FEAT_PCC_CMAC_AES_256, \
 173    S390_FEAT_PCC_CMAC_EAES_128, \
 174    S390_FEAT_PCC_CMAC_EAES_192, \
 175    S390_FEAT_PCC_CMAC_EAES_256, \
 176    S390_FEAT_PCC_XTS_AES_128, \
 177    S390_FEAT_PCC_XTS_AES_256, \
 178    S390_FEAT_PCC_XTS_EAES_128, \
 179    S390_FEAT_PCC_XTS_EAES_256
 180
 181#define S390_FEAT_GROUP_MSA_EXT_5 \
 182    S390_FEAT_MSA_EXT_5, \
 183    S390_FEAT_PPNO_SHA_512_DRNG
 184
 185/* cpu feature groups */
 186static uint16_t group_PLO[] = {
 187    S390_FEAT_GROUP_PLO,
 188};
 189static uint16_t group_TOD_CLOCK_STEERING[] = {
 190    S390_FEAT_GROUP_TOD_CLOCK_STEERING,
 191};
 192static uint16_t group_GEN13_PTFF[] = {
 193    S390_FEAT_GROUP_GEN13_PTFF,
 194};
 195static uint16_t group_MSA[] = {
 196    S390_FEAT_GROUP_MSA,
 197};
 198static uint16_t group_MSA_EXT_1[] = {
 199    S390_FEAT_GROUP_MSA_EXT_1,
 200};
 201static uint16_t group_MSA_EXT_2[] = {
 202    S390_FEAT_GROUP_MSA_EXT_2,
 203};
 204static uint16_t group_MSA_EXT_3[] = {
 205    S390_FEAT_GROUP_MSA_EXT_3,
 206};
 207static uint16_t group_MSA_EXT_4[] = {
 208    S390_FEAT_GROUP_MSA_EXT_4,
 209};
 210static uint16_t group_MSA_EXT_5[] = {
 211    S390_FEAT_GROUP_MSA_EXT_5,
 212};
 213
 214/* base features in order of release */
 215static uint16_t base_GEN7_GA1[] = {
 216    S390_FEAT_GROUP_PLO,
 217    S390_FEAT_ESAN3,
 218    S390_FEAT_ZARCH,
 219};
 220#define base_GEN7_GA2 EmptyFeat
 221#define base_GEN7_GA3 EmptyFeat
 222static uint16_t base_GEN8_GA1[] = {
 223    S390_FEAT_DAT_ENH,
 224    S390_FEAT_EXTENDED_TRANSLATION_2,
 225    S390_FEAT_GROUP_MSA,
 226    S390_FEAT_LONG_DISPLACEMENT,
 227    S390_FEAT_LONG_DISPLACEMENT_FAST,
 228    S390_FEAT_HFP_MADDSUB,
 229};
 230#define base_GEN8_GA2 EmptyFeat
 231#define base_GEN8_GA3 EmptyFeat
 232#define base_GEN8_GA4 EmptyFeat
 233#define base_GEN8_GA5 EmptyFeat
 234static uint16_t base_GEN9_GA1[] = {
 235    S390_FEAT_IDTE_SEGMENT,
 236    S390_FEAT_ASN_LX_REUSE,
 237    S390_FEAT_STFLE,
 238    S390_FEAT_SENSE_RUNNING_STATUS,
 239    S390_FEAT_EXTENDED_IMMEDIATE,
 240    S390_FEAT_EXTENDED_TRANSLATION_3,
 241    S390_FEAT_HFP_UNNORMALIZED_EXT,
 242    S390_FEAT_ETF2_ENH,
 243    S390_FEAT_STORE_CLOCK_FAST,
 244    S390_FEAT_GROUP_TOD_CLOCK_STEERING,
 245    S390_FEAT_ETF3_ENH,
 246    S390_FEAT_DAT_ENH_2,
 247};
 248#define base_GEN9_GA2 EmptyFeat
 249#define base_GEN9_GA3 EmptyFeat
 250static uint16_t base_GEN10_GA1[] = {
 251    S390_FEAT_CONDITIONAL_SSKE,
 252    S390_FEAT_PARSING_ENH,
 253    S390_FEAT_MOVE_WITH_OPTIONAL_SPEC,
 254    S390_FEAT_EXTRACT_CPU_TIME,
 255    S390_FEAT_COMPARE_AND_SWAP_AND_STORE,
 256    S390_FEAT_COMPARE_AND_SWAP_AND_STORE_2,
 257    S390_FEAT_GENERAL_INSTRUCTIONS_EXT,
 258    S390_FEAT_EXECUTE_EXT,
 259    S390_FEAT_FLOATING_POINT_SUPPPORT_ENH,
 260    S390_FEAT_DFP,
 261    S390_FEAT_DFP_FAST,
 262    S390_FEAT_PFPO,
 263};
 264#define base_GEN10_GA2 EmptyFeat
 265#define base_GEN10_GA3 EmptyFeat
 266static uint16_t base_GEN11_GA1[] = {
 267    S390_FEAT_NONQ_KEY_SETTING,
 268    S390_FEAT_ENHANCED_MONITOR,
 269    S390_FEAT_FLOATING_POINT_EXT,
 270    S390_FEAT_SET_PROGRAM_PARAMETERS,
 271    S390_FEAT_STFLE_45,
 272    S390_FEAT_CMPSC_ENH,
 273    S390_FEAT_INTERLOCKED_ACCESS_2,
 274};
 275#define base_GEN11_GA2 EmptyFeat
 276static uint16_t base_GEN12_GA1[] = {
 277    S390_FEAT_DFP_ZONED_CONVERSION,
 278    S390_FEAT_STFLE_49,
 279    S390_FEAT_LOCAL_TLB_CLEARING,
 280};
 281#define base_GEN12_GA2 EmptyFeat
 282static uint16_t base_GEN13_GA1[] = {
 283    S390_FEAT_STFLE_53,
 284    S390_FEAT_DFP_PACKED_CONVERSION,
 285    S390_FEAT_GROUP_GEN13_PTFF,
 286};
 287#define base_GEN13_GA2 EmptyFeat
 288
 289/* full features differing to the base in order of release */
 290static uint16_t full_GEN7_GA1[] = {
 291    S390_FEAT_SIE_F2,
 292    S390_FEAT_SIE_SKEY,
 293    S390_FEAT_SIE_GPERE,
 294    S390_FEAT_SIE_IB,
 295    S390_FEAT_SIE_CEI,
 296};
 297static uint16_t full_GEN7_GA2[] = {
 298    S390_FEAT_EXTENDED_TRANSLATION_2,
 299};
 300static uint16_t full_GEN7_GA3[] = {
 301    S390_FEAT_LONG_DISPLACEMENT,
 302    S390_FEAT_SIE_SIIF,
 303};
 304static uint16_t full_GEN8_GA1[] = {
 305    S390_FEAT_SIE_GSLS,
 306    S390_FEAT_SIE_64BSCAO,
 307};
 308#define full_GEN8_GA2 EmptyFeat
 309static uint16_t full_GEN8_GA3[] = {
 310    S390_FEAT_ASN_LX_REUSE,
 311    S390_FEAT_EXTENDED_TRANSLATION_3,
 312};
 313#define full_GEN8_GA4 EmptyFeat
 314#define full_GEN8_GA5 EmptyFeat
 315static uint16_t full_GEN9_GA1[] = {
 316    S390_FEAT_STORE_HYPERVISOR_INFO,
 317    S390_FEAT_GROUP_MSA_EXT_1,
 318    S390_FEAT_CMM,
 319    S390_FEAT_SIE_CMMA,
 320};
 321static uint16_t full_GEN9_GA2[] = {
 322    S390_FEAT_MOVE_WITH_OPTIONAL_SPEC,
 323    S390_FEAT_EXTRACT_CPU_TIME,
 324    S390_FEAT_COMPARE_AND_SWAP_AND_STORE,
 325    S390_FEAT_FLOATING_POINT_SUPPPORT_ENH,
 326    S390_FEAT_DFP,
 327};
 328static uint16_t full_GEN9_GA3[] = {
 329    S390_FEAT_CONDITIONAL_SSKE,
 330    S390_FEAT_PFPO,
 331};
 332static uint16_t full_GEN10_GA1[] = {
 333    S390_FEAT_EDAT,
 334    S390_FEAT_CONFIGURATION_TOPOLOGY,
 335    S390_FEAT_GROUP_MSA_EXT_2,
 336    S390_FEAT_ESOP,
 337    S390_FEAT_SIE_PFMFI,
 338    S390_FEAT_SIE_SIGPIF,
 339};
 340static uint16_t full_GEN10_GA2[] = {
 341    S390_FEAT_SET_PROGRAM_PARAMETERS,
 342    S390_FEAT_SIE_IBS,
 343};
 344static uint16_t full_GEN10_GA3[] = {
 345    S390_FEAT_GROUP_MSA_EXT_3,
 346};
 347static uint16_t full_GEN11_GA1[] = {
 348    S390_FEAT_IPTE_RANGE,
 349    S390_FEAT_ACCESS_EXCEPTION_FS_INDICATION,
 350    S390_FEAT_GROUP_MSA_EXT_4,
 351};
 352#define full_GEN11_GA2 EmptyFeat
 353static uint16_t full_GEN12_GA1[] = {
 354    S390_FEAT_CONSTRAINT_TRANSACTIONAL_EXE,
 355    S390_FEAT_TRANSACTIONAL_EXE,
 356    S390_FEAT_RUNTIME_INSTRUMENTATION,
 357    S390_FEAT_EDAT_2,
 358};
 359static uint16_t full_GEN12_GA2[] = {
 360    S390_FEAT_GROUP_MSA_EXT_5,
 361};
 362static uint16_t full_GEN13_GA1[] = {
 363    S390_FEAT_VECTOR,
 364};
 365#define full_GEN13_GA2 EmptyFeat
 366
 367/* default features differing to the base in order of release */
 368#define default_GEN7_GA1 EmptyFeat
 369#define default_GEN7_GA2 EmptyFeat
 370#define default_GEN7_GA3 EmptyFeat
 371#define default_GEN8_GA1 EmptyFeat
 372#define default_GEN8_GA2 EmptyFeat
 373#define default_GEN8_GA3 EmptyFeat
 374#define default_GEN8_GA4 EmptyFeat
 375#define default_GEN8_GA5 EmptyFeat
 376static uint16_t default_GEN9_GA1[] = {
 377    S390_FEAT_STORE_HYPERVISOR_INFO,
 378    S390_FEAT_GROUP_MSA_EXT_1,
 379    S390_FEAT_CMM,
 380};
 381#define default_GEN9_GA2 EmptyFeat
 382#define default_GEN9_GA3 EmptyFeat
 383static uint16_t default_GEN10_GA1[] = {
 384    S390_FEAT_EDAT,
 385    S390_FEAT_GROUP_MSA_EXT_2,
 386};
 387#define default_GEN10_GA2 EmptyFeat
 388#define default_GEN10_GA3 EmptyFeat
 389static uint16_t default_GEN11_GA1[] = {
 390    S390_FEAT_GROUP_MSA_EXT_3,
 391    S390_FEAT_IPTE_RANGE,
 392    S390_FEAT_ACCESS_EXCEPTION_FS_INDICATION,
 393    S390_FEAT_GROUP_MSA_EXT_4,
 394};
 395#define default_GEN11_GA2 EmptyFeat
 396static uint16_t default_GEN12_GA1[] = {
 397    S390_FEAT_CONSTRAINT_TRANSACTIONAL_EXE,
 398    S390_FEAT_TRANSACTIONAL_EXE,
 399    S390_FEAT_RUNTIME_INSTRUMENTATION,
 400    S390_FEAT_EDAT_2,
 401};
 402#define default_GEN12_GA2 EmptyFeat
 403static uint16_t default_GEN13_GA1[] = {
 404    S390_FEAT_GROUP_MSA_EXT_5,
 405    S390_FEAT_VECTOR,
 406};
 407#define default_GEN13_GA2 EmptyFeat
 408
 409/****** END FEATURE DEFS ******/
 410
 411#define _YEARS  "2016"
 412#define _NAME_H "TARGET_S390X_GEN_FEATURES_H"
 413
 414#define CPU_FEAT_INITIALIZER(_name)                    \
 415    {                                                  \
 416        .name = "S390_FEAT_LIST_" #_name,              \
 417        .base_bits =                                   \
 418            { .data = base_##_name,                    \
 419              .len = ARRAY_SIZE(base_##_name) },       \
 420        .default_bits =                                \
 421            { .data = default_##_name,                 \
 422              .len = ARRAY_SIZE(default_##_name) },    \
 423        .full_bits =                                   \
 424            { .data = full_##_name,                    \
 425              .len = ARRAY_SIZE(full_##_name) },       \
 426    }
 427
 428typedef struct BitSpec {
 429    uint16_t *data;
 430    uint32_t len;
 431} BitSpec;
 432
 433typedef struct {
 434    const char *name;
 435    BitSpec base_bits;
 436    BitSpec default_bits;
 437    BitSpec full_bits;
 438} CpuFeatDefSpec;
 439
 440static uint16_t EmptyFeat[] = {};
 441
 442/*******************************
 443 * processor GA series
 444 *******************************/
 445static CpuFeatDefSpec CpuFeatDef[] = {
 446    CPU_FEAT_INITIALIZER(GEN7_GA1),
 447    CPU_FEAT_INITIALIZER(GEN7_GA2),
 448    CPU_FEAT_INITIALIZER(GEN7_GA3),
 449    CPU_FEAT_INITIALIZER(GEN8_GA1),
 450    CPU_FEAT_INITIALIZER(GEN8_GA2),
 451    CPU_FEAT_INITIALIZER(GEN8_GA3),
 452    CPU_FEAT_INITIALIZER(GEN8_GA4),
 453    CPU_FEAT_INITIALIZER(GEN8_GA5),
 454    CPU_FEAT_INITIALIZER(GEN9_GA1),
 455    CPU_FEAT_INITIALIZER(GEN9_GA2),
 456    CPU_FEAT_INITIALIZER(GEN9_GA3),
 457    CPU_FEAT_INITIALIZER(GEN10_GA1),
 458    CPU_FEAT_INITIALIZER(GEN10_GA2),
 459    CPU_FEAT_INITIALIZER(GEN10_GA3),
 460    CPU_FEAT_INITIALIZER(GEN11_GA1),
 461    CPU_FEAT_INITIALIZER(GEN11_GA2),
 462    CPU_FEAT_INITIALIZER(GEN12_GA1),
 463    CPU_FEAT_INITIALIZER(GEN12_GA2),
 464    CPU_FEAT_INITIALIZER(GEN13_GA1),
 465    CPU_FEAT_INITIALIZER(GEN13_GA2),
 466};
 467
 468#define FEAT_GROUP_INITIALIZER(_name)                  \
 469    {                                                  \
 470        .name = "S390_FEAT_GROUP_LIST_" #_name,        \
 471        .bits =                                        \
 472            { .data = group_##_name,                   \
 473              .len = ARRAY_SIZE(group_##_name) },      \
 474    }
 475
 476typedef struct {
 477    const char *name;
 478    BitSpec bits;
 479} FeatGroupDefSpec;
 480
 481/*******************************
 482 * feature groups
 483 *******************************/
 484static FeatGroupDefSpec FeatGroupDef[] = {
 485    FEAT_GROUP_INITIALIZER(PLO),
 486    FEAT_GROUP_INITIALIZER(TOD_CLOCK_STEERING),
 487    FEAT_GROUP_INITIALIZER(GEN13_PTFF),
 488    FEAT_GROUP_INITIALIZER(MSA),
 489    FEAT_GROUP_INITIALIZER(MSA_EXT_1),
 490    FEAT_GROUP_INITIALIZER(MSA_EXT_2),
 491    FEAT_GROUP_INITIALIZER(MSA_EXT_3),
 492    FEAT_GROUP_INITIALIZER(MSA_EXT_4),
 493    FEAT_GROUP_INITIALIZER(MSA_EXT_5),
 494};
 495
 496static void set_bits(uint64_t list[], BitSpec bits)
 497{
 498    uint32_t i;
 499
 500    for (i = 0; i < bits.len; i++) {
 501        list[bits.data[i] / 64] |= 1ULL << (bits.data[i] % 64);
 502    }
 503}
 504
 505static void print_feature_defs(void)
 506{
 507    uint64_t base_feat[S390_FEAT_MAX / 64 + 1] = {};
 508    uint64_t default_feat[S390_FEAT_MAX / 64 + 1] = {};
 509    uint64_t full_feat[S390_FEAT_MAX / 64 + 1] = {};
 510    int i, j;
 511
 512    printf("\n/* CPU model feature list data */\n");
 513
 514    for (i = 0; i < ARRAY_SIZE(CpuFeatDef); i++) {
 515        set_bits(base_feat, CpuFeatDef[i].base_bits);
 516        /* add the base to the default features */
 517        set_bits(default_feat, CpuFeatDef[i].base_bits);
 518        set_bits(default_feat, CpuFeatDef[i].default_bits);
 519        /* add the base to the full features */
 520        set_bits(full_feat, CpuFeatDef[i].base_bits);
 521        set_bits(full_feat, CpuFeatDef[i].full_bits);
 522
 523        printf("#define %s_BASE\t", CpuFeatDef[i].name);
 524        for (j = 0; j < ARRAY_SIZE(base_feat); j++) {
 525            printf("0x%016"PRIx64"ULL", base_feat[j]);
 526            if (j < ARRAY_SIZE(base_feat) - 1) {
 527                printf(",");
 528            } else {
 529                printf("\n");
 530            }
 531        }
 532        printf("#define %s_DEFAULT\t", CpuFeatDef[i].name);
 533        for (j = 0; j < ARRAY_SIZE(default_feat); j++) {
 534            printf("0x%016"PRIx64"ULL", default_feat[j]);
 535            if (j < ARRAY_SIZE(default_feat) - 1) {
 536                printf(",");
 537            } else {
 538                printf("\n");
 539            }
 540        }
 541        printf("#define %s_FULL\t\t", CpuFeatDef[i].name);
 542        for (j = 0; j < ARRAY_SIZE(full_feat); j++) {
 543            printf("0x%016"PRIx64"ULL", full_feat[j]);
 544            if (j < ARRAY_SIZE(full_feat) - 1) {
 545                printf(",");
 546            } else {
 547                printf("\n");
 548            }
 549        }
 550    }
 551}
 552
 553static void print_feature_group_defs(void)
 554{
 555    int i, j;
 556
 557    printf("\n/* CPU feature group list data */\n");
 558
 559    for (i = 0; i < ARRAY_SIZE(FeatGroupDef); i++) {
 560        uint64_t feat[S390_FEAT_MAX / 64 + 1] = {};
 561
 562        set_bits(feat, FeatGroupDef[i].bits);
 563        printf("#define %s\t", FeatGroupDef[i].name);
 564        for (j = 0; j < ARRAY_SIZE(feat); j++) {
 565            printf("0x%016"PRIx64"ULL", feat[j]);
 566            if (j < ARRAY_SIZE(feat) - 1) {
 567                printf(",");
 568            } else {
 569                printf("\n");
 570            }
 571        }
 572    }
 573}
 574
 575int main(int argc, char *argv[])
 576{
 577    printf("/*\n"
 578           " * AUTOMATICALLY GENERATED, DO NOT MODIFY HERE, EDIT\n"
 579           " * SOURCE FILE \"%s\" INSTEAD.\n"
 580           " *\n"
 581           " * Copyright %s IBM Corp.\n"
 582           " *\n"
 583           " * This work is licensed under the terms of the GNU GPL, "
 584           "version 2 or (at\n * your option) any later version. See "
 585           "the COPYING file in the top-level\n * directory.\n"
 586           " */\n\n"
 587           "#ifndef %s\n#define %s\n", __FILE__, _YEARS, _NAME_H, _NAME_H);
 588    print_feature_defs();
 589    print_feature_group_defs();
 590    printf("\n#endif\n");
 591    return 0;
 592}
 593