aboutsummaryrefslogtreecommitdiff
path: root/target/s390x/gen-features.c
diff options
context:
space:
mode:
Diffstat (limited to 'target/s390x/gen-features.c')
-rw-r--r--target/s390x/gen-features.c208
1 files changed, 196 insertions, 12 deletions
diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c
index 70015eaaf5..2b2bfc3736 100644
--- a/target/s390x/gen-features.c
+++ b/target/s390x/gen-features.c
@@ -13,6 +13,7 @@
#include <inttypes.h>
#include <stdio.h>
+#include <string.h>
#include "cpu_features_def.h"
#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
@@ -213,6 +214,54 @@
S390_FEAT_KMA_GCM_EAES_192, \
S390_FEAT_KMA_GCM_EAES_256
+#define S390_FEAT_GROUP_MSA_EXT_9 \
+ S390_FEAT_MSA_EXT_9, \
+ 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, \
+ 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
+
+#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
+
+
+#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
+
/* cpu feature groups */
static uint16_t group_PLO[] = {
S390_FEAT_GROUP_PLO,
@@ -254,6 +303,22 @@ static uint16_t group_MSA_EXT_8[] = {
S390_FEAT_GROUP_MSA_EXT_8,
};
+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,
+};
+
+static uint16_t group_ENH_SORT[] = {
+ S390_FEAT_GROUP_ENH_SORT,
+};
+
+static uint16_t group_DEFLATE_CONVERSION[] = {
+ S390_FEAT_GROUP_DEFLATE_CONVERSION,
+};
+
/* 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
@@ -309,7 +374,7 @@ static uint16_t base_GEN10_GA1[] = {
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_FLOATING_POINT_SUPPORT_ENH,
S390_FEAT_DFP,
S390_FEAT_DFP_FAST,
S390_FEAT_PFPO,
@@ -347,12 +412,20 @@ static uint16_t base_GEN13_GA1[] = {
static uint16_t base_GEN14_GA1[] = {
S390_FEAT_ENTROPY_ENC_COMP,
- S390_FEAT_MISC_INSTRUCTION_EXT,
+ S390_FEAT_MISC_INSTRUCTION_EXT2,
S390_FEAT_SEMAPHORE_ASSIST,
S390_FEAT_TIME_SLICE_INSTRUMENTATION,
S390_FEAT_ORDER_PRESERVING_COMPRESSION,
};
+#define base_GEN14_GA2 EmptyFeat
+
+static uint16_t base_GEN15_GA1[] = {
+ S390_FEAT_MISC_INSTRUCTION_EXT3,
+};
+
+#define base_GEN16_GA1 EmptyFeat
+
/* 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
@@ -403,7 +476,7 @@ 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_FLOATING_POINT_SUPPORT_ENH,
S390_FEAT_DFP,
};
@@ -448,8 +521,11 @@ static uint16_t full_GEN12_GA1[] = {
S390_FEAT_EDAT_2,
S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2,
S390_FEAT_AP_QUERY_CONFIG_INFO,
+ S390_FEAT_AP_QUEUE_INTERRUPT_CONTROL,
S390_FEAT_AP_FACILITIES_TEST,
S390_FEAT_AP,
+ S390_FEAT_EXTENDED_LENGTH_SCCB,
+ S390_FEAT_DIAG_318,
};
static uint16_t full_GEN12_GA2[] = {
@@ -480,6 +556,31 @@ static uint16_t full_GEN14_GA1[] = {
S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF,
};
+#define full_GEN14_GA2 EmptyFeat
+
+static uint16_t full_GEN15_GA1[] = {
+ S390_FEAT_VECTOR_ENH2,
+ S390_FEAT_GROUP_ENH_SORT,
+ S390_FEAT_GROUP_DEFLATE_CONVERSION,
+ S390_FEAT_VECTOR_PACKED_DECIMAL_ENH,
+ S390_FEAT_GROUP_MSA_EXT_9,
+ S390_FEAT_GROUP_MSA_EXT_9_PCKMO,
+ S390_FEAT_ETOKEN,
+ S390_FEAT_UNPACK,
+};
+
+static uint16_t full_GEN16_GA1[] = {
+ S390_FEAT_NNPA,
+ S390_FEAT_VECTOR_PACKED_DECIMAL_ENH2,
+ S390_FEAT_BEAR_ENH,
+ S390_FEAT_RDP,
+ S390_FEAT_PAI,
+ S390_FEAT_PAIE,
+ S390_FEAT_UV_FEAT_AP,
+ S390_FEAT_UV_FEAT_AP_INTR,
+};
+
+
/* Default features (in order of release)
* Automatically includes corresponding base features.
* Default features are all features this version of QEMU supports for this
@@ -550,6 +651,28 @@ static uint16_t default_GEN14_GA1[] = {
S390_FEAT_GROUP_MSA_EXT_6,
S390_FEAT_GROUP_MSA_EXT_7,
S390_FEAT_GROUP_MSA_EXT_8,
+ S390_FEAT_MULTIPLE_EPOCH,
+ S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF,
+};
+
+#define default_GEN14_GA2 EmptyFeat
+
+static uint16_t default_GEN15_GA1[] = {
+ S390_FEAT_VECTOR_ENH2,
+ S390_FEAT_GROUP_DEFLATE_CONVERSION,
+ S390_FEAT_VECTOR_PACKED_DECIMAL_ENH,
+ S390_FEAT_GROUP_MSA_EXT_9,
+ S390_FEAT_GROUP_MSA_EXT_9_PCKMO,
+ S390_FEAT_ETOKEN,
+};
+
+static uint16_t default_GEN16_GA1[] = {
+ S390_FEAT_NNPA,
+ S390_FEAT_VECTOR_PACKED_DECIMAL_ENH2,
+ S390_FEAT_BEAR_ENH,
+ S390_FEAT_RDP,
+ S390_FEAT_PAI,
+ S390_FEAT_PAIE,
};
/* QEMU (CPU model) features */
@@ -560,7 +683,7 @@ static uint16_t qemu_V2_11[] = {
S390_FEAT_ZARCH,
};
-static uint16_t qemu_LATEST[] = {
+static uint16_t qemu_V3_1[] = {
S390_FEAT_DAT_ENH,
S390_FEAT_IDTE_SEGMENT,
S390_FEAT_STFLE,
@@ -581,7 +704,7 @@ static uint16_t qemu_LATEST[] = {
S390_FEAT_GENERAL_INSTRUCTIONS_EXT,
S390_FEAT_EXECUTE_EXT,
S390_FEAT_SET_PROGRAM_PARAMETERS,
- S390_FEAT_FLOATING_POINT_SUPPPORT_ENH,
+ S390_FEAT_FLOATING_POINT_SUPPORT_ENH,
S390_FEAT_STFLE_45,
S390_FEAT_STFLE_49,
S390_FEAT_LOCAL_TLB_CLEARING,
@@ -592,14 +715,51 @@ static uint16_t qemu_LATEST[] = {
S390_FEAT_MSA_EXT_4,
};
-/* add all new definitions before this point */
-static uint16_t qemu_MAX[] = {
- /* z13+ features */
+static uint16_t qemu_V4_0[] = {
+ /*
+ * Only BFP bits are implemented (HFP, DFP, PFPO and DIVIDE TO INTEGER not
+ * implemented yet).
+ */
+ S390_FEAT_FLOATING_POINT_EXT,
+ S390_FEAT_ZPCI,
+};
+
+static uint16_t qemu_V4_1[] = {
S390_FEAT_STFLE_53,
- /* generates a dependency warning, leave it out for now */
+ S390_FEAT_VECTOR,
+};
+
+static uint16_t qemu_V6_0[] = {
+ S390_FEAT_ACCESS_EXCEPTION_FS_INDICATION,
+ S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2,
+ S390_FEAT_ESOP,
+};
+
+static uint16_t qemu_V6_2[] = {
+ S390_FEAT_INSTRUCTION_EXEC_PROT,
+ S390_FEAT_MISC_INSTRUCTION_EXT2,
+ S390_FEAT_MSA_EXT_8,
+ S390_FEAT_VECTOR_ENH,
+};
+
+static uint16_t qemu_V7_0[] = {
+ S390_FEAT_MISC_INSTRUCTION_EXT3,
+};
+
+static uint16_t qemu_V7_1[] = {
+ S390_FEAT_VECTOR_ENH2,
+};
+
+/*
+ * Features for the "qemu" CPU model of the latest QEMU machine and the "max"
+ * CPU model under TCG. Don't include features that are not part of the full
+ * feature set of the current "max" CPU model generation.
+ */
+static uint16_t qemu_MAX[] = {
S390_FEAT_MSA_EXT_5,
- /* only with CONFIG_PCI */
- S390_FEAT_ZPCI,
+ S390_FEAT_KIMD_SHA_512,
+ S390_FEAT_KLMD_SHA_512,
+ S390_FEAT_PRNO_TRNG,
};
/****** END FEATURE DEFS ******/
@@ -660,6 +820,9 @@ static CpuFeatDefSpec CpuFeatDef[] = {
CPU_FEAT_INITIALIZER(GEN13_GA1),
CPU_FEAT_INITIALIZER(GEN13_GA2),
CPU_FEAT_INITIALIZER(GEN14_GA1),
+ CPU_FEAT_INITIALIZER(GEN14_GA2),
+ CPU_FEAT_INITIALIZER(GEN15_GA1),
+ CPU_FEAT_INITIALIZER(GEN16_GA1),
};
#define FEAT_GROUP_INITIALIZER(_name) \
@@ -693,7 +856,11 @@ static FeatGroupDefSpec FeatGroupDef[] = {
FEAT_GROUP_INITIALIZER(MSA_EXT_6),
FEAT_GROUP_INITIALIZER(MSA_EXT_7),
FEAT_GROUP_INITIALIZER(MSA_EXT_8),
+ FEAT_GROUP_INITIALIZER(MSA_EXT_9),
+ FEAT_GROUP_INITIALIZER(MSA_EXT_9_PCKMO),
FEAT_GROUP_INITIALIZER(MULTIPLE_EPOCH_PTFF),
+ FEAT_GROUP_INITIALIZER(ENH_SORT),
+ FEAT_GROUP_INITIALIZER(DEFLATE_CONVERSION),
};
#define QEMU_FEAT_INITIALIZER(_name) \
@@ -709,7 +876,13 @@ static FeatGroupDefSpec FeatGroupDef[] = {
*******************************/
static FeatGroupDefSpec QemuFeatDef[] = {
QEMU_FEAT_INITIALIZER(V2_11),
- QEMU_FEAT_INITIALIZER(LATEST),
+ QEMU_FEAT_INITIALIZER(V3_1),
+ QEMU_FEAT_INITIALIZER(V4_0),
+ QEMU_FEAT_INITIALIZER(V4_1),
+ QEMU_FEAT_INITIALIZER(V6_0),
+ QEMU_FEAT_INITIALIZER(V6_2),
+ QEMU_FEAT_INITIALIZER(V7_0),
+ QEMU_FEAT_INITIALIZER(V7_1),
QEMU_FEAT_INITIALIZER(MAX),
};
@@ -723,6 +896,11 @@ static void set_bits(uint64_t list[], BitSpec bits)
}
}
+static inline void clear_bit(uint64_t list[], unsigned long nr)
+{
+ list[nr / 64] &= ~(1ULL << (nr % 64));
+}
+
static void print_feature_defs(void)
{
uint64_t base_feat[S390_FEAT_MAX / 64 + 1] = {};
@@ -733,6 +911,12 @@ static void print_feature_defs(void)
printf("\n/* CPU model feature list data */\n");
for (i = 0; i < ARRAY_SIZE(CpuFeatDef); i++) {
+ /* 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);
+ }
set_bits(base_feat, CpuFeatDef[i].base_bits);
/* add the base to the default features */
set_bits(default_feat, CpuFeatDef[i].base_bits);