diff options
author | Cornelia Huck | 2017-07-06 17:13:14 +0200 |
---|---|---|
committer | Cornelia Huck | 2017-08-30 18:23:25 +0200 |
commit | 80b7a265362c870f95fb5ca1f7e7a02c0fa0db3e (patch) | |
tree | 854932d6cc1e81fea496caae0224d09935cac791 /hw/s390x/sclp.c | |
parent | s390x/ccw: create s390 phb conditionally (diff) | |
download | qemu-80b7a265362c870f95fb5ca1f7e7a02c0fa0db3e.tar.gz qemu-80b7a265362c870f95fb5ca1f7e7a02c0fa0db3e.tar.xz qemu-80b7a265362c870f95fb5ca1f7e7a02c0fa0db3e.zip |
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 <pmorel@linux.vnet.ibm.com>
Reviewed-by: Halil Pasic <pasic@linux.vnet.ibm.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
Diffstat (limited to 'hw/s390x/sclp.c')
-rw-r--r-- | hw/s390x/sclp.c | 39 |
1 files changed, 34 insertions, 5 deletions
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); |