[PATCH-for-12.0 v2 00/12] linux-user/aarch64: Support both endianness at runtime

Philippe Mathieu-Daudé posted 12 patches 2 days, 6 hours ago
Failed in applying to current master (apply log)
There is a newer version of this series
docs/about/deprecated.rst                 | 23 +++++++++++++
docs/user/main.rst                        | 18 +++++++++--
configure                                 | 12 ++++++-
configs/targets/aarch64-linux-user.mak    |  2 ++
configs/targets/aarch64_be-linux-user.mak | 10 ------
configs/targets/arm-linux-user.mak        |  2 ++
configs/targets/armeb-linux-user.mak      |  9 ------
meson.build                               | 39 +++++++++++++++++++++--
include/exec/tswap.h                      | 11 ++++---
include/qemu/target-info-def.h            | 14 ++++++++
include/qemu/target-info.h                | 20 ++++++++++++
linux-user/aarch64/target_elf.h           |  6 +---
linux-user/aarch64/target_syscall.h       |  6 +---
linux-user/arm/target_proc.h              | 20 ++++--------
linux-user/arm/target_syscall.h           |  6 +---
linux-user/qemu.h                         | 17 +++++++++-
linux-user/syscall_defs.h                 |  7 ----
target/arm/cpu.h                          | 10 ++++--
target/arm/internals.h                    |  2 +-
linux-user/aarch64/cpu_loop.c             | 12 +++----
linux-user/aarch64/elfload.c              | 10 +++++-
linux-user/aarch64/signal.c               | 20 ++++--------
linux-user/arm/cpu_loop.c                 |  2 +-
linux-user/arm/elfload.c                  | 36 +++++++--------------
linux-user/elfload.c                      |  6 +---
linux-user/main.c                         | 26 +++++++++++++++
linux-user/syscall.c                      |  6 ++--
linux-user/uname.c                        | 13 ++------
target-info-def.c                         | 19 +++++++++++
target/arm/gdbstub64.c                    |  4 +--
target/arm/tcg/translate-sve.c            |  2 +-
tests/tcg/aarch64_be/hello.c              | 16 ++++++----
tests/tcg/arm/hello-arm-be.c              | 34 ++++++++++++++++++++
tests/tcg/arm/hello-arm-be32.c            |  4 +++
.gitlab-ci.d/buildtest.yml                |  2 +-
.gitlab-ci.d/crossbuild-template.yml      |  4 +--
linux-user/aarch64/meson.build            | 10 +++---
linux-user/arm/meson.build                |  4 ---
tests/tcg/aarch64_be/meson.build          |  4 +--
tests/tcg/arm/hello-arm.ref               |  1 +
tests/tcg/arm/meson.build                 | 11 +++++++
41 files changed, 323 insertions(+), 157 deletions(-)
delete mode 100644 configs/targets/aarch64_be-linux-user.mak
delete mode 100644 configs/targets/armeb-linux-user.mak
create mode 100644 tests/tcg/arm/hello-arm-be.c
create mode 100644 tests/tcg/arm/hello-arm-be32.c
create mode 100644 tests/tcg/arm/hello-arm.ref
[PATCH-for-12.0 v2 00/12] linux-user/aarch64: Support both endianness at runtime
Posted by Philippe Mathieu-Daudé 2 days, 6 hours ago
Since v1:
- add ./configure error msg
- cover ARM32

This series lets qemu-aarch64 run both little- and big-endian
ELF binaries, retaining qemu-aarch64_be as a compatibility alias.

The ELF loader selects the target byte order once, before execution.
AArch64 CPU, signal, ABI and vDSO handling then use that selection.
Fixed-endian targets and system emulation retain their existing
accessors.

Runtime-endian TargetInfo data is exposed const to readers, allowing
target_big_endian() to be inlined without a separate boolean cache.
The writable initializer remains outside LTO, preserving the boundary
between ELF initialization and subsequent reads.

I compared the complete series against its baseline, with normal and
LTO builds and LE/BE guests and did not notice significative speed
down.

The inspiration comes from previous optimization intent from Richard:
https://lore.kernel.org/qemu-devel/20260511190634.472174-1-richard.henderson@linaro.org/

Philippe Mathieu-Daudé (12):
  tests/tcg/aarch64_be: Check data byte order in hello
  tests/tcg/arm: Add BE8 and BE32 hello tests
  linux-user/aarch64: Move ELF/vDSO endian checks to runtime
  linux-user/aarch64: Move CPU/signal endian checks to runtime
  linux-user/arm: Move ELF/vDSO endian checks to runtime
  linux-user/arm: Move CPU endian checks to runtime
  target-info: Support runtime-endian Linux-user targets
  linux-user: Honor runtime byte order in ABI accesses
  linux-user: Select target byte order from the ELF header
  meson: Support Linux-user executable aliases
  linux-user/aarch64: Unify both endianness under qemu-aarch64
  linux-user/arm: Unify both endianness under qemu-arm

 docs/about/deprecated.rst                 | 23 +++++++++++++
 docs/user/main.rst                        | 18 +++++++++--
 configure                                 | 12 ++++++-
 configs/targets/aarch64-linux-user.mak    |  2 ++
 configs/targets/aarch64_be-linux-user.mak | 10 ------
 configs/targets/arm-linux-user.mak        |  2 ++
 configs/targets/armeb-linux-user.mak      |  9 ------
 meson.build                               | 39 +++++++++++++++++++++--
 include/exec/tswap.h                      | 11 ++++---
 include/qemu/target-info-def.h            | 14 ++++++++
 include/qemu/target-info.h                | 20 ++++++++++++
 linux-user/aarch64/target_elf.h           |  6 +---
 linux-user/aarch64/target_syscall.h       |  6 +---
 linux-user/arm/target_proc.h              | 20 ++++--------
 linux-user/arm/target_syscall.h           |  6 +---
 linux-user/qemu.h                         | 17 +++++++++-
 linux-user/syscall_defs.h                 |  7 ----
 target/arm/cpu.h                          | 10 ++++--
 target/arm/internals.h                    |  2 +-
 linux-user/aarch64/cpu_loop.c             | 12 +++----
 linux-user/aarch64/elfload.c              | 10 +++++-
 linux-user/aarch64/signal.c               | 20 ++++--------
 linux-user/arm/cpu_loop.c                 |  2 +-
 linux-user/arm/elfload.c                  | 36 +++++++--------------
 linux-user/elfload.c                      |  6 +---
 linux-user/main.c                         | 26 +++++++++++++++
 linux-user/syscall.c                      |  6 ++--
 linux-user/uname.c                        | 13 ++------
 target-info-def.c                         | 19 +++++++++++
 target/arm/gdbstub64.c                    |  4 +--
 target/arm/tcg/translate-sve.c            |  2 +-
 tests/tcg/aarch64_be/hello.c              | 16 ++++++----
 tests/tcg/arm/hello-arm-be.c              | 34 ++++++++++++++++++++
 tests/tcg/arm/hello-arm-be32.c            |  4 +++
 .gitlab-ci.d/buildtest.yml                |  2 +-
 .gitlab-ci.d/crossbuild-template.yml      |  4 +--
 linux-user/aarch64/meson.build            | 10 +++---
 linux-user/arm/meson.build                |  4 ---
 tests/tcg/aarch64_be/meson.build          |  4 +--
 tests/tcg/arm/hello-arm.ref               |  1 +
 tests/tcg/arm/meson.build                 | 11 +++++++
 41 files changed, 323 insertions(+), 157 deletions(-)
 delete mode 100644 configs/targets/aarch64_be-linux-user.mak
 delete mode 100644 configs/targets/armeb-linux-user.mak
 create mode 100644 tests/tcg/arm/hello-arm-be.c
 create mode 100644 tests/tcg/arm/hello-arm-be32.c
 create mode 100644 tests/tcg/arm/hello-arm.ref

-- 
2.55.0

Re: [PATCH-for-12.0 v2 00/12] linux-user/aarch64: Support both endianness at runtime
Posted by Richard Henderson 1 day, 5 hours ago
On 11/12/26 11:08, Philippe Mathieu-Daudé wrote:
> Since v1:
> - add ./configure error msg
> - cover ARM32
> 
> This series lets qemu-aarch64 run both little- and big-endian
> ELF binaries, retaining qemu-aarch64_be as a compatibility alias.

Why would we want to do this?  qemu-aarch64_be exists, but is 
essentially unused.  It's certainly not supported by upstream Linux.

Having runtime selection of endianness seems silly within that context.


r~

Re: [PATCH-for-12.0 v2 00/12] linux-user/aarch64: Support both endianness at runtime
Posted by Peter Maydell 1 day, 5 hours ago
On Fri, 13 Nov 2026 at 18:39, Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> On 11/12/26 11:08, Philippe Mathieu-Daudé wrote:
> > Since v1:
> > - add ./configure error msg
> > - cover ARM32
> >
> > This series lets qemu-aarch64 run both little- and big-endian
> > ELF binaries, retaining qemu-aarch64_be as a compatibility alias.
>
> Why would we want to do this?  qemu-aarch64_be exists, but is
> essentially unused.  It's certainly not supported by upstream Linux.

I know the kernel just dropped big-endian kernel support
recently, but did that also extend to userspace ?

(We should check with the kernel and gcc folks about
whether/when it makes sense to deprecate qemu-aarch64_be.)

> Having runtime selection of endianness seems silly within that context.

As a more general question, is this something we would want
for architectures where both endiannesses are relevant (e.g.
mips, ppc64)? At the moment we consistently for all targets
handle big vs little endian as "it's a separate target with
its own executable". That's convenient because you can at
compile time hardwire in things like variations in struct
layout between the two. We could switch to doing that kind
of thing at runtime, but what is the benefit we're aiming
for by doing that?

thanks
-- PMM