From 00e54c13c7c9030c4d5f7151467f2d85a3730e29 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Rasmusson Date: Sun, 13 Sep 2026 18:36:21 -0400 Subject: Initial commit: Open-IOV vGPU-IO complete stack - Firmware decompilation: GSP 570.144W (28.5MB ELF, RV64IMAC), 132 decompiled C files - Kernel modules: nvidia.ko (34MB, OpenRM), open-iov-vfio.ko (2.8MB, VFIO mdev), gsp-vgpu.ko (1.8MB, guest driver) - Userspace: libiov.so/libvgpu.so (76KB), example_vgpu (28KB), rpc_emulator.c - PCI config space emulation (256B with PM, MSI, MSI-X, PCIe caps) - 12 RPC types fully mapped from firmware decompilation - BAR trap, WPR, scheduling, notification, migration emulation - Helper scripts: load_vgpu_stack, create_mdev, launch_qemu_vgpu, test_vgpu_stack, setup_guest_driver, unload_vgpu_stack - Architecture documentation - Wiki: 10 technical documents - Git LFS for large binaries (.ko, .bin, .iso, .img, .o, ghidra repos) - nvidia-open-gpu-kernel-modules as submodule --- scripts/launch_qemu_vgpu.sh | 183 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100755 scripts/launch_qemu_vgpu.sh (limited to 'scripts/launch_qemu_vgpu.sh') diff --git a/scripts/launch_qemu_vgpu.sh b/scripts/launch_qemu_vgpu.sh new file mode 100755 index 0000000..5a57737 --- /dev/null +++ b/scripts/launch_qemu_vgpu.sh @@ -0,0 +1,183 @@ +#!/bin/bash +# launch_qemu_vgpu.sh - Launch QEMU with NVIDIA vGPU mediated device +# Usage: ./launch_qemu_vgpu.sh [MDEV_UUID] [GUEST_IMAGE] [OPTIONS] + +set -euo pipefail + +MDEV_UUID="${1:-}" +GUEST_IMAGE="${2:-/var/lib/libvirt/images/ubuntu-22.04.qcow2}" +shift 2 || true +EXTRA_QEMU_ARGS=("$@") + +# Find mdev device if UUID not specified +if [[ -z "$MDEV_UUID" ]]; then + echo "Scanning for available mdev devices..." + mapfile -t MDEVS < <(find /sys/bus/mdev/devices -maxdepth 1 -name "????????-????-????-????-????????????" -printf "%f\n" 2>/dev/null) + if [[ ${#MDEVS[@]} -eq 0 ]]; then + echo "ERROR: No mdev devices found. Run create_mdev.sh first." + exit 1 + elif [[ ${#MDEVS[@]} -eq 1 ]]; then + MDEV_UUID="${MDEVS[0]}" + echo "Auto-selected mdev: $MDEV_UUID" + else + echo "Multiple mdev devices found:" + for i in "${!MDEVS[@]}"; do + MDEV="${MDEVS[$i]}" + TYPE=$(cat "/sys/bus/mdev/devices/$MDEV/mdev_type/name" 2>/dev/null || echo "unknown") + echo " [$i] $MDEV ($TYPE)" + done + read -p "Select mdev [0-$((${#MDEVS[@]}-1))]: " idx + MDEV_UUID="${MDEVS[$idx]}" + fi +fi + +MDEV_PATH="/sys/bus/mdev/devices/$MDEV_UUID" + +if [[ ! -d "$MDEV_PATH" ]]; then + echo "ERROR: mdev device $MDEV_UUID not found at $MDEV_PATH" + exit 1 +fi + +# Verify guest image +if [[ ! -f "$GUEST_IMAGE" ]]; then + echo "ERROR: Guest image not found: $GUEST_IMAGE" + echo "Create one with: qemu-img create -f qcow2 $GUEST_IMAGE 50G" + exit 1 +fi + +# Check KVM +if [[ ! -r /dev/kvm ]]; then + echo "ERROR: KVM not available (/dev/kvm not readable)" + exit 1 +fi + +# Check VFIO +if [[ ! -e /dev/vfio/vfio ]]; then + echo "ERROR: VFIO not available" + exit 1 +fi + +# Get mdev info +VGPU_TYPE=$(cat "$MDEV_PATH/mdev_type/name" 2>/dev/null || echo "unknown") +PCI_ADDR=$(readlink -f "$MDEV_PATH/../../.." | xargs basename) + +echo "==========================================" +echo "Launching QEMU with NVIDIA vGPU" +echo "==========================================" +echo "mdev UUID: $MDEV_UUID" +echo "vGPU Type: $VGPU_TYPE" +echo "PCI Addr: $PCI_ADDR" +echo "Guest Image: $GUEST_IMAGE" +echo "Extra Args: ${EXTRA_QEMU_ARGS[*]}" +echo "==========================================" + +# CPU configuration for vGPU +CPU_OPTS=( + -cpu host,hv_time,hv_relaxed,hv_vapic,hv_spinlocks=0x1fff,hv_vendor_id=NVIDIA42 + -smp 8,sockets=1,cores=8,threads=1 + -m 16G,slots=4,maxmem=64G + -mem-prealloc +) + +# Memory backing for hugepages (better performance) +HUGEPAGE_OPTS=( + -object memory-backend-file,id=mem,size=16G,mem-path=/dev/hugepages,share=on + -numa node,memdev=mem +) + +# VFIO device configuration +VFIO_OPTS=( + -device vfio-pci,sysfsdev="$MDEV_PATH",display=off,x-igd-opregion=on + -device vfio-pci,sysfsdev="$MDEV_PATH",display=off,romfile= +) + +# Display (use SPICE/VNC for headless, or virtio-gpu for local) +DISPLAY_OPTS=( + -vga none + -display none + # Uncomment for VNC: + # -vnc :1 + # Uncomment for SPICE: + # -spice port=5900,addr=127.0.0.1,disable-ticketing=on + # -device virtio-serial-pci + # -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 + # -chardev spicevmc,id=spicechannel0,name=vdagent +) + +# Network +NET_OPTS=( + -netdev user,id=net0,hostfwd=tcp::2222-:22 + -device virtio-net-pci,netdev=net0 +) + +# Storage +STORAGE_OPTS=( + -drive file="$GUEST_IMAGE",format=qcow2,if=virtio,cache=writeback,aio=threads + # Add ISO for installation: + # -drive file=/path/to/ubuntu-22.04-live-server-amd64.iso,format=raw,if=virtio,media=cdrom +) + +# USB tablet for better mouse integration +USB_OPTS=( + -usb + -device usb-tablet +) + +# RNG +RNG_OPTS=( + -object rng-random,id=rng0,filename=/dev/urandom + -device virtio-rng-pci,rng=rng0 +) + +# TPM (optional, for Windows guests) +# TPM_OPTS=( +# -chardev socket,id=chrtpm,path=/var/run/tpm-emulator/swtpm-sock +# -tpmdev emulator,id=tpm0,chardev=chrtpm +# -device tpm-tis,tpmdev=tpm0 +# ) + +# QEMU command +QEMU_CMD=( + qemu-system-x86_64 + -enable-kvm + -machine q35,accel=kvm,kernel_irqchip=split + -bios /usr/share/ovmf/OVMF.fd + "${CPU_OPTS[@]}" + "${HUGEPAGE_OPTS[@]}" + "${VFIO_OPTS[@]}" + "${DISPLAY_OPTS[@]}" + "${NET_OPTS[@]}" + "${STORAGE_OPTS[@]}" + "${USB_OPTS[@]}" + "${RNG_OPTS[@]}" + "${EXTRA_QEMU_ARGS[@]}" + -name "vGPU-Guest-$VGPU_TYPE" + -pidfile "/tmp/qemu-vgpu-$MDEV_UUID.pid" + -daemonize +) + +echo "Starting QEMU..." +echo "Command: ${QEMU_CMD[*]}" +echo "" + +"${QEMU_CMD[@]}" + +sleep 2 + +if [[ -f "/tmp/qemu-vgpu-$MDEV_UUID.pid" ]]; then + PID=$(cat "/tmp/qemu-vgpu-$MDEV_UUID.pid") + if kill -0 "$PID" 2>/dev/null; then + echo "SUCCESS: QEMU started with PID $PID" + echo "" + echo "Connect via SSH: ssh -p 2222 user@localhost" + echo "Or VNC: vncviewer localhost:1 (if enabled)" + echo "" + echo "To stop: kill $PID" + else + echo "ERROR: QEMU failed to start" + exit 1 + fi +else + echo "ERROR: QEMU PID file not created" + exit 1 +fi \ No newline at end of file -- cgit v1.2.3