some s390x fixes, including a bios update
-----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEEw9DWbcNiT/aowBjO3s9rk8bwL68FAl+lStoSHGNvaHVja0By ZWRoYXQuY29tAAoJEN7Pa5PG8C+vok4P/jW+kgs9ZrtBH+H+/Zg3sNv5BC8N84U1 dKesANeeDB0XNBpZ3OP+wiavNqsn+U9oKvvgLOquntZlJqBkZo3qHCvi1VXAmT36 g02CrOiTZmIlkrB9xnhG/LYzOnNVYI0fTVE5rQIC58dLEeCLyIq1RbhK6XPTiqWz W+kp3e56NMVO8NIsz2llLv0XoB50Xxe1rbk0E/fa289ZQOBqqPgilnh8/raPyNTB YeY8RbXne0yfzuLHb4eo8bsj+4FB2iyst5yZyD86ZRWtUF8WVpwhiukOMbS48n9R 3e6vvkjcLd+jT8I58yhGdydav5Y+C19iZEmuvcTCCqgyODrGcDCXacDjc+XmjOQ1 TGfN+ok+CZzjULNouSbDsV2H6K+JVE1b823f/DAAbLi1bKNKz6rS0gJA6GEvjDVP e45/kP00RxFT+LOe2RFjeO2fEY5qCH8768ogaRQPEhlK0GtSeb0Gbd7sDiTwl5/y Xmw3mZ8HxMKWJmN4whFtdB1pI5EKsls0svoZMoVcdA4jxgbHEQ6nUe3LKb/I6Ys8 Lvt3syBJ9iAZRjxpSTip7A33heGCB4B2pxxu809Ff82kdQ8CrPRDYxdyfZbvr1VM /rmoCND8puwWBvJH55GUTsUapOsRXTCza9W4BU9E/3Ym30j3mHW72yIXYPnT6wmO sD640ABnP9+T =J7tY -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/cohuck/tags/s390x-20201106' into staging some s390x fixes, including a bios update # gpg: Signature made Fri 06 Nov 2020 13:08:42 GMT # gpg: using RSA key C3D0D66DC3624FF6A8C018CEDECF6B93C6F02FAF # gpg: issuer "cohuck@redhat.com" # gpg: Good signature from "Cornelia Huck <conny@cornelia-huck.de>" [unknown] # gpg: aka "Cornelia Huck <huckc@linux.vnet.ibm.com>" [full] # gpg: aka "Cornelia Huck <cornelia.huck@de.ibm.com>" [full] # gpg: aka "Cornelia Huck <cohuck@kernel.org>" [unknown] # gpg: aka "Cornelia Huck <cohuck@redhat.com>" [unknown] # Primary key fingerprint: C3D0 D66D C362 4FF6 A8C0 18CE DECF 6B93 C6F0 2FAF * remotes/cohuck/tags/s390x-20201106: s390x: fix build for --without-default-devices target/s390x: fix execution with icount pc-bios/s390: update s390-ccw bios binaries s390-bios: Skip writing iplb location to low core for ccw ipl Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
3493c36f03
|
@ -27,7 +27,7 @@ s390x_ss.add(when: 'CONFIG_KVM', if_true: files(
|
|||
))
|
||||
s390x_ss.add(when: 'CONFIG_S390_CCW_VIRTIO', if_true: files('s390-virtio-ccw.c'))
|
||||
s390x_ss.add(when: 'CONFIG_TERMINAL3270', if_true: files('3270-ccw.c'))
|
||||
s390x_ss.add(when: 'CONFIG_LINUX', if_true: files('s390-pci-vfio.c'))
|
||||
s390x_ss.add(when: 'CONFIG_VFIO', if_true: files('s390-pci-vfio.c'))
|
||||
|
||||
virtio_ss = ss.source_set()
|
||||
virtio_ss.add(files('virtio-ccw.c'))
|
||||
|
|
|
@ -13,8 +13,9 @@
|
|||
#define HW_S390_PCI_VFIO_H
|
||||
|
||||
#include "hw/s390x/s390-pci-bus.h"
|
||||
#include CONFIG_DEVICES
|
||||
|
||||
#ifdef CONFIG_LINUX
|
||||
#ifdef CONFIG_VFIO
|
||||
bool s390_pci_update_dma_avail(int fd, unsigned int *avail);
|
||||
S390PCIDMACount *s390_pci_start_dma_count(S390pciState *s,
|
||||
S390PCIBusDevice *pbdev);
|
||||
|
|
Binary file not shown.
|
@ -43,7 +43,9 @@ void write_subsystem_identification(void)
|
|||
|
||||
void write_iplb_location(void)
|
||||
{
|
||||
if (cutype == CU_TYPE_VIRTIO && virtio_get_device_type() != VIRTIO_ID_NET) {
|
||||
lowcore->ptr_iplb = ptr2u32(&iplb);
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int get_loadparm_index(void)
|
||||
|
|
Binary file not shown.
|
@ -379,7 +379,7 @@
|
|||
/* EXTRACT CPU ATTRIBUTE */
|
||||
C(0xeb4c, ECAG, RSY_a, GIE, 0, a2, r1, 0, ecag, 0)
|
||||
/* EXTRACT CPU TIME */
|
||||
C(0xc801, ECTG, SSF, ECT, 0, 0, 0, 0, ectg, 0)
|
||||
F(0xc801, ECTG, SSF, ECT, 0, 0, 0, 0, ectg, 0, IF_IO)
|
||||
/* EXTRACT FPC */
|
||||
F(0xb38c, EFPC, RRE, Z, 0, 0, new, r1_32, efpc, 0, IF_BFP)
|
||||
/* EXTRACT PSW */
|
||||
|
@ -855,10 +855,10 @@
|
|||
C(0xe32f, STRVG, RXY_a, Z, la2, r1_o, new, m1_64, rev64, 0)
|
||||
|
||||
/* STORE CLOCK */
|
||||
C(0xb205, STCK, S, Z, la2, 0, new, m1_64, stck, 0)
|
||||
C(0xb27c, STCKF, S, SCF, la2, 0, new, m1_64, stck, 0)
|
||||
F(0xb205, STCK, S, Z, la2, 0, new, m1_64, stck, 0, IF_IO)
|
||||
F(0xb27c, STCKF, S, SCF, la2, 0, new, m1_64, stck, 0, IF_IO)
|
||||
/* STORE CLOCK EXTENDED */
|
||||
C(0xb278, STCKE, S, Z, 0, a2, 0, 0, stcke, 0)
|
||||
F(0xb278, STCKE, S, Z, 0, a2, 0, 0, stcke, 0, IF_IO)
|
||||
|
||||
/* STORE FACILITY LIST EXTENDED */
|
||||
C(0xb2b0, STFLE, S, SFLE, 0, a2, 0, 0, stfle, 0)
|
||||
|
@ -1269,7 +1269,7 @@
|
|||
E(0xb250, CSP, RRE, Z, r1_32u, ra2, r1_P, 0, csp, 0, MO_TEUL, IF_PRIV)
|
||||
E(0xb98a, CSPG, RRE, DAT_ENH, r1_o, ra2, r1_P, 0, csp, 0, MO_TEQ, IF_PRIV)
|
||||
/* DIAGNOSE (KVM hypercall) */
|
||||
F(0x8300, DIAG, RSI, Z, 0, 0, 0, 0, diag, 0, IF_PRIV)
|
||||
F(0x8300, DIAG, RSI, Z, 0, 0, 0, 0, diag, 0, IF_PRIV | IF_IO)
|
||||
/* INSERT STORAGE KEY EXTENDED */
|
||||
F(0xb229, ISKE, RRE, Z, 0, r2_o, new, r1_8, iske, 0, IF_PRIV)
|
||||
/* INVALIDATE DAT TABLE ENTRY */
|
||||
|
@ -1301,17 +1301,17 @@
|
|||
/* RESET REFERENCE BIT EXTENDED */
|
||||
F(0xb22a, RRBE, RRE, Z, 0, r2_o, 0, 0, rrbe, 0, IF_PRIV)
|
||||
/* SERVICE CALL LOGICAL PROCESSOR (PV hypercall) */
|
||||
F(0xb220, SERVC, RRE, Z, r1_o, r2_o, 0, 0, servc, 0, IF_PRIV)
|
||||
F(0xb220, SERVC, RRE, Z, r1_o, r2_o, 0, 0, servc, 0, IF_PRIV | IF_IO)
|
||||
/* SET ADDRESS SPACE CONTROL FAST */
|
||||
F(0xb279, SACF, S, Z, 0, a2, 0, 0, sacf, 0, IF_PRIV)
|
||||
/* SET CLOCK */
|
||||
F(0xb204, SCK, S, Z, la2, 0, 0, 0, sck, 0, IF_PRIV)
|
||||
F(0xb204, SCK, S, Z, la2, 0, 0, 0, sck, 0, IF_PRIV | IF_IO)
|
||||
/* SET CLOCK COMPARATOR */
|
||||
F(0xb206, SCKC, S, Z, 0, m2_64a, 0, 0, sckc, 0, IF_PRIV)
|
||||
F(0xb206, SCKC, S, Z, 0, m2_64a, 0, 0, sckc, 0, IF_PRIV | IF_IO)
|
||||
/* SET CLOCK PROGRAMMABLE FIELD */
|
||||
F(0x0107, SCKPF, E, Z, 0, 0, 0, 0, sckpf, 0, IF_PRIV)
|
||||
/* SET CPU TIMER */
|
||||
F(0xb208, SPT, S, Z, 0, m2_64a, 0, 0, spt, 0, IF_PRIV)
|
||||
F(0xb208, SPT, S, Z, 0, m2_64a, 0, 0, spt, 0, IF_PRIV | IF_IO)
|
||||
/* SET PREFIX */
|
||||
F(0xb210, SPX, S, Z, 0, m2_32ua, 0, 0, spx, 0, IF_PRIV)
|
||||
/* SET PSW KEY FROM ADDRESS */
|
||||
|
@ -1321,7 +1321,7 @@
|
|||
/* SET SYSTEM MASK */
|
||||
F(0x8000, SSM, S, Z, 0, m2_8u, 0, 0, ssm, 0, IF_PRIV)
|
||||
/* SIGNAL PROCESSOR */
|
||||
F(0xae00, SIGP, RS_a, Z, 0, a2, 0, 0, sigp, 0, IF_PRIV)
|
||||
F(0xae00, SIGP, RS_a, Z, 0, a2, 0, 0, sigp, 0, IF_PRIV | IF_IO)
|
||||
/* STORE CLOCK COMPARATOR */
|
||||
F(0xb207, STCKC, S, Z, la2, 0, new, m1_64a, stckc, 0, IF_PRIV)
|
||||
/* STORE CONTROL */
|
||||
|
@ -1332,7 +1332,7 @@
|
|||
/* STORE CPU ID */
|
||||
F(0xb202, STIDP, S, Z, la2, 0, new, m1_64a, stidp, 0, IF_PRIV)
|
||||
/* STORE CPU TIMER */
|
||||
F(0xb209, STPT, S, Z, la2, 0, new, m1_64a, stpt, 0, IF_PRIV)
|
||||
F(0xb209, STPT, S, Z, la2, 0, new, m1_64a, stpt, 0, IF_PRIV | IF_IO)
|
||||
/* STORE FACILITY LIST */
|
||||
F(0xb2b1, STFL, S, Z, 0, 0, 0, 0, stfl, 0, IF_PRIV)
|
||||
/* STORE PREFIX */
|
||||
|
@ -1352,35 +1352,35 @@
|
|||
C(0xe501, TPROT, SSE, Z, la1, a2, 0, 0, tprot, 0)
|
||||
|
||||
/* CCW I/O Instructions */
|
||||
F(0xb276, XSCH, S, Z, 0, 0, 0, 0, xsch, 0, IF_PRIV)
|
||||
F(0xb230, CSCH, S, Z, 0, 0, 0, 0, csch, 0, IF_PRIV)
|
||||
F(0xb231, HSCH, S, Z, 0, 0, 0, 0, hsch, 0, IF_PRIV)
|
||||
F(0xb232, MSCH, S, Z, 0, insn, 0, 0, msch, 0, IF_PRIV)
|
||||
F(0xb23b, RCHP, S, Z, 0, 0, 0, 0, rchp, 0, IF_PRIV)
|
||||
F(0xb238, RSCH, S, Z, 0, 0, 0, 0, rsch, 0, IF_PRIV)
|
||||
F(0xb237, SAL, S, Z, 0, 0, 0, 0, sal, 0, IF_PRIV)
|
||||
F(0xb23c, SCHM, S, Z, 0, insn, 0, 0, schm, 0, IF_PRIV)
|
||||
F(0xb274, SIGA, S, Z, 0, 0, 0, 0, siga, 0, IF_PRIV)
|
||||
F(0xb23a, STCPS, S, Z, 0, 0, 0, 0, stcps, 0, IF_PRIV)
|
||||
F(0xb233, SSCH, S, Z, 0, insn, 0, 0, ssch, 0, IF_PRIV)
|
||||
F(0xb239, STCRW, S, Z, 0, insn, 0, 0, stcrw, 0, IF_PRIV)
|
||||
F(0xb234, STSCH, S, Z, 0, insn, 0, 0, stsch, 0, IF_PRIV)
|
||||
F(0xb236, TPI , S, Z, la2, 0, 0, 0, tpi, 0, IF_PRIV)
|
||||
F(0xb235, TSCH, S, Z, 0, insn, 0, 0, tsch, 0, IF_PRIV)
|
||||
F(0xb276, XSCH, S, Z, 0, 0, 0, 0, xsch, 0, IF_PRIV | IF_IO)
|
||||
F(0xb230, CSCH, S, Z, 0, 0, 0, 0, csch, 0, IF_PRIV | IF_IO)
|
||||
F(0xb231, HSCH, S, Z, 0, 0, 0, 0, hsch, 0, IF_PRIV | IF_IO)
|
||||
F(0xb232, MSCH, S, Z, 0, insn, 0, 0, msch, 0, IF_PRIV | IF_IO)
|
||||
F(0xb23b, RCHP, S, Z, 0, 0, 0, 0, rchp, 0, IF_PRIV | IF_IO)
|
||||
F(0xb238, RSCH, S, Z, 0, 0, 0, 0, rsch, 0, IF_PRIV | IF_IO)
|
||||
F(0xb237, SAL, S, Z, 0, 0, 0, 0, sal, 0, IF_PRIV | IF_IO)
|
||||
F(0xb23c, SCHM, S, Z, 0, insn, 0, 0, schm, 0, IF_PRIV | IF_IO)
|
||||
F(0xb274, SIGA, S, Z, 0, 0, 0, 0, siga, 0, IF_PRIV | IF_IO)
|
||||
F(0xb23a, STCPS, S, Z, 0, 0, 0, 0, stcps, 0, IF_PRIV | IF_IO)
|
||||
F(0xb233, SSCH, S, Z, 0, insn, 0, 0, ssch, 0, IF_PRIV | IF_IO)
|
||||
F(0xb239, STCRW, S, Z, 0, insn, 0, 0, stcrw, 0, IF_PRIV | IF_IO)
|
||||
F(0xb234, STSCH, S, Z, 0, insn, 0, 0, stsch, 0, IF_PRIV | IF_IO)
|
||||
F(0xb236, TPI , S, Z, la2, 0, 0, 0, tpi, 0, IF_PRIV | IF_IO)
|
||||
F(0xb235, TSCH, S, Z, 0, insn, 0, 0, tsch, 0, IF_PRIV | IF_IO)
|
||||
/* ??? Not listed in PoO ninth edition, but there's a linux driver that
|
||||
uses it: "A CHSC subchannel is usually present on LPAR only." */
|
||||
F(0xb25f, CHSC, RRE, Z, 0, insn, 0, 0, chsc, 0, IF_PRIV)
|
||||
F(0xb25f, CHSC, RRE, Z, 0, insn, 0, 0, chsc, 0, IF_PRIV | IF_IO)
|
||||
|
||||
/* zPCI Instructions */
|
||||
/* None of these instructions are documented in the PoP, so this is all
|
||||
based upon target/s390x/kvm.c and Linux code and likely incomplete */
|
||||
F(0xebd0, PCISTB, RSY_a, PCI, la2, 0, 0, 0, pcistb, 0, IF_PRIV)
|
||||
F(0xebd1, SIC, RSY_a, AIS, r1, r3, 0, 0, sic, 0, IF_PRIV)
|
||||
F(0xb9a0, CLP, RRF_c, PCI, 0, 0, 0, 0, clp, 0, IF_PRIV)
|
||||
F(0xb9d0, PCISTG, RRE, PCI, 0, 0, 0, 0, pcistg, 0, IF_PRIV)
|
||||
F(0xb9d2, PCILG, RRE, PCI, 0, 0, 0, 0, pcilg, 0, IF_PRIV)
|
||||
F(0xb9d3, RPCIT, RRE, PCI, 0, 0, 0, 0, rpcit, 0, IF_PRIV)
|
||||
F(0xe3d0, MPCIFC, RXY_a, PCI, la2, 0, 0, 0, mpcifc, 0, IF_PRIV)
|
||||
F(0xe3d4, STPCIFC, RXY_a, PCI, la2, 0, 0, 0, stpcifc, 0, IF_PRIV)
|
||||
F(0xebd0, PCISTB, RSY_a, PCI, la2, 0, 0, 0, pcistb, 0, IF_PRIV | IF_IO)
|
||||
F(0xebd1, SIC, RSY_a, AIS, r1, r3, 0, 0, sic, 0, IF_PRIV | IF_IO)
|
||||
F(0xb9a0, CLP, RRF_c, PCI, 0, 0, 0, 0, clp, 0, IF_PRIV | IF_IO)
|
||||
F(0xb9d0, PCISTG, RRE, PCI, 0, 0, 0, 0, pcistg, 0, IF_PRIV | IF_IO)
|
||||
F(0xb9d2, PCILG, RRE, PCI, 0, 0, 0, 0, pcilg, 0, IF_PRIV | IF_IO)
|
||||
F(0xb9d3, RPCIT, RRE, PCI, 0, 0, 0, 0, rpcit, 0, IF_PRIV | IF_IO)
|
||||
F(0xe3d0, MPCIFC, RXY_a, PCI, la2, 0, 0, 0, mpcifc, 0, IF_PRIV | IF_IO)
|
||||
F(0xe3d4, STPCIFC, RXY_a, PCI, la2, 0, 0, 0, stpcifc, 0, IF_PRIV | IF_IO)
|
||||
|
||||
#endif /* CONFIG_USER_ONLY */
|
||||
|
|
|
@ -1214,6 +1214,7 @@ typedef struct {
|
|||
#define IF_DFP 0x0010 /* decimal floating point instruction */
|
||||
#define IF_PRIV 0x0020 /* privileged instruction */
|
||||
#define IF_VEC 0x0040 /* vector instruction */
|
||||
#define IF_IO 0x0080 /* input/output instruction */
|
||||
|
||||
struct DisasInsn {
|
||||
unsigned opc:16;
|
||||
|
@ -6369,6 +6370,7 @@ static DisasJumpType translate_one(CPUS390XState *env, DisasContext *s)
|
|||
const DisasInsn *insn;
|
||||
DisasJumpType ret = DISAS_NEXT;
|
||||
DisasOps o = {};
|
||||
bool icount = false;
|
||||
|
||||
/* Search for the insn in the table. */
|
||||
insn = extract_insn(env, s);
|
||||
|
@ -6435,6 +6437,14 @@ static DisasJumpType translate_one(CPUS390XState *env, DisasContext *s)
|
|||
return DISAS_NORETURN;
|
||||
}
|
||||
}
|
||||
|
||||
/* input/output is the special case for icount mode */
|
||||
if (unlikely(insn->flags & IF_IO)) {
|
||||
icount = tb_cflags(s->base.tb) & CF_USE_ICOUNT;
|
||||
if (icount) {
|
||||
gen_io_start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Check for insn specification exceptions. */
|
||||
|
@ -6488,6 +6498,11 @@ static DisasJumpType translate_one(CPUS390XState *env, DisasContext *s)
|
|||
tcg_temp_free_i64(o.addr1);
|
||||
}
|
||||
|
||||
/* io should be the last instruction in tb when icount is enabled */
|
||||
if (unlikely(icount && ret == DISAS_NEXT)) {
|
||||
ret = DISAS_PC_STALE;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
if (s->base.tb->flags & FLAG_MASK_PER) {
|
||||
/* An exception might be triggered, save PSW if not already done. */
|
||||
|
|
Loading…
Reference in a new issue