The OSX-KVM ESP ships Lilu 1.6.8 / VirtualSMC 1.3.3 / WhateverGreen 1.6.7,
which disable themselves on macOS 26; Apple's SMC driver then runs on QEMU's
isa-applesmc stub and the restart path panics (SMCWDT smcWriteKey
kSMCBadCommand → nested panic after MACH Reboot). Overlay pinned current
releases (upstream.json opencore.kexts) and drop isa-applesmc: with the stub
present VirtualSMC steps aside ("multiple devices present"); alone it carries
the OSK and reboots work (PE restart test: 10 s, clean). RestrictEvents with
revpatch=memtab silences MacPro7,1's "Memory Modules Misconfigured".
- makeOpenCore: kext overlay + Kernel.Add entries for overlaid kexts,
--memory-mb (4 DIMMs), bootArgs default revpatch=memtab
- qemu.nix: deviceArgsFor { appleSmc } (default false); cli: --applesmc for
images built before this change
- vm-driver: reboot-death detection (reset 60 s after a guest reboot request
that never comes back), panics wait for XNU's own auto-reboot, debug dir
works across nixbld users
- generalize: QEMU USB keyboard declared ANSI (no Keyboard Setup Assistant)
- README: architecture, reliability handling, debugging
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XsESshRCoBoUVWV9qKURUF
44 lines
2.7 KiB
Nix
44 lines
2.7 KiB
Nix
# QEMU pieces shared by the macOS image builders, the vmix CLI and the NixOS module.
|
|
# Mirrors OSX-KVM's OpenCore-Boot.sh: q35, Skylake-Client CPU spoof (works on AMD
|
|
# hosts too), AppleSMC with the OSK, XHCI keyboard/tablet, AHCI disks, VMware SVGA.
|
|
{ pkgs, lib, ... }:
|
|
rec {
|
|
osk = "ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc";
|
|
|
|
# OSX-KVM's CPU line for Sequoia/Tahoe; AVX2 capable, Intel vendor for the kernel
|
|
defaultCpu = "Skylake-Client,-hle,-rtm,kvm=on,vendor=GenuineIntel,+invtsc,vmware-cpuid-freq=on,+ssse3,+sse4.2,+popcnt,+avx,+aes,+xsave,+xsaveopt,check";
|
|
|
|
# The NIC is pinned to a fixed PCI slot so OpenCore can mark it built-in
|
|
# (required for en0 / Apple ID, iMessage, App Store).
|
|
nicAddr = "0x12";
|
|
nicDevicePath = "PciRoot(0x0)/Pci(0x12,0x0)";
|
|
|
|
# `-nic user` cannot pin a PCI address, so netdev + device
|
|
netArgs = { mac, netdev ? "user,id=net0", extra ? "" }:
|
|
"-netdev ${netdev} -device virtio-net-pci,netdev=net0,mac=${mac},bus=pcie.0,addr=${nicAddr}${extra}";
|
|
|
|
# Devices macOS needs (no accel, disks, display adapter or display server here).
|
|
# No isa-applesmc: QEMU's stub only answers the OSK keys, and its presence makes
|
|
# VirtualSMC (which carries the OSK itself) step aside, leaving Apple's SMC
|
|
# driver on the stub — whose missing watchdog keys panic the restart path on
|
|
# macOS 26. VirtualSMC alone is the standard Hackintosh setup.
|
|
deviceArgsFor = { appleSmc ? false }:
|
|
''${lib.optionalString appleSmc ''-device isa-applesmc,osk="${osk}" ''}-smbios type=2 -device qemu-xhci,id=xhci -device usb-kbd,bus=xhci.0 -device usb-tablet,bus=xhci.0 -device usb-ehci,id=ehci -device ich9-intel-hda -device hda-duplex -device ich9-ahci,id=sata -global ICH9-LPC.disable_s3=1'';
|
|
deviceArgs = deviceArgsFor { };
|
|
|
|
# macOS has no QXL/virtio-gpu driver; VMware SVGA gives a plain framebuffer
|
|
vgaArgs = "-vga vmware";
|
|
|
|
machineArgs = { cpu ? defaultCpu, smp ? 4, memSize ? 4096, appleSmc ? false }:
|
|
"-accel kvm -machine type=q35 -cpu ${cpu} -smp ${toString smp},sockets=1,cores=${toString smp},threads=1 -m ${toString memSize} ${deviceArgsFor { inherit appleSmc; }} ${vgaArgs}";
|
|
|
|
# SATA disk on a given port. Store files are read-only: callers create qcow2 overlays.
|
|
sataDrive = { id, port, file, format ? "qcow2", extra ? "" }:
|
|
"-drive id=${id},if=none,format=${format},file=${file}${extra} -device ide-hd,bus=sata.${toString port},drive=${id}";
|
|
|
|
# XNU logs to COM1 with boot-args serial=3; the build drivers read this file
|
|
serialArgs = file: "-serial file:${file}";
|
|
|
|
firmwareArgs = varsFile:
|
|
"-drive if=pflash,format=raw,readonly=on,file=${pkgs.OVMF.fd}/FV/OVMF_CODE.fd -drive if=pflash,format=raw,file=${varsFile}";
|
|
}
|