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