qemu-system-aarch64 Segfaults
Host environment
- Operating system: Linux Mint 21.3 Cinnamon
- OS/kernel version: 6.5.0-15-generic
- Architecture: x86_64
- QEMU flavor: qemu-system-aarch64
- QEMU version: 8.2.50 (v8.2.0-924-gbd2e1231), 8.2.1, 6.2.0 (Debian 1:6.2+dfsg-2ubuntu6.16)
- QEMU command line: ./qemu-system-aarch64
-M virt -m 6G -cpu cortex-a72
-kernel vmlinuz-6.1.0-17-arm64
-initrd initrd.img-6.1.0-17-arm64
-append 'root=/dev/vda2'
-drive if=none,file=hda.qcow2,format=qcow2,id=hd
-device virtio-blk-pci,drive=hd
-netdev user,id=mynet,hostfwd=tcp::10022-:22
-device virtio-net-pci,netdev=mynet
-nographic
-accel tcg,thread=multi
-smp 8
Emulated/Virtualized environment
- Operating system: Debian GNU/Linux 12
- OS/kernel version: 6.1.0-17-arm64
- Architecture: aarch64
Description of problem
Never finishes the script below always segfaults after a few hours in seemingly random functions.
Steps to reproduce
This is what i did with qemu version 8.2.1 inside test directory:
- wget https://download.qemu.org/qemu-8.2.1.tar.xz
- tar xvJf qemu-8.2.1.tar.xz
- cd qemu-8.2.1
- ./configure --target-list="aarch64-linux-user, aarch64-softmmu" --enable-slirp (crashes with and without --enable-debug)
- make -j$(nproc)
- ln -sf "$PWD/build/qemu-system-aarch64" "../qemu-system-aarch64"
- cd ..
Now the VM
- wget -O installer-linux https://deb.debian.org/debian/dists/bookworm/main/installer-arm64/current/images/netboot/debian-installer/arm64/linux
- wget -O installer-initrd.gz https://deb.debian.org/debian/dists/bookworm/main/installer-arm64/current/images/netboot/debian-installer/arm64/initrd.gz
- qemu-img create -f qcow2 hda.qcow2 15G
- ./qemu-system-aarch64 -M virt -m 6G -cpu cortex-a72
-kernel installer-linux
-initrd installer-initrd.gz
-drive if=none,file=hda.qcow2,format=qcow2,id=hd
-device virtio-blk-pci,drive=hd
-netdev user,id=mynet
-device virtio-net-pci,netdev=mynet
-nographic -no-reboot
-accel tcg,thread=multi
-smp 8 - Install minimal debian inside the VM
- sudo virt-copy-out -a hda.qcow2 /boot/vmlinuz-6.1.0-17-arm64 /boot/initrd.img-6.1.0-17-arm64 .
- ./qemu-system-aarch64 -M virt -m 6G -cpu cortex-a72
-kernel vmlinuz-6.1.0-17-arm64
-initrd initrd.img-6.1.0-17-arm64
-append 'root=/dev/vda2'
-drive if=none,file=hda.qcow2,format=qcow2,id=hd
-device virtio-blk-pci,drive=hd
-netdev user,id=mynet,hostfwd=tcp::10022-:22
-device virtio-net-pci,netdev=mynet
-nographic
-accel tcg,thread=multi
-smp 8 - Now run this script inside some directory inside the VM(you might need to install gcc first)
#!/bin/bash
wget --no-clobber https://sourceware.org/pub/binutils/releases/binutils-2.41.tar.xz
wget --no-clobber https://ftp.gnu.org/gnu/mpfr/mpfr-4.2.0.tar.xz
wget --no-clobber https://ftp.gnu.org/gnu/gmp/gmp-6.3.0.tar.xz
wget --no-clobber https://ftp.gnu.org/gnu/mpc/mpc-1.3.1.tar.gz
wget --no-clobber https://ftp.gnu.org/gnu/gcc/gcc-13.2.0/gcc-13.2.0.tar.xz
BUG_TARGET="$(uname -m)-bug-linux-gnu"
tar -xf binutils-2.41.tar.xz
cd binutils-2.41
mkdir -vp build
cd build
../configure --prefix=$PWD
--with-sysroot=$PWD
--target=$BUG_TARGET
--disable-nls
--enable-gprofng=no
--disable-werror
--disable-gdb
make --jobs $(nproc)
cd ../..
rm -rf binutils
tar -xf gcc-13.2.0.tar.xz
cd gcc-13.2.0
tar -xf ../mpfr-4.2.0.tar.xz
tar -xf ../gmp-6.3.0.tar.xz
tar -xf ../mpc-1.3.1.tar.gz
mv mpfr-4.2.0 mpfr
mv gmp-6.3.0 gmp
mv mpc-1.3.1 mpc
mkdir -vp build
cd build
../configure --prefix=$PWD
--with-sysroot=$PWD
--target=$BUG_TARGET
--with-glibc-version=2.38
--with-newlib
--without-headers
--enable-default-pie
--enable-default-ssp
--disable-nls
--disable-shared
--disable-multilib
--disable-threads
--disable-libatomic
--disable-libgomp
--disable-libquadmath
--disable-libssp
--disable-libvtv
--disable-libstdcxx
--enable-languages=c,c++
make --jobs $(nproc)
cd ../..
rm -rf gcc
Additional information
I tried all the versions listed above, 6.2 usually segfaults in binutils while the other two run further.
Example: Program terminated with signal SIGSEGV, Segmentation fault. #0 0x000055555615dd37 in tlb_index (cpu=<Cannot access memory at address 0x7fffefffe1c8>, mmu_idx=<Cannot access memory at address 0x7fffefffe1c0>, addr=<Cannot access memory at address 0x7fffefffe1b8>) at qemu-8.2.1/include/exec/cpu_ldst.h:367 367 uintptr_t size_mask = cpu->neg.tlb.f[mmu_idx].mask >> CPU_TLB_ENTRY_BITS; [Current thread is 1 (LWP 857562)]