[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-stable] [PATCH 50/51] memory: fix limiting of translation at a pag
From: |
Michael Roth |
Subject: |
[Qemu-stable] [PATCH 50/51] memory: fix limiting of translation at a page boundary |
Date: |
Fri, 21 Feb 2014 02:17:26 -0600 |
From: Paolo Bonzini <address@hidden>
Commit 360e607 (address_space_translate: do not cross page boundaries,
2014-01-30) broke MMIO accesses in cases where the section is shorter
than the full register width. This can happen for example with the
Bochs DISPI registers, which are 16 bits wide but have only a 1-byte
long MemoryRegion (if you write to the "second byte" of the register
your access is discarded; it doesn't write only to half of the register).
Restrict the action of commit 360e607 to direct RAM accesses. This
is enough for Xen, since MMIO will not go through the mapcache.
Reported-by: Mark Cave-Ayland <address@hidden>
Cc: address@hidden
Signed-off-by: Paolo Bonzini <address@hidden>
Tested-by: Mark Cave-Ayland <address@hidden>
Signed-off-by: Peter Maydell <address@hidden>
(cherry picked from commit a87f39543a9259f671c5413723311180ee2ad2a8)
Signed-off-by: Michael Roth <address@hidden>
---
exec.c | 29 +++++++++++++++++------------
1 file changed, 17 insertions(+), 12 deletions(-)
diff --git a/exec.c b/exec.c
index df94429..b324fcc 100644
--- a/exec.c
+++ b/exec.c
@@ -266,6 +266,18 @@ address_space_translate_internal(AddressSpaceDispatch *d,
hwaddr addr, hwaddr *x
return section;
}
+static inline bool memory_access_is_direct(MemoryRegion *mr, bool is_write)
+{
+ if (memory_region_is_ram(mr)) {
+ return !(is_write && mr->readonly);
+ }
+ if (memory_region_is_romd(mr)) {
+ return !is_write;
+ }
+
+ return false;
+}
+
MemoryRegion *address_space_translate(AddressSpace *as, hwaddr addr,
hwaddr *xlat, hwaddr *plen,
bool is_write)
@@ -295,6 +307,11 @@ MemoryRegion *address_space_translate(AddressSpace *as,
hwaddr addr,
as = iotlb.target_as;
}
+ if (memory_access_is_direct(mr, is_write)) {
+ hwaddr page = ((addr & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE) - addr;
+ len = MIN(page, len);
+ }
+
*plen = len;
*xlat = addr;
return mr;
@@ -1815,18 +1832,6 @@ static void invalidate_and_set_dirty(hwaddr addr,
xen_modified_memory(addr, length);
}
-static inline bool memory_access_is_direct(MemoryRegion *mr, bool is_write)
-{
- if (memory_region_is_ram(mr)) {
- return !(is_write && mr->readonly);
- }
- if (memory_region_is_romd(mr)) {
- return !is_write;
- }
-
- return false;
-}
-
static int memory_access_size(MemoryRegion *mr, unsigned l, hwaddr addr)
{
unsigned access_size_max = mr->ops->valid.max_access_size;
--
1.7.9.5
- [Qemu-stable] [PATCH 39/51] migration: qmp_migrate(): keep working after syntax error, (continued)
- [Qemu-stable] [PATCH 39/51] migration: qmp_migrate(): keep working after syntax error, Michael Roth, 2014/02/21
- [Qemu-stable] [PATCH 40/51] vfio-pci: Release all MSI-X vectors when disabled, Michael Roth, 2014/02/21
- [Qemu-stable] [PATCH 41/51] block/curl: Implement the libcurl timer callback interface, Michael Roth, 2014/02/21
- [Qemu-stable] [PATCH 43/51] scsi: Assign cancel_io vector for scsi_disk_emulate_ops, Michael Roth, 2014/02/21
- [Qemu-stable] [PATCH 42/51] scsi: Support TEST UNIT READY in the dummy LUN0, Michael Roth, 2014/02/21
- [Qemu-stable] [PATCH 44/51] virtio-scsi: Cleanup of I/Os that never started, Michael Roth, 2014/02/21
- [Qemu-stable] [PATCH 45/51] virtio-scsi: Prevent assertion on missed events, Michael Roth, 2014/02/21
- [Qemu-stable] [PATCH 47/51] i386: Add missing include file for QEMU_PACKED, Michael Roth, 2014/02/21
- [Qemu-stable] [PATCH 46/51] KVM: Retry KVM_CREATE_VM on EINTR, Michael Roth, 2014/02/21
- [Qemu-stable] [PATCH 48/51] linux-user: Fix trampoline code for CRIS, Michael Roth, 2014/02/21
- [Qemu-stable] [PATCH 50/51] memory: fix limiting of translation at a page boundary,
Michael Roth <=
- [Qemu-stable] [PATCH 51/51] tcg-arm: The shift count of op_rotl_i32 is in args[2] not args[1]., Michael Roth, 2014/02/21
- Re: [Qemu-stable] Patch Round-up for stable 1.7.1, freeze on 2013-02-27, Paolo Bonzini, 2014/02/21
- Re: [Qemu-stable] Patch Round-up for stable 1.7.1, freeze on 2013-02-27, Legorol, 2014/02/21
- [Qemu-stable] [PATCH 30/51] linux-user: create target_structs header to place ipc_perm and shmid_ds, Michael Roth, 2014/02/21
- [Qemu-stable] [PATCH 49/51] Update OpenBIOS images, Michael Roth, 2014/02/21