Il mer 24 dic 2025, 16:24 Philippe Mathieu-Daudé <philmd@linaro.org> ha
scritto:
> Introduce load/store helpers taking an unsigned size argument.
>
Are they used anywhere (or do you have plans)?
Overall I like the introduction of MemOp! But host endianness should be the
basis of everything else instead of something to shun.
Paolo
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
> docs/devel/loads-stores.rst | 10 ++++++----
> include/system/memory_ldst_endian.h.inc | 4 ++++
> system/memory_ldst_endian.c.inc | 14 ++++++++++++++
> 3 files changed, 24 insertions(+), 4 deletions(-)
>
> diff --git a/docs/devel/loads-stores.rst b/docs/devel/loads-stores.rst
> index c906c6509ee..8db6285538e 100644
> --- a/docs/devel/loads-stores.rst
> +++ b/docs/devel/loads-stores.rst
> @@ -375,6 +375,7 @@ succeeded using a MemTxResult return code.
> - ``w`` : 16 bits
> - ``l`` : 32 bits
> - ``q`` : 64 bits
> + - ``n`` : size in bytes
>
> ``endian``
> - ``le`` : little endian
> @@ -384,8 +385,8 @@ The ``_{endian}`` suffix is omitted for byte accesses.
>
> Regexes for git grep:
> - ``\<address_space_\(read\|write\|rw\)\>``
> - - ``\<address_space_ldu\?[bwql]\(_[lb]e\)\?\>``
> - - ``\<address_space_st[bwql]\(_[lb]e\)\?\>``
> + - ``\<address_space_ldu\?[bwlqn]\(_[lb]e\)\?\>``
> + - ``\<address_space_st[bwlqn]\(_[lb]e\)\?\>``
>
> ``address_space_write_rom``
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~
> @@ -431,6 +432,7 @@ device doing the access has no way to report such an
> error.
> - ``w`` : 16 bits
> - ``l`` : 32 bits
> - ``q`` : 64 bits
> + - ``n`` : size in bytes
>
> ``endian``
> - ``le`` : little endian
> @@ -439,8 +441,8 @@ device doing the access has no way to report such an
> error.
> The ``_{endian}_`` infix is omitted for byte accesses.
>
> Regexes for git grep:
> - - ``\<ldu\?[bwlq]\(_[bl]e\)\?_phys\>``
> - - ``\<st[bwlq]\(_[bl]e\)\?_phys\>``
> + - ``\<ldu\?[bwlqn]\(_[bl]e\)\?_phys\>``
> + - ``\<st[bwlqn]\(_[bl]e\)\?_phys\>``
>
> ``cpu_physical_memory_*``
> ~~~~~~~~~~~~~~~~~~~~~~~~~
> diff --git a/include/system/memory_ldst_endian.h.inc
> b/include/system/memory_ldst_endian.h.inc
> index f5b6b496be5..77850f1a18d 100644
> --- a/include/system/memory_ldst_endian.h.inc
> +++ b/include/system/memory_ldst_endian.h.inc
> @@ -20,12 +20,16 @@ uint32_t ADDRESS_SPACE_LD(l)(ARG1_DECL, hwaddr addr,
> MemTxAttrs attrs, MemTxResult *result);
> uint64_t ADDRESS_SPACE_LD(q)(ARG1_DECL, hwaddr addr,
> MemTxAttrs attrs, MemTxResult *result);
> +uint64_t ADDRESS_SPACE_LD(n)(ARG1_DECL, unsigned size, hwaddr addr,
> + MemTxAttrs attrs, MemTxResult *result);
> void ADDRESS_SPACE_ST(w)(ARG1_DECL, hwaddr addr, uint16_t val,
> MemTxAttrs attrs, MemTxResult *result);
> void ADDRESS_SPACE_ST(l)(ARG1_DECL, hwaddr addr, uint32_t val,
> MemTxAttrs attrs, MemTxResult *result);
> void ADDRESS_SPACE_ST(q)(ARG1_DECL, hwaddr addr, uint64_t val,
> MemTxAttrs attrs, MemTxResult *result);
> +void ADDRESS_SPACE_ST(n)(ARG1_DECL, unsigned size, hwaddr addr, uint64_t
> val,
> + MemTxAttrs attrs, MemTxResult *result);
>
> #undef ADDRESS_SPACE_LD
> #undef ADDRESS_SPACE_ST
> diff --git a/system/memory_ldst_endian.c.inc
> b/system/memory_ldst_endian.c.inc
> index fb933de11f8..4ff050027f5 100644
> --- a/system/memory_ldst_endian.c.inc
> +++ b/system/memory_ldst_endian.c.inc
> @@ -40,6 +40,13 @@ uint64_t ADDRESS_SPACE_LD(q)(ARG1_DECL, hwaddr addr,
> addr, attrs, result);
> }
>
> +uint64_t ADDRESS_SPACE_LD(n)(ARG1_DECL, unsigned size, hwaddr addr,
> + MemTxAttrs attrs, MemTxResult *result)
> +{
> + return ADDRESS_SPACE_LD_INTERNAL(m)(ARG1, MO_ENDIAN |
> size_memop(size),
> + addr, attrs, result);
> +}
> +
> void ADDRESS_SPACE_ST(w)(ARG1_DECL, hwaddr addr, uint16_t val,
> MemTxAttrs attrs, MemTxResult *result)
> {
> @@ -61,6 +68,13 @@ void ADDRESS_SPACE_ST(q)(ARG1_DECL, hwaddr addr,
> uint64_t val,
> addr, val, attrs, result);
> }
>
> +void ADDRESS_SPACE_ST(n)(ARG1_DECL, unsigned size, hwaddr addr, uint64_t
> val,
> + MemTxAttrs attrs, MemTxResult *result)
> +{
> + ADDRESS_SPACE_ST_INTERNAL(m)(ARG1, MO_ENDIAN | size_memop(size),
> + addr, val, attrs, result);
> +}
> +
> #undef ADDRESS_SPACE_LD
> #undef ADDRESS_SPACE_LD_INTERNAL
> #undef ADDRESS_SPACE_ST
> --
> 2.52.0
>
>