2016-09-05 11:52:19 +03:00
|
|
|
/*
|
|
|
|
* S390 feature list generator
|
|
|
|
*
|
2018-07-31 12:04:48 +03:00
|
|
|
* Copyright IBM Corp. 2016, 2018
|
2016-09-05 11:52:19 +03:00
|
|
|
*
|
|
|
|
* Author(s): Michael Mueller <mimu@linux.vnet.ibm.com>
|
|
|
|
* David Hildenbrand <dahi@linux.vnet.ibm.com>
|
|
|
|
*
|
|
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or (at
|
|
|
|
* your option) any later version. See the COPYING file in the top-level
|
|
|
|
* directory.
|
|
|
|
*/
|
|
|
|
|
2018-02-01 14:18:28 +03:00
|
|
|
#include <inttypes.h>
|
|
|
|
#include <stdio.h>
|
2019-04-29 12:02:49 +03:00
|
|
|
#include <string.h>
|
2016-09-05 11:52:19 +03:00
|
|
|
#include "cpu_features_def.h"
|
|
|
|
|
|
|
|
#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
|
|
|
|
|
|
|
|
/***** BEGIN FEATURE DEFS *****/
|
|
|
|
|
|
|
|
#define S390_FEAT_GROUP_PLO \
|
|
|
|
S390_FEAT_PLO_CL, \
|
|
|
|
S390_FEAT_PLO_CLG, \
|
|
|
|
S390_FEAT_PLO_CLGR, \
|
|
|
|
S390_FEAT_PLO_CLX, \
|
|
|
|
S390_FEAT_PLO_CS, \
|
|
|
|
S390_FEAT_PLO_CSG, \
|
|
|
|
S390_FEAT_PLO_CSGR, \
|
|
|
|
S390_FEAT_PLO_CSX, \
|
|
|
|
S390_FEAT_PLO_DCS, \
|
|
|
|
S390_FEAT_PLO_DCSG, \
|
|
|
|
S390_FEAT_PLO_DCSGR, \
|
|
|
|
S390_FEAT_PLO_DCSX, \
|
|
|
|
S390_FEAT_PLO_CSST, \
|
|
|
|
S390_FEAT_PLO_CSSTG, \
|
|
|
|
S390_FEAT_PLO_CSSTGR, \
|
|
|
|
S390_FEAT_PLO_CSSTX, \
|
|
|
|
S390_FEAT_PLO_CSDST, \
|
|
|
|
S390_FEAT_PLO_CSDSTG, \
|
|
|
|
S390_FEAT_PLO_CSDSTGR, \
|
|
|
|
S390_FEAT_PLO_CSDSTX, \
|
|
|
|
S390_FEAT_PLO_CSTST, \
|
|
|
|
S390_FEAT_PLO_CSTSTG, \
|
|
|
|
S390_FEAT_PLO_CSTSTGR, \
|
|
|
|
S390_FEAT_PLO_CSTSTX
|
|
|
|
|
|
|
|
#define S390_FEAT_GROUP_TOD_CLOCK_STEERING \
|
|
|
|
S390_FEAT_TOD_CLOCK_STEERING, \
|
|
|
|
S390_FEAT_PTFF_QTO, \
|
|
|
|
S390_FEAT_PTFF_QSI, \
|
|
|
|
S390_FEAT_PTFF_QPT, \
|
|
|
|
S390_FEAT_PTFF_STO
|
|
|
|
|
|
|
|
#define S390_FEAT_GROUP_GEN13_PTFF \
|
|
|
|
S390_FEAT_PTFF_QUI, \
|
|
|
|
S390_FEAT_PTFF_QTOU, \
|
|
|
|
S390_FEAT_PTFF_STOU
|
|
|
|
|
2018-02-05 13:29:35 +03:00
|
|
|
#define S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF \
|
|
|
|
S390_FEAT_PTFF_QSIE, \
|
|
|
|
S390_FEAT_PTFF_QTOUE, \
|
|
|
|
S390_FEAT_PTFF_STOE, \
|
|
|
|
S390_FEAT_PTFF_STOUE
|
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
#define S390_FEAT_GROUP_MSA \
|
|
|
|
S390_FEAT_MSA, \
|
|
|
|
S390_FEAT_KMAC_DEA, \
|
|
|
|
S390_FEAT_KMAC_TDEA_128, \
|
|
|
|
S390_FEAT_KMAC_TDEA_192, \
|
|
|
|
S390_FEAT_KMC_DEA, \
|
|
|
|
S390_FEAT_KMC_TDEA_128, \
|
|
|
|
S390_FEAT_KMC_TDEA_192, \
|
|
|
|
S390_FEAT_KM_DEA, \
|
|
|
|
S390_FEAT_KM_TDEA_128, \
|
|
|
|
S390_FEAT_KM_TDEA_192, \
|
|
|
|
S390_FEAT_KIMD_SHA_1, \
|
|
|
|
S390_FEAT_KLMD_SHA_1
|
|
|
|
|
|
|
|
#define S390_FEAT_GROUP_MSA_EXT_1 \
|
|
|
|
S390_FEAT_KMC_AES_128, \
|
|
|
|
S390_FEAT_KM_AES_128, \
|
|
|
|
S390_FEAT_KIMD_SHA_256, \
|
|
|
|
S390_FEAT_KLMD_SHA_256
|
|
|
|
|
|
|
|
#define S390_FEAT_GROUP_MSA_EXT_2 \
|
|
|
|
S390_FEAT_KMC_AES_192, \
|
|
|
|
S390_FEAT_KMC_AES_256, \
|
|
|
|
S390_FEAT_KMC_PRNG, \
|
|
|
|
S390_FEAT_KM_AES_192, \
|
|
|
|
S390_FEAT_KM_AES_256, \
|
|
|
|
S390_FEAT_KIMD_SHA_512, \
|
|
|
|
S390_FEAT_KLMD_SHA_512
|
|
|
|
|
|
|
|
#define S390_FEAT_GROUP_MSA_EXT_3 \
|
|
|
|
S390_FEAT_MSA_EXT_3, \
|
|
|
|
S390_FEAT_KMAC_EDEA, \
|
|
|
|
S390_FEAT_KMAC_ETDEA_128, \
|
|
|
|
S390_FEAT_KMAC_ETDEA_192, \
|
|
|
|
S390_FEAT_KMC_EAES_128, \
|
|
|
|
S390_FEAT_KMC_EAES_192, \
|
|
|
|
S390_FEAT_KMC_EAES_256, \
|
|
|
|
S390_FEAT_KMC_EDEA, \
|
|
|
|
S390_FEAT_KMC_ETDEA_128, \
|
|
|
|
S390_FEAT_KMC_ETDEA_192, \
|
|
|
|
S390_FEAT_KM_EDEA, \
|
|
|
|
S390_FEAT_KM_ETDEA_128, \
|
|
|
|
S390_FEAT_KM_ETDEA_192, \
|
|
|
|
S390_FEAT_KM_EAES_128, \
|
|
|
|
S390_FEAT_KM_EAES_192, \
|
|
|
|
S390_FEAT_KM_EAES_256, \
|
|
|
|
S390_FEAT_PCKMO_EDEA, \
|
|
|
|
S390_FEAT_PCKMO_ETDEA_128, \
|
|
|
|
S390_FEAT_PCKMO_ETDEA_256, \
|
|
|
|
S390_FEAT_PCKMO_AES_128, \
|
|
|
|
S390_FEAT_PCKMO_AES_192, \
|
|
|
|
S390_FEAT_PCKMO_AES_256
|
|
|
|
|
|
|
|
#define S390_FEAT_GROUP_MSA_EXT_4 \
|
|
|
|
S390_FEAT_MSA_EXT_4, \
|
|
|
|
S390_FEAT_KMAC_AES_128, \
|
|
|
|
S390_FEAT_KMAC_AES_192, \
|
|
|
|
S390_FEAT_KMAC_AES_256, \
|
|
|
|
S390_FEAT_KMAC_EAES_128, \
|
|
|
|
S390_FEAT_KMAC_EAES_192, \
|
|
|
|
S390_FEAT_KMAC_EAES_256, \
|
|
|
|
S390_FEAT_KM_XTS_AES_128, \
|
|
|
|
S390_FEAT_KM_XTS_AES_256, \
|
|
|
|
S390_FEAT_KM_XTS_EAES_128, \
|
|
|
|
S390_FEAT_KM_XTS_EAES_256, \
|
|
|
|
S390_FEAT_KIMD_GHASH, \
|
|
|
|
S390_FEAT_KMCTR_DEA, \
|
|
|
|
S390_FEAT_KMCTR_TDEA_128, \
|
|
|
|
S390_FEAT_KMCTR_TDEA_192, \
|
|
|
|
S390_FEAT_KMCTR_EDEA, \
|
|
|
|
S390_FEAT_KMCTR_ETDEA_128, \
|
|
|
|
S390_FEAT_KMCTR_ETDEA_192, \
|
|
|
|
S390_FEAT_KMCTR_AES_128, \
|
|
|
|
S390_FEAT_KMCTR_AES_192, \
|
|
|
|
S390_FEAT_KMCTR_AES_256, \
|
|
|
|
S390_FEAT_KMCTR_EAES_128, \
|
|
|
|
S390_FEAT_KMCTR_EAES_192, \
|
|
|
|
S390_FEAT_KMCTR_EAES_256, \
|
|
|
|
S390_FEAT_KMF_DEA, \
|
|
|
|
S390_FEAT_KMF_TDEA_128, \
|
|
|
|
S390_FEAT_KMF_TDEA_192, \
|
|
|
|
S390_FEAT_KMF_EDEA, \
|
|
|
|
S390_FEAT_KMF_ETDEA_128, \
|
|
|
|
S390_FEAT_KMF_ETDEA_192, \
|
|
|
|
S390_FEAT_KMF_AES_128, \
|
|
|
|
S390_FEAT_KMF_AES_192, \
|
|
|
|
S390_FEAT_KMF_AES_256, \
|
|
|
|
S390_FEAT_KMF_EAES_128, \
|
|
|
|
S390_FEAT_KMF_EAES_192, \
|
|
|
|
S390_FEAT_KMF_EAES_256, \
|
|
|
|
S390_FEAT_KMO_DEA, \
|
|
|
|
S390_FEAT_KMO_TDEA_128, \
|
|
|
|
S390_FEAT_KMO_TDEA_192, \
|
|
|
|
S390_FEAT_KMO_EDEA, \
|
|
|
|
S390_FEAT_KMO_ETDEA_128, \
|
|
|
|
S390_FEAT_KMO_ETDEA_192, \
|
|
|
|
S390_FEAT_KMO_AES_128, \
|
|
|
|
S390_FEAT_KMO_AES_192, \
|
|
|
|
S390_FEAT_KMO_AES_256, \
|
|
|
|
S390_FEAT_KMO_EAES_128, \
|
|
|
|
S390_FEAT_KMO_EAES_192, \
|
|
|
|
S390_FEAT_KMO_EAES_256, \
|
|
|
|
S390_FEAT_PCC_CMAC_DEA, \
|
|
|
|
S390_FEAT_PCC_CMAC_TDEA_128, \
|
|
|
|
S390_FEAT_PCC_CMAC_TDEA_192, \
|
|
|
|
S390_FEAT_PCC_CMAC_ETDEA_128, \
|
|
|
|
S390_FEAT_PCC_CMAC_ETDEA_192, \
|
|
|
|
S390_FEAT_PCC_CMAC_TDEA, \
|
|
|
|
S390_FEAT_PCC_CMAC_AES_128, \
|
|
|
|
S390_FEAT_PCC_CMAC_AES_192, \
|
|
|
|
S390_FEAT_PCC_CMAC_AES_256, \
|
|
|
|
S390_FEAT_PCC_CMAC_EAES_128, \
|
|
|
|
S390_FEAT_PCC_CMAC_EAES_192, \
|
|
|
|
S390_FEAT_PCC_CMAC_EAES_256, \
|
|
|
|
S390_FEAT_PCC_XTS_AES_128, \
|
|
|
|
S390_FEAT_PCC_XTS_AES_256, \
|
|
|
|
S390_FEAT_PCC_XTS_EAES_128, \
|
|
|
|
S390_FEAT_PCC_XTS_EAES_256
|
|
|
|
|
|
|
|
#define S390_FEAT_GROUP_MSA_EXT_5 \
|
|
|
|
S390_FEAT_MSA_EXT_5, \
|
|
|
|
S390_FEAT_PPNO_SHA_512_DRNG
|
|
|
|
|
2017-04-13 17:28:41 +03:00
|
|
|
#define S390_FEAT_GROUP_MSA_EXT_6 \
|
|
|
|
S390_FEAT_KIMD_SHA3_224, \
|
|
|
|
S390_FEAT_KIMD_SHA3_256, \
|
|
|
|
S390_FEAT_KIMD_SHA3_384, \
|
|
|
|
S390_FEAT_KIMD_SHA3_512, \
|
|
|
|
S390_FEAT_KIMD_SHAKE_128, \
|
|
|
|
S390_FEAT_KIMD_SHAKE_256, \
|
|
|
|
S390_FEAT_KLMD_SHA3_224, \
|
|
|
|
S390_FEAT_KLMD_SHA3_256, \
|
|
|
|
S390_FEAT_KLMD_SHA3_384, \
|
|
|
|
S390_FEAT_KLMD_SHA3_512, \
|
|
|
|
S390_FEAT_KLMD_SHAKE_128, \
|
|
|
|
S390_FEAT_KLMD_SHAKE_256
|
|
|
|
|
|
|
|
#define S390_FEAT_GROUP_MSA_EXT_7 \
|
|
|
|
S390_FEAT_PRNO_TRNG_QRTCR, \
|
|
|
|
S390_FEAT_PRNO_TRNG
|
|
|
|
|
|
|
|
#define S390_FEAT_GROUP_MSA_EXT_8 \
|
|
|
|
S390_FEAT_MSA_EXT_8, \
|
|
|
|
S390_FEAT_KMA_GCM_AES_128, \
|
|
|
|
S390_FEAT_KMA_GCM_AES_192, \
|
|
|
|
S390_FEAT_KMA_GCM_AES_256 , \
|
|
|
|
S390_FEAT_KMA_GCM_EAES_128, \
|
|
|
|
S390_FEAT_KMA_GCM_EAES_192, \
|
|
|
|
S390_FEAT_KMA_GCM_EAES_256
|
|
|
|
|
2019-04-29 12:02:45 +03:00
|
|
|
#define S390_FEAT_GROUP_MSA_EXT_9 \
|
|
|
|
S390_FEAT_MSA_EXT_9, \
|
2019-06-12 16:17:05 +03:00
|
|
|
S390_FEAT_KDSA_ECDSA_VERIFY_P256, \
|
|
|
|
S390_FEAT_KDSA_ECDSA_VERIFY_P384, \
|
|
|
|
S390_FEAT_KDSA_ECDSA_VERIFY_P512, \
|
|
|
|
S390_FEAT_KDSA_ECDSA_SIGN_P256, \
|
|
|
|
S390_FEAT_KDSA_ECDSA_SIGN_P384, \
|
|
|
|
S390_FEAT_KDSA_ECDSA_SIGN_P512, \
|
|
|
|
S390_FEAT_KDSA_EECDSA_SIGN_P256, \
|
|
|
|
S390_FEAT_KDSA_EECDSA_SIGN_P384, \
|
|
|
|
S390_FEAT_KDSA_EECDSA_SIGN_P512, \
|
|
|
|
S390_FEAT_KDSA_EDDSA_VERIFY_ED25519, \
|
|
|
|
S390_FEAT_KDSA_EDDSA_VERIFY_ED448, \
|
|
|
|
S390_FEAT_KDSA_EDDSA_SIGN_ED25519, \
|
|
|
|
S390_FEAT_KDSA_EDDSA_SIGN_ED448, \
|
|
|
|
S390_FEAT_KDSA_EEDDSA_SIGN_ED25519, \
|
|
|
|
S390_FEAT_KDSA_EEDDSA_SIGN_ED448, \
|
2019-04-29 12:02:45 +03:00
|
|
|
S390_FEAT_PCC_SCALAR_MULT_P256, \
|
|
|
|
S390_FEAT_PCC_SCALAR_MULT_P384, \
|
|
|
|
S390_FEAT_PCC_SCALAR_MULT_P512, \
|
|
|
|
S390_FEAT_PCC_SCALAR_MULT_ED25519, \
|
|
|
|
S390_FEAT_PCC_SCALAR_MULT_ED448, \
|
|
|
|
S390_FEAT_PCC_SCALAR_MULT_X25519, \
|
|
|
|
S390_FEAT_PCC_SCALAR_MULT_X448
|
|
|
|
|
|
|
|
#define S390_FEAT_GROUP_MSA_EXT_9_PCKMO \
|
|
|
|
S390_FEAT_PCKMO_ECC_P256, \
|
|
|
|
S390_FEAT_PCKMO_ECC_P384, \
|
|
|
|
S390_FEAT_PCKMO_ECC_P521, \
|
|
|
|
S390_FEAT_PCKMO_ECC_ED25519, \
|
|
|
|
S390_FEAT_PCKMO_ECC_ED448
|
|
|
|
|
2019-04-29 12:02:47 +03:00
|
|
|
#define S390_FEAT_GROUP_ENH_SORT \
|
|
|
|
S390_FEAT_ESORT_BASE, \
|
|
|
|
S390_FEAT_SORTL_SFLR, \
|
|
|
|
S390_FEAT_SORTL_SVLR, \
|
|
|
|
S390_FEAT_SORTL_32, \
|
|
|
|
S390_FEAT_SORTL_128, \
|
|
|
|
S390_FEAT_SORTL_F0
|
|
|
|
|
|
|
|
|
2019-04-29 12:02:48 +03:00
|
|
|
#define S390_FEAT_GROUP_DEFLATE_CONVERSION \
|
|
|
|
S390_FEAT_DEFLATE_BASE, \
|
|
|
|
S390_FEAT_DEFLATE_GHDT, \
|
|
|
|
S390_FEAT_DEFLATE_CMPR, \
|
|
|
|
S390_FEAT_DEFLATE_XPND, \
|
|
|
|
S390_FEAT_DEFLATE_F0
|
|
|
|
|
2016-09-05 11:52:20 +03:00
|
|
|
/* cpu feature groups */
|
|
|
|
static uint16_t group_PLO[] = {
|
|
|
|
S390_FEAT_GROUP_PLO,
|
|
|
|
};
|
|
|
|
static uint16_t group_TOD_CLOCK_STEERING[] = {
|
|
|
|
S390_FEAT_GROUP_TOD_CLOCK_STEERING,
|
|
|
|
};
|
|
|
|
static uint16_t group_GEN13_PTFF[] = {
|
|
|
|
S390_FEAT_GROUP_GEN13_PTFF,
|
|
|
|
};
|
2018-02-05 13:29:35 +03:00
|
|
|
static uint16_t group_MULTIPLE_EPOCH_PTFF[] = {
|
|
|
|
S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF,
|
|
|
|
};
|
2016-09-05 11:52:20 +03:00
|
|
|
static uint16_t group_MSA[] = {
|
|
|
|
S390_FEAT_GROUP_MSA,
|
|
|
|
};
|
|
|
|
static uint16_t group_MSA_EXT_1[] = {
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_1,
|
|
|
|
};
|
|
|
|
static uint16_t group_MSA_EXT_2[] = {
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_2,
|
|
|
|
};
|
|
|
|
static uint16_t group_MSA_EXT_3[] = {
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_3,
|
|
|
|
};
|
|
|
|
static uint16_t group_MSA_EXT_4[] = {
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_4,
|
|
|
|
};
|
|
|
|
static uint16_t group_MSA_EXT_5[] = {
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_5,
|
|
|
|
};
|
2017-04-13 17:28:41 +03:00
|
|
|
static uint16_t group_MSA_EXT_6[] = {
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_6,
|
|
|
|
};
|
|
|
|
static uint16_t group_MSA_EXT_7[] = {
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_7,
|
|
|
|
};
|
|
|
|
static uint16_t group_MSA_EXT_8[] = {
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_8,
|
|
|
|
};
|
2016-09-05 11:52:20 +03:00
|
|
|
|
2019-04-29 12:02:45 +03:00
|
|
|
static uint16_t group_MSA_EXT_9[] = {
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_9,
|
|
|
|
};
|
|
|
|
|
|
|
|
static uint16_t group_MSA_EXT_9_PCKMO[] = {
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_9_PCKMO,
|
|
|
|
};
|
|
|
|
|
2019-04-29 12:02:47 +03:00
|
|
|
static uint16_t group_ENH_SORT[] = {
|
|
|
|
S390_FEAT_GROUP_ENH_SORT,
|
|
|
|
};
|
|
|
|
|
2019-04-29 12:02:48 +03:00
|
|
|
static uint16_t group_DEFLATE_CONVERSION[] = {
|
|
|
|
S390_FEAT_GROUP_DEFLATE_CONVERSION,
|
|
|
|
};
|
|
|
|
|
2017-02-22 18:32:20 +03:00
|
|
|
/* Base features (in order of release)
|
|
|
|
* Only non-hypervisor managed features belong here.
|
|
|
|
* Base feature sets are static meaning they do not change in future QEMU
|
|
|
|
* releases.
|
|
|
|
*/
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t base_GEN7_GA1[] = {
|
|
|
|
S390_FEAT_GROUP_PLO,
|
|
|
|
S390_FEAT_ESAN3,
|
|
|
|
S390_FEAT_ZARCH,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
#define base_GEN7_GA2 EmptyFeat
|
|
|
|
#define base_GEN7_GA3 EmptyFeat
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t base_GEN8_GA1[] = {
|
|
|
|
S390_FEAT_DAT_ENH,
|
|
|
|
S390_FEAT_EXTENDED_TRANSLATION_2,
|
|
|
|
S390_FEAT_GROUP_MSA,
|
|
|
|
S390_FEAT_LONG_DISPLACEMENT,
|
|
|
|
S390_FEAT_LONG_DISPLACEMENT_FAST,
|
|
|
|
S390_FEAT_HFP_MADDSUB,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
#define base_GEN8_GA2 EmptyFeat
|
|
|
|
#define base_GEN8_GA3 EmptyFeat
|
|
|
|
#define base_GEN8_GA4 EmptyFeat
|
|
|
|
#define base_GEN8_GA5 EmptyFeat
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t base_GEN9_GA1[] = {
|
|
|
|
S390_FEAT_IDTE_SEGMENT,
|
|
|
|
S390_FEAT_ASN_LX_REUSE,
|
|
|
|
S390_FEAT_STFLE,
|
|
|
|
S390_FEAT_SENSE_RUNNING_STATUS,
|
|
|
|
S390_FEAT_EXTENDED_IMMEDIATE,
|
|
|
|
S390_FEAT_EXTENDED_TRANSLATION_3,
|
|
|
|
S390_FEAT_HFP_UNNORMALIZED_EXT,
|
|
|
|
S390_FEAT_ETF2_ENH,
|
|
|
|
S390_FEAT_STORE_CLOCK_FAST,
|
|
|
|
S390_FEAT_GROUP_TOD_CLOCK_STEERING,
|
|
|
|
S390_FEAT_ETF3_ENH,
|
|
|
|
S390_FEAT_DAT_ENH_2,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
#define base_GEN9_GA2 EmptyFeat
|
|
|
|
#define base_GEN9_GA3 EmptyFeat
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t base_GEN10_GA1[] = {
|
|
|
|
S390_FEAT_CONDITIONAL_SSKE,
|
|
|
|
S390_FEAT_PARSING_ENH,
|
|
|
|
S390_FEAT_MOVE_WITH_OPTIONAL_SPEC,
|
|
|
|
S390_FEAT_EXTRACT_CPU_TIME,
|
|
|
|
S390_FEAT_COMPARE_AND_SWAP_AND_STORE,
|
|
|
|
S390_FEAT_COMPARE_AND_SWAP_AND_STORE_2,
|
|
|
|
S390_FEAT_GENERAL_INSTRUCTIONS_EXT,
|
|
|
|
S390_FEAT_EXECUTE_EXT,
|
|
|
|
S390_FEAT_FLOATING_POINT_SUPPPORT_ENH,
|
|
|
|
S390_FEAT_DFP,
|
|
|
|
S390_FEAT_DFP_FAST,
|
|
|
|
S390_FEAT_PFPO,
|
|
|
|
};
|
|
|
|
#define base_GEN10_GA2 EmptyFeat
|
|
|
|
#define base_GEN10_GA3 EmptyFeat
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t base_GEN11_GA1[] = {
|
|
|
|
S390_FEAT_NONQ_KEY_SETTING,
|
|
|
|
S390_FEAT_ENHANCED_MONITOR,
|
|
|
|
S390_FEAT_FLOATING_POINT_EXT,
|
|
|
|
S390_FEAT_SET_PROGRAM_PARAMETERS,
|
|
|
|
S390_FEAT_STFLE_45,
|
|
|
|
S390_FEAT_CMPSC_ENH,
|
|
|
|
S390_FEAT_INTERLOCKED_ACCESS_2,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
#define base_GEN11_GA2 EmptyFeat
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t base_GEN12_GA1[] = {
|
|
|
|
S390_FEAT_DFP_ZONED_CONVERSION,
|
|
|
|
S390_FEAT_STFLE_49,
|
|
|
|
S390_FEAT_LOCAL_TLB_CLEARING,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
#define base_GEN12_GA2 EmptyFeat
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t base_GEN13_GA1[] = {
|
|
|
|
S390_FEAT_STFLE_53,
|
|
|
|
S390_FEAT_DFP_PACKED_CONVERSION,
|
|
|
|
S390_FEAT_GROUP_GEN13_PTFF,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
#define base_GEN13_GA2 EmptyFeat
|
|
|
|
|
2017-04-13 17:28:41 +03:00
|
|
|
static uint16_t base_GEN14_GA1[] = {
|
|
|
|
S390_FEAT_ENTROPY_ENC_COMP,
|
2020-09-28 15:27:09 +03:00
|
|
|
S390_FEAT_MISC_INSTRUCTION_EXT2,
|
2017-04-13 17:28:41 +03:00
|
|
|
S390_FEAT_SEMAPHORE_ASSIST,
|
|
|
|
S390_FEAT_TIME_SLICE_INSTRUMENTATION,
|
|
|
|
S390_FEAT_ORDER_PRESERVING_COMPRESSION,
|
|
|
|
};
|
|
|
|
|
2019-02-12 04:16:57 +03:00
|
|
|
#define base_GEN14_GA2 EmptyFeat
|
|
|
|
|
2019-04-29 12:02:49 +03:00
|
|
|
static uint16_t base_GEN15_GA1[] = {
|
|
|
|
S390_FEAT_MISC_INSTRUCTION_EXT3,
|
|
|
|
};
|
|
|
|
|
2017-02-22 18:32:20 +03:00
|
|
|
/* Full features (in order of release)
|
|
|
|
* Automatically includes corresponding base features.
|
|
|
|
* Full features are all features this hardware supports even if kvm/QEMU do not
|
|
|
|
* support these features yet.
|
|
|
|
*/
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t full_GEN7_GA1[] = {
|
2018-01-18 11:56:28 +03:00
|
|
|
S390_FEAT_PPA15,
|
2018-01-18 11:56:27 +03:00
|
|
|
S390_FEAT_BPB,
|
2016-09-05 11:52:19 +03:00
|
|
|
S390_FEAT_SIE_F2,
|
|
|
|
S390_FEAT_SIE_SKEY,
|
|
|
|
S390_FEAT_SIE_GPERE,
|
|
|
|
S390_FEAT_SIE_IB,
|
|
|
|
S390_FEAT_SIE_CEI,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t full_GEN7_GA2[] = {
|
|
|
|
S390_FEAT_EXTENDED_TRANSLATION_2,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t full_GEN7_GA3[] = {
|
|
|
|
S390_FEAT_LONG_DISPLACEMENT,
|
|
|
|
S390_FEAT_SIE_SIIF,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t full_GEN8_GA1[] = {
|
|
|
|
S390_FEAT_SIE_GSLS,
|
|
|
|
S390_FEAT_SIE_64BSCAO,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
#define full_GEN8_GA2 EmptyFeat
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t full_GEN8_GA3[] = {
|
|
|
|
S390_FEAT_ASN_LX_REUSE,
|
|
|
|
S390_FEAT_EXTENDED_TRANSLATION_3,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
#define full_GEN8_GA4 EmptyFeat
|
|
|
|
#define full_GEN8_GA5 EmptyFeat
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t full_GEN9_GA1[] = {
|
|
|
|
S390_FEAT_STORE_HYPERVISOR_INFO,
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_1,
|
|
|
|
S390_FEAT_CMM,
|
|
|
|
S390_FEAT_SIE_CMMA,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t full_GEN9_GA2[] = {
|
|
|
|
S390_FEAT_MOVE_WITH_OPTIONAL_SPEC,
|
|
|
|
S390_FEAT_EXTRACT_CPU_TIME,
|
|
|
|
S390_FEAT_COMPARE_AND_SWAP_AND_STORE,
|
|
|
|
S390_FEAT_FLOATING_POINT_SUPPPORT_ENH,
|
|
|
|
S390_FEAT_DFP,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t full_GEN9_GA3[] = {
|
|
|
|
S390_FEAT_CONDITIONAL_SSKE,
|
|
|
|
S390_FEAT_PFPO,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t full_GEN10_GA1[] = {
|
|
|
|
S390_FEAT_EDAT,
|
|
|
|
S390_FEAT_CONFIGURATION_TOPOLOGY,
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_2,
|
|
|
|
S390_FEAT_ESOP,
|
|
|
|
S390_FEAT_SIE_PFMFI,
|
|
|
|
S390_FEAT_SIE_SIGPIF,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t full_GEN10_GA2[] = {
|
|
|
|
S390_FEAT_SET_PROGRAM_PARAMETERS,
|
|
|
|
S390_FEAT_SIE_IBS,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t full_GEN10_GA3[] = {
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_3,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t full_GEN11_GA1[] = {
|
|
|
|
S390_FEAT_IPTE_RANGE,
|
|
|
|
S390_FEAT_ACCESS_EXCEPTION_FS_INDICATION,
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_4,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
#define full_GEN11_GA2 EmptyFeat
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t full_GEN12_GA1[] = {
|
|
|
|
S390_FEAT_CONSTRAINT_TRANSACTIONAL_EXE,
|
|
|
|
S390_FEAT_TRANSACTIONAL_EXE,
|
|
|
|
S390_FEAT_RUNTIME_INSTRUMENTATION,
|
2017-06-14 08:25:58 +03:00
|
|
|
S390_FEAT_ZPCI,
|
|
|
|
S390_FEAT_ADAPTER_EVENT_NOTIFICATION,
|
|
|
|
S390_FEAT_ADAPTER_INT_SUPPRESSION,
|
2016-09-05 11:52:19 +03:00
|
|
|
S390_FEAT_EDAT_2,
|
2017-04-10 16:39:00 +03:00
|
|
|
S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2,
|
2018-10-10 20:03:04 +03:00
|
|
|
S390_FEAT_AP_QUERY_CONFIG_INFO,
|
2019-07-05 18:32:49 +03:00
|
|
|
S390_FEAT_AP_QUEUE_INTERRUPT_CONTROL,
|
2018-10-10 20:03:04 +03:00
|
|
|
S390_FEAT_AP_FACILITIES_TEST,
|
|
|
|
S390_FEAT_AP,
|
s390/sclp: add extended-length sccb support for kvm guest
As more features and facilities are added to the Read SCP Info (RSCPI)
response, more space is required to store them. The space used to store
these new features intrudes on the space originally used to store CPU
entries. This means as more features and facilities are added to the
RSCPI response, less space can be used to store CPU entries.
With the Extended-Length SCCB (ELS) facility, a KVM guest can execute
the RSCPI command and determine if the SCCB is large enough to store a
complete reponse. If it is not large enough, then the required length
will be set in the SCCB header.
The caller of the SCLP command is responsible for creating a
large-enough SCCB to store a complete response. Proper checking should
be in place, and the caller should execute the command once-more with
the large-enough SCCB.
This facility also enables an extended SCCB for the Read CPU Info
(RCPUI) command.
When this facility is enabled, the boundary violation response cannot
be a result from the RSCPI, RSCPI Forced, or RCPUI commands.
In order to tolerate kernels that do not yet have full support for this
feature, a "fixed" offset to the start of the CPU Entries within the
Read SCP Info struct is set to allow for the original 248 max entries
when this feature is disabled.
Additionally, this is introduced as a CPU feature to protect the guest
from migrating to a machine that does not support storing an extended
SCCB. This could otherwise hinder the VM from being able to read all
available CPU entries after migration (such as during re-ipl).
Signed-off-by: Collin Walling <walling@linux.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Acked-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Message-Id: <20200915194416.107460-7-walling@linux.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
2020-09-15 22:44:14 +03:00
|
|
|
S390_FEAT_EXTENDED_LENGTH_SCCB,
|
2020-09-15 22:44:16 +03:00
|
|
|
S390_FEAT_DIAG_318,
|
2016-09-05 11:52:19 +03:00
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t full_GEN12_GA2[] = {
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_5,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t full_GEN13_GA1[] = {
|
|
|
|
S390_FEAT_VECTOR,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
#define full_GEN13_GA2 EmptyFeat
|
|
|
|
|
2017-04-13 17:28:41 +03:00
|
|
|
static uint16_t full_GEN14_GA1[] = {
|
|
|
|
S390_FEAT_INSTRUCTION_EXEC_PROT,
|
|
|
|
S390_FEAT_GUARDED_STORAGE,
|
|
|
|
S390_FEAT_VECTOR_PACKED_DECIMAL,
|
|
|
|
S390_FEAT_VECTOR_ENH,
|
|
|
|
S390_FEAT_MULTIPLE_EPOCH,
|
|
|
|
S390_FEAT_TEST_PENDING_EXT_INTERRUPTION,
|
|
|
|
S390_FEAT_INSERT_REFERENCE_BITS_MULT,
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_6,
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_7,
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_8,
|
|
|
|
S390_FEAT_CMM_NT,
|
2018-07-31 12:04:48 +03:00
|
|
|
S390_FEAT_ETOKEN,
|
2017-04-13 17:28:41 +03:00
|
|
|
S390_FEAT_HPMA2,
|
|
|
|
S390_FEAT_SIE_KSS,
|
2018-02-05 13:29:35 +03:00
|
|
|
S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF,
|
2017-04-13 17:28:41 +03:00
|
|
|
};
|
|
|
|
|
2019-02-12 04:16:57 +03:00
|
|
|
#define full_GEN14_GA2 EmptyFeat
|
|
|
|
|
2019-04-29 12:02:49 +03:00
|
|
|
static uint16_t full_GEN15_GA1[] = {
|
|
|
|
S390_FEAT_VECTOR_ENH2,
|
|
|
|
S390_FEAT_GROUP_ENH_SORT,
|
|
|
|
S390_FEAT_GROUP_DEFLATE_CONVERSION,
|
2019-07-15 17:23:04 +03:00
|
|
|
S390_FEAT_VECTOR_PACKED_DECIMAL_ENH,
|
2019-04-29 12:02:49 +03:00
|
|
|
S390_FEAT_GROUP_MSA_EXT_9,
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_9_PCKMO,
|
|
|
|
S390_FEAT_ETOKEN,
|
2020-03-19 16:19:21 +03:00
|
|
|
S390_FEAT_UNPACK,
|
2019-04-29 12:02:49 +03:00
|
|
|
};
|
|
|
|
|
2017-02-22 18:32:20 +03:00
|
|
|
/* Default features (in order of release)
|
|
|
|
* Automatically includes corresponding base features.
|
|
|
|
* Default features are all features this version of QEMU supports for this
|
|
|
|
* hardware model. Default feature sets can grow with new QEMU releases.
|
|
|
|
*/
|
2016-09-05 11:52:19 +03:00
|
|
|
#define default_GEN7_GA1 EmptyFeat
|
|
|
|
#define default_GEN7_GA2 EmptyFeat
|
|
|
|
#define default_GEN7_GA3 EmptyFeat
|
|
|
|
#define default_GEN8_GA1 EmptyFeat
|
|
|
|
#define default_GEN8_GA2 EmptyFeat
|
|
|
|
#define default_GEN8_GA3 EmptyFeat
|
|
|
|
#define default_GEN8_GA4 EmptyFeat
|
|
|
|
#define default_GEN8_GA5 EmptyFeat
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t default_GEN9_GA1[] = {
|
|
|
|
S390_FEAT_STORE_HYPERVISOR_INFO,
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_1,
|
2016-09-05 11:52:37 +03:00
|
|
|
S390_FEAT_CMM,
|
2016-09-05 11:52:19 +03:00
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
#define default_GEN9_GA2 EmptyFeat
|
|
|
|
#define default_GEN9_GA3 EmptyFeat
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t default_GEN10_GA1[] = {
|
|
|
|
S390_FEAT_EDAT,
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_2,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
#define default_GEN10_GA2 EmptyFeat
|
|
|
|
#define default_GEN10_GA3 EmptyFeat
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t default_GEN11_GA1[] = {
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_3,
|
|
|
|
S390_FEAT_IPTE_RANGE,
|
|
|
|
S390_FEAT_ACCESS_EXCEPTION_FS_INDICATION,
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_4,
|
2018-06-26 15:38:30 +03:00
|
|
|
S390_FEAT_PPA15,
|
|
|
|
S390_FEAT_BPB,
|
2016-09-05 11:52:19 +03:00
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
#define default_GEN11_GA2 EmptyFeat
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t default_GEN12_GA1[] = {
|
|
|
|
S390_FEAT_CONSTRAINT_TRANSACTIONAL_EXE,
|
|
|
|
S390_FEAT_TRANSACTIONAL_EXE,
|
|
|
|
S390_FEAT_RUNTIME_INSTRUMENTATION,
|
2017-06-14 08:25:58 +03:00
|
|
|
S390_FEAT_ZPCI,
|
|
|
|
S390_FEAT_ADAPTER_EVENT_NOTIFICATION,
|
2016-09-05 11:52:19 +03:00
|
|
|
S390_FEAT_EDAT_2,
|
2017-04-10 16:39:00 +03:00
|
|
|
S390_FEAT_ESOP,
|
|
|
|
S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2,
|
2016-09-05 11:52:19 +03:00
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
#define default_GEN12_GA2 EmptyFeat
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static uint16_t default_GEN13_GA1[] = {
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_5,
|
|
|
|
S390_FEAT_VECTOR,
|
|
|
|
};
|
2017-02-22 18:32:20 +03:00
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
#define default_GEN13_GA2 EmptyFeat
|
|
|
|
|
2017-04-13 17:28:41 +03:00
|
|
|
static uint16_t default_GEN14_GA1[] = {
|
|
|
|
S390_FEAT_INSTRUCTION_EXEC_PROT,
|
|
|
|
S390_FEAT_GUARDED_STORAGE,
|
|
|
|
S390_FEAT_VECTOR_PACKED_DECIMAL,
|
|
|
|
S390_FEAT_VECTOR_ENH,
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_6,
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_7,
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_8,
|
2019-02-12 04:16:56 +03:00
|
|
|
S390_FEAT_MULTIPLE_EPOCH,
|
|
|
|
S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF,
|
2017-04-13 17:28:41 +03:00
|
|
|
};
|
|
|
|
|
2019-02-12 04:16:57 +03:00
|
|
|
#define default_GEN14_GA2 EmptyFeat
|
|
|
|
|
2019-04-29 12:02:49 +03:00
|
|
|
static uint16_t default_GEN15_GA1[] = {
|
|
|
|
S390_FEAT_VECTOR_ENH2,
|
|
|
|
S390_FEAT_GROUP_DEFLATE_CONVERSION,
|
2019-07-15 17:23:04 +03:00
|
|
|
S390_FEAT_VECTOR_PACKED_DECIMAL_ENH,
|
2019-04-29 12:02:49 +03:00
|
|
|
S390_FEAT_GROUP_MSA_EXT_9,
|
|
|
|
S390_FEAT_GROUP_MSA_EXT_9_PCKMO,
|
|
|
|
S390_FEAT_ETOKEN,
|
|
|
|
};
|
|
|
|
|
2017-12-08 19:55:29 +03:00
|
|
|
/* QEMU (CPU model) features */
|
|
|
|
|
|
|
|
static uint16_t qemu_V2_11[] = {
|
|
|
|
S390_FEAT_GROUP_PLO,
|
|
|
|
S390_FEAT_ESAN3,
|
|
|
|
S390_FEAT_ZARCH,
|
|
|
|
};
|
|
|
|
|
2019-02-12 14:23:23 +03:00
|
|
|
static uint16_t qemu_V3_1[] = {
|
2017-12-08 19:55:29 +03:00
|
|
|
S390_FEAT_DAT_ENH,
|
|
|
|
S390_FEAT_IDTE_SEGMENT,
|
|
|
|
S390_FEAT_STFLE,
|
|
|
|
S390_FEAT_SENSE_RUNNING_STATUS,
|
|
|
|
S390_FEAT_EXTENDED_TRANSLATION_2,
|
|
|
|
S390_FEAT_MSA,
|
|
|
|
S390_FEAT_LONG_DISPLACEMENT,
|
|
|
|
S390_FEAT_LONG_DISPLACEMENT_FAST,
|
|
|
|
S390_FEAT_EXTENDED_IMMEDIATE,
|
|
|
|
S390_FEAT_EXTENDED_TRANSLATION_3,
|
|
|
|
S390_FEAT_ETF2_ENH,
|
|
|
|
S390_FEAT_STORE_CLOCK_FAST,
|
|
|
|
S390_FEAT_MOVE_WITH_OPTIONAL_SPEC,
|
|
|
|
S390_FEAT_ETF3_ENH,
|
|
|
|
S390_FEAT_EXTRACT_CPU_TIME,
|
|
|
|
S390_FEAT_COMPARE_AND_SWAP_AND_STORE,
|
|
|
|
S390_FEAT_COMPARE_AND_SWAP_AND_STORE_2,
|
|
|
|
S390_FEAT_GENERAL_INSTRUCTIONS_EXT,
|
|
|
|
S390_FEAT_EXECUTE_EXT,
|
|
|
|
S390_FEAT_SET_PROGRAM_PARAMETERS,
|
|
|
|
S390_FEAT_FLOATING_POINT_SUPPPORT_ENH,
|
|
|
|
S390_FEAT_STFLE_45,
|
|
|
|
S390_FEAT_STFLE_49,
|
|
|
|
S390_FEAT_LOCAL_TLB_CLEARING,
|
|
|
|
S390_FEAT_INTERLOCKED_ACCESS_2,
|
2017-11-23 18:59:11 +03:00
|
|
|
S390_FEAT_ADAPTER_EVENT_NOTIFICATION,
|
|
|
|
S390_FEAT_ADAPTER_INT_SUPPRESSION,
|
2017-12-08 19:55:29 +03:00
|
|
|
S390_FEAT_MSA_EXT_3,
|
2017-11-23 18:59:11 +03:00
|
|
|
S390_FEAT_MSA_EXT_4,
|
2017-12-08 19:55:29 +03:00
|
|
|
};
|
|
|
|
|
2019-02-27 11:12:09 +03:00
|
|
|
static uint16_t qemu_V4_0[] = {
|
s390x: Add floating-point extension facility to "qemu" cpu model
The floating-point extension facility implemented certain changes to
BFP, HFP and DFP instructions.
As we don't implement HFP/DFP, we can ignore those completely. Related
to BFP, the changes include
- SET BFP ROUNDING MODE (SRNMB) instruction
- BFP-rounding-mode field in the FPC register is changed to 3 bits
- CONVERT FROM LOGICAL instructions
- CONVERT TO LOGICAL instructions
- Changes (rounding mode + XxC) added to
-- CONVERT TO FIXED
-- CONVERT FROM FIXED
-- LOAD FP INTEGER
-- LOAD ROUNDED
-- DIVIDE TO INTEGER
For TCG, we don't implement DIVIDE TO INTEGER, and it is harder to
implement, so skip that. Also, as we don't implement PFPO, we can skip
changes to that as well. The other parts are now implemented, we can
indicate the facility.
z14 PoP mentions that "The floating-point extension facility is installed
in the z/Architecture architectural mode. When bit 37 is one, bit 42 is
also one.", meaning that the DFP (decimal-floating-point) facility also
has to be indicated. We can ignore that for now.
Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20190218122710.23639-16-david@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
2019-02-18 15:27:10 +03:00
|
|
|
/*
|
|
|
|
* Only BFP bits are implemented (HFP, DFP, PFPO and DIVIDE TO INTEGER not
|
|
|
|
* implemented yet).
|
|
|
|
*/
|
|
|
|
S390_FEAT_FLOATING_POINT_EXT,
|
2019-02-12 14:23:23 +03:00
|
|
|
S390_FEAT_ZPCI,
|
|
|
|
};
|
|
|
|
|
2019-08-05 11:13:52 +03:00
|
|
|
static uint16_t qemu_V4_1[] = {
|
2017-12-08 19:55:29 +03:00
|
|
|
S390_FEAT_STFLE_53,
|
2019-05-29 23:29:46 +03:00
|
|
|
S390_FEAT_VECTOR,
|
2019-02-27 11:12:09 +03:00
|
|
|
};
|
|
|
|
|
2019-08-05 11:13:52 +03:00
|
|
|
static uint16_t qemu_LATEST[] = {
|
2019-08-05 11:19:22 +03:00
|
|
|
S390_FEAT_ACCESS_EXCEPTION_FS_INDICATION,
|
|
|
|
S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2,
|
|
|
|
S390_FEAT_ESOP,
|
2019-08-05 11:13:52 +03:00
|
|
|
};
|
|
|
|
|
2019-02-27 11:12:09 +03:00
|
|
|
/* add all new definitions before this point */
|
|
|
|
static uint16_t qemu_MAX[] = {
|
2017-12-08 19:55:29 +03:00
|
|
|
/* generates a dependency warning, leave it out for now */
|
|
|
|
S390_FEAT_MSA_EXT_5,
|
2019-08-05 11:19:22 +03:00
|
|
|
/* features introduced after the z13 */
|
|
|
|
S390_FEAT_INSTRUCTION_EXEC_PROT,
|
2020-09-28 15:27:16 +03:00
|
|
|
S390_FEAT_MISC_INSTRUCTION_EXT2,
|
2017-12-08 19:55:29 +03:00
|
|
|
};
|
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
/****** END FEATURE DEFS ******/
|
|
|
|
|
|
|
|
#define _YEARS "2016"
|
|
|
|
#define _NAME_H "TARGET_S390X_GEN_FEATURES_H"
|
|
|
|
|
|
|
|
#define CPU_FEAT_INITIALIZER(_name) \
|
|
|
|
{ \
|
|
|
|
.name = "S390_FEAT_LIST_" #_name, \
|
|
|
|
.base_bits = \
|
|
|
|
{ .data = base_##_name, \
|
|
|
|
.len = ARRAY_SIZE(base_##_name) }, \
|
|
|
|
.default_bits = \
|
|
|
|
{ .data = default_##_name, \
|
|
|
|
.len = ARRAY_SIZE(default_##_name) }, \
|
|
|
|
.full_bits = \
|
|
|
|
{ .data = full_##_name, \
|
|
|
|
.len = ARRAY_SIZE(full_##_name) }, \
|
|
|
|
}
|
|
|
|
|
|
|
|
typedef struct BitSpec {
|
|
|
|
uint16_t *data;
|
|
|
|
uint32_t len;
|
|
|
|
} BitSpec;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
const char *name;
|
|
|
|
BitSpec base_bits;
|
|
|
|
BitSpec default_bits;
|
|
|
|
BitSpec full_bits;
|
|
|
|
} CpuFeatDefSpec;
|
|
|
|
|
|
|
|
static uint16_t EmptyFeat[] = {};
|
|
|
|
|
|
|
|
/*******************************
|
|
|
|
* processor GA series
|
|
|
|
*******************************/
|
|
|
|
static CpuFeatDefSpec CpuFeatDef[] = {
|
|
|
|
CPU_FEAT_INITIALIZER(GEN7_GA1),
|
|
|
|
CPU_FEAT_INITIALIZER(GEN7_GA2),
|
|
|
|
CPU_FEAT_INITIALIZER(GEN7_GA3),
|
|
|
|
CPU_FEAT_INITIALIZER(GEN8_GA1),
|
|
|
|
CPU_FEAT_INITIALIZER(GEN8_GA2),
|
|
|
|
CPU_FEAT_INITIALIZER(GEN8_GA3),
|
|
|
|
CPU_FEAT_INITIALIZER(GEN8_GA4),
|
|
|
|
CPU_FEAT_INITIALIZER(GEN8_GA5),
|
|
|
|
CPU_FEAT_INITIALIZER(GEN9_GA1),
|
|
|
|
CPU_FEAT_INITIALIZER(GEN9_GA2),
|
|
|
|
CPU_FEAT_INITIALIZER(GEN9_GA3),
|
|
|
|
CPU_FEAT_INITIALIZER(GEN10_GA1),
|
|
|
|
CPU_FEAT_INITIALIZER(GEN10_GA2),
|
|
|
|
CPU_FEAT_INITIALIZER(GEN10_GA3),
|
|
|
|
CPU_FEAT_INITIALIZER(GEN11_GA1),
|
|
|
|
CPU_FEAT_INITIALIZER(GEN11_GA2),
|
|
|
|
CPU_FEAT_INITIALIZER(GEN12_GA1),
|
|
|
|
CPU_FEAT_INITIALIZER(GEN12_GA2),
|
|
|
|
CPU_FEAT_INITIALIZER(GEN13_GA1),
|
|
|
|
CPU_FEAT_INITIALIZER(GEN13_GA2),
|
2017-04-13 17:28:41 +03:00
|
|
|
CPU_FEAT_INITIALIZER(GEN14_GA1),
|
2019-02-12 04:16:57 +03:00
|
|
|
CPU_FEAT_INITIALIZER(GEN14_GA2),
|
2019-04-29 12:02:49 +03:00
|
|
|
CPU_FEAT_INITIALIZER(GEN15_GA1),
|
2016-09-05 11:52:19 +03:00
|
|
|
};
|
|
|
|
|
2016-09-05 11:52:20 +03:00
|
|
|
#define FEAT_GROUP_INITIALIZER(_name) \
|
|
|
|
{ \
|
|
|
|
.name = "S390_FEAT_GROUP_LIST_" #_name, \
|
2018-07-25 17:36:17 +03:00
|
|
|
.enum_name = "S390_FEAT_GROUP_" #_name, \
|
2016-09-05 11:52:20 +03:00
|
|
|
.bits = \
|
|
|
|
{ .data = group_##_name, \
|
|
|
|
.len = ARRAY_SIZE(group_##_name) }, \
|
|
|
|
}
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
const char *name;
|
2018-07-25 17:36:17 +03:00
|
|
|
const char *enum_name;
|
2016-09-05 11:52:20 +03:00
|
|
|
BitSpec bits;
|
|
|
|
} FeatGroupDefSpec;
|
|
|
|
|
|
|
|
/*******************************
|
|
|
|
* feature groups
|
|
|
|
*******************************/
|
|
|
|
static FeatGroupDefSpec FeatGroupDef[] = {
|
|
|
|
FEAT_GROUP_INITIALIZER(PLO),
|
|
|
|
FEAT_GROUP_INITIALIZER(TOD_CLOCK_STEERING),
|
|
|
|
FEAT_GROUP_INITIALIZER(GEN13_PTFF),
|
|
|
|
FEAT_GROUP_INITIALIZER(MSA),
|
|
|
|
FEAT_GROUP_INITIALIZER(MSA_EXT_1),
|
|
|
|
FEAT_GROUP_INITIALIZER(MSA_EXT_2),
|
|
|
|
FEAT_GROUP_INITIALIZER(MSA_EXT_3),
|
|
|
|
FEAT_GROUP_INITIALIZER(MSA_EXT_4),
|
|
|
|
FEAT_GROUP_INITIALIZER(MSA_EXT_5),
|
2017-04-13 17:28:41 +03:00
|
|
|
FEAT_GROUP_INITIALIZER(MSA_EXT_6),
|
|
|
|
FEAT_GROUP_INITIALIZER(MSA_EXT_7),
|
|
|
|
FEAT_GROUP_INITIALIZER(MSA_EXT_8),
|
2019-04-29 12:02:45 +03:00
|
|
|
FEAT_GROUP_INITIALIZER(MSA_EXT_9),
|
|
|
|
FEAT_GROUP_INITIALIZER(MSA_EXT_9_PCKMO),
|
2018-07-25 17:36:17 +03:00
|
|
|
FEAT_GROUP_INITIALIZER(MULTIPLE_EPOCH_PTFF),
|
2019-04-29 12:02:47 +03:00
|
|
|
FEAT_GROUP_INITIALIZER(ENH_SORT),
|
2019-04-29 12:02:48 +03:00
|
|
|
FEAT_GROUP_INITIALIZER(DEFLATE_CONVERSION),
|
2016-09-05 11:52:20 +03:00
|
|
|
};
|
|
|
|
|
2017-12-08 19:55:29 +03:00
|
|
|
#define QEMU_FEAT_INITIALIZER(_name) \
|
|
|
|
{ \
|
|
|
|
.name = "S390_FEAT_LIST_QEMU_" #_name, \
|
|
|
|
.bits = \
|
|
|
|
{ .data = qemu_##_name, \
|
|
|
|
.len = ARRAY_SIZE(qemu_##_name) }, \
|
|
|
|
}
|
|
|
|
|
|
|
|
/*******************************
|
|
|
|
* QEMU (CPU model) features
|
|
|
|
*******************************/
|
|
|
|
static FeatGroupDefSpec QemuFeatDef[] = {
|
|
|
|
QEMU_FEAT_INITIALIZER(V2_11),
|
2019-02-12 14:23:23 +03:00
|
|
|
QEMU_FEAT_INITIALIZER(V3_1),
|
2019-02-27 11:12:09 +03:00
|
|
|
QEMU_FEAT_INITIALIZER(V4_0),
|
2019-08-05 11:13:52 +03:00
|
|
|
QEMU_FEAT_INITIALIZER(V4_1),
|
2017-12-08 19:55:29 +03:00
|
|
|
QEMU_FEAT_INITIALIZER(LATEST),
|
|
|
|
QEMU_FEAT_INITIALIZER(MAX),
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static void set_bits(uint64_t list[], BitSpec bits)
|
|
|
|
{
|
|
|
|
uint32_t i;
|
|
|
|
|
|
|
|
for (i = 0; i < bits.len; i++) {
|
|
|
|
list[bits.data[i] / 64] |= 1ULL << (bits.data[i] % 64);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-04-29 12:02:49 +03:00
|
|
|
static inline void clear_bit(uint64_t list[], unsigned long nr)
|
|
|
|
{
|
|
|
|
list[nr / 64] &= ~(1ULL << (nr % 64));
|
|
|
|
}
|
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
static void print_feature_defs(void)
|
|
|
|
{
|
|
|
|
uint64_t base_feat[S390_FEAT_MAX / 64 + 1] = {};
|
|
|
|
uint64_t default_feat[S390_FEAT_MAX / 64 + 1] = {};
|
|
|
|
uint64_t full_feat[S390_FEAT_MAX / 64 + 1] = {};
|
|
|
|
int i, j;
|
|
|
|
|
|
|
|
printf("\n/* CPU model feature list data */\n");
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_SIZE(CpuFeatDef); i++) {
|
2019-04-29 12:02:49 +03:00
|
|
|
/* With gen15 CSSKE and BPB are deprecated */
|
|
|
|
if (strcmp(CpuFeatDef[i].name, "S390_FEAT_LIST_GEN15_GA1") == 0) {
|
|
|
|
clear_bit(base_feat, S390_FEAT_CONDITIONAL_SSKE);
|
|
|
|
clear_bit(default_feat, S390_FEAT_CONDITIONAL_SSKE);
|
|
|
|
clear_bit(default_feat, S390_FEAT_BPB);
|
|
|
|
}
|
2016-09-05 11:52:19 +03:00
|
|
|
set_bits(base_feat, CpuFeatDef[i].base_bits);
|
|
|
|
/* add the base to the default features */
|
|
|
|
set_bits(default_feat, CpuFeatDef[i].base_bits);
|
|
|
|
set_bits(default_feat, CpuFeatDef[i].default_bits);
|
|
|
|
/* add the base to the full features */
|
|
|
|
set_bits(full_feat, CpuFeatDef[i].base_bits);
|
|
|
|
set_bits(full_feat, CpuFeatDef[i].full_bits);
|
|
|
|
|
|
|
|
printf("#define %s_BASE\t", CpuFeatDef[i].name);
|
|
|
|
for (j = 0; j < ARRAY_SIZE(base_feat); j++) {
|
|
|
|
printf("0x%016"PRIx64"ULL", base_feat[j]);
|
|
|
|
if (j < ARRAY_SIZE(base_feat) - 1) {
|
|
|
|
printf(",");
|
|
|
|
} else {
|
|
|
|
printf("\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
printf("#define %s_DEFAULT\t", CpuFeatDef[i].name);
|
|
|
|
for (j = 0; j < ARRAY_SIZE(default_feat); j++) {
|
|
|
|
printf("0x%016"PRIx64"ULL", default_feat[j]);
|
|
|
|
if (j < ARRAY_SIZE(default_feat) - 1) {
|
|
|
|
printf(",");
|
|
|
|
} else {
|
|
|
|
printf("\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
printf("#define %s_FULL\t\t", CpuFeatDef[i].name);
|
|
|
|
for (j = 0; j < ARRAY_SIZE(full_feat); j++) {
|
|
|
|
printf("0x%016"PRIx64"ULL", full_feat[j]);
|
|
|
|
if (j < ARRAY_SIZE(full_feat) - 1) {
|
|
|
|
printf(",");
|
|
|
|
} else {
|
|
|
|
printf("\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-08 19:55:29 +03:00
|
|
|
static void print_qemu_feature_defs(void)
|
|
|
|
{
|
|
|
|
uint64_t feat[S390_FEAT_MAX / 64 + 1] = {};
|
|
|
|
int i, j;
|
|
|
|
|
|
|
|
printf("\n/* QEMU (CPU model) feature list data */\n");
|
|
|
|
|
|
|
|
/* for now we assume that we only add new features */
|
|
|
|
for (i = 0; i < ARRAY_SIZE(QemuFeatDef); i++) {
|
|
|
|
set_bits(feat, QemuFeatDef[i].bits);
|
|
|
|
|
|
|
|
printf("#define %s\t", QemuFeatDef[i].name);
|
|
|
|
for (j = 0; j < ARRAY_SIZE(feat); j++) {
|
|
|
|
printf("0x%016"PRIx64"ULL", feat[j]);
|
|
|
|
if (j < ARRAY_SIZE(feat) - 1) {
|
|
|
|
printf(",");
|
|
|
|
} else {
|
|
|
|
printf("\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-09-05 11:52:20 +03:00
|
|
|
static void print_feature_group_defs(void)
|
|
|
|
{
|
|
|
|
int i, j;
|
|
|
|
|
|
|
|
printf("\n/* CPU feature group list data */\n");
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_SIZE(FeatGroupDef); i++) {
|
|
|
|
uint64_t feat[S390_FEAT_MAX / 64 + 1] = {};
|
|
|
|
|
|
|
|
set_bits(feat, FeatGroupDef[i].bits);
|
|
|
|
printf("#define %s\t", FeatGroupDef[i].name);
|
|
|
|
for (j = 0; j < ARRAY_SIZE(feat); j++) {
|
|
|
|
printf("0x%016"PRIx64"ULL", feat[j]);
|
|
|
|
if (j < ARRAY_SIZE(feat) - 1) {
|
|
|
|
printf(",");
|
|
|
|
} else {
|
|
|
|
printf("\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-25 17:36:17 +03:00
|
|
|
static void print_feature_group_enum_type(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
printf("\n/* CPU feature group enum type */\n"
|
|
|
|
"typedef enum {\n");
|
|
|
|
for (i = 0; i < ARRAY_SIZE(FeatGroupDef); i++) {
|
|
|
|
printf("\t%s,\n", FeatGroupDef[i].enum_name);
|
|
|
|
}
|
|
|
|
printf("\tS390_FEAT_GROUP_MAX,\n"
|
|
|
|
"} S390FeatGroup;\n");
|
|
|
|
}
|
|
|
|
|
2016-09-05 11:52:19 +03:00
|
|
|
int main(int argc, char *argv[])
|
|
|
|
{
|
|
|
|
printf("/*\n"
|
|
|
|
" * AUTOMATICALLY GENERATED, DO NOT MODIFY HERE, EDIT\n"
|
|
|
|
" * SOURCE FILE \"%s\" INSTEAD.\n"
|
|
|
|
" *\n"
|
|
|
|
" * Copyright %s IBM Corp.\n"
|
|
|
|
" *\n"
|
|
|
|
" * This work is licensed under the terms of the GNU GPL, "
|
|
|
|
"version 2 or (at\n * your option) any later version. See "
|
|
|
|
"the COPYING file in the top-level\n * directory.\n"
|
|
|
|
" */\n\n"
|
|
|
|
"#ifndef %s\n#define %s\n", __FILE__, _YEARS, _NAME_H, _NAME_H);
|
|
|
|
print_feature_defs();
|
2016-09-05 11:52:20 +03:00
|
|
|
print_feature_group_defs();
|
2017-12-08 19:55:29 +03:00
|
|
|
print_qemu_feature_defs();
|
2018-07-25 17:36:17 +03:00
|
|
|
print_feature_group_enum_type();
|
2016-09-05 11:52:19 +03:00
|
|
|
printf("\n#endif\n");
|
|
|
|
return 0;
|
|
|
|
}
|