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