blob: 339b8d955e613473bf644cddc7c9cc647372d5d9 [file] [log] [blame]
#!/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