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 "-d <disk image>     : a virtio block device"
12    echo "-n                  : a virtio network device"
13    echo "-g                  : with graphics"
14    echo "-k                  : use KVM"
15    echo "-h for help"
16    echo "all arguments after -- are passed to qemu directly"
17    exit 1
18}
19
20DO_64BIT=0
21DO_LEGACY=0
22DO_GRAPHICS=0
23DO_KVM=0
24DO_DISK=0
25DISK_IMAGE=""
26DO_NET=0
27MEMSIZE=0
28SMP=1
29SUDO=""
30MAKE_VARS=""
31
32while getopts 6d:gklm:ns:h FLAG; do
33    case $FLAG in
34        6) DO_64BIT=1;;
35        d) DO_DISK=1; DISK_IMAGE=$OPTARG;;
36        g) DO_GRAPHICS=1;;
37        k) DO_KVM=1;;
38        l) DO_LEGACY=1;;
39        m) MEMSIZE=$OPTARG;;
40        n) DO_NET=1;;
41        s) SMP=$OPTARG;;
42        h) HELP;;
43        \?)
44            echo unrecognized option
45            HELP
46    esac
47done
48
49shift $((OPTIND-1))
50
51# pick the appropriate qemu and project
52if (( $DO_64BIT )); then
53    QEMU="qemu-system-x86_64"
54    PROJECT="pc-x86-64-test"
55    CPU=qemu64
56    MACHINE=q35
57elif (( $DO_LEGACY )); then
58    QEMU="qemu-system-i386"
59    PROJECT="pc-x86-legacy-test"
60    CPU=486
61    MACHINE=isapc
62else
63    QEMU="qemu-system-i386"
64    PROJECT="pc-x86-test"
65    CPU=qemu32
66    MACHINE=q35
67fi
68
69if (( $DO_LEGACY )); then
70    if (( ! $MEMSIZE )); then
71        MEMSIZE=4
72    fi
73else
74    if (( ! $MEMSIZE )); then
75        MEMSIZE=512
76    fi
77fi
78
79ARGS=""
80if (( $DO_KVM )); then
81    ARGS+=" -enable-kvm -cpu host"
82else
83    ARGS+=" -cpu $CPU"
84fi
85ARGS+=" -m $MEMSIZE -smp $SMP -machine $MACHINE -kernel build-${PROJECT}/lk.elf"
86
87ARGS+=" -device isa-debug-exit,iobase=0xf4,iosize=0x04"
88# Override the SeaBIOS serial port to keep it from outputting
89# a terminal reset on start.
90ARGS+=" -fw_cfg name=etc/sercon-port,string=0"
91
92if (( ! $DO_GRAPHICS )); then
93    ARGS+=" -nographic"
94else
95    ARGS+=" -serial stdio -vga std"
96fi
97
98if (( $DO_DISK )); then
99    if (( ! $DO_LEGACY )); then
100        ARGS+=" -drive if=none,file=${DISK_IMAGE},id=blk -device virtio-blk-pci,drive=blk"
101    else
102        ARGS+=" -hda ${DISK_IMAGE}"
103    fi
104fi
105if (( $DO_NET )); then
106    if (( ! $DO_LEGACY )); then
107        ARGS+=" -netdev user,id=vmnic,hostname=qemu -device virtio-net-pci,netdev=vmnic"
108    else
109        echo "implement legacy + network config"
110        exit 1
111    fi
112else
113    ARGS+=" -nic none"
114fi
115
116$DIR/make-parallel $MAKE_VARS $PROJECT &&
117echo $SUDO $QEMU $ARGS $@ &&
118$SUDO $QEMU $ARGS $@
119
120