diff options
-rw-r--r-- | system/physmem.c | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/system/physmem.c b/system/physmem.c index e92bed50a6..e35aa29343 100644 --- a/system/physmem.c +++ b/system/physmem.c @@ -2688,10 +2688,7 @@ static MemTxResult flatview_write_continue(FlatView *fv, hwaddr addr, hwaddr len, hwaddr mr_addr, hwaddr l, MemoryRegion *mr) { - uint8_t *ram_ptr; - uint64_t val; MemTxResult result = MEMTX_OK; - bool release_lock = false; const uint8_t *buf = ptr; for (;;) { @@ -2699,7 +2696,9 @@ static MemTxResult flatview_write_continue(FlatView *fv, hwaddr addr, result |= MEMTX_ACCESS_ERROR; /* Keep going. */ } else if (!memory_access_is_direct(mr, true)) { - release_lock |= prepare_mmio_access(mr); + uint64_t val; + bool release_lock = prepare_mmio_access(mr); + l = memory_access_size(mr, l, mr_addr); /* XXX: could force current_cpu to NULL to avoid potential bugs */ @@ -2717,18 +2716,21 @@ static MemTxResult flatview_write_continue(FlatView *fv, hwaddr addr, val = ldn_he_p(buf, l); result |= memory_region_dispatch_write(mr, mr_addr, val, size_memop(l), attrs); + if (release_lock) { + bql_unlock(); + } + + } else { /* RAM case */ - ram_ptr = qemu_ram_ptr_length(mr->ram_block, mr_addr, &l, false); + + uint8_t *ram_ptr = qemu_ram_ptr_length(mr->ram_block, mr_addr, &l, + false); + memmove(ram_ptr, buf, l); invalidate_and_set_dirty(mr, mr_addr, l); } - if (release_lock) { - bql_unlock(); - release_lock = false; - } - len -= l; buf += l; addr += l; @@ -2767,10 +2769,7 @@ MemTxResult flatview_read_continue(FlatView *fv, hwaddr addr, hwaddr len, hwaddr mr_addr, hwaddr l, MemoryRegion *mr) { - uint8_t *ram_ptr; - uint64_t val; MemTxResult result = MEMTX_OK; - bool release_lock = false; uint8_t *buf = ptr; fuzz_dma_read_cb(addr, len, mr); @@ -2780,7 +2779,9 @@ MemTxResult flatview_read_continue(FlatView *fv, hwaddr addr, /* Keep going. */ } else if (!memory_access_is_direct(mr, false)) { /* I/O case */ - release_lock |= prepare_mmio_access(mr); + uint64_t val; + bool release_lock = prepare_mmio_access(mr); + l = memory_access_size(mr, l, mr_addr); result |= memory_region_dispatch_read(mr, mr_addr, &val, size_memop(l), attrs); @@ -2796,17 +2797,16 @@ MemTxResult flatview_read_continue(FlatView *fv, hwaddr addr, (l == 8 && len >= 8)); #endif stn_he_p(buf, l, val); + if (release_lock) { + bql_unlock(); + } } else { /* RAM case */ - ram_ptr = qemu_ram_ptr_length(mr->ram_block, mr_addr, &l, false); + uint8_t *ram_ptr = qemu_ram_ptr_length(mr->ram_block, mr_addr, &l, + false); memcpy(buf, ram_ptr, l); } - if (release_lock) { - bql_unlock(); - release_lock = false; - } - len -= l; buf += l; addr += l; |