Skip to content

x86_64 emu on aarch64 host: cpu_exec: assertion failed: (cpu == current_cpu)

Host environment

  • Operating system: Asahi Linux
  • OS/kernel version: Linux xxxx 5.19.0-rc7-asahi-2-1-ARCH #1 SMP PREEMPT_DYNAMIC Sat, 23 Jul 2022 15:19:32 +0000 aarch64 GNU/Linux
  • Architecture: aarch64
  • QEMU flavor: qemu-x86_64-static
  • QEMU version: 7.0.0
  • QEMU command line: N/A

Emulated/Virtualized environment

  • Operating system: Ubuntu 22.04 LTS
  • OS/kernel version: N/A
  • Architecture: x86_64

Description of problem

Execution of some binaries crashes with Bail out! ERROR:../qemu-7.0.0/accel/tcg/cpu-exec.c:933:cpu_exec: assertion failed: (cpu == current_cpu). Looking at the code, that code is wrapped in a gcc/clang ifdef. Recompiling with clang produces this crash instead: ... include/qemu/rcu.h:102: void rcu_read_unlock(void): Assertion 'p_rcu_reader->depth != 0' failed.

No easier steps to reproduce (yet) than systemd-nspawning into an x86_64 Ubuntu container invoking qemu-x86_64-static through binfmt. Commands such as ls work fine, while apt-get will immediately crash with the error listed above.

Note that this happens running Asahi Linux on the bare metal of an M1-based Macbook Pro. This same issue does not occur running the same binaries with the same x86_64 Ubuntu image on an Arch or Ubuntu VM under macOS on the same machine - regardless of if the QEMU binaries were built in a VM or in Asahi.

These are big.LITTLE chips. Using taskset/affinity to limit the target process to a single specific core does not help. The Asahi kernel has a 16K page-size, which is known to cause trouble for some programs. qemu-arm(-static) however works without any issues (the M1 cannot run 32-bit ARM code natively, only 64-bit).

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information