diff mbox

[v5,05/11] exec: allows 8-byte accesses in subpage_ops

Message ID 1418850613-26821-6-git-send-email-lersek@redhat.com
State New
Headers show

Commit Message

Laszlo Ersek Dec. 17, 2014, 9:10 p.m. UTC
From: Paolo Bonzini <pbonzini@redhat.com>

Otherwise fw_cfg accesses are split into 4-byte ones before they reach the
fw_cfg ops / handlers.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
---

Notes:
    v5:
    - new in v5 [reported by Laszlo, fixed by Paolo]

 exec.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)
diff mbox

Patch

diff --git a/exec.c b/exec.c
index 963481a..619e046 100644
--- a/exec.c
+++ b/exec.c
@@ -1767,9 +1767,9 @@  static const MemoryRegionOps watch_mem_ops = {
 static uint64_t subpage_read(void *opaque, hwaddr addr,
                              unsigned len)
 {
     subpage_t *subpage = opaque;
-    uint8_t buf[4];
+    uint8_t buf[8];
 
 #if defined(DEBUG_SUBPAGE)
     printf("%s: subpage %p len %u addr " TARGET_FMT_plx "\n", __func__,
            subpage, len, addr);
@@ -1781,8 +1781,10 @@  static uint64_t subpage_read(void *opaque, hwaddr addr,
     case 2:
         return lduw_p(buf);
     case 4:
         return ldl_p(buf);
+    case 8:
+        return ldq_p(buf);
     default:
         abort();
     }
 }
@@ -1790,9 +1792,9 @@  static uint64_t subpage_read(void *opaque, hwaddr addr,
 static void subpage_write(void *opaque, hwaddr addr,
                           uint64_t value, unsigned len)
 {
     subpage_t *subpage = opaque;
-    uint8_t buf[4];
+    uint8_t buf[8];
 
 #if defined(DEBUG_SUBPAGE)
     printf("%s: subpage %p len %u addr " TARGET_FMT_plx
            " value %"PRIx64"\n",
@@ -1807,8 +1809,11 @@  static void subpage_write(void *opaque, hwaddr addr,
         break;
     case 4:
         stl_p(buf, value);
         break;
+    case 8:
+        stq_p(buf, value);
+        break;
     default:
         abort();
     }
     address_space_write(subpage->as, addr + subpage->base, buf, len);
@@ -1829,8 +1834,12 @@  static bool subpage_accepts(void *opaque, hwaddr addr,
 
 static const MemoryRegionOps subpage_ops = {
     .read = subpage_read,
     .write = subpage_write,
+    .impl.min_access_size = 1,
+    .impl.max_access_size = 8,
+    .valid.min_access_size = 1,
+    .valid.max_access_size = 8,
     .valid.accepts = subpage_accepts,
     .endianness = DEVICE_NATIVE_ENDIAN,
 };