Message ID | 1564048354001.54262@bt.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Invert Endian bit in SPARCv9 MMU TTE | expand |
On 7/25/19 11:52 AM, tony.nguyen@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.nguyen@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 > > >
On 7/25/19 9:45 PM, Philippe Mathieu-Daudé wrote: >On 7/25/19 11:52 AM, tony.nguyen@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.nguyen@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. SIZE_MEMOP() is used, and is the main change, in patches #3 to #10. Perhaps you meant MEMOP_SIZE()? Either way, you have raised an issue :) There is a lack of clarity in how the two macros are used to update the interfaces.?
On 7/26/19 8:03 AM, tony.nguyen@bt.com wrote: > On 7/25/19 9:45 PM, Philippe Mathieu-Daudé wrote: >>On 7/25/19 11:52 AM, tony.nguyen@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.nguyen@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. > > SIZE_MEMOP() is used, and is the main change, in patches #3 to #10. > Perhaps you > meant MEMOP_SIZE()? Eh, I inverted the macro names... :( Thanks for correcting me. > Either way, you have raised an issue :) > > There is a lack of clarity in how the two macros are used to update the > interfaces. > >
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. */ + #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;
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.nguyen@bt.com> --- include/exec/memop.h | 4 ++++ include/exec/memory.h | 9 +++++---- memory.c | 7 +++++-- 3 files changed, 14 insertions(+), 6 deletions(-) -- 1.8.3.1