memory_region_dispatch_read|write, when dealing with an invalid memory
region, default to MEMTX_DECODE_ERROR error code.  This happens because
memory_region_access_valid() until recently would just report true/false
and nothing else.

We now have access to the internal reason why memory_region_access_valid()
would fail.  In particular, we can now receive a MEMTX_ACCESS_ERROR when
the mr->ops->valid.accepts() callback fails.

Make both functions return the actual error reason in case
memory_region_access_valid fails, allowing more precise error handling
throughout the code.

Signed-off-by: Daniel Henrique Barboza <[email protected]>
---
 system/memory.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/system/memory.c b/system/memory.c
index 48348edb96..7d38b9774e 100644
--- a/system/memory.c
+++ b/system/memory.c
@@ -1492,9 +1492,9 @@ MemTxResult memory_region_dispatch_read(MemoryRegion *mr,
                                            mr->alias_offset + addr,
                                            pval, op, attrs);
     }
-    if (!memory_region_access_valid(mr, addr, size, false, attrs, NULL)) {
+    if (!memory_region_access_valid(mr, addr, size, false, attrs, &r)) {
         *pval = unassigned_mem_read(mr, addr, size);
-        return MEMTX_DECODE_ERROR;
+        return r;
     }
 
     r = memory_region_dispatch_read1(mr, addr, pval, size, attrs);
@@ -1535,15 +1535,16 @@ MemTxResult memory_region_dispatch_write(MemoryRegion 
*mr,
                                          MemTxAttrs attrs)
 {
     unsigned size = memop_size(op);
+    MemTxResult r;
 
     if (mr->alias) {
         return memory_region_dispatch_write(mr->alias,
                                             mr->alias_offset + addr,
                                             data, op, attrs);
     }
-    if (!memory_region_access_valid(mr, addr, size, true, attrs, NULL)) {
+    if (!memory_region_access_valid(mr, addr, size, true, attrs, &r)) {
         unassigned_mem_write(mr, addr, data, size);
-        return MEMTX_DECODE_ERROR;
+        return r;
     }
 
     adjust_endianness(mr, &data, op);
-- 
2.43.0


Reply via email to