summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--hw/s390x/meson.build4
-rw-r--r--hw/s390x/s390-pci-inst.c5
-rw-r--r--hw/s390x/virtio-ccw.c21
-rw-r--r--hw/vfio/ccw.c12
-rw-r--r--target/s390x/arch_dump.c4
-rw-r--r--target/s390x/cpu_models.c10
-rw-r--r--target/s390x/ioinst.c6
-rw-r--r--target/s390x/kvm.c3
8 files changed, 48 insertions, 17 deletions
diff --git a/hw/s390x/meson.build b/hw/s390x/meson.build
index 2a7818d94b..91495b5631 100644
--- a/hw/s390x/meson.build
+++ b/hw/s390x/meson.build
@@ -40,7 +40,9 @@ virtio_ss.add(when: 'CONFIG_VIRTIO_NET', if_true: files('virtio-ccw-net.c'))
virtio_ss.add(when: 'CONFIG_VIRTIO_RNG', if_true: files('virtio-ccw-rng.c'))
virtio_ss.add(when: 'CONFIG_VIRTIO_SCSI', if_true: files('virtio-ccw-scsi.c'))
virtio_ss.add(when: 'CONFIG_VIRTIO_SERIAL', if_true: files('virtio-ccw-serial.c'))
-virtio_ss.add(when: ['CONFIG_VIRTIO_9P', 'CONFIG_VIRTFS'], if_true: files('virtio-ccw-blk.c'))
+if have_virtfs
+ virtio_ss.add(when: 'CONFIG_VIRTIO_9P', if_true: files('virtio-ccw-9p.c'))
+endif
virtio_ss.add(when: 'CONFIG_VHOST_VSOCK', if_true: files('vhost-vsock-ccw.c'))
virtio_ss.add(when: 'CONFIG_VHOST_USER_FS', if_true: files('vhost-user-fs-ccw.c'))
s390x_ss.add_all(when: 'CONFIG_VIRTIO_CCW', if_true: virtio_ss)
diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
index 654fac6c0a..4b8326afa4 100644
--- a/hw/s390x/s390-pci-inst.c
+++ b/hw/s390x/s390-pci-inst.c
@@ -284,10 +284,15 @@ int clp_service_call(S390CPU *cpu, uint8_t r2, uintptr_t ra)
stq_p(&resquery->sdma, pbdev->zpci_fn.sdma);
stq_p(&resquery->edma, pbdev->zpci_fn.edma);
stw_p(&resquery->pchid, pbdev->zpci_fn.pchid);
+ stw_p(&resquery->vfn, pbdev->zpci_fn.vfn);
resquery->flags = pbdev->zpci_fn.flags;
resquery->pfgid = pbdev->zpci_fn.pfgid;
+ resquery->pft = pbdev->zpci_fn.pft;
+ resquery->fmbl = pbdev->zpci_fn.fmbl;
stl_p(&resquery->fid, pbdev->zpci_fn.fid);
stl_p(&resquery->uid, pbdev->zpci_fn.uid);
+ memcpy(resquery->pfip, pbdev->zpci_fn.pfip, CLP_PFIP_NR_SEGMENTS);
+ memcpy(resquery->util_str, pbdev->zpci_fn.util_str, CLP_UTIL_STR_LEN);
for (i = 0; i < PCI_BAR_COUNT; i++) {
uint32_t data = pci_get_long(pbdev->pdev->config +
diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
index 4582e94ae7..06c0605681 100644
--- a/hw/s390x/virtio-ccw.c
+++ b/hw/s390x/virtio-ccw.c
@@ -327,13 +327,20 @@ static int virtio_ccw_cb(SubchDev *sch, CCW1 ccw)
ccw.cmd_code);
check_len = !((ccw.flags & CCW_FLAG_SLI) && !(ccw.flags & CCW_FLAG_DC));
- if (dev->force_revision_1 && dev->revision < 0 &&
- ccw.cmd_code != CCW_CMD_SET_VIRTIO_REV) {
- /*
- * virtio-1 drivers must start with negotiating to a revision >= 1,
- * so post a command reject for all other commands
- */
- return -ENOSYS;
+ if (dev->revision < 0 && ccw.cmd_code != CCW_CMD_SET_VIRTIO_REV) {
+ if (dev->force_revision_1) {
+ /*
+ * virtio-1 drivers must start with negotiating to a revision >= 1,
+ * so post a command reject for all other commands
+ */
+ return -ENOSYS;
+ } else {
+ /*
+ * If the driver issues any command that is not SET_VIRTIO_REV,
+ * we'll have to operate the device in legacy mode.
+ */
+ dev->revision = 0;
+ }
}
/* Look at the command. */
diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c
index bc78a0ad76..b2df708e4b 100644
--- a/hw/vfio/ccw.c
+++ b/hw/vfio/ccw.c
@@ -104,9 +104,9 @@ again:
goto again;
}
error_report("vfio-ccw: write I/O region failed with errno=%d", errno);
- ret = -errno;
+ ret = errno ? -errno : -EFAULT;
} else {
- ret = region->ret_code;
+ ret = 0;
}
switch (ret) {
case 0:
@@ -192,9 +192,9 @@ again:
goto again;
}
error_report("vfio-ccw: write cmd region failed with errno=%d", errno);
- ret = -errno;
+ ret = errno ? -errno : -EFAULT;
} else {
- ret = region->ret_code;
+ ret = 0;
}
switch (ret) {
case 0:
@@ -232,9 +232,9 @@ again:
goto again;
}
error_report("vfio-ccw: write cmd region failed with errno=%d", errno);
- ret = -errno;
+ ret = errno ? -errno : -EFAULT;
} else {
- ret = region->ret_code;
+ ret = 0;
}
switch (ret) {
case 0:
diff --git a/target/s390x/arch_dump.c b/target/s390x/arch_dump.c
index 50fa0ae4b6..cc1330876b 100644
--- a/target/s390x/arch_dump.c
+++ b/target/s390x/arch_dump.c
@@ -212,11 +212,13 @@ static int s390x_write_elf64_notes(const char *note_name,
int note_size;
int ret = -1;
+ assert(strlen(note_name) < sizeof(note.name));
+
for (nf = funcs; nf->note_contents_func; nf++) {
memset(&note, 0, sizeof(note));
note.hdr.n_namesz = cpu_to_be32(strlen(note_name) + 1);
note.hdr.n_descsz = cpu_to_be32(nf->contents_size);
- strncpy(note.name, note_name, sizeof(note.name));
+ g_strlcpy(note.name, note_name, sizeof(note.name));
(*nf->note_contents_func)(&note, cpu, id);
note_size = sizeof(note) - sizeof(note.contents) + nf->contents_size;
diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
index 35179f9dc7..dd474c5e9a 100644
--- a/target/s390x/cpu_models.c
+++ b/target/s390x/cpu_models.c
@@ -26,6 +26,7 @@
#include "qapi/qmp/qdict.h"
#ifndef CONFIG_USER_ONLY
#include "sysemu/arch_init.h"
+#include "sysemu/sysemu.h"
#include "hw/pci/pci.h"
#endif
#include "qapi/qapi-commands-machine-target.h"
@@ -878,6 +879,15 @@ static void check_compatibility(const S390CPUModel *max_model,
return;
}
+#ifndef CONFIG_USER_ONLY
+ if (only_migratable && test_bit(S390_FEAT_UNPACK, model->features)) {
+ error_setg(errp, "The unpack facility is not compatible with "
+ "the --only-migratable option. You must remove either "
+ "the 'unpack' facility or the --only-migratable option");
+ return;
+ }
+#endif
+
/* detect the missing features to properly report them */
bitmap_andnot(missing, model->features, max_model->features, S390_FEAT_MAX);
if (bitmap_empty(missing, S390_FEAT_MAX)) {
diff --git a/target/s390x/ioinst.c b/target/s390x/ioinst.c
index a412926d27..1ee11522e1 100644
--- a/target/s390x/ioinst.c
+++ b/target/s390x/ioinst.c
@@ -121,6 +121,12 @@ static int ioinst_schib_valid(SCHIB *schib)
if (be32_to_cpu(schib->pmcw.chars) & PMCW_CHARS_MASK_XMWME) {
return 0;
}
+ /* for MB format 1 bits 26-31 of word 11 must be 0 */
+ /* MBA uses words 10 and 11, it means align on 2**6 */
+ if ((be16_to_cpu(schib->pmcw.chars) & PMCW_CHARS_MASK_MBFC) &&
+ (be64_to_cpu(schib->mba) & 0x03fUL)) {
+ return 0;
+ }
return 1;
}
diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
index 7a892d663d..73f816a722 100644
--- a/target/s390x/kvm.c
+++ b/target/s390x/kvm.c
@@ -1785,8 +1785,7 @@ static int handle_intercept(S390CPU *cpu)
int icpt_code = run->s390_sieic.icptcode;
int r = 0;
- DPRINTF("intercept: 0x%x (at 0x%lx)\n", icpt_code,
- (long)cs->kvm_run->psw_addr);
+ DPRINTF("intercept: 0x%x (at 0x%lx)\n", icpt_code, (long)run->psw_addr);
switch (icpt_code) {
case ICPT_INSTRUCTION:
case ICPT_PV_INSTR: