#!/bin/bash print_usage() { echo "Usage: $(basename $0) --arch [arm|arm64] [options]" echo -e "Starts QEMU system mode emulation for the architecture.\n" echo -e " --help\t\t\tDisplay this information." echo -e " --arch {arm|arm64}\t\tSelects architecture QEMU system emulation." echo -e " --sve\t\t\t\tEnables AArch64 SVE mode." echo -e " --mte\t\t\t\tEnables AArch64 MTE mode.\n" echo -e " --rootfs {path}\t\tPath of root file system image." echo -e " --qemu {path}\t\t\tPath of pre-installed qemu-system-* executable." echo -e " --kernel {path}\t\tPath of Linux kernel prebuilt image.\n" echo -e "By default this utility will use:" echo -e " QEMU image built from source in qemu.git directory" echo -e " Linux kernel image from linux.build/(arm or arm64) directory." echo -e "Custom Linux kernel image or QEMU binary can be provided using commandline." exit "$1" } invalid_arg() { echo "ERROR: Unrecognized argument: $1" >&2 print_usage 1 } run_qemu() { QEMU_CORES=2 QEMU_MEMORY=1024 $QEMU_BIN \ -cpu $QEMU_CPU \ -m $QEMU_MEMORY \ -smp $QEMU_CORES \ -kernel $KERNEL_IMG \ -machine $QEMU_MACHINE \ -drive file=$ROOTFS_IMG,if=none,format=raw,id=hd0 \ -device virtio-blk-device,drive=hd0 \ -append "root=/dev/vda rw ip=dhcp mem=1024M raid=noautodetect \ crashkernel=128M rootwait console=ttyAMA0 devtmpfs.mount=0" \ -netdev type=tap,id=net0 \ -device virtio-net-device,netdev=net0 \ -nographic } # Parse options while [[ $# -gt 0 ]]; do case "${END_OF_OPT}${1}" in --arch) ARCH=$2; shift;; --rootfs) ROOTFS_IMG=$2; shift;; --kernel) KERNEL_IMG=$2; shift;; --qemu) QEMU_BIN=$2; shift;; --sve) SVE=1;; --mte) MTE=1;; --help) print_usage 0 ;; *) invalid_arg "$1" ;; esac shift done if [ "$ARCH" == "arm64" ] && [ "$ARCH" == "arm" ]; then echo "Invalid architecture: $ARCH" print_usage 1 fi if [[ ! -f "$ROOTFS_IMG" ]]; then echo "No root file system image image available for emulation." exit fi if [[ ! -f "$KERNEL_IMG" ]]; then KERNEL_IMG_PATH=$(pwd)/linux.build/"$ARCH"/arch/"$ARCH"/boot/ if [[ ! -d "$KERNEL_IMG_PATH" ]]; then echo "No Linux kernel image available for emulation." exit fi if [[ "$ARCH" == "arm" ]]; then KERNEL_IMG=$KERNEL_IMG_PATH/zImage elif [[ "$ARCH" == "arm64" ]]; then KERNEL_IMG=$KERNEL_IMG_PATH/Image fi fi if [[ ! -f "$QEMU_BIN" ]]; then if [[ "$ARCH" == "arm" ]]; then QEMU_BIN=$(pwd)/qemu.git/arm-softmmu/qemu-system-arm elif [[ "$ARCH" == "arm64" ]]; then QEMU_BIN=$(pwd)/qemu.git/aarch64-softmmu/qemu-system-aarch64 fi if [[ ! -f "$QEMU_BIN" ]]; then echo "QEMU $ARCH system emulation executable not found." exit fi fi if [[ "$ARCH" == "arm" ]]; then QEMU_MACHINE="virt,highmem=off" QEMU_CPU="cortex-a15" if [[ $SVE ]]; then echo "warning: --sve is supported by AArch64 targets only" fi if [[ $MTE ]]; then echo "warning: --mte is supported by AArch64 targets only" fi elif [[ "$ARCH" == "arm64" ]]; then QEMU_MACHINE=virt QEMU_SVE_MAX_VQ=4 QEMU_CPU="cortex-a53" if [[ $SVE ]]; then QEMU_CPU="max,sve-max-vq=$QEMU_SVE_MAX_VQ" fi if [[ $MTE ]]; then QEMU_MACHINE="$QEMU_MACHINE,mte=on" fi fi run_qemu