From 205e5de4251f4c18e1f17f2e7aaa42ff92c3e05f Mon Sep 17 00:00:00 2001 From: Pierre Morel Date: Wed, 24 Aug 2016 12:46:34 +0200 Subject: [PATCH 1/8] s390x/pci: re-arrange variable declarations Pull mr variable declarations at the top of the functions instead of mixing them up with the code. This is in preparation for followup patches. Signed-off-by: Pierre Morel Reviewed-by: Cornelia Huck Signed-off-by: Christian Borntraeger --- hw/s390x/s390-pci-inst.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c index f069b110b4..80a51049ca 100644 --- a/hw/s390x/s390-pci-inst.c +++ b/hw/s390x/s390-pci-inst.c @@ -315,6 +315,7 @@ int pcilg_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2) S390PCIBusDevice *pbdev; uint64_t offset; uint64_t data; + MemoryRegion *mr; uint8_t len; uint32_t fh; uint8_t pcias; @@ -363,7 +364,7 @@ int pcilg_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2) program_interrupt(env, PGM_OPERAND, 4); return 0; } - MemoryRegion *mr = pbdev->pdev->io_regions[pcias].memory; + mr = pbdev->pdev->io_regions[pcias].memory; memory_region_dispatch_read(mr, offset, &data, len, MEMTXATTRS_UNSPECIFIED); } else if (pcias == 15) { @@ -442,6 +443,7 @@ int pcistg_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2) CPUS390XState *env = &cpu->env; uint64_t offset, data; S390PCIBusDevice *pbdev; + MemoryRegion *mr; uint8_t len; uint32_t fh; uint8_t pcias; @@ -491,7 +493,7 @@ int pcistg_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2) program_interrupt(env, PGM_OPERAND, 4); return 0; } - MemoryRegion *mr; + if (trap_msix(pbdev, offset, pcias)) { offset = offset - pbdev->msix.table_offset; mr = &pbdev->pdev->msix_table_mmio; From 8f95595072c3d91645c21d27cd02dd0b8d920f77 Mon Sep 17 00:00:00 2001 From: Yi Min Zhao Date: Tue, 6 Sep 2016 14:00:44 +0800 Subject: [PATCH 2/8] s390x/pci: assign msix io region for each pci device For efficiency we now assign one msix io region for each pci device and provide it with the pointer to the zPCI device as opaque parameter. In addition, we remove msix address space and add msix io region as a subregion to the root memory region of pci device. Signed-off-by: Yi Min Zhao Reviewed-by: Pierre Morel Signed-off-by: Christian Borntraeger --- hw/s390x/s390-pci-bus.c | 37 ++++++++++++++++++++++++++----------- hw/s390x/s390-pci-bus.h | 4 ++-- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c index ac8f06d9e7..fe5fc4eb16 100644 --- a/hw/s390x/s390-pci-bus.c +++ b/hw/s390x/s390-pci-bus.c @@ -383,7 +383,6 @@ static IOMMUTLBEntry s390_translate_iommu(MemoryRegion *iommu, hwaddr addr, uint64_t pte; uint32_t flags; S390PCIBusDevice *pbdev = container_of(iommu, S390PCIBusDevice, iommu_mr); - S390pciState *s; IOMMUTLBEntry ret = { .target_as = &address_space_memory, .iova = 0, @@ -405,12 +404,10 @@ static IOMMUTLBEntry s390_translate_iommu(MemoryRegion *iommu, hwaddr addr, DPRINTF("iommu trans addr 0x%" PRIx64 "\n", addr); - s = S390_PCI_HOST_BRIDGE(pci_device_root_bus(pbdev->pdev)->qbus.parent); /* s390 does not have an APIC mapped to main storage so we use * a separate AddressSpace only for msix notifications */ if (addr == ZPCI_MSI_ADDR) { - ret.target_as = &s->msix_notify_as; ret.iova = addr; ret.translated_addr = addr; ret.addr_mask = 0xfff; @@ -476,7 +473,7 @@ static uint8_t set_ind_atomic(uint64_t ind_loc, uint8_t to_be_set) static void s390_msi_ctrl_write(void *opaque, hwaddr addr, uint64_t data, unsigned int size) { - S390PCIBusDevice *pbdev; + S390PCIBusDevice *pbdev = opaque; uint32_t io_int_word; uint32_t idx = data >> ZPCI_MSI_VEC_BITS; uint32_t vec = data & ZPCI_MSI_VEC_MASK; @@ -486,7 +483,6 @@ static void s390_msi_ctrl_write(void *opaque, hwaddr addr, uint64_t data, DPRINTF("write_msix data 0x%" PRIx64 " idx %d vec 0x%x\n", data, idx, vec); - pbdev = s390_pci_find_dev_by_idx(idx); if (!pbdev) { e |= (vec << ERR_EVENT_MVN_OFFSET); s390_pci_generate_error_event(ERR_EVENT_NOMSI, idx, 0, addr, e); @@ -548,10 +544,6 @@ static void s390_pcihost_init_as(S390pciState *s) s->iommu[i] = iommu; } - - memory_region_init_io(&s->msix_notify_mr, OBJECT(s), - &s390_msi_ctrl_ops, s, "msix-s390", UINT64_MAX); - address_space_init(&s->msix_notify_as, &s->msix_notify_mr, "msix-pci"); } static int s390_pcihost_init(SysBusDevice *dev) @@ -581,7 +573,7 @@ static int s390_pcihost_init(SysBusDevice *dev) return 0; } -static int s390_pcihost_setup_msix(S390PCIBusDevice *pbdev) +static int s390_pci_setup_msix(S390PCIBusDevice *pbdev) { uint8_t pos; uint16_t ctrl; @@ -609,6 +601,26 @@ static int s390_pcihost_setup_msix(S390PCIBusDevice *pbdev) return 0; } +static void s390_pci_msix_init(S390PCIBusDevice *pbdev) +{ + char *name; + + name = g_strdup_printf("msix-s390-%04x", pbdev->uid); + + memory_region_init_io(&pbdev->msix_notify_mr, OBJECT(pbdev), + &s390_msi_ctrl_ops, pbdev, name, PAGE_SIZE); + memory_region_add_subregion(&pbdev->iommu->mr, ZPCI_MSI_ADDR, + &pbdev->msix_notify_mr); + + g_free(name); +} + +static void s390_pci_msix_free(S390PCIBusDevice *pbdev) +{ + memory_region_del_subregion(&pbdev->iommu->mr, &pbdev->msix_notify_mr); + object_unparent(OBJECT(&pbdev->msix_notify_mr)); +} + static S390PCIBusDevice *s390_pci_device_new(const char *target) { DeviceState *dev = NULL; @@ -662,7 +674,9 @@ static void s390_pcihost_hot_plug(HotplugHandler *hotplug_dev, pbdev->pdev = pdev; pbdev->iommu = s->iommu[PCI_SLOT(pdev->devfn)]; pbdev->state = ZPCI_FS_STANDBY; - s390_pcihost_setup_msix(pbdev); + + s390_pci_msix_init(pbdev); + s390_pci_setup_msix(pbdev); if (dev->hotplugged) { s390_pci_generate_plug_event(HP_EVENT_RESERVED_TO_STANDBY, @@ -749,6 +763,7 @@ static void s390_pcihost_hot_unplug(HotplugHandler *hotplug_dev, s390_pci_generate_plug_event(HP_EVENT_STANDBY_TO_RESERVED, pbdev->fh, pbdev->fid); object_unparent(OBJECT(pci_dev)); + s390_pci_msix_free(pbdev); pbdev->pdev = NULL; pbdev->state = ZPCI_FS_RESERVED; out: diff --git a/hw/s390x/s390-pci-bus.h b/hw/s390x/s390-pci-bus.h index 4f564e02f2..7f2701301e 100644 --- a/hw/s390x/s390-pci-bus.h +++ b/hw/s390x/s390-pci-bus.h @@ -82,6 +82,7 @@ #define ZPCI_EDMA_ADDR 0x1ffffffffffffffULL #define PAGE_SHIFT 12 +#define PAGE_SIZE (1 << PAGE_SHIFT) #define PAGE_MASK (~(PAGE_SIZE-1)) #define PAGE_DEFAULT_ACC 0 #define PAGE_DEFAULT_KEY (PAGE_DEFAULT_ACC << 4) @@ -283,6 +284,7 @@ typedef struct S390PCIBusDevice { AdapterRoutes routes; S390PCIIOMMU *iommu; MemoryRegion iommu_mr; + MemoryRegion msix_notify_mr; IndAddr *summary_ind; IndAddr *indicator; QEMUTimer *release_timer; @@ -297,8 +299,6 @@ typedef struct S390pciState { S390PCIBus *bus; S390PCIBusDevice *pbdev[PCI_SLOT_MAX]; S390PCIIOMMU *iommu[PCI_SLOT_MAX]; - AddressSpace msix_notify_as; - MemoryRegion msix_notify_mr; QTAILQ_HEAD(, SeiContainer) pending_sei; } S390pciState; From bfcec59a23f42dcac18a434bd48bd60d6fc0e563 Mon Sep 17 00:00:00 2001 From: Yi Min Zhao Date: Tue, 6 Sep 2016 14:01:29 +0800 Subject: [PATCH 3/8] s390x/pci: code cleanup Now that each S390 PCI device uses an IO region as MSIX region. The code in s390_translate_iommu() will never be triggered. Let's remove it. Signed-off-by: Yi Min Zhao Reviewed-by: Pierre Morel Signed-off-by: Christian Borntraeger --- hw/s390x/s390-pci-bus.c | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c index fe5fc4eb16..b7f8bca1fd 100644 --- a/hw/s390x/s390-pci-bus.c +++ b/hw/s390x/s390-pci-bus.c @@ -404,17 +404,6 @@ static IOMMUTLBEntry s390_translate_iommu(MemoryRegion *iommu, hwaddr addr, DPRINTF("iommu trans addr 0x%" PRIx64 "\n", addr); - /* s390 does not have an APIC mapped to main storage so we use - * a separate AddressSpace only for msix notifications - */ - if (addr == ZPCI_MSI_ADDR) { - ret.iova = addr; - ret.translated_addr = addr; - ret.addr_mask = 0xfff; - ret.perm = IOMMU_RW; - return ret; - } - if (addr < pbdev->pba || addr > pbdev->pal) { return ret; } From f9530c32420fff941b7bc8bb5d90310eecab5a96 Mon Sep 17 00:00:00 2001 From: Christian Borntraeger Date: Mon, 19 Sep 2016 13:39:42 +0200 Subject: [PATCH 4/8] s390x/kvm: Fix potential deadlock in sigp handling If two VCPUs exit at the same time and target each other with a sigp, both could run into a deadlock as run_on_cpu on CPU0 will free the BQL when starting the CPU1 target routine. CPU1 will run its sigp initiater for CPU0 before handling the run_on_cpu requests, thus resulting in a dead lock. As all qemu SIGPs are slow path anway we can use a big sigp lock and allow only one SIGP for the guest at a time. We will return condition code 2 (BUSY) on contention to the guest. Reported-by: Paolo Bonzini Reviewed-by: Cornelia Huck Signed-off-by: Christian Borntraeger --- target-s390x/kvm.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c index 4b847a3be4..a95d3da0f8 100644 --- a/target-s390x/kvm.c +++ b/target-s390x/kvm.c @@ -132,6 +132,8 @@ const KVMCapabilityInfo kvm_arch_required_capabilities[] = { KVM_CAP_LAST_INFO }; +static QemuMutex qemu_sigp_mutex; + static int cap_sync_regs; static int cap_async_pf; static int cap_mem_op; @@ -287,6 +289,8 @@ int kvm_arch_init(MachineState *ms, KVMState *s) } } + qemu_mutex_init(&qemu_sigp_mutex); + return 0; } @@ -1774,6 +1778,11 @@ static int handle_sigp(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1) status_reg = &env->regs[r1]; param = (r1 % 2) ? env->regs[r1] : env->regs[r1 + 1]; + if (qemu_mutex_trylock(&qemu_sigp_mutex)) { + ret = SIGP_CC_BUSY; + goto out; + } + switch (order) { case SIGP_SET_ARCH: ret = sigp_set_architecture(cpu, param, status_reg); @@ -1783,7 +1792,9 @@ static int handle_sigp(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1) dst_cpu = s390_cpu_addr2state(env->regs[r3]); ret = handle_sigp_single_dst(dst_cpu, order, param, status_reg); } + qemu_mutex_unlock(&qemu_sigp_mutex); +out: trace_kvm_sigp_finished(order, CPU(cpu)->cpu_index, dst_cpu ? CPU(dst_cpu)->cpu_index : -1, ret); From 9c9f5f311a4b391c2dba57cf06b63d62b790e891 Mon Sep 17 00:00:00 2001 From: Dong Jia Shi Date: Thu, 22 Sep 2016 10:36:39 +0200 Subject: [PATCH 5/8] pc-bios/s390-ccw: enable subchannel for IPL I/O devices IPL should cause the IPL I/O device to become enabled. So when handling the IPL program, we should set the E (Enable) bit. However, virtio-ccw does not know whether it's dealing with an IPL device or not. Since trying to perform I/O on a disabled device doesn't make any sense, let's just always enable it. At the same time we can remove the SCSW_FCTL_START_FUNC flag as it is ignored for msch anyway and did not enable the device as intended. Reported-by: Farhan Ali Signed-off-by: Dong Jia Shi Reviewed-by: Cornelia Huck Reviewed-by: Sascha Silbe Signed-off-by: Halil Pasic [remove superfluous flag] Signed-off-by: Christian Borntraeger --- pc-bios/s390-ccw/virtio.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c index 1d34e8c1aa..b333734955 100644 --- a/pc-bios/s390-ccw/virtio.c +++ b/pc-bios/s390-ccw/virtio.c @@ -97,7 +97,8 @@ static int run_ccw(VDev *vdev, int cmd, void *ptr, int len) /* start command processing */ stsch_err(vdev->schid, &schib); - schib.scsw.ctrl = SCSW_FCTL_START_FUNC; + /* enable the subchannel for IPL device */ + schib.pmcw.ena = 1; msch(vdev->schid, &schib); /* start subchannel command */ From 6b5ffb14b78f8bb4835d0cd8e3d2826720acfa43 Mon Sep 17 00:00:00 2001 From: Christian Borntraeger Date: Tue, 27 Sep 2016 13:41:21 +0200 Subject: [PATCH 6/8] pc-bios/s390-ccw.img: rebuild image Contains: - pc-bios/s390-ccw: enable subchannel for IPL I/O devices Signed-off-by: Christian Borntraeger --- pc-bios/s390-ccw.img | Bin 26440 -> 26392 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pc-bios/s390-ccw.img b/pc-bios/s390-ccw.img index 089f6ba5e924c17796cccac4ecbfa7a78b00ba22..cf05bf0be2299ec6512375ef4b38179f22558ddc 100644 GIT binary patch literal 26392 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 literal 26440 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 Date: Mon, 19 Sep 2016 21:12:03 +0200 Subject: [PATCH 7/8] s390x/css: {c,h,t,r,x}sch: require enable AND device number valid According to the PoP, subchannels are only considered operational if they are enabled _and_ the device number is valid. With the current checks being enabled _or_ having a valid device number was sufficient. This caused qemu to allow IO on subchannels that were not enabled. Fix the checks to require both bits to be set. Signed-off-by: Sascha Silbe Reviewed-by: Cornelia Huck Reviewed-by: Halil Pasic Signed-off-by: Christian Borntraeger --- hw/s390x/css.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/hw/s390x/css.c b/hw/s390x/css.c index b0e81efc27..0f2580d644 100644 --- a/hw/s390x/css.c +++ b/hw/s390x/css.c @@ -775,7 +775,7 @@ int css_do_xsch(SubchDev *sch) PMCW *p = &sch->curr_status.pmcw; int ret; - if (!(p->flags & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA))) { + if (~(p->flags) & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA)) { ret = -ENODEV; goto out; } @@ -815,7 +815,7 @@ int css_do_csch(SubchDev *sch) PMCW *p = &sch->curr_status.pmcw; int ret; - if (!(p->flags & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA))) { + if (~(p->flags) & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA)) { ret = -ENODEV; goto out; } @@ -837,7 +837,7 @@ int css_do_hsch(SubchDev *sch) PMCW *p = &sch->curr_status.pmcw; int ret; - if (!(p->flags & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA))) { + if (~(p->flags) & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA)) { ret = -ENODEV; goto out; } @@ -913,7 +913,7 @@ int css_do_ssch(SubchDev *sch, ORB *orb) PMCW *p = &sch->curr_status.pmcw; int ret; - if (!(p->flags & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA))) { + if (~(p->flags) & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA)) { ret = -ENODEV; goto out; } @@ -990,7 +990,7 @@ int css_do_tsch_get_irb(SubchDev *sch, IRB *target_irb, int *irb_len) uint16_t stctl; IRB irb; - if (!(p->flags & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA))) { + if (~(p->flags) & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA)) { return 3; } @@ -1196,7 +1196,7 @@ int css_do_rsch(SubchDev *sch) PMCW *p = &sch->curr_status.pmcw; int ret; - if (!(p->flags & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA))) { + if (~(p->flags) & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA)) { ret = -ENODEV; goto out; } From 794afd7096f1ef3ea632b5cf75998562a2f8029a Mon Sep 17 00:00:00 2001 From: Christian Borntraeger Date: Tue, 27 Sep 2016 10:08:50 +0200 Subject: [PATCH 8/8] s390x/kvm: fix build against qemu_uuid commit 9c5ce8db2e5c ("vl: Switch qemu_uuid to QemuUUID") changed most users of qemu_uuid but not all. Fix a build error on s390/kvm. Reviewed-by: Fam Zheng Signed-off-by: Christian Borntraeger --- target-s390x/kvm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c index a95d3da0f8..495905cf8e 100644 --- a/target-s390x/kvm.c +++ b/target-s390x/kvm.c @@ -1999,7 +1999,7 @@ static void insert_stsi_3_2_2(S390CPU *cpu, __u64 addr, uint8_t ar) strcpy((char *)sysib.ext_names[0], "KVMguest"); } /* Insert UUID */ - memcpy(sysib.vm[0].uuid, qemu_uuid, sizeof(sysib.vm[0].uuid)); + memcpy(sysib.vm[0].uuid, &qemu_uuid, sizeof(sysib.vm[0].uuid)); s390_cpu_virt_mem_write(cpu, addr, ar, &sysib, sizeof(sysib)); }