aboutsummaryrefslogtreecommitdiff
path: root/scripts/do-qemux86
blob: 685718b4e7adb070555198c3a057f9084cab76a0 (plain)
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 $@