From 808e668bbc8db6faa9ffaa802628711f36fe659b Mon Sep 17 00:00:00 2001 From: Dong Jia Shi Date: Thu, 3 Aug 2017 02:35:26 +0200 Subject: s390x/css: use macro for event-information pending error recover code Let's use a macro for the ERC (error recover code) when generating a Channel Subsystem Event-information pending CRW (channel report word). While we are at it, let's also add all other ERCs. Signed-off-by: Dong Jia Shi Reviewed-by: Halil Pasic Message-Id: <20170803003527.86979-2-bjsdjshi@linux.vnet.ibm.com> Signed-off-by: Cornelia Huck --- include/hw/s390x/ioinst.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'include') diff --git a/include/hw/s390x/ioinst.h b/include/hw/s390x/ioinst.h index 92d15655e4..5f2db6949d 100644 --- a/include/hw/s390x/ioinst.h +++ b/include/hw/s390x/ioinst.h @@ -201,8 +201,16 @@ typedef struct CRW { #define CRW_FLAGS_MASK_A 0x0080 #define CRW_FLAGS_MASK_ERC 0x003f -#define CRW_ERC_INIT 0x02 -#define CRW_ERC_IPI 0x04 +#define CRW_ERC_EVENT 0x00 /* event information pending */ +#define CRW_ERC_AVAIL 0x01 /* available */ +#define CRW_ERC_INIT 0x02 /* initialized */ +#define CRW_ERC_TERROR 0x03 /* temporary error */ +#define CRW_ERC_IPI 0x04 /* installed parm initialized */ +#define CRW_ERC_TERM 0x05 /* terminal */ +#define CRW_ERC_PERRN 0x06 /* perm. error, facility not init */ +#define CRW_ERC_PERRI 0x07 /* perm. error, facility init */ +#define CRW_ERC_PMOD 0x08 /* installed parameters modified */ +#define CRW_ERC_IPR 0x0A /* installed parameters restored */ #define CRW_RSC_SUBCH 0x3 #define CRW_RSC_CHP 0x4 -- cgit v1.2.3-55-g7522 From 5c8d6f008c0555b54cf10550fa86199a2cfabbca Mon Sep 17 00:00:00 2001 From: Dong Jia Shi Date: Thu, 3 Aug 2017 02:35:27 +0200 Subject: s390x/css: generate solicited crw for rchp completion signaling A successful completion of rchp should signal a solicited channel path initialized CRW (channel report word), while the current implementation always generates an un-solicited one. Let's fix this. Reported-by: Halil Pasic Signed-off-by: Dong Jia Shi Reviewed-by: Halil Pasic Message-Id: <20170803003527.86979-3-bjsdjshi@linux.vnet.ibm.com> Signed-off-by: Cornelia Huck --- hw/s390x/css.c | 16 ++++++++++------ include/hw/s390x/css.h | 3 ++- 2 files changed, 12 insertions(+), 7 deletions(-) (limited to 'include') diff --git a/hw/s390x/css.c b/hw/s390x/css.c index 0be4eb093d..901dc6a0f3 100644 --- a/hw/s390x/css.c +++ b/hw/s390x/css.c @@ -1750,10 +1750,10 @@ int css_do_rchp(uint8_t cssid, uint8_t chpid) } /* We don't really use a channel path, so we're done here. */ - css_queue_crw(CRW_RSC_CHP, CRW_ERC_INIT, + css_queue_crw(CRW_RSC_CHP, CRW_ERC_INIT, 1, channel_subsys.max_cssid > 0 ? 1 : 0, chpid); if (channel_subsys.max_cssid > 0) { - css_queue_crw(CRW_RSC_CHP, CRW_ERC_INIT, 0, real_cssid << 8); + css_queue_crw(CRW_RSC_CHP, CRW_ERC_INIT, 1, 0, real_cssid << 8); } return 0; } @@ -2033,7 +2033,8 @@ void css_subch_assign(uint8_t cssid, uint8_t ssid, uint16_t schid, } } -void css_queue_crw(uint8_t rsc, uint8_t erc, int chain, uint16_t rsid) +void css_queue_crw(uint8_t rsc, uint8_t erc, int solicited, + int chain, uint16_t rsid) { CrwContainer *crw_cont; @@ -2045,6 +2046,9 @@ void css_queue_crw(uint8_t rsc, uint8_t erc, int chain, uint16_t rsid) return; } crw_cont->crw.flags = (rsc << 8) | erc; + if (solicited) { + crw_cont->crw.flags |= CRW_FLAGS_MASK_S; + } if (chain) { crw_cont->crw.flags |= CRW_FLAGS_MASK_C; } @@ -2091,9 +2095,9 @@ void css_generate_sch_crws(uint8_t cssid, uint8_t ssid, uint16_t schid, } chain_crw = (channel_subsys.max_ssid > 0) || (channel_subsys.max_cssid > 0); - css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, chain_crw ? 1 : 0, schid); + css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, 0, chain_crw ? 1 : 0, schid); if (chain_crw) { - css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, 0, + css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, 0, 0, (guest_cssid << 8) | (ssid << 4)); } /* RW_ERC_IPI --> clear pending interrupts */ @@ -2108,7 +2112,7 @@ void css_generate_chp_crws(uint8_t cssid, uint8_t chpid) void css_generate_css_crws(uint8_t cssid) { if (!channel_subsys.sei_pending) { - css_queue_crw(CRW_RSC_CSS, CRW_ERC_EVENT, 0, cssid); + css_queue_crw(CRW_RSC_CSS, CRW_ERC_EVENT, 0, 0, cssid); } channel_subsys.sei_pending = true; } diff --git a/include/hw/s390x/css.h b/include/hw/s390x/css.h index 5c5fe6b202..5b017e1fc3 100644 --- a/include/hw/s390x/css.h +++ b/include/hw/s390x/css.h @@ -150,7 +150,8 @@ void copy_scsw_to_guest(SCSW *dest, const SCSW *src); void css_inject_io_interrupt(SubchDev *sch); void css_reset(void); void css_reset_sch(SubchDev *sch); -void css_queue_crw(uint8_t rsc, uint8_t erc, int chain, uint16_t rsid); +void css_queue_crw(uint8_t rsc, uint8_t erc, int solicited, + int chain, uint16_t rsid); void css_generate_sch_crws(uint8_t cssid, uint8_t ssid, uint16_t schid, int hotplugged, int add); void css_generate_chp_crws(uint8_t cssid, uint8_t chpid); -- cgit v1.2.3-55-g7522 From 70d8d9a0c9bc599d8ae99dd65ff8535adb2acdfc Mon Sep 17 00:00:00 2001 From: Cornelia Huck Date: Thu, 10 Aug 2017 14:07:31 +0200 Subject: s390x: introduce 2.11 compat machine Reviewed-by: David Hildenbrand Reviewed-by: Halil Pasic Signed-off-by: Cornelia Huck --- hw/s390x/s390-virtio-ccw.c | 17 ++++++++++++++++- include/hw/compat.h | 3 +++ 2 files changed, 19 insertions(+), 1 deletion(-) (limited to 'include') diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c index 1c7af39ce6..d3d67b8d77 100644 --- a/hw/s390x/s390-virtio-ccw.c +++ b/hw/s390x/s390-virtio-ccw.c @@ -432,6 +432,9 @@ bool css_migration_enabled(void) } \ type_init(ccw_machine_register_##suffix) +#define CCW_COMPAT_2_10 \ + HW_COMPAT_2_10 + #define CCW_COMPAT_2_9 \ HW_COMPAT_2_9 \ {\ @@ -506,8 +509,18 @@ bool css_migration_enabled(void) .value = "0",\ }, +static void ccw_machine_2_11_instance_options(MachineState *machine) +{ +} + +static void ccw_machine_2_11_class_options(MachineClass *mc) +{ +} +DEFINE_CCW_MACHINE(2_11, "2.11", true); + static void ccw_machine_2_10_instance_options(MachineState *machine) { + ccw_machine_2_11_instance_options(machine); if (css_migration_enabled()) { css_register_vmstate(); } @@ -515,8 +528,10 @@ static void ccw_machine_2_10_instance_options(MachineState *machine) static void ccw_machine_2_10_class_options(MachineClass *mc) { + ccw_machine_2_11_class_options(mc); + SET_MACHINE_COMPAT(mc, CCW_COMPAT_2_10); } -DEFINE_CCW_MACHINE(2_10, "2.10", true); +DEFINE_CCW_MACHINE(2_10, "2.10", false); static void ccw_machine_2_9_instance_options(MachineState *machine) { diff --git a/include/hw/compat.h b/include/hw/compat.h index 08f36004da..3e101f8f67 100644 --- a/include/hw/compat.h +++ b/include/hw/compat.h @@ -1,6 +1,9 @@ #ifndef HW_COMPAT_H #define HW_COMPAT_H +#define HW_COMPAT_2_10 \ + /* empty */ + #define HW_COMPAT_2_9 \ {\ .driver = "pci-bridge",\ -- cgit v1.2.3-55-g7522 From 88c725c78e87eecb061f882177c7a6a2ac1059ad Mon Sep 17 00:00:00 2001 From: Cornelia Huck Date: Fri, 7 Jul 2017 11:45:26 +0200 Subject: kvm: remove hard dependency on pci The msi routing code in kvm calls some pci functions: provide some stubs to enable builds without pci. Also, to make this more obvious, guard them via a pci_available boolean (which also can be reused in other places). Fixes: e1d4fb2de ("kvm-irqchip: x86: add msi route notify fn") Fixes: 767a554a0 ("kvm-all: Pass requester ID to MSI routing functions") Reviewed-by: Pierre Morel Reviewed-by: Thomas Huth Acked-by: Christian Borntraeger Signed-off-by: Cornelia Huck --- accel/kvm/kvm-all.c | 6 +++--- hw/pci/pci-stub.c | 14 ++++++++++++++ hw/pci/pci.c | 2 ++ include/hw/pci/pci.h | 2 ++ 4 files changed, 21 insertions(+), 3 deletions(-) (limited to 'include') diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index 46ce479dc3..f85553a851 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -1248,7 +1248,7 @@ int kvm_irqchip_add_msi_route(KVMState *s, int vector, PCIDevice *dev) int virq; MSIMessage msg = {0, 0}; - if (dev) { + if (pci_available && dev) { msg = pci_get_msi_message(dev, vector); } @@ -1271,7 +1271,7 @@ int kvm_irqchip_add_msi_route(KVMState *s, int vector, PCIDevice *dev) kroute.u.msi.address_lo = (uint32_t)msg.address; kroute.u.msi.address_hi = msg.address >> 32; kroute.u.msi.data = le32_to_cpu(msg.data); - if (kvm_msi_devid_required()) { + if (pci_available && kvm_msi_devid_required()) { kroute.flags = KVM_MSI_VALID_DEVID; kroute.u.msi.devid = pci_requester_id(dev); } @@ -1309,7 +1309,7 @@ int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg, kroute.u.msi.address_lo = (uint32_t)msg.address; kroute.u.msi.address_hi = msg.address >> 32; kroute.u.msi.data = le32_to_cpu(msg.data); - if (kvm_msi_devid_required()) { + if (pci_available && kvm_msi_devid_required()) { kroute.flags = KVM_MSI_VALID_DEVID; kroute.u.msi.devid = pci_requester_id(dev); } diff --git a/hw/pci/pci-stub.c b/hw/pci/pci-stub.c index ecad664946..d5ce00748e 100644 --- a/hw/pci/pci-stub.c +++ b/hw/pci/pci-stub.c @@ -27,6 +27,7 @@ #include "hw/pci/msi.h" bool msi_nonbroken; +bool pci_available; PciInfoList *qmp_query_pci(Error **errp) { @@ -38,3 +39,16 @@ void hmp_pcie_aer_inject_error(Monitor *mon, const QDict *qdict) { monitor_printf(mon, "PCI devices not supported\n"); } + +/* kvm-all wants this */ +MSIMessage pci_get_msi_message(PCIDevice *dev, int vector) +{ + g_assert(false); + return (MSIMessage){}; +} + +uint16_t pci_requester_id(PCIDevice *dev) +{ + g_assert(false); + return 0; +} diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 258fbe51e2..26f346db2c 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -49,6 +49,8 @@ # define PCI_DPRINTF(format, ...) do { } while (0) #endif +bool pci_available = true; + static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent); static char *pcibus_get_dev_path(DeviceState *dev); static char *pcibus_get_fw_dev_path(DeviceState *dev); diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h index e598b095eb..8bb6449dd7 100644 --- a/include/hw/pci/pci.h +++ b/include/hw/pci/pci.h @@ -10,6 +10,8 @@ #include "hw/pci/pcie.h" +extern bool pci_available; + /* PCI bus */ #define PCI_DEVFN(slot, func) ((((slot) & 0x1f) << 3) | ((func) & 0x07)) -- cgit v1.2.3-55-g7522 From 5838d65770aea0bc7d4f26bc4e5efbd0e5aeaa7a Mon Sep 17 00:00:00 2001 From: Cornelia Huck Date: Mon, 17 Jul 2017 10:34:42 +0200 Subject: s390x/pci: add stubs Some non-pci code calls into zpci code. Provide some stubs for builds without pci. Reviewed-by: Thomas Huth Acked-by: Christian Borntraeger Acked-by: Halil Pasic Signed-off-by: Cornelia Huck --- hw/s390x/Makefile.objs | 3 +- hw/s390x/s390-pci-stub.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++ include/hw/s390x/sclp.h | 1 + 3 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 hw/s390x/s390-pci-stub.c (limited to 'include') diff --git a/hw/s390x/Makefile.objs b/hw/s390x/Makefile.objs index b2aade2466..7ee19d3abc 100644 --- a/hw/s390x/Makefile.objs +++ b/hw/s390x/Makefile.objs @@ -11,7 +11,8 @@ obj-y += 3270-ccw.o obj-y += virtio-ccw.o obj-y += css-bridge.o obj-y += ccw-device.o -obj-y += s390-pci-bus.o s390-pci-inst.o +obj-$(CONFIG_PCI) += s390-pci-bus.o s390-pci-inst.o +obj-$(call lnot,$(CONFIG_PCI)) += s390-pci-stub.o obj-y += s390-skeys.o obj-y += s390-stattrib.o obj-$(CONFIG_KVM) += s390-skeys-kvm.o diff --git a/hw/s390x/s390-pci-stub.c b/hw/s390x/s390-pci-stub.c new file mode 100644 index 0000000000..48f8b4e8a3 --- /dev/null +++ b/hw/s390x/s390-pci-stub.c @@ -0,0 +1,76 @@ +/* stubs for non-pci builds */ + +#include "qemu/osdep.h" +#include "qemu-common.h" +#include "cpu.h" +#include "s390-pci-inst.h" +#include "s390-pci-bus.h" + +/* target/s390x/ioinst.c */ +int chsc_sei_nt2_get_event(void *res) +{ + return 1; +} + +int chsc_sei_nt2_have_event(void) +{ + return 0; +} + +/* hw/s390x/sclp.c */ +void s390_pci_sclp_configure(SCCB *sccb) +{ + sccb->h.response_code = cpu_to_be16(SCLP_RC_ADAPTER_TYPE_NOT_RECOGNIZED); +} + +void s390_pci_sclp_deconfigure(SCCB *sccb) +{ + sccb->h.response_code = cpu_to_be16(SCLP_RC_ADAPTER_TYPE_NOT_RECOGNIZED); +} + +/* target/s390x/kvm.c */ +int clp_service_call(S390CPU *cpu, uint8_t r2) +{ + return -1; +} + +int pcilg_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2) +{ + return -1; +} + +int pcistg_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2) +{ + return -1; +} + +int stpcifc_service_call(S390CPU *cpu, uint8_t r1, uint64_t fiba, uint8_t ar) +{ + return -1; +} + +int rpcit_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2) +{ + return -1; +} + +int pcistb_service_call(S390CPU *cpu, uint8_t r1, uint8_t r3, uint64_t gaddr, + uint8_t ar) +{ + return -1; +} + +int mpcifc_service_call(S390CPU *cpu, uint8_t r1, uint64_t fiba, uint8_t ar) +{ + return -1; +} + +S390pciState *s390_get_phb(void) +{ + return NULL; +} + +S390PCIBusDevice *s390_pci_find_dev_by_idx(S390pciState *s, uint32_t idx) +{ + return NULL; +} diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h index e71d526605..fe54442ecd 100644 --- a/include/hw/s390x/sclp.h +++ b/include/hw/s390x/sclp.h @@ -59,6 +59,7 @@ #define SCLP_RC_INSUFFICIENT_SCCB_LENGTH 0x0300 #define SCLP_RC_STANDBY_READ_COMPLETION 0x0410 #define SCLP_RC_ADAPTER_IN_RESERVED_STATE 0x05f0 +#define SCLP_RC_ADAPTER_TYPE_NOT_RECOGNIZED 0x06f0 #define SCLP_RC_ADAPTER_ID_NOT_RECOGNIZED 0x09f0 #define SCLP_RC_INVALID_FUNCTION 0x40f0 #define SCLP_RC_NO_EVENT_BUFFERS_STORED 0x60f0 -- cgit v1.2.3-55-g7522 From 80b7a265362c870f95fb5ca1f7e7a02c0fa0db3e Mon Sep 17 00:00:00 2001 From: Cornelia Huck Date: Thu, 6 Jul 2017 17:13:14 +0200 Subject: s390x/sclp: properly guard pci-specific functions If we do not provide zpci, pci reconfiguration via sclp is not available either. I/O adapter configuration, however, should always be present. Rename the values that refer to I/O adapter configuration (instead of only pci) to make things clearer. Move length checking of the sccb for I/O adapter configuration into the common sclp code (out of the pci code). This also fixes an issue that the pci code would refer to a field in the sccb before checking whether it was actually long enough. Check for the adapter type in the sccb and return unrecognized adapter type if the guest tries to issue I/O adapter configure/deconfigure for a type other than pci or for pci if the zpci facility is not provided. Reviewed-by: Pierre Morel Reviewed-by: Halil Pasic Acked-by: Christian Borntraeger Signed-off-by: Cornelia Huck --- hw/s390x/s390-pci-bus.c | 14 ++------------ hw/s390x/s390-pci-bus.h | 8 -------- hw/s390x/sclp.c | 39 ++++++++++++++++++++++++++++++++++----- include/hw/s390x/sclp.h | 16 ++++++++++++---- 4 files changed, 48 insertions(+), 29 deletions(-) (limited to 'include') diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c index c57f6ebae0..0a31a4ae88 100644 --- a/hw/s390x/s390-pci-bus.c +++ b/hw/s390x/s390-pci-bus.c @@ -122,16 +122,11 @@ S390PCIBusDevice *s390_pci_find_dev_by_fid(S390pciState *s, uint32_t fid) void s390_pci_sclp_configure(SCCB *sccb) { - PciCfgSccb *psccb = (PciCfgSccb *)sccb; + IoaCfgSccb *psccb = (IoaCfgSccb *)sccb; S390PCIBusDevice *pbdev = s390_pci_find_dev_by_fid(s390_get_phb(), be32_to_cpu(psccb->aid)); uint16_t rc; - if (be16_to_cpu(sccb->h.length) < 16) { - rc = SCLP_RC_INSUFFICIENT_SCCB_LENGTH; - goto out; - } - if (!pbdev) { DPRINTF("sclp config no dev found\n"); rc = SCLP_RC_ADAPTER_ID_NOT_RECOGNIZED; @@ -155,16 +150,11 @@ out: void s390_pci_sclp_deconfigure(SCCB *sccb) { - PciCfgSccb *psccb = (PciCfgSccb *)sccb; + IoaCfgSccb *psccb = (IoaCfgSccb *)sccb; S390PCIBusDevice *pbdev = s390_pci_find_dev_by_fid(s390_get_phb(), be32_to_cpu(psccb->aid)); uint16_t rc; - if (be16_to_cpu(sccb->h.length) < 16) { - rc = SCLP_RC_INSUFFICIENT_SCCB_LENGTH; - goto out; - } - if (!pbdev) { DPRINTF("sclp deconfig no dev found\n"); rc = SCLP_RC_ADAPTER_ID_NOT_RECOGNIZED; diff --git a/hw/s390x/s390-pci-bus.h b/hw/s390x/s390-pci-bus.h index 5df6292509..bd636abc28 100644 --- a/hw/s390x/s390-pci-bus.h +++ b/hw/s390x/s390-pci-bus.h @@ -244,14 +244,6 @@ typedef struct ChscSeiNt2Res { uint8_t ccdf[4016]; } QEMU_PACKED ChscSeiNt2Res; -typedef struct PciCfgSccb { - SCCBHeader header; - uint8_t atype; - uint8_t reserved1; - uint16_t reserved2; - uint32_t aid; -} QEMU_PACKED PciCfgSccb; - typedef struct S390MsixInfo { bool available; uint8_t table_bar; diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c index 9253dbbc64..7ae6a0e37a 100644 --- a/hw/s390x/sclp.c +++ b/hw/s390x/sclp.c @@ -80,7 +80,7 @@ static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb) prepare_cpu_entries(sclp, read_info->entries, cpu_count); read_info->facilities = cpu_to_be64(SCLP_HAS_CPU_INFO | - SCLP_HAS_PCI_RECONFIG); + SCLP_HAS_IOA_RECONFIG); /* Memory Hotplug is only supported for the ccw machine type */ if (mhd) { @@ -354,6 +354,35 @@ static void sclp_read_cpu_info(SCLPDevice *sclp, SCCB *sccb) sccb->h.response_code = cpu_to_be16(SCLP_RC_NORMAL_READ_COMPLETION); } +static void sclp_configure_io_adapter(SCLPDevice *sclp, SCCB *sccb, + bool configure) +{ + int rc; + + if (be16_to_cpu(sccb->h.length) < 16) { + rc = SCLP_RC_INSUFFICIENT_SCCB_LENGTH; + goto out_err; + } + + switch (((IoaCfgSccb *)sccb)->atype) { + case SCLP_RECONFIG_PCI_ATYPE: + if (s390_has_feat(S390_FEAT_ZPCI)) { + if (configure) { + s390_pci_sclp_configure(sccb); + } else { + s390_pci_sclp_deconfigure(sccb); + } + return; + } + /* fallthrough */ + default: + rc = SCLP_RC_ADAPTER_TYPE_NOT_RECOGNIZED; + } + + out_err: + sccb->h.response_code = cpu_to_be16(rc); +} + static void sclp_execute(SCLPDevice *sclp, SCCB *sccb, uint32_t code) { SCLPDeviceClass *sclp_c = SCLP_GET_CLASS(sclp); @@ -384,11 +413,11 @@ static void sclp_execute(SCLPDevice *sclp, SCCB *sccb, uint32_t code) case SCLP_UNASSIGN_STORAGE: sclp_c->unassign_storage(sclp, sccb); break; - case SCLP_CMDW_CONFIGURE_PCI: - s390_pci_sclp_configure(sccb); + case SCLP_CMDW_CONFIGURE_IOA: + sclp_configure_io_adapter(sclp, sccb, true); break; - case SCLP_CMDW_DECONFIGURE_PCI: - s390_pci_sclp_deconfigure(sccb); + case SCLP_CMDW_DECONFIGURE_IOA: + sclp_configure_io_adapter(sclp, sccb, false); break; default: efc->command_handler(ef, sccb, code); diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h index fe54442ecd..a72d096081 100644 --- a/include/hw/s390x/sclp.h +++ b/include/hw/s390x/sclp.h @@ -44,10 +44,10 @@ #define SCLP_CMDW_DECONFIGURE_CPU 0x00100001 /* SCLP PCI codes */ -#define SCLP_HAS_PCI_RECONFIG 0x0000000040000000ULL -#define SCLP_CMDW_CONFIGURE_PCI 0x001a0001 -#define SCLP_CMDW_DECONFIGURE_PCI 0x001b0001 -#define SCLP_RECONFIG_PCI_ATPYE 2 +#define SCLP_HAS_IOA_RECONFIG 0x0000000040000000ULL +#define SCLP_CMDW_CONFIGURE_IOA 0x001a0001 +#define SCLP_CMDW_DECONFIGURE_IOA 0x001b0001 +#define SCLP_RECONFIG_PCI_ATYPE 2 /* SCLP response codes */ #define SCLP_RC_NORMAL_READ_COMPLETION 0x0010 @@ -168,6 +168,14 @@ typedef struct AssignStorage { uint16_t rn; } QEMU_PACKED AssignStorage; +typedef struct IoaCfgSccb { + SCCBHeader header; + uint8_t atype; + uint8_t reserved1; + uint16_t reserved2; + uint32_t aid; +} QEMU_PACKED IoaCfgSccb; + typedef struct SCCB { SCCBHeader h; char data[SCCB_DATA_LEN]; -- cgit v1.2.3-55-g7522 From f16bbb9bbde3285dd40c806b46f80b49dfebfc4a Mon Sep 17 00:00:00 2001 From: David Hildenbrand Date: Fri, 18 Aug 2017 13:43:52 +0200 Subject: s390x/kvm: move KVM declarations and stubs to separate files Let's do it just like the other architectures. Introduce kvm-stub.c for stubs and kvm_s390x.h for the declarations. Change license to GPL2+ and keep copyright notice. As we are dropping the sysemu/kvm.h include from cpu.h, fix up includes. Suggested-by: Thomas Huth Reviewed-by: Richard Henderson Signed-off-by: David Hildenbrand Message-Id: <20170818114353.13455-18-david@redhat.com> Signed-off-by: Cornelia Huck --- hw/intc/s390_flic_kvm.c | 1 + hw/s390x/s390-stattrib-kvm.c | 1 + include/hw/s390x/css.h | 1 + target/s390x/Makefile.objs | 1 + target/s390x/cpu.c | 2 + target/s390x/cpu.h | 119 ------------------------------------------- target/s390x/cpu_models.c | 2 + target/s390x/interrupt.c | 1 + target/s390x/kvm-stub.c | 111 ++++++++++++++++++++++++++++++++++++++++ target/s390x/kvm.c | 1 + target/s390x/kvm_s390x.h | 47 +++++++++++++++++ target/s390x/machine.c | 1 + target/s390x/mmu_helper.c | 1 + 13 files changed, 170 insertions(+), 119 deletions(-) create mode 100644 target/s390x/kvm-stub.c create mode 100644 target/s390x/kvm_s390x.h (limited to 'include') diff --git a/hw/intc/s390_flic_kvm.c b/hw/intc/s390_flic_kvm.c index be3fd00a57..7ead17ac3e 100644 --- a/hw/intc/s390_flic_kvm.c +++ b/hw/intc/s390_flic_kvm.c @@ -13,6 +13,7 @@ #include "qemu/osdep.h" #include "qemu-common.h" #include "cpu.h" +#include "kvm_s390x.h" #include #include "qemu/error-report.h" #include "qapi/error.h" diff --git a/hw/s390x/s390-stattrib-kvm.c b/hw/s390x/s390-stattrib-kvm.c index ff3f89fd2d..ed95d13c68 100644 --- a/hw/s390x/s390-stattrib-kvm.c +++ b/hw/s390x/s390-stattrib-kvm.c @@ -17,6 +17,7 @@ #include "sysemu/kvm.h" #include "exec/ram_addr.h" #include "cpu.h" +#include "kvm_s390x.h" Object *kvm_s390_stattrib_create(void) { diff --git a/include/hw/s390x/css.h b/include/hw/s390x/css.h index 5b017e1fc3..0653d3c9be 100644 --- a/include/hw/s390x/css.h +++ b/include/hw/s390x/css.h @@ -16,6 +16,7 @@ #include "hw/s390x/adapter.h" #include "hw/s390x/s390_flic.h" #include "hw/s390x/ioinst.h" +#include "sysemu/kvm.h" /* Channel subsystem constants. */ #define MAX_DEVNO 65535 diff --git a/target/s390x/Makefile.objs b/target/s390x/Makefile.objs index f42cd1f9cc..9615256d81 100644 --- a/target/s390x/Makefile.objs +++ b/target/s390x/Makefile.objs @@ -3,6 +3,7 @@ obj-$(CONFIG_TCG) += translate.o cc_helper.o excp_helper.o fpu_helper.o obj-$(CONFIG_TCG) += int_helper.o mem_helper.o misc_helper.o obj-$(CONFIG_SOFTMMU) += machine.o ioinst.o arch_dump.o mmu_helper.o diag.o obj-$(CONFIG_KVM) += kvm.o +obj-$(call lnot,$(CONFIG_KVM)) += kvm-stub.o # build and run feature list generator feat-src = $(SRC_PATH)/target/$(TARGET_BASE_ARCH)/ diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c index c538a95850..7267b60d41 100644 --- a/target/s390x/cpu.c +++ b/target/s390x/cpu.c @@ -27,6 +27,8 @@ #include "qapi/error.h" #include "cpu.h" #include "internal.h" +#include "kvm_s390x.h" +#include "sysemu/kvm.h" #include "qemu-common.h" #include "qemu/cutils.h" #include "qemu/timer.h" diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h index 77b29774cc..464db3e556 100644 --- a/target/s390x/cpu.h +++ b/target/s390x/cpu.h @@ -213,8 +213,6 @@ static inline S390CPU *s390_env_get_cpu(CPUS390XState *env) extern const struct VMStateDescription vmstate_s390_cpu; #endif -#include "sysemu/kvm.h" - /* distinguish between 24 bit and 31 bit addressing */ #define HIGH_ORDER_BIT 0x80000000 @@ -407,39 +405,6 @@ int cpu_s390x_signal_handler(int host_signum, void *pinfo, void s390_enable_css_support(S390CPU *cpu); int s390_virtio_hypercall(CPUS390XState *env); -#ifdef CONFIG_KVM -void kvm_s390_service_interrupt(uint32_t parm); -void kvm_s390_vcpu_interrupt(S390CPU *cpu, struct kvm_s390_irq *irq); -void kvm_s390_floating_interrupt(struct kvm_s390_irq *irq); -int kvm_s390_inject_flic(struct kvm_s390_irq *irq); -void kvm_s390_access_exception(S390CPU *cpu, uint16_t code, uint64_t te_code); -int kvm_s390_mem_op(S390CPU *cpu, vaddr addr, uint8_t ar, void *hostbuf, - int len, bool is_write); -int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_clock); -int kvm_s390_set_clock(uint8_t *tod_high, uint64_t *tod_clock); -#else -static inline void kvm_s390_service_interrupt(uint32_t parm) -{ -} -static inline int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_low) -{ - return -ENOSYS; -} -static inline int kvm_s390_set_clock(uint8_t *tod_high, uint64_t *tod_low) -{ - return -ENOSYS; -} -static inline int kvm_s390_mem_op(S390CPU *cpu, vaddr addr, uint8_t ar, - void *hostbuf, int len, bool is_write) -{ - return -ENOSYS; -} -static inline void kvm_s390_access_exception(S390CPU *cpu, uint16_t code, - uint64_t te_code) -{ -} -#endif - int s390_get_clock(uint8_t *tod_high, uint64_t *tod_low); int s390_set_clock(uint8_t *tod_high, uint64_t *tod_low); @@ -704,90 +669,6 @@ int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr, uint8_t ar, void *hostbuf, #define ILEN_AUTO 0xff void program_interrupt(CPUS390XState *env, uint32_t code, int ilen); -#ifdef CONFIG_KVM -void kvm_s390_program_interrupt(S390CPU *cpu, uint16_t code); -void kvm_s390_io_interrupt(uint16_t subchannel_id, - uint16_t subchannel_nr, uint32_t io_int_parm, - uint32_t io_int_word); -void kvm_s390_crw_mchk(void); -void kvm_s390_enable_css_support(S390CPU *cpu); -int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch, - int vq, bool assign); -int kvm_s390_cpu_restart(S390CPU *cpu); -int kvm_s390_get_memslot_count(void); -int kvm_s390_cmma_active(void); -void kvm_s390_cmma_reset(void); -int kvm_s390_set_cpu_state(S390CPU *cpu, uint8_t cpu_state); -void kvm_s390_reset_vcpu(S390CPU *cpu); -int kvm_s390_set_mem_limit(uint64_t new_limit, uint64_t *hw_limit); -void kvm_s390_vcpu_interrupt_pre_save(S390CPU *cpu); -int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu); -int kvm_s390_get_ri(void); -int kvm_s390_get_gs(void); -void kvm_s390_crypto_reset(void); -#else -static inline void kvm_s390_program_interrupt(S390CPU *cpu, uint16_t code) -{ -} -static inline void kvm_s390_io_interrupt(uint16_t subchannel_id, - uint16_t subchannel_nr, - uint32_t io_int_parm, - uint32_t io_int_word) -{ -} -static inline void kvm_s390_crw_mchk(void) -{ -} -static inline void kvm_s390_enable_css_support(S390CPU *cpu) -{ -} -static inline int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, - uint32_t sch, int vq, - bool assign) -{ - return -ENOSYS; -} -static inline int kvm_s390_cpu_restart(S390CPU *cpu) -{ - return -ENOSYS; -} -static inline void kvm_s390_cmma_reset(void) -{ -} -static inline int kvm_s390_get_memslot_count(void) -{ - return MAX_AVAIL_SLOTS; -} -static inline int kvm_s390_set_cpu_state(S390CPU *cpu, uint8_t cpu_state) -{ - return -ENOSYS; -} -static inline void kvm_s390_reset_vcpu(S390CPU *cpu) -{ -} -static inline int kvm_s390_set_mem_limit(uint64_t new_limit, uint64_t *hw_limit) -{ - return 0; -} -static inline void kvm_s390_vcpu_interrupt_pre_save(S390CPU *cpu) -{ -} -static inline int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu) -{ - return 0; -} -static inline int kvm_s390_get_ri(void) -{ - return 0; -} -static inline int kvm_s390_get_gs(void) -{ - return 0; -} -static inline void kvm_s390_crypto_reset(void) -{ -} -#endif int s390_set_memory_limit(uint64_t new_limit, uint64_t *hw_limit); void s390_cmma_reset(void); diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c index 2ce9157197..18cbf91d9c 100644 --- a/target/s390x/cpu_models.c +++ b/target/s390x/cpu_models.c @@ -13,6 +13,8 @@ #include "qemu/osdep.h" #include "cpu.h" #include "internal.h" +#include "kvm_s390x.h" +#include "sysemu/kvm.h" #include "gen-features.h" #include "qapi/error.h" #include "qapi/visitor.h" diff --git a/target/s390x/interrupt.c b/target/s390x/interrupt.c index 119ca74230..058e219fe5 100644 --- a/target/s390x/interrupt.c +++ b/target/s390x/interrupt.c @@ -10,6 +10,7 @@ #include "qemu/osdep.h" #include "qemu/log.h" #include "cpu.h" +#include "kvm_s390x.h" #include "internal.h" #include "exec/exec-all.h" #include "sysemu/kvm.h" diff --git a/target/s390x/kvm-stub.c b/target/s390x/kvm-stub.c new file mode 100644 index 0000000000..261e1cdc44 --- /dev/null +++ b/target/s390x/kvm-stub.c @@ -0,0 +1,111 @@ +/* + * QEMU KVM support -- s390x specific function stubs. + * + * Copyright (c) 2009 Ulrich Hecht + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "qemu-common.h" +#include "cpu.h" +#include "kvm_s390x.h" + +void kvm_s390_service_interrupt(uint32_t parm) +{ +} + +void kvm_s390_access_exception(S390CPU *cpu, uint16_t code, uint64_t te_code) +{ +} + +int kvm_s390_mem_op(S390CPU *cpu, vaddr addr, uint8_t ar, void *hostbuf, + int len, bool is_write) +{ + return -ENOSYS; +} + +void kvm_s390_program_interrupt(S390CPU *cpu, uint16_t code) +{ +} + +void kvm_s390_io_interrupt(uint16_t subchannel_id, uint16_t subchannel_nr, + uint32_t io_int_parm, uint32_t io_int_word) +{ +} + +void kvm_s390_crw_mchk(void) +{ +} + +int kvm_s390_set_cpu_state(S390CPU *cpu, uint8_t cpu_state) +{ + return -ENOSYS; +} + +void kvm_s390_vcpu_interrupt_pre_save(S390CPU *cpu) +{ +} + +int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu) +{ + return 0; +} + +int kvm_s390_get_ri(void) +{ + return 0; +} + +int kvm_s390_get_gs(void) +{ + return 0; +} + +int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_low) +{ + return -ENOSYS; +} + +int kvm_s390_set_clock(uint8_t *tod_high, uint64_t *tod_low) +{ + return -ENOSYS; +} + +void kvm_s390_enable_css_support(S390CPU *cpu) +{ +} + +int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch, + int vq, bool assign) +{ + return -ENOSYS; +} + +int kvm_s390_cpu_restart(S390CPU *cpu) +{ + return -ENOSYS; +} + +void kvm_s390_cmma_reset(void) +{ +} + +int kvm_s390_get_memslot_count(void) +{ + return MAX_AVAIL_SLOTS; +} + +void kvm_s390_reset_vcpu(S390CPU *cpu) +{ +} + +int kvm_s390_set_mem_limit(uint64_t new_limit, uint64_t *hw_limit) +{ + return 0; +} + +void kvm_s390_crypto_reset(void) +{ +} diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c index e271f958a4..d07763ff2c 100644 --- a/target/s390x/kvm.c +++ b/target/s390x/kvm.c @@ -30,6 +30,7 @@ #include "qemu-common.h" #include "cpu.h" #include "internal.h" +#include "kvm_s390x.h" #include "qemu/error-report.h" #include "qemu/timer.h" #include "sysemu/sysemu.h" diff --git a/target/s390x/kvm_s390x.h b/target/s390x/kvm_s390x.h new file mode 100644 index 0000000000..2d594bd4ee --- /dev/null +++ b/target/s390x/kvm_s390x.h @@ -0,0 +1,47 @@ +/* + * QEMU KVM support -- s390x specific functions. + * + * Copyright (c) 2009 Ulrich Hecht + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#ifndef KVM_S390X_H +#define KVM_S390X_H + +struct kvm_s390_irq; + +void kvm_s390_floating_interrupt(struct kvm_s390_irq *irq); +void kvm_s390_service_interrupt(uint32_t parm); +void kvm_s390_vcpu_interrupt(S390CPU *cpu, struct kvm_s390_irq *irq); +void kvm_s390_access_exception(S390CPU *cpu, uint16_t code, uint64_t te_code); +int kvm_s390_mem_op(S390CPU *cpu, vaddr addr, uint8_t ar, void *hostbuf, + int len, bool is_write); +void kvm_s390_program_interrupt(S390CPU *cpu, uint16_t code); +void kvm_s390_io_interrupt(uint16_t subchannel_id, + uint16_t subchannel_nr, uint32_t io_int_parm, + uint32_t io_int_word); +void kvm_s390_crw_mchk(void); +int kvm_s390_set_cpu_state(S390CPU *cpu, uint8_t cpu_state); +void kvm_s390_vcpu_interrupt_pre_save(S390CPU *cpu); +int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu); +int kvm_s390_get_ri(void); +int kvm_s390_get_gs(void); +int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_clock); +int kvm_s390_set_clock(uint8_t *tod_high, uint64_t *tod_clock); +void kvm_s390_enable_css_support(S390CPU *cpu); +int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch, + int vq, bool assign); +int kvm_s390_cpu_restart(S390CPU *cpu); +int kvm_s390_get_memslot_count(void); +int kvm_s390_cmma_active(void); +void kvm_s390_cmma_reset(void); +void kvm_s390_reset_vcpu(S390CPU *cpu); +int kvm_s390_set_mem_limit(uint64_t new_limit, uint64_t *hw_limit); +void kvm_s390_crypto_reset(void); + +/* implemented outside of target/s390x/ */ +int kvm_s390_inject_flic(struct kvm_s390_irq *irq); + +#endif /* KVM_S390X_H */ diff --git a/target/s390x/machine.c b/target/s390x/machine.c index 592db6b515..097a147dbb 100644 --- a/target/s390x/machine.c +++ b/target/s390x/machine.c @@ -18,6 +18,7 @@ #include "hw/hw.h" #include "cpu.h" #include "internal.h" +#include "kvm_s390x.h" #include "sysemu/kvm.h" static int cpu_post_load(void *opaque, int version_id) diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c index 09fe5bba29..b528c5921d 100644 --- a/target/s390x/mmu_helper.c +++ b/target/s390x/mmu_helper.c @@ -20,6 +20,7 @@ #include "exec/address-spaces.h" #include "cpu.h" #include "internal.h" +#include "kvm_s390x.h" #include "sysemu/kvm.h" #include "trace.h" #include "hw/s390x/storage-keys.h" -- cgit v1.2.3-55-g7522