On 7/25/19 11:52 AM, tony.ngu...@bt.com wrote: > Replacing size with size+sign+endianness (MemOp) will enable us to > collapse the two byte swaps, adjust_endianness and handle_bswap, along > the I/O path. > > While interfaces are converted, callers will have existing unsigned > size coerced into a MemOp, and the callee will use this MemOp as an > unsigned size. > > Signed-off-by: Tony Nguyen <tony.ngu...@bt.com> > --- > include/exec/memop.h | 4 ++++ > include/exec/memory.h | 9 +++++---- > memory.c | 7 +++++-- > 3 files changed, 14 insertions(+), 6 deletions(-) > > diff --git a/include/exec/memop.h b/include/exec/memop.h > index ac58066..09c8d20 100644 > --- a/include/exec/memop.h > +++ b/include/exec/memop.h > @@ -106,4 +106,8 @@ typedef enum MemOp { > MO_SSIZE = MO_SIZE | MO_SIGN, > } MemOp; > > +/* No-op while memory_region_dispatch_[read|write] is converted to MemOp */ > +#define MEMOP_SIZE(op) (op) /* MemOp to size. */ > +#define SIZE_MEMOP(ul) (ul) /* Size to MemOp. */
SIZE_MEMOP() is never used until patch #10 "memory: Access MemoryRegion with MemOp semantics", it would be clearer to only introduce the MEMOP_SIZE() no-op here, and directly introduce the correct SIZE_MEMOP() macro in patch #10. > + > #endif > diff --git a/include/exec/memory.h b/include/exec/memory.h > index bb0961d..30b1c58 100644 > --- a/include/exec/memory.h > +++ b/include/exec/memory.h > @@ -19,6 +19,7 @@ > #include "exec/cpu-common.h" > #include "exec/hwaddr.h" > #include "exec/memattrs.h" > +#include "exec/memop.h" > #include "exec/ramlist.h" > #include "qemu/queue.h" > #include "qemu/int128.h" > @@ -1731,13 +1732,13 @@ void mtree_info(bool flatview, bool dispatch_tree, > bool owner); > * @mr: #MemoryRegion to access > * @addr: address within that region > * @pval: pointer to uint64_t which the data is written to > - * @size: size of the access in bytes > + * @op: encodes size of the access in bytes > * @attrs: memory transaction attributes to use for the access > */ > MemTxResult memory_region_dispatch_read(MemoryRegion *mr, > hwaddr addr, > uint64_t *pval, > - unsigned size, > + MemOp op, > MemTxAttrs attrs); > /** > * memory_region_dispatch_write: perform a write directly to the specified > @@ -1746,13 +1747,13 @@ MemTxResult memory_region_dispatch_read(MemoryRegion > *mr, > * @mr: #MemoryRegion to access > * @addr: address within that region > * @data: data to write > - * @size: size of the access in bytes > + * @op: encodes size of the access in bytes > * @attrs: memory transaction attributes to use for the access > */ > MemTxResult memory_region_dispatch_write(MemoryRegion *mr, > hwaddr addr, > uint64_t data, > - unsigned size, > + MemOp op, > MemTxAttrs attrs); > > /** > diff --git a/memory.c b/memory.c > index 5d8c9a9..6982e19 100644 > --- a/memory.c > +++ b/memory.c > @@ -1439,10 +1439,11 @@ static MemTxResult > memory_region_dispatch_read1(MemoryRegion *mr, > MemTxResult memory_region_dispatch_read(MemoryRegion *mr, > hwaddr addr, > uint64_t *pval, > - unsigned size, > + MemOp op, > MemTxAttrs attrs) > { > MemTxResult r; > + unsigned size = MEMOP_SIZE(op); > > if (!memory_region_access_valid(mr, addr, size, false, attrs)) { > *pval = unassigned_mem_read(mr, addr, size); > @@ -1483,9 +1484,11 @@ static bool > memory_region_dispatch_write_eventfds(MemoryRegion *mr, > MemTxResult memory_region_dispatch_write(MemoryRegion *mr, > hwaddr addr, > uint64_t data, > - unsigned size, > + MemOp op, > MemTxAttrs attrs) > { > + unsigned size = MEMOP_SIZE(op); > + > if (!memory_region_access_valid(mr, addr, size, true, attrs)) { > unassigned_mem_write(mr, addr, data, size); > return MEMTX_DECODE_ERROR; > -- > 1.8.3.1 > > >