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