There are two supported methods of booting FreeBSD/arm64 under QEMU: using U-Boot, or using an UEFI firmware image. To use U-Boot, install u-boot-qemu-arm64 package, and then run:

% qemu-system-aarch64 -m 4096M -cpu cortex-a57 -M virt  \
    -bios /usr/local/share/u-boot/u-boot-qemu-arm64/u-boot.bin \
    -serial telnet::4444,server -nographic \
    -drive if=none,file=VMDISK,id=hd0 \
    -device virtio-blk-device,drive=hd0 \
    -device virtio-net-device,netdev=net0 \
    -netdev user,id=net0

Be sure to replace “VMDISK” with the path to the virtual machine image.

Prepopulated images are available under https://download.freebsd.org/releases/VM-IMAGES/ or https://download.freebsd.org/snapshots/VM-IMAGES/

Qemu comes with a UEFI firmware image. To boot the VM image run:

% qemu-system-aarch64 -m 4096M -cpu cortex-a57 -M virt  \
    -bios edk2-aarch64-code.fd -serial telnet::4444,server -nographic \
    -drive if=none,file=VMDISK,id=hd0 \
    -device virtio-blk-device,drive=hd0 \
    -device virtio-net-device,netdev=net0 \
    -netdev user,id=net0

Be sure to replace “VMDISK” with the path to the virtual machine image.

NOTE: if you are booting a 12.x image, use -device virtio-blk,drive=hd0 and -device virtio-net,netdev=net0 instead, e.g.:

% qemu-system-aarch64 -m 4096M -cpu cortex-a57 -M virt  \
    -bios edk2-aarch64-code.fd -serial telnet::4444,server -nographic \
    -drive if=none,file=VMDISK,id=hd0 \
    -device virtio-blk,drive=hd0 \
    -device virtio-net,netdev=net0 \
    -netdev user,id=net0

To connect to the virtual console run telnet localhost 4444.

To boot on ThunderX under KVM:

% qemu-system-aarch64 -m 4096M -cpu host,pmu=off -M virt,gic-version=3 \
    -bios QEMU_EFI.fd -serial telnet::4444,server -nographic \
    -drive if=none,file=VMDISK,id=hd0 \
    -device virtio-blk-device,drive=hd0 \
    --enable-kvm

To boot on Apple Silicon hardware (M1, M2) and macOS with HVF acceleration:

% qemu-system-aarch64 -m 4096M -cpu host -M virt,accel=hvf \
    -bios edk2-aarch64-code.fd -serial telnet::4444,server -nographic \
    -drive if=virtio,file=VMDISK,id=hd0 \
    -device virtio-net,netdev=net0 -netdev user,id=net0