| #!/bin/bash | 
 |  | 
 | function HELP { | 
 |     echo "help:" | 
 |     echo "-b a virtio block device" | 
 |     echo "-c cmpctmalloc instead of dlmalloc" | 
 |     echo "-M miniheap instead of dlmalloc" | 
 |     echo "-n a virtio network device" | 
 |     echo "-t a virtio tap network device" | 
 |     echo "-d a virtio display" | 
 |     echo "-6 64bit arm" | 
 |     echo "-m <memory in MB>" | 
 |     echo "-h for help" | 
 |     echo "all arguments after -- are passed to qemu directly" | 
 |     exit 1 | 
 | } | 
 |  | 
 | DO_NET=0 | 
 | DO_NET_TAP=0 | 
 | DO_BLOCK=0 | 
 | DO_64BIT=0 | 
 | DO_DISPLAY=0 | 
 | DO_CMPCTMALLOC=0 | 
 | DO_MINIHEAP=0 | 
 | MEMSIZE=512 | 
 | SUDO="" | 
 |  | 
 | while getopts bdhm:cMnt6 FLAG; do | 
 |     case $FLAG in | 
 |         b) DO_BLOCK=1;; | 
 |         c) DO_CMPCTMALLOC=1;; | 
 |         d) DO_DISPLAY=1;; | 
 |         M) DO_MINIHEAP=1;; | 
 |         n) DO_NET=1;; | 
 |         t) DO_NET_TAP=1;; | 
 |         6) DO_64BIT=1;; | 
 |         m) MEMSIZE=$OPTARG;; | 
 |         h) HELP;; | 
 |         \?) | 
 |             echo unrecognized option | 
 |             HELP | 
 |     esac | 
 | done | 
 |  | 
 | shift $((OPTIND-1)) | 
 |  | 
 | if [ $DO_64BIT == 1 ]; then | 
 |     QEMU="qemu-system-aarch64 -machine virt -cpu cortex-a53" | 
 |     PROJECT="qemu-virt-a53-test" | 
 | else | 
 |     QEMU="qemu-system-arm -machine virt -cpu cortex-a15" | 
 |     PROJECT="qemu-virt-a15-test" | 
 | fi | 
 |  | 
 | ARGS=" -m $MEMSIZE -kernel build-${PROJECT}/lk.elf" | 
 | BLOCK_ARGS=" -drive if=none,file=blk.bin,id=blk,format=raw -device virtio-blk-device,drive=blk" | 
 | NET_ARGS=" -netdev user,id=vmnic,hostname=qemu -device virtio-net-device,netdev=vmnic" | 
 | NET_TAP_ARGS=" -netdev tap,id=vmnic -device virtio-net-device,netdev=vmnic" | 
 | NO_DISPLAY_ARGS=" -nographic" | 
 | DISPLAY_ARGS=" -device virtio-gpu-device -serial stdio" | 
 |  | 
 | echo DO_BLOCK = $DO_BLOCK | 
 | echo DO_NET = $DO_NET | 
 |  | 
 | if [ $DO_BLOCK == 1 ]; then | 
 |     ARGS+=$BLOCK_ARGS | 
 | fi | 
 | if [ $DO_NET == 1 ]; then | 
 |     ARGS+=$NET_ARGS | 
 | fi | 
 | if [ $DO_NET_TAP == 1 ]; then | 
 |     ARGS+=$NET_TAP_ARGS | 
 |     SUDO="sudo " | 
 | fi | 
 | if [ $DO_DISPLAY == 1 ]; then | 
 |     ARGS+=$DISPLAY_ARGS | 
 | else | 
 |     ARGS+=$NO_DISPLAY_ARGS | 
 | fi | 
 |  | 
 | MAKE_VARS="" | 
 |  | 
 | if [ $DO_CMPCTMALLOC == 1 ]; then | 
 | 	MAKE_VARS=LK_HEAP_IMPLEMENTATION=cmpctmalloc | 
 | elif [ $DO_MINIHEAP == 1 ]; then | 
 | 	MAKE_VARS=LK_HEAP_IMPLEMENTATION=miniheap | 
 | fi | 
 |  | 
 | make $MAKE_VARS $PROJECT -j4 && | 
 | echo $SUDO $QEMU $ARGS $@ && | 
 | $SUDO $QEMU $ARGS $@ |