@echo off setlocal enabledelayedexpansion set "SCRIPT_DIR=%~dp0" set "IMG=%SCRIPT_DIR%deshab.img" set "SATA_IMG=%SCRIPT_DIR%..\.build_tmp\sata_fat32_dsk.img" set "NVME_IMG=%SCRIPT_DIR%..\.build_tmp\nvme_test.img" if not exist "%IMG%" ( echo [qemu] Image not found: %IMG% echo [qemu] Run ..\build.bat first. exit /b 1 ) set "QEMU=" for %%Q in (qemu-system-x86_64.exe qemu-system-x86_64) do ( for /f "delims=" %%P in ('where %%Q 2^>nul') do ( if not defined QEMU set "QEMU=%%P" ) ) if not defined QEMU if exist "C:\Program Files\qemu\qemu-system-x86_64.exe" set "QEMU=C:\Program Files\qemu\qemu-system-x86_64.exe" if not defined QEMU if exist "C:\Program Files (x86)\qemu\qemu-system-x86_64.exe" set "QEMU=C:\Program Files (x86)\qemu\qemu-system-x86_64.exe" if not defined QEMU if exist "C:\msys64\mingw64\bin\qemu-system-x86_64.exe" set "QEMU=C:\msys64\mingw64\bin\qemu-system-x86_64.exe" if not defined QEMU if exist "C:\msys64\ucrt64\bin\qemu-system-x86_64.exe" set "QEMU=C:\msys64\ucrt64\bin\qemu-system-x86_64.exe" if not defined QEMU ( echo [qemu] qemu-system-x86_64 was not found. echo [qemu] Install QEMU or add it to PATH. exit /b 1 ) set "OVMF=" if exist "C:\Program Files\qemu\share\edk2-x86_64-code.fd" set "OVMF=C:\Program Files\qemu\share\edk2-x86_64-code.fd" if not defined OVMF if exist "C:\Program Files\qemu\share\OVMF_CODE.fd" set "OVMF=C:\Program Files\qemu\share\OVMF_CODE.fd" if not defined OVMF if exist "C:\msys64\mingw64\share\edk2\ovmf\OVMF_CODE.fd" set "OVMF=C:\msys64\mingw64\share\edk2\ovmf\OVMF_CODE.fd" if not defined OVMF if exist "C:\msys64\ucrt64\share\edk2\ovmf\OVMF_CODE.fd" set "OVMF=C:\msys64\ucrt64\share\edk2\ovmf\OVMF_CODE.fd" if not defined OVMF ( echo [qemu] UEFI firmware was not found. echo [qemu] Expected edk2-x86_64-code.fd or OVMF_CODE.fd under QEMU install directory. exit /b 1 ) REM ===== Accelerator selection ===== REM QEMU_ACCEL env var can override: "whpx" / "tcg" REM Default: WHPX for performance; TCG as fallback. REM NOTE: WHPX does NOT support nested VMX. CPUID reports vmx but VMXON REM causes a fatal hypervisor exit. When QEMU_ACCEL=whpx, we disable REM the VMX CPUID flag so UTSM gracefully skips VMX init. REM Set QEMU_ACCEL=tcg for full software emulation (also no VMX). if not defined QEMU_ACCEL set "QEMU_ACCEL=whpx" REM Detect whether Linux compat layer is enabled (bzImage present in IMG) set "LINUX_ENABLED=0" findstr /C:"module_path: boot():/boot/linux-bzImage" "%SCRIPT_DIR%..\SYSTEM\limine\limine.conf" >nul 2>&1 if not errorlevel 1 ( set "LINUX_ENABLED=1" ) REM Build CPU model string: disable VMX under WHPX (no nested virtualization) set "QEMU_CPU=qemu64" if "%QEMU_ACCEL%"=="whpx" ( set "QEMU_CPU=qemu64,-vmx" ) echo [qemu] Using: %QEMU% echo [qemu] UEFI: %OVMF% echo [qemu] Image: %IMG% echo [qemu] Accel: %QEMU_ACCEL% echo [qemu] CPU: %QEMU_CPU% if "%LINUX_ENABLED%"=="1" ( echo [qemu] Linux compat: ENABLED (modules present) if "%QEMU_ACCEL%"=="whpx" ( echo [qemu] WARNING: WHPX does not support nested VMX echo [qemu] Linux guest will NOT run under WHPX; VMX CPUID flag disabled echo [qemu] Use QEMU_ACCEL=tcg or run on real hardware for VMX support ) else if "%QEMU_ACCEL%"=="tcg" ( echo [qemu] WARNING: TCG does not support VMX echo [qemu] Linux guest will NOT run under TCG ) else ( echo [qemu] VMX may be available for Linux guest ) ) else ( echo [qemu] Linux compat: disabled (build via CODE/linux/build.sh to enable) ) REM NVMe test disk (generated by build.ps1, 64MB raw with DESHABNVME0 signature at LBA0) set "NVME_OPTS=" if exist "%NVME_IMG%" ( echo [qemu] NVMe: %NVME_IMG% set "NVME_OPTS=-drive if=none,id=nvme0,file=%NVME_IMG%,format=raw -device nvme,drive=nvme0,serial=deadbeef" ) REM USB xHCI test disk (64MB raw image for USB Mass Storage testing) set "USB_IMG=%SCRIPT_DIR%..\.build_tmp\usb_test.img" set "USB_OPTS=" if exist "%USB_IMG%" ( echo [qemu] USB: %USB_IMG% set "USB_OPTS=-device qemu-xhci,id=xhci0 -drive id=usb0,if=none,file=%USB_IMG%,format=raw -device usb-storage,bus=xhci0.0,drive=usb0" ) if exist "%SATA_IMG%" ( echo [qemu] SATA: %SATA_IMG% "%QEMU%" -accel %QEMU_ACCEL% -machine q35 -m 2G -cpu %QEMU_CPU% -serial stdio -drive if=pflash,format=raw,readonly=on,file="%OVMF%" -drive format=raw,file="%IMG%",if=virtio -drive id=sata0,format=raw,file="%SATA_IMG%",if=none -device ide-hd,drive=sata0,bus=ide.0 %NVME_OPTS% %USB_OPTS% -netdev user,id=net0 -device e1000,netdev=net0,mac=52:54:00:12:34:56 -boot menu=on ) else ( echo [qemu] SATA image not found, booting without block device "%QEMU%" -accel %QEMU_ACCEL% -machine q35 -m 2G -cpu %QEMU_CPU% -serial stdio -drive if=pflash,format=raw,readonly=on,file="%OVMF%" -drive format=raw,file="%IMG%",if=virtio %NVME_OPTS% %USB_OPTS% -netdev user,id=net0 -device e1000,netdev=net0 -boot menu=on ) endlocal