1#!/usr/bin/env bash
2
3DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
4
5function HELP {
6    echo "help:"
7    echo "-6                  : x86-64"
8    echo "-l                  : legacy mode build (386 emulated machine)"
9    echo "-m <memory in MB>"
10    echo "-s <number of cpus>"
11    echo
12    echo "-d <disk image>     : a virtio block device"
13    echo "-g                  : with graphics"
14    echo "-n                  : user mode networking, defaults to virtio-net-pci device"
15    echo "-N <network driver> : specify network driver (virtio-net-pci, e1000e, etc)"
16    echo "-t                  : use tap interface qemu0 for networking"
17    echo "-k                  : use KVM"
18    echo
19    echo "-h for help"
20    echo "all arguments after -- are passed to qemu directly"
21    exit 1
22}
23
24DO_64BIT=0
25DO_LEGACY=0
26DO_GRAPHICS=0
27DO_KVM=0
28DO_DISK=0
29DISK_IMAGE=""
30DO_NET=0
31DO_NET_TAP=0
32NETDEV=e1000e
33MEMSIZE=0
34SMP=1
35SUDO=""
36MAKE_VARS=""
37
38while getopts 6d:gklm:nN:s:th FLAG; do
39    case $FLAG in
40        6) DO_64BIT=1;;
41        d) DO_DISK=1; DISK_IMAGE=$OPTARG;;
42        g) DO_GRAPHICS=1;;
43        k) DO_KVM=1;;
44        l) DO_LEGACY=1;;
45        m) MEMSIZE=$OPTARG;;
46        n) DO_NET=1;;
47        t) DO_NET_TAP=1;;
48        N) NETDEV=$OPTARG;;
49        s) SMP=$OPTARG;;
50        h) HELP;;
51        \?)
52            echo unrecognized option $OPTARG
53            HELP
54    esac
55done
56
57shift $((OPTIND-1))
58
59# pick the appropriate qemu and project
60if (( $DO_64BIT )); then
61    QEMU="qemu-system-x86_64"
62    PROJECT="pc-x86-64-test"
63    CPU=max
64    MACHINE=q35
65elif (( $DO_LEGACY )); then
66    QEMU="qemu-system-i386"
67    PROJECT="pc-x86-legacy-test"
68    CPU=486
69    MACHINE=isapc
70else
71    QEMU="qemu-system-i386"
72    PROJECT="pc-x86-test"
73    CPU=max
74    MACHINE=pc
75fi
76
77if (( $DO_LEGACY )); then
78    if (( ! $MEMSIZE )); then
79        MEMSIZE=4
80    fi
81else
82    if (( ! $MEMSIZE )); then
83        MEMSIZE=512
84    fi
85fi
86
87ARGS=""
88if (( $DO_KVM )); then
89    ARGS+=" -accel kvm -cpu host"
90else
91    ARGS+=" -cpu $CPU"
92fi
93ARGS+=" -m $MEMSIZE -smp $SMP -machine $MACHINE -kernel build-${PROJECT}/lk.elf"
94
95ARGS+=" -device isa-debug-exit,iobase=0xf4,iosize=0x04"
96# Override the SeaBIOS serial port to keep it from outputting
97# a terminal reset on start.
98ARGS+=" -fw_cfg name=etc/sercon-port,string=0"
99
100if (( $DO_GRAPHICS )); then
101    ARGS+=" -serial stdio -vga std"
102    if (( ! $DO_LEGACY )); then
103        # add a couple of virtio devices for good measure
104        ARGS+=" -device virtio-keyboard-pci"
105        ARGS+=" -device virtio-mouse-pci"
106    fi
107else
108    ARGS+=" -nographic"
109fi
110
111if (( $DO_DISK )); then
112    if (( ! $DO_LEGACY )); then
113        ARGS+=" -drive if=none,file=${DISK_IMAGE},id=blk,discard=on -device virtio-blk-pci,drive=blk,discard=on"
114    else
115        ARGS+=" -hda ${DISK_IMAGE}"
116    fi
117fi
118if (( $DO_NET )); then
119    if (( ! $DO_LEGACY )); then
120        if (( ! $DO_NET_TAP )); then
121            ARGS+=" -netdev user,id=vmnic,hostname=qemu"
122        else
123            # quick note to enable tap interface
124            # IFNAME=qemu0
125            # BRIDGE=bridge0
126            # sudo tunctl -u $(whoami) -t ${IFNAME}
127            # sudo ifconfig ${IFNAME} up
128            # sudo ip link set ${IFNAME} master ${BRIDGE}
129            ARGS+=" -netdev tap,id=vmnic,ifname=qemu0,script=no,downscript=no"
130            #SUDO="sudo"
131        fi
132        ARGS+=" -device $NETDEV,netdev=vmnic"
133    else
134        echo "implement legacy + network config"
135        exit 1
136    fi
137else
138    ARGS+=" -net none"
139fi
140
141$DIR/make-parallel $MAKE_VARS $PROJECT &&
142echo $SUDO $QEMU $ARGS $@ &&
143$SUDO $QEMU $ARGS $@
144
145