Serenity Operating System
at master 506 lines 20 kB view raw
1#!/bin/sh 2# shellcheck disable=SC2086 # FIXME: fix these globing warnings 3 4set -e 5 6die() { 7 echo "die: $*" 8 exit 1 9} 10 11SCRIPT_DIR="$(dirname "${0}")" 12 13# https://www.shellcheck.net/wiki/SC1090 No need to shellcheck private config. 14# shellcheck source=/dev/null 15[ -x "$SCRIPT_DIR/../run-local.sh" ] && . "$SCRIPT_DIR/../run-local.sh" 16 17#SERENITY_PACKET_LOGGING_ARG="-object filter-dump,id=hue,netdev=breh,file=e1000.pcap" 18 19# FIXME: Enable for SERENITY_ARCH=aarch64 if on an aarch64 host? 20 21# Check if SERENITY_VIRTUALIZATION_SUPPORT is unset 22if [ -z ${SERENITY_VIRTUALIZATION_SUPPORT+x} ]; then 23 VIRTUALIZATION_SUPPORT="0" 24 [ -e /dev/kvm ] && [ -r /dev/kvm ] && [ -w /dev/kvm ] && [ "$SERENITY_ARCH" != "aarch64" ] && [ "$(uname -m)" != "aarch64" ] && VIRTUALIZATION_SUPPORT="1" 25 command -v wslpath >/dev/null && VIRTUALIZATION_SUPPORT="1" 26else 27 VIRTUALIZATION_SUPPORT="$SERENITY_VIRTUALIZATION_SUPPORT" 28fi 29 30[ -z "$SERENITY_BOCHS_BIN" ] && SERENITY_BOCHS_BIN="bochs" 31 32# To support virtualization acceleration on mac 33# we need to use 64-bit qemu 34if [ "$(uname)" = "Darwin" ]; then 35 36 if [ "$SERENITY_ARCH" != "aarch64" ]; then 37 [ -z "$SERENITY_QEMU_BIN" ] && SERENITY_QEMU_BIN="qemu-system-x86_64" 38 else 39 [ -z "$SERENITY_QEMU_BIN" ] && SERENITY_QEMU_BIN="qemu-system-aarch64" 40 fi 41 42 if [ "$(uname -m)" = "x86_64" ]; then 43 if $SERENITY_QEMU_BIN --accel help | grep -q hvf; then 44 SERENITY_VIRT_TECH_ARG="--accel hvf" 45 fi 46 fi 47fi 48 49# Prepend the toolchain qemu directory so we pick up QEMU from there 50PATH="$SCRIPT_DIR/../Toolchain/Local/qemu/bin:$PATH" 51 52# Also prepend the x86_64 toolchain directory because that's where most 53# people will have their QEMU binaries if they built them before the 54# directory was changed to Toolchain/Local/qemu. 55PATH="$SCRIPT_DIR/../Toolchain/Local/x86_64/bin:$PATH" 56 57SERENITY_RUN="${SERENITY_RUN:-$1}" 58 59if [ -z "$SERENITY_QEMU_BIN" ]; then 60 if command -v wslpath >/dev/null; then 61 # Some Windows systems don't have reg.exe's directory on the PATH by default. 62 PATH=$PATH:/mnt/c/Windows/System32 63 QEMU_INSTALL_DIR=$(reg.exe query 'HKLM\Software\QEMU' /v Install_Dir /t REG_SZ | grep '^ Install_Dir' | sed 's/ / /g' | cut -f4- -d' ') 64 if [ -z "$QEMU_INSTALL_DIR" ]; then 65 if [ "$VIRTUALIZATION_SUPPORT" -eq "0" ]; then 66 die "Could not determine where QEMU for Windows is installed. Please make sure QEMU is installed or set SERENITY_QEMU_BIN if it is already installed." 67 fi 68 else 69 QEMU_BINARY_PREFIX="$(wslpath -- "${QEMU_INSTALL_DIR}" | tr -d '\r\n')/" 70 QEMU_BINARY_SUFFIX=".exe" 71 fi 72 fi 73 if [ "$SERENITY_ARCH" = "aarch64" ]; then 74 SERENITY_QEMU_BIN="${QEMU_BINARY_PREFIX}qemu-system-aarch64${QEMU_BINARY_SUFFIX}" 75 elif [ "$SERENITY_ARCH" = "x86_64" ]; then 76 SERENITY_QEMU_BIN="${QEMU_BINARY_PREFIX}qemu-system-x86_64${QEMU_BINARY_SUFFIX}" 77 else 78 die "Please specify a valid CPU architecture." 79 fi 80fi 81 82 83# For default values, see Kernel/CommandLine.cpp 84[ -z "$SERENITY_KERNEL_CMDLINE" ] && SERENITY_KERNEL_CMDLINE="hello" 85 86[ -z "$SERENITY_RAM_SIZE" ] && SERENITY_RAM_SIZE=1G 87 88[ -z "$SERENITY_DISK_IMAGE" ] && { 89 if [ "$SERENITY_RUN" = q35grub ] || [ "$SERENITY_RUN" = qgrub ]; then 90 SERENITY_DISK_IMAGE="grub_disk_image" 91 elif [ "$SERENITY_RUN" = limine ]; then 92 SERENITY_DISK_IMAGE="limine_disk_image" 93 elif [ "$SERENITY_RUN" = qextlinux ]; then 94 SERENITY_DISK_IMAGE="extlinux_disk_image" 95 else 96 SERENITY_DISK_IMAGE="_disk_image" 97 fi 98 if command -v wslpath >/dev/null; then 99 case "$SERENITY_QEMU_BIN" in 100 /mnt/?/*) 101 SERENITY_DISK_IMAGE=$(wslpath -w "$SERENITY_DISK_IMAGE") 102 ;; 103 esac 104 fi 105} 106 107SERENITY_QEMU_MIN_REQ_MAJOR_VERSION=6 108SERENITY_QEMU_MIN_REQ_MINOR_VERSION=2 109SERENITY_QEMU_MIN_REQ_VERSION="$SERENITY_QEMU_MIN_REQ_MAJOR_VERSION.$SERENITY_QEMU_MIN_REQ_MINOR_VERSION" 110if ! command -v "$SERENITY_QEMU_BIN" >/dev/null 2>&1 ; then 111 die "Please install QEMU version $SERENITY_QEMU_MIN_REQ_VERSION or newer or use the Toolchain/BuildQemu.sh script." 112fi 113 114installed_major_version=$("$SERENITY_QEMU_BIN" -version | head -n 1 | sed -E 's/QEMU emulator version ([1-9][0-9]*|0).*/\1/') 115installed_minor_version=$("$SERENITY_QEMU_BIN" -version | head -n 1 | sed -E 's/QEMU emulator version [0-9]+\.([1-9][0-9]*|0).*/\1/') 116if [ "$installed_major_version" -lt "$SERENITY_QEMU_MIN_REQ_MAJOR_VERSION" ] || 117 { [ "$installed_major_version" -eq "$SERENITY_QEMU_MIN_REQ_MAJOR_VERSION" ] && 118 [ "$installed_minor_version" -lt "$SERENITY_QEMU_MIN_REQ_MINOR_VERSION" ]; }; then 119 echo "Required QEMU >= $SERENITY_QEMU_MIN_REQ_VERSION! Found $($SERENITY_QEMU_BIN -version | head -n 1)" 120 echo "Please install a newer version of QEMU or use the Toolchain/BuildQemu.sh script." 121 die 122fi 123 124NATIVE_WINDOWS_QEMU="0" 125 126if command -v wslpath >/dev/null; then 127 case "$SERENITY_QEMU_BIN" in 128 /mnt/?/*) 129 if [ -z "$SERENITY_VIRT_TECH_ARG" ]; then 130 if [ "$VIRTUALIZATION_SUPPORT" -eq "1" ]; then 131 if [ "$installed_major_version" -gt 5 ]; then 132 SERENITY_VIRT_TECH_ARG="-accel whpx,kernel-irqchip=off" 133 else 134 SERENITY_VIRT_TECH_ARG="-accel whpx" 135 fi 136 fi 137 SERENITY_VIRT_TECH_ARG="$SERENITY_VIRT_TECH_ARG -accel tcg" 138 fi 139 [ -z "$SERENITY_QEMU_CPU" ] && SERENITY_QEMU_CPU="max,vmx=off" 140 SERENITY_KERNEL_CMDLINE="$SERENITY_KERNEL_CMDLINE disable_virtio" 141 NATIVE_WINDOWS_QEMU="1" 142 ;; 143 esac 144fi 145 146[ "$VIRTUALIZATION_SUPPORT" -eq "1" ] && [ "$NATIVE_WINDOWS_QEMU" -ne "1" ] && SERENITY_VIRT_TECH_ARG="-enable-kvm" 147 148[ -z "$SERENITY_QEMU_CPU" ] && SERENITY_QEMU_CPU="max" 149 150if [ "$SERENITY_ARCH" != "aarch64" ]; then 151 [ -z "$SERENITY_CPUS" ] && SERENITY_CPUS="2" 152 if [ "$SERENITY_CPUS" -le 8 ]; then 153 # Explicitly disable x2APIC so we can test it more easily 154 SERENITY_QEMU_CPU="$SERENITY_QEMU_CPU,-x2apic" 155 fi 156 157 if [ -z "$SERENITY_SPICE" ] && "${SERENITY_QEMU_BIN}" -chardev help | grep -iq qemu-vdagent; then 158 SERENITY_SPICE_SERVER_CHARDEV="-chardev qemu-vdagent,clipboard=on,mouse=off,id=vdagent,name=vdagent" 159 elif "${SERENITY_QEMU_BIN}" -chardev help | grep -iq spicevmc; then 160 SERENITY_SPICE_SERVER_CHARDEV="-chardev spicevmc,id=vdagent,name=vdagent" 161 fi 162fi 163 164if [ "$(uname)" = "Darwin" ]; then 165 SERENITY_AUDIO_BACKEND="-audiodev coreaudio,id=snd0" 166elif [ "$NATIVE_WINDOWS_QEMU" -eq "1" ]; then 167 SERENITY_AUDIO_BACKEND="-audiodev dsound,id=snd0,timer-period=2000" 168elif "$SERENITY_QEMU_BIN" -audio-help 2>&1 | grep -- "-audiodev id=sdl" >/dev/null; then 169 SERENITY_AUDIO_BACKEND="-audiodev sdl,id=snd0" 170else 171 SERENITY_AUDIO_BACKEND="-audiodev pa,timer-period=2000,id=snd0" 172fi 173 174if [ "$installed_major_version" -eq 5 ] && [ "$installed_minor_version" -eq 0 ]; then 175 SERENITY_AUDIO_HW="-soundhw pcspk" 176else 177 SERENITY_AUDIO_HW="-machine pcspk-audiodev=snd0" 178fi 179 180SERENITY_SCREENS="${SERENITY_SCREENS:-1}" 181if [ "$SERENITY_SPICE" ]; then 182 SERENITY_QEMU_DISPLAY_BACKEND="${SERENITY_QEMU_DISPLAY_BACKEND:-spice-app}" 183elif [ "$NATIVE_WINDOWS_QEMU" -eq "1" ]; then 184 # QEMU for windows does not like gl=on, so detect if we are building in wsl, and if so, disable it 185 # Also, when using the GTK backend we run into this problem: https://github.com/SerenityOS/serenity/issues/7657 186 SERENITY_QEMU_DISPLAY_BACKEND="${SERENITY_QEMU_DISPLAY_BACKEND:-sdl,gl=off}" 187elif [ $SERENITY_SCREENS -gt 1 ] && "${SERENITY_QEMU_BIN}" --display help | grep -iq sdl; then 188 SERENITY_QEMU_DISPLAY_BACKEND="${SERENITY_QEMU_DISPLAY_BACKEND:-sdl,gl=off}" 189elif ! command -v wslpath >/dev/null && ("${SERENITY_QEMU_BIN}" --display help | grep -iq sdl) && (ldconfig -p | grep -iq virglrenderer); then 190 SERENITY_QEMU_DISPLAY_BACKEND="${SERENITY_QEMU_DISPLAY_BACKEND:-sdl,gl=on}" 191elif "${SERENITY_QEMU_BIN}" --display help | grep -iq cocoa; then 192 # QEMU for OSX seems to only support cocoa 193 SERENITY_QEMU_DISPLAY_BACKEND="${SERENITY_QEMU_DISPLAY_BACKEND:-cocoa,gl=off}" 194elif [ "$(uname -s)" = "SerenityOS" ]; then 195 SERENITY_QEMU_DISPLAY_BACKEND="${SERENITY_QEMU_DISPLAY_BACKEND:-sdl,gl=off}" 196else 197 SERENITY_QEMU_DISPLAY_BACKEND="${SERENITY_QEMU_DISPLAY_BACKEND:-gtk,gl=off}" 198fi 199 200SERENITY_GL="${SERENITY_GL:-0}" 201if [ -z "$SERENITY_QEMU_DISPLAY_DEVICE" ]; then 202 if [ "$SERENITY_GL" = "1" ]; then 203 SERENITY_QEMU_DISPLAY_DEVICE="virtio-vga-gl " 204 if [ "$SERENITY_SCREENS" -gt 1 ]; then 205 die "SERENITY_GL and multi-monitor support cannot be setup simultaneously" 206 fi 207 elif [ "$SERENITY_SCREENS" -gt 1 ]; then 208 SERENITY_QEMU_DISPLAY_DEVICE="virtio-vga,max_outputs=$SERENITY_SCREENS " 209 # QEMU appears to always relay absolute mouse coordinates relative to the screen that the mouse is 210 # pointed to, without any way for us to know what screen it was. So, when dealing with multiple 211 # displays force using relative coordinates only 212 SERENITY_KERNEL_CMDLINE="$SERENITY_KERNEL_CMDLINE vmmouse=off" 213 else 214 SERENITY_QEMU_DISPLAY_DEVICE="VGA,vgamem_mb=64 " 215 fi 216fi 217 218# Check if SERENITY_NVME_ENABLE is unset 219if [ -z ${SERENITY_NVME_ENABLE+x} ]; then 220 SERENITY_BOOT_DRIVE="-drive file=${SERENITY_DISK_IMAGE},format=raw,index=0,media=disk,id=disk" 221else 222 if [ "$SERENITY_NVME_ENABLE" -eq 1 ]; then 223 SERENITY_BOOT_DRIVE="-drive file=${SERENITY_DISK_IMAGE},format=raw,index=0,media=disk,if=none,id=disk" 224 SERENITY_BOOT_DRIVE="$SERENITY_BOOT_DRIVE -device i82801b11-bridge,id=bridge4 -device sdhci-pci,bus=bridge4" 225 SERENITY_BOOT_DRIVE="$SERENITY_BOOT_DRIVE -device nvme,serial=deadbeef,drive=disk,bus=bridge4,logical_block_size=4096,physical_block_size=4096" 226 SERENITY_KERNEL_CMDLINE="$SERENITY_KERNEL_CMDLINE root=nvme0:1:0" 227 else 228 SERENITY_BOOT_DRIVE="-drive file=${SERENITY_DISK_IMAGE},format=raw,index=0,media=disk,id=disk" 229 fi 230fi 231 232if [ -z "$SERENITY_HOST_IP" ]; then 233 SERENITY_HOST_IP="127.0.0.1" 234fi 235 236if command -v wslpath >/dev/null; then 237 SERENITY_DISABLE_GDB_SOCKET=1 238fi 239 240if [ "$(uname)" = "Darwin" ] && 241 [ "${SERENITY_VIRT_TECH_ARG}" = "--accel hvf" ]; then 242 # HVF doesn't support gdbstub per https://wiki.qemu.org/Features/HVF 243 SERENITY_DISABLE_GDB_SOCKET=1 244fi 245 246if [ -z "$SERENITY_DISABLE_GDB_SOCKET" ]; then 247 SERENITY_EXTRA_QEMU_ARGS="$SERENITY_EXTRA_QEMU_ARGS -gdb tcp:${SERENITY_HOST_IP}:1234" 248fi 249 250if [ -z "$SERENITY_ETHERNET_DEVICE_TYPE" ]; then 251 SERENITY_ETHERNET_DEVICE_TYPE="e1000" 252fi 253 254if [ "$SERENITY_ARCH" = "aarch64" ]; then 255 SERENITY_NETFLAGS= 256 SERENITY_NETFLAGS_WITH_DEFAULT_DEVICE= 257else 258 SERENITY_NETFLAGS="-netdev user,id=breh,hostfwd=tcp:${SERENITY_HOST_IP}:8888-10.0.2.15:8888,hostfwd=tcp:${SERENITY_HOST_IP}:8823-10.0.2.15:23,hostfwd=tcp:${SERENITY_HOST_IP}:8000-10.0.2.15:8000,hostfwd=tcp:${SERENITY_HOST_IP}:2222-10.0.2.15:22" 259 SERENITY_NETFLAGS_WITH_DEFAULT_DEVICE=" 260 $SERENITY_NETFLAGS 261 -device $SERENITY_ETHERNET_DEVICE_TYPE,netdev=breh 262 " 263fi 264 265# add -machine vmport=off below to run the machine with ps/2 mouse 266if [ -z "$SERENITY_MACHINE" ]; then 267 if [ "$SERENITY_ARCH" = "aarch64" ]; then 268 SERENITY_MACHINE="-M raspi3b -serial stdio" 269 else 270 SERENITY_MACHINE=" 271 -m $SERENITY_RAM_SIZE 272 -smp $SERENITY_CPUS 273 -display $SERENITY_QEMU_DISPLAY_BACKEND 274 -device $SERENITY_QEMU_DISPLAY_DEVICE 275 -device virtio-serial,max_ports=2 276 -device virtconsole,chardev=stdout 277 -device isa-debugcon,chardev=stdout 278 -device virtio-rng-pci 279 $SERENITY_AUDIO_BACKEND 280 $SERENITY_AUDIO_HW 281 -device ac97,audiodev=snd0 282 -device pci-bridge,chassis_nr=1,id=bridge1 -device $SERENITY_ETHERNET_DEVICE_TYPE,bus=bridge1 283 -device i82801b11-bridge,bus=bridge1,id=bridge2 -device sdhci-pci,bus=bridge2 284 -device i82801b11-bridge,id=bridge3 -device sdhci-pci,bus=bridge3 285 -device ich9-ahci,bus=bridge3 286 -chardev stdio,id=stdout,mux=on 287 $SERENITY_BOOT_DRIVE 288 " 289 fi 290fi 291 292if [ "$NATIVE_WINDOWS_QEMU" -ne "1" ]; then 293 SERENITY_MACHINE="$SERENITY_MACHINE 294 -qmp unix:qmp-sock,server,nowait" 295fi 296 297if [ "$SERENITY_ARCH" = "aarch64" ]; then 298 SERENITY_KERNEL_AND_INITRD=" 299 -kernel Kernel/Kernel 300 " 301else 302 SERENITY_KERNEL_AND_INITRD=" 303 -kernel Kernel/Prekernel/Prekernel 304 -initrd Kernel/Kernel 305 " 306fi 307 308 309[ -z "$SERENITY_COMMON_QEMU_ARGS" ] && SERENITY_COMMON_QEMU_ARGS=" 310$SERENITY_EXTRA_QEMU_ARGS 311$SERENITY_MACHINE 312-cpu $SERENITY_QEMU_CPU 313-name SerenityOS 314-d guest_errors 315-usb 316$SERENITY_SPICE_SERVER_CHARDEV 317" 318 319if [ "$SERENITY_ARCH" != "aarch64" ]; then 320 if "${SERENITY_QEMU_BIN}" -chardev help | grep -iq spice; then 321 SERENITY_COMMON_QEMU_ARGS="$SERENITY_COMMON_QEMU_ARGS 322 -spice port=5930,agent-mouse=off,disable-ticketing=on 323 " 324 fi 325 if "${SERENITY_QEMU_BIN}" -chardev help | grep -iq 'spice\|vdagent'; then 326 SERENITY_COMMON_QEMU_ARGS="$SERENITY_COMMON_QEMU_ARGS 327 -device virtserialport,chardev=vdagent,nr=1 328 " 329 fi 330fi 331 332[ -z "$SERENITY_COMMON_QEMU_ISA_PC_ARGS" ] && SERENITY_COMMON_QEMU_ISA_PC_ARGS=" 333$SERENITY_EXTRA_QEMU_ARGS 334-m $SERENITY_RAM_SIZE 335-cpu pentium3 336-machine isapc 337-d guest_errors 338-device isa-vga 339-chardev stdio,id=stdout,mux=on 340-device isa-debugcon,chardev=stdout 341$SERENITY_BOOT_DRIVE 342" 343 344[ -z "$SERENITY_COMMON_QEMU_MICROVM_ARGS" ] && SERENITY_COMMON_QEMU_MICROVM_ARGS=" 345$SERENITY_EXTRA_QEMU_ARGS 346-m $SERENITY_RAM_SIZE 347-machine microvm,pit=on,rtc=on,pic=on 348-cpu qemu64 349-d guest_errors 350-chardev stdio,id=stdout,mux=on 351-device isa-debugcon,chardev=stdout 352-device isa-vga 353-device isa-ide 354$SERENITY_BOOT_DRIVE 355-device i8042 356-device ide-hd,drive=disk 357" 358 359[ -z "$SERENITY_COMMON_QEMU_Q35_ARGS" ] && SERENITY_COMMON_QEMU_Q35_ARGS=" 360$SERENITY_EXTRA_QEMU_ARGS 361-m $SERENITY_RAM_SIZE 362-cpu $SERENITY_QEMU_CPU 363-machine q35 364-d guest_errors 365-smp $SERENITY_CPUS 366-vga none 367-device vmware-svga 368-device ich9-usb-ehci1,bus=pcie.0,multifunction=on,addr=0x5.0x0 369-device ich9-usb-ehci2,bus=pcie.0,addr=0x5.0x2 370-device ich9-usb-uhci1,bus=pcie.0,multifunction=on,addr=0x7.0x0 371-device ich9-usb-uhci2,bus=pcie.0,addr=0x7.0x1 372-device ich9-usb-uhci3,bus=pcie.0,addr=0x7.0x2 373-device ich9-usb-uhci4,bus=pcie.0,addr=0x7.0x3 374-device ich9-usb-uhci5,bus=pcie.0,addr=0x7.0x4 375-device ich9-usb-uhci6,bus=pcie.0,addr=0x7.0x5 376-device pcie-root-port,port=0x10,chassis=1,id=pcie.1,bus=pcie.0,multifunction=on,addr=0x6 377-device pcie-root-port,port=0x11,chassis=2,id=pcie.2,bus=pcie.0,addr=0x6.0x1 378-device pcie-root-port,port=0x12,chassis=3,id=pcie.3,bus=pcie.0,addr=0x6.0x2 379-device pcie-root-port,port=0x13,chassis=4,id=pcie.4,bus=pcie.0,addr=0x6.0x3 380-device pcie-root-port,port=0x14,chassis=5,id=pcie.5,bus=pcie.0,addr=0x6.0x4 381-device pcie-root-port,port=0x15,chassis=6,id=pcie.6,bus=pcie.0,addr=0x6.0x5 382-device pcie-root-port,port=0x16,chassis=7,id=pcie.7,bus=pcie.0,addr=0x6.0x6 383-device pcie-root-port,port=0x17,chassis=8,id=pcie.8,bus=pcie.0,addr=0x6.0x7 384-device ich9-intel-hda,bus=pcie.2,addr=0x03.0x0 385-device bochs-display 386-device nec-usb-xhci,bus=pcie.2,addr=0x11.0x0 387-device pci-bridge,chassis_nr=1,id=bridge1,bus=pcie.4,addr=0x3.0x0 388-device sdhci-pci,bus=bridge1,addr=0x1.0x0 389-display $SERENITY_QEMU_DISPLAY_BACKEND 390-device virtio-serial 391-chardev stdio,id=stdout,mux=on 392-device virtconsole,chardev=stdout 393-device isa-debugcon,chardev=stdout 394-device virtio-rng-pci 395$SERENITY_AUDIO_BACKEND 396$SERENITY_AUDIO_HW 397$SERENITY_BOOT_DRIVE 398" 399 400export SDL_VIDEO_X11_DGAMOUSE=0 401 402: "${SERENITY_BUILD:=.}" 403cd -P -- "$SERENITY_BUILD" || die "Could not cd to \"$SERENITY_BUILD\"" 404 405if [ "$SERENITY_RUN" = "b" ]; then 406 # Meta/run.sh b: bochs 407 [ -z "$SERENITY_BOCHSRC" ] && { 408 # Make sure that SERENITY_SOURCE_DIR is set and not empty 409 [ -z "$SERENITY_SOURCE_DIR" ] && die 'SERENITY_SOURCE_DIR not set or empty' 410 SERENITY_BOCHSRC="$SERENITY_SOURCE_DIR/Meta/bochsrc" 411 } 412 "$SERENITY_BOCHS_BIN" -q -f "$SERENITY_BOCHSRC" 413elif [ "$SERENITY_RUN" = "qn" ]; then 414 # Meta/run.sh qn: qemu without network 415 "$SERENITY_QEMU_BIN" \ 416 $SERENITY_COMMON_QEMU_ARGS \ 417 -device $SERENITY_ETHERNET_DEVICE_TYPE \ 418 $SERENITY_KERNEL_AND_INITRD \ 419 -append "${SERENITY_KERNEL_CMDLINE}" 420elif [ "$SERENITY_RUN" = "qtap" ]; then 421 # Meta/run.sh qtap: qemu with tap 422 sudo ip tuntap del dev tap0 mode tap || true 423 sudo ip tuntap add dev tap0 mode tap user "$(id -u)" 424 "$SERENITY_QEMU_BIN" \ 425 $SERENITY_COMMON_QEMU_ARGS \ 426 $SERENITY_VIRT_TECH_ARG \ 427 $SERENITY_PACKET_LOGGING_ARG \ 428 -netdev tap,ifname=tap0,id=br0 \ 429 -device $SERENITY_ETHERNET_DEVICE_TYPE,netdev=br0 \ 430 $SERENITY_KERNEL_AND_INITRD \ 431 -append "${SERENITY_KERNEL_CMDLINE}" 432 sudo ip tuntap del dev tap0 mode tap 433elif [ "$SERENITY_RUN" = "qgrub" ] || [ "$SERENITY_RUN" = "qextlinux" ]; then 434 # Meta/run.sh qgrub: qemu with grub/extlinux 435 "$SERENITY_QEMU_BIN" \ 436 $SERENITY_COMMON_QEMU_ARGS \ 437 $SERENITY_VIRT_TECH_ARG \ 438 $SERENITY_PACKET_LOGGING_ARG \ 439 $SERENITY_NETFLAGS_WITH_DEFAULT_DEVICE 440elif [ "$SERENITY_RUN" = "q35" ]; then 441 # Meta/run.sh q35: qemu (q35 chipset) with SerenityOS 442 echo "Starting SerenityOS with QEMU Q35 machine, Commandline: ${SERENITY_KERNEL_CMDLINE}" 443 "$SERENITY_QEMU_BIN" \ 444 $SERENITY_COMMON_QEMU_Q35_ARGS \ 445 $SERENITY_VIRT_TECH_ARG \ 446 $SERENITY_NETFLAGS_WITH_DEFAULT_DEVICE \ 447 $SERENITY_KERNEL_AND_INITRD \ 448 -append "${SERENITY_KERNEL_CMDLINE}" 449elif [ "$SERENITY_RUN" = "isapc" ]; then 450 # Meta/run.sh q35: qemu (q35 chipset) with SerenityOS 451 echo "Starting SerenityOS with QEMU ISA-PC machine, Commandline: ${SERENITY_KERNEL_CMDLINE}" 452 "$SERENITY_QEMU_BIN" \ 453 $SERENITY_COMMON_QEMU_ISA_PC_ARGS \ 454 $SERENITY_VIRT_TECH_ARG \ 455 $SERENITY_NETFLAGS \ 456 -device ne2k_isa,netdev=breh \ 457 $SERENITY_KERNEL_AND_INITRD \ 458 -append "${SERENITY_KERNEL_CMDLINE}" 459elif [ "$SERENITY_RUN" = "microvm" ]; then 460 # Meta/run.sh q35: qemu (q35 chipset) with SerenityOS 461 echo "Starting SerenityOS with QEMU MicroVM machine, Commandline: ${SERENITY_KERNEL_CMDLINE}" 462 "$SERENITY_QEMU_BIN" \ 463 $SERENITY_COMMON_QEMU_MICROVM_ARGS \ 464 $SERENITY_VIRT_TECH_ARG \ 465 $SERENITY_NETFLAGS \ 466 -device ne2k_isa,netdev=breh \ 467 $SERENITY_KERNEL_AND_INITRD \ 468 -append "${SERENITY_KERNEL_CMDLINE}" 469elif [ "$SERENITY_RUN" = "q35grub" ]; then 470 # Meta/run.sh q35grub: qemu (q35 chipset) with SerenityOS, using a grub disk image 471 "$SERENITY_QEMU_BIN" \ 472 $SERENITY_COMMON_QEMU_Q35_ARGS \ 473 $SERENITY_VIRT_TECH_ARG \ 474 $SERENITY_NETFLAGS_WITH_DEFAULT_DEVICE 475elif [ "$SERENITY_RUN" = "limine" ]; then 476 "$SERENITY_QEMU_BIN" \ 477 $SERENITY_COMMON_QEMU_ARGS \ 478 $SERENITY_VIRT_TECH_ARG 479elif [ "$SERENITY_RUN" = "ci" ]; then 480 # Meta/run.sh ci: qemu in text mode 481 echo "Running QEMU in CI" 482 "$SERENITY_QEMU_BIN" \ 483 $SERENITY_EXTRA_QEMU_ARGS \ 484 $SERENITY_VIRT_TECH_ARG \ 485 -m $SERENITY_RAM_SIZE \ 486 -cpu $SERENITY_QEMU_CPU \ 487 -d guest_errors \ 488 -no-reboot \ 489 -smp ${SERENITY_CPUS} \ 490 -drive file=${SERENITY_DISK_IMAGE},format=raw,index=0,media=disk \ 491 -device ich9-ahci \ 492 -nographic \ 493 -display none \ 494 -debugcon file:debug.log \ 495 $SERENITY_KERNEL_AND_INITRD \ 496 -append "${SERENITY_KERNEL_CMDLINE}" 497else 498 # Meta/run.sh: qemu with user networking 499 "$SERENITY_QEMU_BIN" \ 500 $SERENITY_COMMON_QEMU_ARGS \ 501 $SERENITY_VIRT_TECH_ARG \ 502 $SERENITY_PACKET_LOGGING_ARG \ 503 $SERENITY_NETFLAGS_WITH_DEFAULT_DEVICE \ 504 $SERENITY_KERNEL_AND_INITRD \ 505 -append "${SERENITY_KERNEL_CMDLINE}" 506fi