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