Merge tag 's390x-20261026' of https://gitlab.com/efarman/qemu into staging

s390x fixes/features for 11.2:
 - Implement resizable vt220 console
 - Deprecate dependencies of deprecated features
 - Reclaim DMA slots during, for example, guest reboot
 - MAINTAINERS updates

# -----BEGIN PGP SIGNATURE-----
#
# iIsEABYKADMWIQQB3Dhbwk4ZE3uUN6KmTx4R4Fx3tAUCat9bfhUcZmFybWFuQGxp
# bnV4LmlibS5jb20ACgkQpk8eEeBcd7S3cAD/TgRQLU3bVmRldeDwAJIca3EG1O1m
# tAJ+uLxcGTBgeY8BANYOrWc3WU+oez472RyUamEkmEnM+xjrt1Wd5amO3eoI
# =6GYD
# -----END PGP SIGNATURE-----
# gpg: Signature made Mon 26 Oct 2026 08:54:06 AM CDT
# gpg:                using EDDSA key 01DC385BC24E19137B9437A2A64F1E11E05C77B4
# gpg:                issuer "farman@linux.ibm.com"
# gpg: Good signature from "Eric Farman <farman@linux.ibm.com>" [unknown]
# gpg: WARNING: The key's User ID is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: D2C6 0504 C9E8 F568 CFE5  87B5 3827 B212 71BF 9562
#      Subkey fingerprint: 01DC 385B C24E 1913 7B94  37A2 A64F 1E11 E05C 77B4

* tag 's390x-20261026' of https://gitlab.com/efarman/qemu:
  MAINTAINERS: Update s390 boot reviewer
  MAINTAINERS: Add other s390x tree
  s390x/pci: reclaim DMA slots upon IOMMU disable
  s390x/sclpconsole: implement resizing for vt220 consoles
  target/s390x: mark feats dependent on deprecated feats as deprecated
  target/s390x: externalize feat dependency array

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson committed 2026-10-27 14:26:53 -05:00
commit 284dc6d036
6 files changed
+230 -133

No files matched your search

+2 -1
View File
@@ -129,6 +129,7 @@ F: docs/system/s390x/
F: tests/qtest/migration/s390x/ F: tests/qtest/migration/s390x/
K: ^Subject:.*(?i)s390x? K: ^Subject:.*(?i)s390x?
T: git https://gitlab.com/cohuck/qemu.git s390-next T: git https://gitlab.com/cohuck/qemu.git s390-next
T: git https://gitlab.com/efarman/qemu.git s390-next
L: qemu-s390x@nongnu.org L: qemu-s390x@nongnu.org
MIPS general architecture support MIPS general architecture support
@@ -1997,7 +1998,7 @@ S390-ccw boot
M: Jared Rossi <jrossi@linux.ibm.com> M: Jared Rossi <jrossi@linux.ibm.com>
R: Zhuoying Cai <zycai@linux.ibm.com> R: Zhuoying Cai <zycai@linux.ibm.com>
R: Christian Borntraeger <borntraeger@linux.ibm.com> R: Christian Borntraeger <borntraeger@linux.ibm.com>
R: Jason Herne <jjherne@linux.ibm.com> R: Joshua Daley <jdaley@linux.ibm.com>
S: Supported S: Supported
F: hw/s390x/ipl.* F: hw/s390x/ipl.*
F: hw/s390x/cert-store.[ch] F: hw/s390x/cert-store.[ch]
+72 -4
View File
@@ -33,6 +33,9 @@ typedef struct ASCIIConsoleData {
/* max size for ASCII data in 4K SCCB page */ /* max size for ASCII data in 4K SCCB page */
#define SIZE_BUFFER_VT220 4080 #define SIZE_BUFFER_VT220 4080
#define SCLP_CONSOLE_EVENT_TYPE_DATA 0x00
#define SCLP_CONSOLE_EVENT_TYPE_RESIZE 0x08
struct SCLPConsole { struct SCLPConsole {
SCLPEvent event; SCLPEvent event;
CharFrontend chr; CharFrontend chr;
@@ -42,6 +45,8 @@ struct SCLPConsole {
uint32_t iov_data_len; /* length of byte stream in buffer */ uint32_t iov_data_len; /* length of byte stream in buffer */
uint32_t iov_sclp_rest; /* length of byte stream not read via SCLP */ uint32_t iov_sclp_rest; /* length of byte stream not read via SCLP */
bool notify; /* qemu_notify_event() req'd if true */ bool notify; /* qemu_notify_event() req'd if true */
bool resize;
bool resize_init;
}; };
typedef struct SCLPConsole SCLPConsole; typedef struct SCLPConsole SCLPConsole;
@@ -49,6 +54,12 @@ typedef struct SCLPConsole SCLPConsole;
DECLARE_INSTANCE_CHECKER(SCLPConsole, SCLP_CONSOLE, DECLARE_INSTANCE_CHECKER(SCLPConsole, SCLP_CONSOLE,
TYPE_SCLP_CONSOLE) TYPE_SCLP_CONSOLE)
typedef struct SCLPConsoleResizeData {
uint8_t type;
uint16_t rows;
uint16_t cols;
} QEMU_PACKED SCLPConsoleResizeData;
/* character layer call-back functions */ /* character layer call-back functions */
/* Return number of bytes that fit into iov buffer */ /* Return number of bytes that fit into iov buffer */
@@ -81,6 +92,29 @@ static void chr_read(void *opaque, const uint8_t *buf, int size)
sclp_service_interrupt(0); sclp_service_interrupt(0);
} }
static void chr_event(void *opaque, QEMUChrEvent event)
{
SCLPConsole *scon = opaque;
assert(scon);
switch (event) {
case CHR_EVENT_RESIZE:
case CHR_EVENT_MUX_IN:
scon->resize = true;
scon->resize_init = false;
scon->event.event_pending = true;
sclp_service_interrupt(0);
break;
case CHR_EVENT_BREAK:
case CHR_EVENT_OPENED:
case CHR_EVENT_MUX_OUT:
case CHR_EVENT_CLOSED:
/* ignore */
break;
}
}
/* functions to be called by event facility */ /* functions to be called by event facility */
static bool can_handle_event(uint8_t type) static bool can_handle_event(uint8_t type)
@@ -104,10 +138,37 @@ static sccb_mask_t receive_mask(void)
static void get_console_data(SCLPEvent *event, uint8_t *buf, size_t *size, static void get_console_data(SCLPEvent *event, uint8_t *buf, size_t *size,
int avail) int avail)
{ {
SCLPConsoleResizeData resize_data;
SCLPConsole *cons = SCLP_CONSOLE(event); SCLPConsole *cons = SCLP_CONSOLE(event);
uint16_t rows, cols;
/* first byte is hex 0 saying an ascii string follows */ if (cons->resize) {
*buf++ = '\0'; if (avail < sizeof(resize_data)) {
*size = 0;
return;
}
qemu_chr_fe_get_winsize(&cons->chr, &cols, &rows);
if (cons->resize_init && cols == 0 && rows == 0) {
*size = 0;
} else {
resize_data.type = SCLP_CONSOLE_EVENT_TYPE_RESIZE;
resize_data.rows = cpu_to_be16(rows);
resize_data.cols = cpu_to_be16(cols);
memcpy(buf, &resize_data, sizeof(resize_data));
*size = sizeof(resize_data);
}
cons->resize = false;
cons->resize_init = false;
event->event_pending = cons->iov_sclp_rest != 0;
return;
}
*buf++ = SCLP_CONSOLE_EVENT_TYPE_DATA;
avail--; avail--;
/* if all data fit into provided SCLP buffer */ /* if all data fit into provided SCLP buffer */
if (avail >= cons->iov_sclp_rest) { if (avail >= cons->iov_sclp_rest) {
@@ -150,6 +211,9 @@ static int read_event_data(SCLPEvent *event, EventBufferHeader *evt_buf_hdr,
to = (uint8_t *)&acd->data; to = (uint8_t *)&acd->data;
avail = *slen - sizeof(ASCIIConsoleData); avail = *slen - sizeof(ASCIIConsoleData);
get_console_data(event, to, &src_len, avail); get_console_data(event, to, &src_len, avail);
if (src_len == 0) {
return 0;
}
acd->ebh.length = cpu_to_be16(sizeof(ASCIIConsoleData) + src_len); acd->ebh.length = cpu_to_be16(sizeof(ASCIIConsoleData) + src_len);
acd->ebh.type = SCLP_EVENT_ASCII_CONSOLE_DATA; acd->ebh.type = SCLP_EVENT_ASCII_CONSOLE_DATA;
@@ -233,7 +297,7 @@ static int console_init(SCLPEvent *event)
} }
console_available = true; console_available = true;
qemu_chr_fe_set_handlers(&scon->chr, chr_can_read, qemu_chr_fe_set_handlers(&scon->chr, chr_can_read,
chr_read, NULL, NULL, scon, NULL, true); chr_read, chr_event, NULL, scon, NULL, true);
return 0; return 0;
} }
@@ -243,12 +307,16 @@ static void console_reset(DeviceState *dev)
SCLPEvent *event = SCLP_EVENT(dev); SCLPEvent *event = SCLP_EVENT(dev);
SCLPConsole *scon = SCLP_CONSOLE(event); SCLPConsole *scon = SCLP_CONSOLE(event);
event->event_pending = false;
scon->iov_sclp = 0; scon->iov_sclp = 0;
scon->iov_bs = 0; scon->iov_bs = 0;
scon->iov_data_len = 0; scon->iov_data_len = 0;
scon->iov_sclp_rest = 0; scon->iov_sclp_rest = 0;
scon->notify = false; scon->notify = false;
/* the guest defaults its terminal size on reset, announce the real one */
scon->resize = true;
scon->resize_init = true;
event->event_pending = true;
} }
static const Property console_properties[] = { static const Property console_properties[] = {
+8
View File
@@ -826,6 +826,14 @@ void s390_pci_iommu_disable(S390PCIBusDevice *pbdev)
{ {
S390PCIIOMMU *iommu = pbdev->iommu; S390PCIIOMMU *iommu = pbdev->iommu;
pbdev->iommu_enabled = false; pbdev->iommu_enabled = false;
if (pbdev->dma_limit) {
/*
* Account for all the DMA mappings still in the IOTLB; they will be
* returned to vfio when we delete the memory subregion via
* memory_region_del_subregion() below.
*/
pbdev->dma_limit->avail += g_hash_table_size(pbdev->iotlb);
}
g_hash_table_remove_all(pbdev->iotlb); g_hash_table_remove_all(pbdev->iotlb);
if (pbdev->dm_mr) { if (pbdev->dm_mr) {
memory_region_del_subregion(&iommu->mr, pbdev->dm_mr); memory_region_del_subregion(&iommu->mr, pbdev->dm_mr);
+139
View File
@@ -223,6 +223,132 @@ void s390_feat_bitmap_to_ascii(const S390FeatBitmap features, void *opaque,
}; };
} }
const int s390_feat_deps[][2] = {
{ S390_FEAT_IPTE_RANGE, S390_FEAT_DAT_ENH },
{ S390_FEAT_IDTE_SEGMENT, S390_FEAT_DAT_ENH },
{ S390_FEAT_IDTE_REGION, S390_FEAT_DAT_ENH },
{ S390_FEAT_IDTE_REGION, S390_FEAT_IDTE_SEGMENT },
{ S390_FEAT_LOCAL_TLB_CLEARING, S390_FEAT_DAT_ENH},
{ S390_FEAT_LONG_DISPLACEMENT_FAST, S390_FEAT_LONG_DISPLACEMENT },
{ S390_FEAT_DFP_FAST, S390_FEAT_DFP },
{ S390_FEAT_TRANSACTIONAL_EXE, S390_FEAT_STFLE_49 },
{ S390_FEAT_EDAT_2, S390_FEAT_EDAT},
{ S390_FEAT_MSA_EXT_5, S390_FEAT_KIMD_SHA_512 },
{ S390_FEAT_MSA_EXT_5, S390_FEAT_KLMD_SHA_512 },
{ S390_FEAT_MSA_EXT_4, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_SIE_CMMA, S390_FEAT_CMM },
{ S390_FEAT_SIE_CMMA, S390_FEAT_SIE_GSLS },
{ S390_FEAT_SIE_PFMFI, S390_FEAT_EDAT },
{ S390_FEAT_MSA_EXT_8, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_MSA_EXT_9, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_MSA_EXT_9, S390_FEAT_MSA_EXT_4 },
{ S390_FEAT_MULTIPLE_EPOCH, S390_FEAT_TOD_CLOCK_STEERING },
{ S390_FEAT_VECTOR_PACKED_DECIMAL, S390_FEAT_VECTOR },
{ S390_FEAT_VECTOR_PACKED_DECIMAL_ENH, S390_FEAT_VECTOR_PACKED_DECIMAL },
{ S390_FEAT_VECTOR_PACKED_DECIMAL_ENH2, S390_FEAT_VECTOR_PACKED_DECIMAL_ENH },
{ S390_FEAT_VECTOR_PACKED_DECIMAL_ENH3, S390_FEAT_VECTOR_PACKED_DECIMAL_ENH2 },
{ S390_FEAT_VECTOR_ENH, S390_FEAT_VECTOR },
{ S390_FEAT_VECTOR_ENH2, S390_FEAT_VECTOR_ENH },
{ S390_FEAT_VECTOR_ENH3, S390_FEAT_VECTOR_ENH2 },
{ S390_FEAT_INSTRUCTION_EXEC_PROT, S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2 },
{ S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2, S390_FEAT_ESOP },
{ S390_FEAT_CMM_NT, S390_FEAT_CMM },
{ S390_FEAT_GUARDED_STORAGE, S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2 },
{ S390_FEAT_MULTIPLE_EPOCH, S390_FEAT_STORE_CLOCK_FAST },
{ S390_FEAT_MULTIPLE_EPOCH, S390_FEAT_TOD_CLOCK_STEERING },
{ S390_FEAT_SEMAPHORE_ASSIST, S390_FEAT_STFLE_49 },
{ S390_FEAT_KIMD_SHA3_224, S390_FEAT_MSA },
{ S390_FEAT_KIMD_SHA3_256, S390_FEAT_MSA },
{ S390_FEAT_KIMD_SHA3_384, S390_FEAT_MSA },
{ S390_FEAT_KIMD_SHA3_512, S390_FEAT_MSA },
{ S390_FEAT_KIMD_SHAKE_128, S390_FEAT_MSA },
{ S390_FEAT_KIMD_SHAKE_256, S390_FEAT_MSA },
{ S390_FEAT_KLMD_SHA3_224, S390_FEAT_MSA },
{ S390_FEAT_KLMD_SHA3_256, S390_FEAT_MSA },
{ S390_FEAT_KLMD_SHA3_384, S390_FEAT_MSA },
{ S390_FEAT_KLMD_SHA3_512, S390_FEAT_MSA },
{ S390_FEAT_KLMD_SHAKE_128, S390_FEAT_MSA },
{ S390_FEAT_KLMD_SHAKE_256, S390_FEAT_MSA },
{ S390_FEAT_KMAC_HMAC_SHA_224, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_KMAC_HMAC_SHA_256, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_KMAC_HMAC_SHA_384, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_KMAC_HMAC_SHA_512, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_KMAC_HMAC_ESHA_224, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_KMAC_HMAC_ESHA_256, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_KMAC_HMAC_ESHA_384, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_KMAC_HMAC_ESHA_512, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_KM_FULL_XTS_AES_128, S390_FEAT_MSA_EXT_4 },
{ S390_FEAT_KM_FULL_XTS_AES_256, S390_FEAT_MSA_EXT_4 },
{ S390_FEAT_KM_FULL_XTS_EAES_128, S390_FEAT_MSA_EXT_4 },
{ S390_FEAT_KM_FULL_XTS_EAES_256, S390_FEAT_MSA_EXT_4 },
{ S390_FEAT_PRNO_TRNG_QRTCR, S390_FEAT_MSA_EXT_5 },
{ S390_FEAT_PRNO_TRNG, S390_FEAT_MSA_EXT_5 },
{ S390_FEAT_SIE_KSS, S390_FEAT_SIE_F2 },
{ S390_FEAT_AP_QUERY_CONFIG_INFO, S390_FEAT_AP },
{ S390_FEAT_AP_FACILITIES_TEST, S390_FEAT_AP },
{ S390_FEAT_PTFF_QSIE, S390_FEAT_MULTIPLE_EPOCH },
{ S390_FEAT_PTFF_QTOUE, S390_FEAT_MULTIPLE_EPOCH },
{ S390_FEAT_PTFF_STOE, S390_FEAT_MULTIPLE_EPOCH },
{ S390_FEAT_PTFF_STOUE, S390_FEAT_MULTIPLE_EPOCH },
{ S390_FEAT_AP_QUEUE_INTERRUPT_CONTROL, S390_FEAT_AP },
{ S390_FEAT_DIAG_318, S390_FEAT_EXTENDED_LENGTH_SCCB },
{ S390_FEAT_CERT_STORE, S390_FEAT_EXTENDED_LENGTH_SCCB },
{ S390_FEAT_SIPL, S390_FEAT_EXTENDED_LENGTH_SCCB },
{ S390_FEAT_SCLAF, S390_FEAT_EXTENDED_LENGTH_SCCB },
{ S390_FEAT_SCLAF, S390_FEAT_SIPL },
{ S390_FEAT_NNPA, S390_FEAT_VECTOR },
{ S390_FEAT_RDP, S390_FEAT_LOCAL_TLB_CLEARING },
{ S390_FEAT_UV_FEAT_AP, S390_FEAT_AP },
{ S390_FEAT_UV_FEAT_AP_INTR, S390_FEAT_UV_FEAT_AP },
{ S390_FEAT_PFCR_QAF, S390_FEAT_CCF_BASE },
{ S390_FEAT_PFCR_CSDST, S390_FEAT_CCF_BASE },
{ S390_FEAT_PFCR_CSDSTG, S390_FEAT_CCF_BASE },
{ S390_FEAT_PFCR_CSTST, S390_FEAT_CCF_BASE },
{ S390_FEAT_PFCR_CSTSTG, S390_FEAT_CCF_BASE },
{ S390_FEAT_INEFF_NC_TX, S390_FEAT_TRANSACTIONAL_EXE },
{ S390_FEAT_PLO_CLO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_CSO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_DCSO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_CSSTO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_CSDSTO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_CSTSTO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TCS, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TCSG, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TCSX, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TCSO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QCS, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QCSG, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QCSX, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QCSO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_LO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_DLX, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_DLO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TL, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TLG, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TLX, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TLO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QL, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QLG, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QLX, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QLO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_STO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_DST, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_DSTG, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_DSTX, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_DSTO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TST, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TSTG, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TSTX, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TSTO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QST, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QSTG, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QSTX, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QSTO, S390_FEAT_PLO_EXT },
{ S390_FEAT_SIE_ASTFLEIE2, S390_FEAT_STFLE },
};
const size_t s390_feat_deps_len = ARRAY_SIZE(s390_feat_deps);
void s390_get_deprecated_features(S390FeatBitmap features) void s390_get_deprecated_features(S390FeatBitmap features)
{ {
static const int feats[] = { static const int feats[] = {
@@ -234,10 +360,23 @@ void s390_get_deprecated_features(S390FeatBitmap features)
S390_FEAT_TRANSACTIONAL_EXE S390_FEAT_TRANSACTIONAL_EXE
}; };
int i; int i;
bool restart;
for (i = 0; i < ARRAY_SIZE(feats); i++) { for (i = 0; i < ARRAY_SIZE(feats); i++) {
set_bit(feats[i], features); set_bit(feats[i], features);
} }
/* Mark features that depend on any deprecated feature */
do {
restart = false;
for (i = 0; i < s390_feat_deps_len; i++) {
if (test_bit(s390_feat_deps[i][1], features) &&
!test_and_set_bit(s390_feat_deps[i][0], features)) {
/* Restart in case set features have other dependencies */
restart = true;
}
}
} while (restart);
} }
#define FEAT_GROUP_INIT(_name, _group, _desc) \ #define FEAT_GROUP_INIT(_name, _group, _desc) \
+4
View File
@@ -57,6 +57,10 @@ typedef struct {
int bit; /* bit within the feature type area (fixed) */ int bit; /* bit within the feature type area (fixed) */
} S390FeatDef; } S390FeatDef;
/* Tuple of features[][0] that depend on other features[][1] */
extern const int s390_feat_deps[][2];
extern const size_t s390_feat_deps_len;
/* use ordinary bitmap operations to work with features */ /* use ordinary bitmap operations to work with features */
typedef unsigned long S390FeatBitmap[BITS_TO_LONGS(S390_FEAT_MAX)]; typedef unsigned long S390FeatBitmap[BITS_TO_LONGS(S390_FEAT_MAX)];
+5 -128
View File
@@ -440,137 +440,14 @@ void s390_cpu_list(void)
static void check_consistency(const S390CPUModel *model) static void check_consistency(const S390CPUModel *model)
{ {
static int dep[][2] = {
{ S390_FEAT_IPTE_RANGE, S390_FEAT_DAT_ENH },
{ S390_FEAT_IDTE_SEGMENT, S390_FEAT_DAT_ENH },
{ S390_FEAT_IDTE_REGION, S390_FEAT_DAT_ENH },
{ S390_FEAT_IDTE_REGION, S390_FEAT_IDTE_SEGMENT },
{ S390_FEAT_LOCAL_TLB_CLEARING, S390_FEAT_DAT_ENH},
{ S390_FEAT_LONG_DISPLACEMENT_FAST, S390_FEAT_LONG_DISPLACEMENT },
{ S390_FEAT_DFP_FAST, S390_FEAT_DFP },
{ S390_FEAT_TRANSACTIONAL_EXE, S390_FEAT_STFLE_49 },
{ S390_FEAT_EDAT_2, S390_FEAT_EDAT},
{ S390_FEAT_MSA_EXT_5, S390_FEAT_KIMD_SHA_512 },
{ S390_FEAT_MSA_EXT_5, S390_FEAT_KLMD_SHA_512 },
{ S390_FEAT_MSA_EXT_4, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_SIE_CMMA, S390_FEAT_CMM },
{ S390_FEAT_SIE_CMMA, S390_FEAT_SIE_GSLS },
{ S390_FEAT_SIE_PFMFI, S390_FEAT_EDAT },
{ S390_FEAT_MSA_EXT_8, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_MSA_EXT_9, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_MSA_EXT_9, S390_FEAT_MSA_EXT_4 },
{ S390_FEAT_MULTIPLE_EPOCH, S390_FEAT_TOD_CLOCK_STEERING },
{ S390_FEAT_VECTOR_PACKED_DECIMAL, S390_FEAT_VECTOR },
{ S390_FEAT_VECTOR_PACKED_DECIMAL_ENH, S390_FEAT_VECTOR_PACKED_DECIMAL },
{ S390_FEAT_VECTOR_PACKED_DECIMAL_ENH2, S390_FEAT_VECTOR_PACKED_DECIMAL_ENH },
{ S390_FEAT_VECTOR_PACKED_DECIMAL_ENH3, S390_FEAT_VECTOR_PACKED_DECIMAL_ENH2 },
{ S390_FEAT_VECTOR_ENH, S390_FEAT_VECTOR },
{ S390_FEAT_VECTOR_ENH2, S390_FEAT_VECTOR_ENH },
{ S390_FEAT_VECTOR_ENH3, S390_FEAT_VECTOR_ENH2 },
{ S390_FEAT_INSTRUCTION_EXEC_PROT, S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2 },
{ S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2, S390_FEAT_ESOP },
{ S390_FEAT_CMM_NT, S390_FEAT_CMM },
{ S390_FEAT_GUARDED_STORAGE, S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2 },
{ S390_FEAT_MULTIPLE_EPOCH, S390_FEAT_STORE_CLOCK_FAST },
{ S390_FEAT_MULTIPLE_EPOCH, S390_FEAT_TOD_CLOCK_STEERING },
{ S390_FEAT_SEMAPHORE_ASSIST, S390_FEAT_STFLE_49 },
{ S390_FEAT_KIMD_SHA3_224, S390_FEAT_MSA },
{ S390_FEAT_KIMD_SHA3_256, S390_FEAT_MSA },
{ S390_FEAT_KIMD_SHA3_384, S390_FEAT_MSA },
{ S390_FEAT_KIMD_SHA3_512, S390_FEAT_MSA },
{ S390_FEAT_KIMD_SHAKE_128, S390_FEAT_MSA },
{ S390_FEAT_KIMD_SHAKE_256, S390_FEAT_MSA },
{ S390_FEAT_KLMD_SHA3_224, S390_FEAT_MSA },
{ S390_FEAT_KLMD_SHA3_256, S390_FEAT_MSA },
{ S390_FEAT_KLMD_SHA3_384, S390_FEAT_MSA },
{ S390_FEAT_KLMD_SHA3_512, S390_FEAT_MSA },
{ S390_FEAT_KLMD_SHAKE_128, S390_FEAT_MSA },
{ S390_FEAT_KLMD_SHAKE_256, S390_FEAT_MSA },
{ S390_FEAT_KMAC_HMAC_SHA_224, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_KMAC_HMAC_SHA_256, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_KMAC_HMAC_SHA_384, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_KMAC_HMAC_SHA_512, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_KMAC_HMAC_ESHA_224, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_KMAC_HMAC_ESHA_256, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_KMAC_HMAC_ESHA_384, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_KMAC_HMAC_ESHA_512, S390_FEAT_MSA_EXT_3 },
{ S390_FEAT_KM_FULL_XTS_AES_128, S390_FEAT_MSA_EXT_4 },
{ S390_FEAT_KM_FULL_XTS_AES_256, S390_FEAT_MSA_EXT_4 },
{ S390_FEAT_KM_FULL_XTS_EAES_128, S390_FEAT_MSA_EXT_4 },
{ S390_FEAT_KM_FULL_XTS_EAES_256, S390_FEAT_MSA_EXT_4 },
{ S390_FEAT_PRNO_TRNG_QRTCR, S390_FEAT_MSA_EXT_5 },
{ S390_FEAT_PRNO_TRNG, S390_FEAT_MSA_EXT_5 },
{ S390_FEAT_SIE_KSS, S390_FEAT_SIE_F2 },
{ S390_FEAT_AP_QUERY_CONFIG_INFO, S390_FEAT_AP },
{ S390_FEAT_AP_FACILITIES_TEST, S390_FEAT_AP },
{ S390_FEAT_PTFF_QSIE, S390_FEAT_MULTIPLE_EPOCH },
{ S390_FEAT_PTFF_QTOUE, S390_FEAT_MULTIPLE_EPOCH },
{ S390_FEAT_PTFF_STOE, S390_FEAT_MULTIPLE_EPOCH },
{ S390_FEAT_PTFF_STOUE, S390_FEAT_MULTIPLE_EPOCH },
{ S390_FEAT_AP_QUEUE_INTERRUPT_CONTROL, S390_FEAT_AP },
{ S390_FEAT_DIAG_318, S390_FEAT_EXTENDED_LENGTH_SCCB },
{ S390_FEAT_CERT_STORE, S390_FEAT_EXTENDED_LENGTH_SCCB },
{ S390_FEAT_SIPL, S390_FEAT_EXTENDED_LENGTH_SCCB },
{ S390_FEAT_SCLAF, S390_FEAT_EXTENDED_LENGTH_SCCB },
{ S390_FEAT_SCLAF, S390_FEAT_SIPL },
{ S390_FEAT_NNPA, S390_FEAT_VECTOR },
{ S390_FEAT_RDP, S390_FEAT_LOCAL_TLB_CLEARING },
{ S390_FEAT_UV_FEAT_AP, S390_FEAT_AP },
{ S390_FEAT_UV_FEAT_AP_INTR, S390_FEAT_UV_FEAT_AP },
{ S390_FEAT_PFCR_QAF, S390_FEAT_CCF_BASE },
{ S390_FEAT_PFCR_CSDST, S390_FEAT_CCF_BASE },
{ S390_FEAT_PFCR_CSDSTG, S390_FEAT_CCF_BASE },
{ S390_FEAT_PFCR_CSTST, S390_FEAT_CCF_BASE },
{ S390_FEAT_PFCR_CSTSTG, S390_FEAT_CCF_BASE },
{ S390_FEAT_INEFF_NC_TX, S390_FEAT_TRANSACTIONAL_EXE },
{ S390_FEAT_PLO_CLO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_CSO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_DCSO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_CSSTO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_CSDSTO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_CSTSTO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TCS, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TCSG, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TCSX, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TCSO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QCS, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QCSG, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QCSX, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QCSO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_LO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_DLX, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_DLO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TL, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TLG, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TLX, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TLO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QL, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QLG, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QLX, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QLO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_STO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_DST, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_DSTG, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_DSTX, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_DSTO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TST, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TSTG, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TSTX, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_TSTO, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QST, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QSTG, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QSTX, S390_FEAT_PLO_EXT },
{ S390_FEAT_PLO_QSTO, S390_FEAT_PLO_EXT },
{ S390_FEAT_SIE_ASTFLEIE2, S390_FEAT_STFLE },
};
int i; int i;
for (i = 0; i < ARRAY_SIZE(dep); i++) { for (i = 0; i < s390_feat_deps_len; i++) {
if (test_bit(dep[i][0], model->features) && if (test_bit(s390_feat_deps[i][0], model->features) &&
!test_bit(dep[i][1], model->features)) { !test_bit(s390_feat_deps[i][1], model->features)) {
warn_report("\'%s\' requires \'%s\'.", warn_report("\'%s\' requires \'%s\'.",
s390_feat_def(dep[i][0])->name, s390_feat_def(s390_feat_deps[i][0])->name,
s390_feat_def(dep[i][1])->name); s390_feat_def(s390_feat_deps[i][1])->name);
} }
} }
} }