mirror of
https://gitlab.com/qemu-project/qemu.git
synced 2026-10-28 14:04:39 +08:00
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:
commit
284dc6d036
6 files changed
+230
-133
No files matched your search
+2
-1
@@ -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
@@ -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[] = {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) \
|
||||||
|
|||||||
@@ -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
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user