#!/usr/bin/env bash

# Copyright 2016 The Fuchsia Authors
# Copyright (c) 2008 Travis Geiselbrecht
#
# Use of this source code is governed by a MIT-style
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/MIT

function HELP {
    echo "help:"
    echo "-a                  : add intel hda sound"
    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 "-3                  : cortex-m3 based platform"
    echo "-6                  : 64bit arm"
    echo "-m <memory in MB>"
    echo "-s <number of cpus>"
    echo "-h for help"
    echo "all arguments after -- are passed to qemu directly"
    exit 1
}

DO_AUDIO=0
DO_BLOCK=0
DO_NET=0
DO_NET_TAP=0
DO_64BIT=0
DO_CORTEX_M3=0
DO_DISPLAY=0
DO_CMPCTMALLOC=0
DO_MINIHEAP=0
SMP=1
MEMSIZE=512
SUDO=""

while getopts abdhm:cMnt36s: FLAG; do
    case $FLAG in
        a) DO_AUDIO=1;;
        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;;
        3) DO_CORTEX_M3=1;;
        6) DO_64BIT=1;;
        m) MEMSIZE=$OPTARG;;
        s) SMP=$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"
elif [ $DO_CORTEX_M3 == 1 ]; then
    QEMU="qemu-system-arm -machine lm3s6965evb -cpu cortex-m3"
    PROJECT="lm3s6965evb-test"
else
    QEMU="qemu-system-arm -machine virt -cpu cortex-a15"
    PROJECT="qemu-virt-a15-test"
fi

ARGS=" -m $MEMSIZE -smp $SMP -kernel build-${PROJECT}/zircon.elf"

AUDIO_ARGS=" -soundhw hda"
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_AUDIO == 1 ]; then
    ARGS+=$AUDIO_ARGS
    export QEMU_AUDIO_DRV=none
fi
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 $@
