On 10/27/25 18:00, Danila Zhebryakov wrote:
These changes make powerpc booke206 mmu pass TLB_BSWAP flag for pages marked as 
LE, and also fixes all the issues this causes.
  - added TLB_BSWAP to non-MMIO flags
  - inserted additional check for LE page when bswap-ing instructions
  - removed assert for cross-page TLB_BSWAP accesses
  - added gdbstub fix to account for TLB_BSWAP of the currently running code

BE- and LE- atomic operations (used by load-and-reserve and store-conditional 
instructions) were unified to support TLB_BSWAP

Some of the fixes are based on what is done in 
https://github.com/YetAnotherMod/qemu

V2:
  - Removed usage of PAGE_USER bit for LE (comment on previous version)
  - Refactored MMU code so directly setting TLB_BSWAP is possible
  - moved translation LE page detect to occur 1 time per translation (comment 
on previous version)
  - Removed redundant assert in atomic_mmu_lookup (comment on previous version)
  - Added assert on cross-endian accesses (ideally, there should be an 
exception)
  - Changed atomic need_bswap handling (comment on previous version)
  - Rebased and fixed atomics

V3
  - unfix assumed typo (if vs iff). Everything else unchanged

V4
  - fix leftovers from BE/LE atomic op tables
  - fix uninitialized CPUTLBEntryFull full in mmu_common

According to RM, unaligned accesses between LE and BE pages should cause an 
exception on e500.
However, (as I understand it) supporting this would require adding a new 
callback to TCGCPUOps, likely just for E500 or maybe a couple other CPUs doing 
this.
Such accesses are clearly not normal and usually don't occur in real 
applications, so I think just placing assert is OK here.

Danila Zhebryakov (4):
   accel/tcg: Unify big- and little- endian atomic ops
   target/ppc: refactor MMU helpers
   target/ppc: Add support for LE pages on PowerPC booke206 mmu
   target/ppc: fix GDB stub to work correctly with LE pages

  accel/tcg/atomic_common.c.inc       |  36 +--
  accel/tcg/atomic_template.h         | 326 ++++++++++------------------
  accel/tcg/cputlb.c                  |  29 ++-
  accel/tcg/tcg-runtime.h             |  48 +---
  accel/tcg/user-exec.c               |   2 +-
  include/accel/tcg/cpu-ldst-common.h |  51 ++---
  target/m68k/op_helper.c             |   4 +-
  target/ppc/gdbstub.c                |  17 +-
  target/ppc/internal.h               |   3 +-
  target/ppc/mmu-booke.c              |  67 +++---
  target/ppc/mmu-booke.h              |   2 +-
  target/ppc/mmu-hash32.c             |  30 +--
  target/ppc/mmu-hash32.h             |   3 +-
  target/ppc/mmu-hash64.c             |  14 +-
  target/ppc/mmu-hash64.h             |   2 +-
  target/ppc/mmu-radix64.c            |  20 +-
  target/ppc/mmu-radix64.h            |   2 +-
  target/ppc/mmu_common.c             |  75 ++++---
  target/ppc/mmu_helper.c             |  15 +-
  target/ppc/translate.c              |  42 +++-
  target/s390x/tcg/mem_helper.c       |   6 +-
  tcg/tcg-op-ldst.c                   |  51 ++---
  22 files changed, 374 insertions(+), 471 deletions(-)

Hey Danila,

This series is failing on QEMU_CI. You can check it here :
https://gitlab.com/rathc/qemu/-/pipelines/2131344109

<https://gitlab.com/rathc/qemu/-/pipelines/2131344109>

Here are some logs for quick reference :

|configuring with: '../configure' '--enable-werror' '--disable-docs' '--cross-prefix=powerpc64le-linux-gnu-' '--disable-tools' '--enable-kvm' '--disable-tcg' '--without-default-devices'
...
|||

|[1690/1838] Linking target qemu-system-ppc64|
|
||
FAILED: qemu-system-ppc64
||
powerpc64le-linux-gnu-gcc -m64 -mlittle-endian @qemu-system-ppc64.rsp
||
/usr/lib/gcc-cross/powerpc64le-linux-gnu/14/../../../../powerpc64le-linux-gnu/bin/ld: libqemu-ppc64-softmmu.a.p/target_ppc_gdbstub.c.o: in function `ppc_maybe_bswap_register':
||
/builds/rathc/qemu/build/../target/ppc/gdbstub.c:96:(.text+0xd0): undefined reference to `probe_access_full_mmu'
||
collect2: error: ld returned 1 exit status
||
[1691/1838] Linking target qemu-system-ppc
||
FAILED: qemu-system-ppc
||
powerpc64le-linux-gnu-gcc -m64 -mlittle-endian @qemu-system-ppc.rsp
||
/usr/lib/gcc-cross/powerpc64le-linux-gnu/14/../../../../powerpc64le-linux-gnu/bin/ld: libqemu-ppc-softmmu.a.p/target_ppc_gdbstub.c.o: in function `ppc_maybe_bswap_register':
||
/builds/rathc/qemu/build/../target/ppc/gdbstub.c:96:(.text+0xd0): undefined reference to `probe_access_full_mmu'
||
collect2: error: ld returned 1 exit status
||
[1692/1838] Generating pc-bios/edk2-arm-code.fd with a custom command (wrapped by meson to capture output)
||
ninja: build stopped: subcommand failed.
||make: *** [Makefile:168: run-ninja] Error 1
|
Thanks and regards,

Chinmay


Reply via email to