1#!/usr/bin/env bash
2
3DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
4
5function HELP {
6    echo "help:"
7    echo "-b a virtio block device"
8    echo "-c cmpctmalloc instead of dlmalloc"
9    echo "-M miniheap instead of dlmalloc"
10    echo "-n a virtio network device"
11    echo "-t a virtio tap network device"
12    echo "-d a virtio display"
13    echo "-3 cortex-m3 based platform"
14    echo "-6 64bit arm"
15    echo "-m <memory in MB>"
16    echo "-s <number of cpus>"
17    echo "-h for help"
18    echo "all arguments after -- are passed to qemu directly"
19    exit 1
20}
21
22DO_NET=0
23DO_NET_TAP=0
24DO_BLOCK=0
25DO_64BIT=0
26DO_CORTEX_M3=0
27DO_DISPLAY=0
28DO_CMPCTMALLOC=0
29DO_MINIHEAP=0
30SMP=1
31MEMSIZE=512
32SUDO=""
33PROJECT=""
34
35while getopts bdhm:cMnt36p:s: FLAG; do
36    case $FLAG in
37        b) DO_BLOCK=1;;
38        c) DO_CMPCTMALLOC=1;;
39        d) DO_DISPLAY=1;;
40        M) DO_MINIHEAP=1;;
41        n) DO_NET=1;;
42        t) DO_NET_TAP=1;;
43        3) DO_CORTEX_M3=1;;
44        6) DO_64BIT=1;;
45        m) MEMSIZE=$OPTARG;;
46        s) SMP=$OPTARG;;
47        p) PROJECT=$OPTARG;;
48        h) HELP;;
49        \?)
50            echo unrecognized option
51            HELP
52    esac
53done
54
55shift $((OPTIND-1))
56
57if [ $DO_64BIT == 1 ]; then
58    QEMU="qemu-system-aarch64"
59    CPU="cortex-a53"
60    MACHINE="virt"
61    _PROJECT="qemu-virt-arm64-test"
62elif [ $DO_CORTEX_M3 == 1 ]; then
63    QEMU="qemu-system-arm"
64    CPU="cortex-m3"
65    MACHINE="lm3s6965evb"
66    _PROJECT="lm3s6965evb-test"
67else
68    QEMU="qemu-system-arm"
69    CPU="cortex-a15"
70    MACHINE="virt"
71    _PROJECT="qemu-virt-arm32-test"
72fi
73if [ "$PROJECT" == "" ]; then
74    PROJECT=$_PROJECT
75fi
76
77ARGS=" -cpu $CPU -m $MEMSIZE -smp $SMP -machine $MACHINE -kernel build-${PROJECT}/lk.elf"
78BLOCK_ARGS=" -drive if=none,file=blk.bin,id=blk,format=raw -device virtio-blk-device,drive=blk"
79NET_ARGS=" -netdev user,id=vmnic,hostname=qemu -device virtio-net-device,netdev=vmnic"
80NET_TAP_ARGS=" -netdev tap,id=vmnic -device virtio-net-device,netdev=vmnic"
81NO_DISPLAY_ARGS=" -nographic"
82DISPLAY_ARGS=" -device virtio-gpu-device -serial stdio"
83
84echo DO_BLOCK = $DO_BLOCK
85echo DO_NET = $DO_NET
86
87if [ $DO_BLOCK == 1 ]; then
88    ARGS+=$BLOCK_ARGS
89fi
90if [ $DO_NET == 1 ]; then
91    ARGS+=$NET_ARGS
92fi
93if [ $DO_NET_TAP == 1 ]; then
94    ARGS+=$NET_TAP_ARGS
95    SUDO="sudo "
96fi
97if [ $DO_DISPLAY == 1 ]; then
98    ARGS+=$DISPLAY_ARGS
99else
100    ARGS+=$NO_DISPLAY_ARGS
101fi
102
103MAKE_VARS=""
104
105if [ $DO_CMPCTMALLOC == 1 ]; then
106    MAKE_VARS=LK_HEAP_IMPLEMENTATION=cmpctmalloc
107elif [ $DO_MINIHEAP == 1 ]; then
108    MAKE_VARS=LK_HEAP_IMPLEMENTATION=miniheap
109fi
110
111$DIR/make-parallel $MAKE_VARS $PROJECT &&
112echo $SUDO $QEMU $ARGS $@ &&
113$SUDO $QEMU $ARGS $@
114