[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 4/9] s390x/pci: fix dma notifications in rpcit instru
From: |
Cornelia Huck |
Subject: |
[Qemu-devel] [PULL 4/9] s390x/pci: fix dma notifications in rpcit instruction |
Date: |
Tue, 3 Feb 2015 14:08:43 +0100 |
From: Yi Min Zhao <address@hidden>
The virtual I/O address range passed to rpcit instruction might not
map to consecutive physical guest pages. For this we have to translate
and create mapping notifications for each vioa page separately.
Signed-off-by: Yi Min Zhao <address@hidden>
Signed-off-by: Cornelia Huck <address@hidden>
---
hw/s390x/s390-pci-inst.c | 20 ++++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
index c269184..9e5bc5b 100644
--- a/hw/s390x/s390-pci-inst.c
+++ b/hw/s390x/s390-pci-inst.c
@@ -487,7 +487,7 @@ int rpcit_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2)
CPUS390XState *env = &cpu->env;
uint32_t fh;
S390PCIBusDevice *pbdev;
- ram_addr_t size;
+ hwaddr start, end;
IOMMUTLBEntry entry;
MemoryRegion *mr;
@@ -504,7 +504,8 @@ int rpcit_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2)
}
fh = env->regs[r1] >> 32;
- size = env->regs[r2 + 1];
+ start = env->regs[r2];
+ end = start + env->regs[r2 + 1];
pbdev = s390_pci_find_dev_by_fh(fh);
@@ -515,15 +516,18 @@ int rpcit_service_call(S390CPU *cpu, uint8_t r1, uint8_t
r2)
}
mr = pci_device_iommu_address_space(pbdev->pdev)->root;
- entry = mr->iommu_ops->translate(mr, env->regs[r2], 0);
+ while (start < end) {
+ entry = mr->iommu_ops->translate(mr, start, 0);
- if (!entry.translated_addr) {
- setcc(cpu, ZPCI_PCI_LS_ERR);
- goto out;
+ if (!entry.translated_addr) {
+ setcc(cpu, ZPCI_PCI_LS_ERR);
+ goto out;
+ }
+
+ memory_region_notify_iommu(mr, entry);
+ start += entry.addr_mask + 1;
}
- entry.addr_mask = size - 1;
- memory_region_notify_iommu(mr, entry);
setcc(cpu, ZPCI_PCI_LS_OK);
out:
return 0;
--
1.7.9.5
- [Qemu-devel] [PULL 0/9] s390x bugfixes and cleanups, Cornelia Huck, 2015/02/03
- [Qemu-devel] [PULL 2/9] s390x/pci: avoid sign extension in stpcifc, Cornelia Huck, 2015/02/03
- [Qemu-devel] [PULL 1/9] s390: Plug memory leak on s390_pci_generate_event() error path, Cornelia Huck, 2015/02/03
- [Qemu-devel] [PULL 3/9] s390x/pci: check for invalid function handle, Cornelia Huck, 2015/02/03
- [Qemu-devel] [PULL 4/9] s390x/pci: fix dma notifications in rpcit instruction,
Cornelia Huck <=
- [Qemu-devel] [PULL 5/9] s390x/kvm: Fix diag-308 register decoding, Cornelia Huck, 2015/02/03
- [Qemu-devel] [PULL 7/9] s390x/ipl: Improved code indentation in s390_ipl_init(), Cornelia Huck, 2015/02/03
- [Qemu-devel] [PULL 9/9] pc-bios/s390-ccw: update binary, Cornelia Huck, 2015/02/03
- [Qemu-devel] [PULL 6/9] s390x/kvm: unknown DIAGNOSE code should give a specification exception, Cornelia Huck, 2015/02/03
- [Qemu-devel] [PULL 8/9] pc-bios/s390-ccw: fix sparse warnings, Cornelia Huck, 2015/02/03
- Re: [Qemu-devel] [PULL 0/9] s390x bugfixes and cleanups, Peter Maydell, 2015/02/03
- Re: [Qemu-devel] [PULL 0/9] s390x bugfixes and cleanups, Peter Maydell, 2015/02/03