Files
Deshab-OS/ISO/run_qemu.bat
T

95 lines
4.2 KiB
Batchfile
Raw Normal View History

2026-07-28 21:11:10 +08:00
@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"
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
)
2026-07-28 21:11:10 +08:00
REM ===== Accelerator selection =====
REM QEMU_ACCEL env var can override: "whpx" / "tcg"
2026-07-29 10:26:25 +08:00
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).
2026-07-28 21:11:10 +08:00
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"
)
2026-07-29 10:26:25 +08:00
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%
2026-07-28 21:11:10 +08:00
echo [qemu] Accel: %QEMU_ACCEL%
2026-07-29 10:26:25 +08:00
echo [qemu] CPU: %QEMU_CPU%
2026-07-28 21:11:10 +08:00
if "%LINUX_ENABLED%"=="1" (
2026-07-29 10:26:25 +08:00
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
)
2026-07-28 21:11:10 +08:00
) else (
echo [qemu] Linux compat: disabled (build via CODE/linux/build.sh to enable)
)
if exist "%SATA_IMG%" (
echo [qemu] SATA: %SATA_IMG%
2026-07-29 10:26:25 +08:00
"%QEMU%" -accel %QEMU_ACCEL% -machine q35 -m 512M -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 -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
2026-07-29 10:26:25 +08:00
"%QEMU%" -accel %QEMU_ACCEL% -machine q35 -m 512M -cpu %QEMU_CPU% -serial stdio -drive if=pflash,format=raw,readonly=on,file="%OVMF%" -drive format=raw,file="%IMG%",if=virtio -netdev user,id=net0 -device e1000,netdev=net0 -boot menu=on
)
endlocal