1*be691f3bSpatrick#!/bin/bash 2*be691f3bSpatrick 3*be691f3bSpatrickprint_usage() { 4*be691f3bSpatrick echo "Usage: $(basename $0) --arch [arm|arm64] [options]" 5*be691f3bSpatrick echo -e "Starts QEMU system mode emulation for the architecture.\n" 6*be691f3bSpatrick echo -e " --help\t\t\tDisplay this information." 7*be691f3bSpatrick echo -e " --arch {arm|arm64}\t\tSelects architecture QEMU system emulation." 8*be691f3bSpatrick echo -e " --sve\t\t\t\tEnables AArch64 SVE mode." 9*be691f3bSpatrick echo -e " --mte\t\t\t\tEnables AArch64 MTE mode.\n" 10*be691f3bSpatrick echo -e " --rootfs {path}\t\tPath of root file system image." 11*be691f3bSpatrick echo -e " --qemu {path}\t\t\tPath of pre-installed qemu-system-* executable." 12*be691f3bSpatrick echo -e " --kernel {path}\t\tPath of Linux kernel prebuilt image.\n" 13*be691f3bSpatrick echo -e "By default this utility will use:" 14*be691f3bSpatrick echo -e " QEMU image built from source in qemu.git directory" 15*be691f3bSpatrick echo -e " Linux kernel image from linux.build/(arm or arm64) directory." 16*be691f3bSpatrick echo -e "Custom Linux kernel image or QEMU binary can be provided using commandline." 17*be691f3bSpatrick exit "$1" 18*be691f3bSpatrick} 19*be691f3bSpatrick 20*be691f3bSpatrickinvalid_arg() { 21*be691f3bSpatrick echo "ERROR: Unrecognized argument: $1" >&2 22*be691f3bSpatrick print_usage 1 23*be691f3bSpatrick} 24*be691f3bSpatrick 25*be691f3bSpatrickrun_qemu() { 26*be691f3bSpatrick QEMU_CORES=2 27*be691f3bSpatrick QEMU_MEMORY=1024 28*be691f3bSpatrick 29*be691f3bSpatrick $QEMU_BIN \ 30*be691f3bSpatrick -cpu $QEMU_CPU \ 31*be691f3bSpatrick -m $QEMU_MEMORY \ 32*be691f3bSpatrick -smp $QEMU_CORES \ 33*be691f3bSpatrick -kernel $KERNEL_IMG \ 34*be691f3bSpatrick -machine $QEMU_MACHINE \ 35*be691f3bSpatrick -drive file=$ROOTFS_IMG,if=none,format=raw,id=hd0 \ 36*be691f3bSpatrick -device virtio-blk-device,drive=hd0 \ 37*be691f3bSpatrick -append "root=/dev/vda rw ip=dhcp mem=1024M raid=noautodetect \ 38*be691f3bSpatrick crashkernel=128M rootwait console=ttyAMA0 devtmpfs.mount=0" \ 39*be691f3bSpatrick -netdev type=tap,id=net0 \ 40*be691f3bSpatrick -device virtio-net-device,netdev=net0 \ 41*be691f3bSpatrick -nographic 42*be691f3bSpatrick} 43*be691f3bSpatrick 44*be691f3bSpatrick# Parse options 45*be691f3bSpatrickwhile [[ $# -gt 0 ]]; do 46*be691f3bSpatrick case "${END_OF_OPT}${1}" in 47*be691f3bSpatrick --arch) ARCH=$2; shift;; 48*be691f3bSpatrick --rootfs) ROOTFS_IMG=$2; shift;; 49*be691f3bSpatrick --kernel) KERNEL_IMG=$2; shift;; 50*be691f3bSpatrick --qemu) QEMU_BIN=$2; shift;; 51*be691f3bSpatrick --sve) SVE=1;; 52*be691f3bSpatrick --mte) MTE=1;; 53*be691f3bSpatrick --help) print_usage 0 ;; 54*be691f3bSpatrick *) invalid_arg "$1" ;; 55*be691f3bSpatrick esac 56*be691f3bSpatrick shift 57*be691f3bSpatrickdone 58*be691f3bSpatrick 59*be691f3bSpatrickif [ "$ARCH" == "arm64" ] && [ "$ARCH" == "arm" ]; then 60*be691f3bSpatrick echo "Invalid architecture: $ARCH" 61*be691f3bSpatrick print_usage 1 62*be691f3bSpatrickfi 63*be691f3bSpatrick 64*be691f3bSpatrickif [[ ! -f "$ROOTFS_IMG" ]]; then 65*be691f3bSpatrick echo "No root file system image image available for emulation." 66*be691f3bSpatrick exit 67*be691f3bSpatrickfi 68*be691f3bSpatrick 69*be691f3bSpatrickif [[ ! -f "$KERNEL_IMG" ]]; then 70*be691f3bSpatrick KERNEL_IMG_PATH=$(pwd)/linux.build/"$ARCH"/arch/"$ARCH"/boot/ 71*be691f3bSpatrick 72*be691f3bSpatrick if [[ ! -d "$KERNEL_IMG_PATH" ]]; then 73*be691f3bSpatrick echo "No Linux kernel image available for emulation." 74*be691f3bSpatrick exit 75*be691f3bSpatrick fi 76*be691f3bSpatrick 77*be691f3bSpatrick if [[ "$ARCH" == "arm" ]]; then 78*be691f3bSpatrick KERNEL_IMG=$KERNEL_IMG_PATH/zImage 79*be691f3bSpatrick elif [[ "$ARCH" == "arm64" ]]; then 80*be691f3bSpatrick KERNEL_IMG=$KERNEL_IMG_PATH/Image 81*be691f3bSpatrick fi 82*be691f3bSpatrickfi 83*be691f3bSpatrick 84*be691f3bSpatrickif [[ ! -f "$QEMU_BIN" ]]; then 85*be691f3bSpatrick if [[ "$ARCH" == "arm" ]]; then 86*be691f3bSpatrick QEMU_BIN=$(pwd)/qemu.git/arm-softmmu/qemu-system-arm 87*be691f3bSpatrick elif [[ "$ARCH" == "arm64" ]]; then 88*be691f3bSpatrick QEMU_BIN=$(pwd)/qemu.git/aarch64-softmmu/qemu-system-aarch64 89*be691f3bSpatrick fi 90*be691f3bSpatrick 91*be691f3bSpatrick if [[ ! -f "$QEMU_BIN" ]]; then 92*be691f3bSpatrick echo "QEMU $ARCH system emulation executable not found." 93*be691f3bSpatrick exit 94*be691f3bSpatrick fi 95*be691f3bSpatrickfi 96*be691f3bSpatrick 97*be691f3bSpatrickif [[ "$ARCH" == "arm" ]]; then 98*be691f3bSpatrick QEMU_MACHINE="virt,highmem=off" 99*be691f3bSpatrick QEMU_CPU="cortex-a15" 100*be691f3bSpatrick 101*be691f3bSpatrick if [[ $SVE ]]; then 102*be691f3bSpatrick echo "warning: --sve is supported by AArch64 targets only" 103*be691f3bSpatrick fi 104*be691f3bSpatrick if [[ $MTE ]]; then 105*be691f3bSpatrick echo "warning: --mte is supported by AArch64 targets only" 106*be691f3bSpatrick fi 107*be691f3bSpatrickelif [[ "$ARCH" == "arm64" ]]; then 108*be691f3bSpatrick QEMU_MACHINE=virt 109*be691f3bSpatrick QEMU_SVE_MAX_VQ=4 110*be691f3bSpatrick QEMU_CPU="cortex-a53" 111*be691f3bSpatrick 112*be691f3bSpatrick if [[ $SVE ]]; then 113*be691f3bSpatrick QEMU_CPU="max,sve-max-vq=$QEMU_SVE_MAX_VQ" 114*be691f3bSpatrick fi 115*be691f3bSpatrick if [[ $MTE ]]; then 116*be691f3bSpatrick QEMU_MACHINE="$QEMU_MACHINE,mte=on" 117*be691f3bSpatrick fi 118*be691f3bSpatrickfi 119*be691f3bSpatrick 120*be691f3bSpatrickrun_qemu 121