Commit Graph

2261 Commits

Author SHA1 Message Date
Martin Wimpress 2384b0d263 fix(quickemu): enable vmware TSC and disable ACPI PCI hotplug for macOS
- Pass vmware-cpuid-freq=on to -cpu on Intel hosts to enable VMware TSC
  frequency reporting and improve macOS timing
- Add ICH9-LPC flag to disable ACPI PCI hotplug bridge support to avoid
  macOS PCI hotplug issues (required for QEMU 6.1+)

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 12:43:43 +00:00
Martin Wimpress eb54549353 fix(quickemu): select correct sound card for macOS guests
- Split macOS sound card logic by OS version:
  - Use virtio-sound-pci for macOS 12+ (Monterey and newer)
  - Use ich9-intel-hda for Big Sur
  - Keep intel-hda for earlier macOS releases
- Add virtio-sound-pci case to configure_audio() to pair the device with
  existing audiodev backends (PulseAudio, PipeWire, ALSA, CoreAudio)
- Update help text to include virtio-sound-pci as an allowed sound card
option
- Add virtio-sound-pci to allowed sound cards in
sound_card_param_check()

VoodooHDA injected via OpenCore stopped working from macOS 11.3+
onwards and usb-audio proved unreliable for Big Sur+. virtio-sound-pci
works natively on macOS 12+ without kexts and fixes guest audio for
affected versions.

Fixes #1642

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 11:55:51 +00:00
Martin Wimpress 76b29c659c perf(quickemu): enable TRIM/discard and detect-zeroes for qcow2 drives
Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 10:43:01 +00:00
Martin Wimpress 81b99feccd perf(quickemu): tune TCG translation cache and enable multithreaded TCG
- Add TCG-specific runtime optimisations in vm_boot for
cross-architecture VMs
- Detect host RAM and set tb-size to 512 for hosts with >=16GB,
otherwise 256
- Append -accel tcg,tb-size=${TCG_TB_SIZE},thread=multi to QEMU args
- Improve TCG translation cache behaviour and SMP performance for TCG
guests

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 03:15:46 +00:00
Martin Wimpress d8b27e8480
docs: update documentation
Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 02:22:38 +00:00
Martin Wimpress 0742312aa5 build(packaging): sync Nix flakes, devshell and Debian packaging
- Update flake.nix and package.nix to refresh package definitions and
pins
- Refresh devshell.nix to include updated development dependencies
- Adjust debian/control metadata to match packaging and dependency
changes
- Align packaging metadata between Nix and Debian to improve
reproducibility

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 01:51:53 +00:00
Martin Wimpress e7b49430cf docs(quickemu): clarify CPU, display and VM comments
- Clarify highmem behaviour for aarch64 virt machine and why it is
needed for >3GB RAM
- Add detailed explanation of TCG (software emulation), how to force it,
and common use cases
- Replace TODOs about VM detection with manufacturer-based detection
guidance
- Improve ARM detection rationale (no standard vendor strings)
- Explain that TCG enables running x86_64 macOS on ARM via software
emulation
- Prefer OpenGL ES via ANGLE on macOS for stability/performance on
Metal-backed systems
- Document virtio-gpu naming and regex rationale for matching device
names
- Note virtio devices manage VRAM dynamically via QEMU default
max_hostmem
- Add SMM/vmport note clarifying x86-specific semantics and Secure Boot
differences

No functional changes; comments only.

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 01:31:11 +00:00
Martin Wimpress 2324d96303 refactor: quote expansions and add ShellCheck directive
- Quote URL argument passed to web_pipe in quickget to prevent
word-splitting
- Quote echoed variables in quickget (echo "${...}") for safe output
when values contain whitespace
- Add shellcheck disable=SC2054 in quickemu vm_boot to silence a
spurious ShellCheck warning

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 01:11:25 +00:00
Martin Wimpress 1991306df3 fix(quickget): prefer macOS-friendly hash commands in check_hash
- Prefer GNU coreutils g* hash commands on macOS when available; fall
back to native shasum/md5 otherwise
- Handle MD5 on macOS using 'md5 -r' and parse its output for comparison
- Warn and skip b2sum verification when GNU b2sum is not installed on
macOS
- Use a selected hash command variable when printing status and
performing checks

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress 6c957f6529 feat(quickget): support Ubuntu desktop ARM64 from 25.10
- Add arch_ubuntu() to enumerate supported architectures and gate ARM64
by release
- Validate architecture once RELEASE is known and exit/skip if
unsupported
- Use UBUNTU_ARCH when selecting ISO lines and hashes instead of
hardcoded amd64
- Use cdimage.ubuntu.com releases path for Ubuntu ARM64 desktop ISOs
- Default non-numeric releases (daily, dvd, etc.) to amd64 only

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress f1c66b45b9 fix(quickget): skip unsupported architectures for test/show operations
- If architecture is unsupported and OPERATION is "test" or "show",
  call test_result with SKIP and exit 0
- Keep existing error and exit 1 for non-test/show operations

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress 61d0bec3ba fix(quickget): validate architecture support after edition selection
- Skip early architecture check for OSes with editions_<os> to avoid
  rejecting valid edition-specific combinations
- Perform architecture validation after EDITION is known and show a
  descriptive error when the chosen edition isn't available on ARCH
- Preserve test/show behaviour (report SKIP) and keep previous flow for
  OSes without editions_<os>

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress 78fc1c93e6 fix(quickget): skip unsupported architectures for all operations
- Remove the OPERATION == "test" guard so is_arch_supported() is
evaluated
  unconditionally
- Apply the unconditional arch check in test_all() for editions loop,
  ubuntu-server, ubuntu desktop (ubuntu*), and the default case
- Skip generating URLs / running further logic when an OS is not
available
  for the requested ARCH
IMPACT: quickget will no longer attempt to generate or test downloads
for
architectures that the distro does not support, preventing incorrect URL
generation and false-positive test attempts.

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress 5bbfdd1b54 fix(quickget): validate architecture before attempting download
Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress 1f7ec7e52c feat(quickget): add --check-all-arch to test amd64 and arm64
- Add CLI flag --check-all-arch with help text and CHECK_ALL_ARCH var
- Implement loop to run checks for both amd64 and arm64, setting ARCH
per run
- Validate architecture and release/edition before generating URLs; skip
Windows
- Generate and check URLs per-arch, reporting PASS / FAIL / SKIP per
entry
- Update CI workflow to call ./quickget --check-all-arch for distro
matrix tests

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress 1e194c6941 feat(quickget): add per-distro architecture support and validation
- Add arch_*() functions declaring supported architectures for several
distros
- Add is_arch_supported() helper; default to amd64 when no arch_* exists
- Validate architecture before generating URLs or running tests
(web_get, zsync_get, test_all)
- Update test_result() to accept and display an optional reason when
skipping
- Prevent false failures by skipping tests for unsupported architectures
IMPACT: quickget now respects requested architectures and reports clear
SKIP reasons for distros that do not support the selected arch.

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress fe4364c7e1 fix(quickget): use ARCH for Debian ISOs and validate arm64 editions
- Use ARCH as DEBIAN_ARCH when constructing ISO filename and cdimage URL
- Update DEBCURRENT handling to select arch-specific iso-hybrid path
- Add explicit error and exit if arm64 is requested with a non-netinst
edition
  (Debian provides netinst images only for ARM64)

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress b62c144480 fix(quickget): select correct arch for Fedora and Ubuntu server ISOs
- Add FEDORA_ARCH and set to aarch64 when ARCH == arm64
- Use FEDORA_ARCH in jq filter to pick the correct Fedora ISO/sha256
- Add UBUNTU_ARCH and switch Ubuntu daily/releases URL for arm64
- Use UBUNTU_ARCH when parsing SHA256SUMS/MD5SUMS instead of hardcoded
amd64
Fixes incorrect ISO selection on ARM64 hosts and enables arm64
downloads.

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress 57f753a21d feat(quickget): detect host architecture and add --arch flag
- Add HOST_ARCH detection and set ARCH default (arm64 → arm64, others →
amd64)
- Add parse_arch_flag() and support --arch/-arch before or after
operation args
- Inject arch="aarch64" into generated VM configs when ARCH=arm64
- Use QEMU_ARCH in distro helpers (AlmaLinux, Alpine, etc.) to build
correct ISO names/URLs
- Update help text to document --arch and reorder flags display
- Tidy Alpine release parsing (use first match) and simplify Rocky URL
assignment
Note: quickget now defaults ARCH from the host; pass --arch to override
if you
need a different target architecture.

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress ea1fbf6932 build(devshell): remove macOS brew and SHARE_PATH sed substitutions
- Remove sed expressions that replaced local SHARE_PATH and removed
Homebrew check
- Rely on existing darwin-specific substitutions and Nix-provided qemu
paths
- Simplify shellHook and avoid accidental replacements on non-Darwin
systems

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 21:28:59 +00:00
Martin Wimpress 305b0cd90e fix(quickemu): derive qemu share path from binary location
- Add get_qemu_share_path() to resolve the QEMU binary realpath and
derive
  a matching share directory (handles symlinks, Nix store paths,
Homebrew,
  MacPorts and custom builds)
- Replace ad-hoc brew/system logic in configure_bios with resolved share
path
- Fallback to /usr/share when no qemu firmware directory is found
Improve firmware/OVMF lookup reliability for non-system QEMU
installations.

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 21:28:59 +00:00
Martin Wimpress 2e147f658e
fix(quickemu): quote qemu-system-${ARCH_VM} lookup
Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 20:15:54 +00:00
Martin Wimpress 5276ebaafb fix(quickemu): set xres/yres only for devices that support them
- Replace vmware-svga exclusion with explicit device regex
- Apply xres/yres only to virtio-(vga|vga-gl|gpu|gpu-pci|gpu-gl-pci),
qxl, qxl-vga and bochs-display
- Prevent passing unsupported xres/yres params to other display devices,
avoiding incorrect resolution coercion and QEMU warnings

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 20:12:53 +00:00
Martin Wimpress 5dfe6c9cf7 fix(quickemu): enable pflash secure property only when secureboot on
Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 20:04:52 +00:00
Martin Wimpress aa4211b38a feat(quickemu): add CPU flag management with deduplication
- Add CPU_FLAG_MAP and helper functions reset_cpu_flags and add_cpu_flag
- Validate flag format, deduplicate entries and detect +/- and value
conflicts
- Replace direct CPU string concatenation in configure_cpu with
add_cpu_flag calls
- Centralise CPU flag logic to improve macOS and Windows CPU feature
selection
IMPACT: prevents duplicate or conflicting CPU flags being passed to QEMU
and
simplifies future CPU feature handling.

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 19:36:09 +00:00
Martin Wimpress 6e0b4981ce feat(quickemu): add ARM64 (aarch64) guest support
- Allow arch override via config (arch="${arch:-x86_64}") and set
  ARCH_VM accordingly so aarch64 VMs can be selected from configs.
- Re-detect qemu-system-${ARCH_VM} after sourcing the VM config and
  fail fast with a clear error if the appropriate QEMU binary is
  missing (e.g. qemu-system-aarch64).
- Use virt machine for ARM64 and enable highmem when required
  (MACHINE_TYPE="virt,highmem=on,pflash0=rom,pflash1=efivars").
  pflash0/pflash1 reference named blockdev nodes instead of -drive if
  using OVMF-style pflash on x86.
- Set CPU selection for ARM64 to "max" when available; fall back to
  TCG accel when cross-arch emulation is required (ensures guests
  boot on non-ARM hosts).
- Omit x86-only machine options (smm, vmport) for aarch64 builds to
  avoid passing unsupported flags to QEMU.
- Add AAVMF/ARM64 firmware search paths and keep OVMF logic for
  x86_64 (preserve existing secureboot behaviour for x86 guests).
- Use virtio-gpu-pci for ARM64 (no VGA/virtio-vga on ARM) and add a
  ramfb device to provide an early UEFI framebuffer on ARM64 UEFI
  boot.
- Use virtio-scsi for CD-ROM on ARM64 (virt has no IDE controller) and
  set CD-ROM bootindex=1 so ISO boots before disk when provided.
  Set disk bootindex=2 when an ISO is present so disk remains second.
- Implement EFI boot configuration for ARM64 using -blockdev with
  named nodes (pflash handled via blockdev) rather than the x86
  -drive/secure global approach which is SMM/x86-specific.
- Use the ARM-compatible TPM device (tpm-tis-device) for aarch64
  instead of the x86 tpm-tis device where appropriate.
- Fix EFI_CODE condition bug by using -z instead of -n when checking
  for empty variables (pre-existing bug surfaced while testing ARM64).

IMPACT:
- Enables running aarch64 guests with proper firmware, machine type,
  devices and boot order on both native ARM hosts and non-ARM hosts
  (via TCG emulation).
- Maintainers should note the different pflash/blockdev handling and
  that -global secure pflash settings used for x86 must NOT be used
  for ARM64 virt machines.

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 18:03:24 +00:00
Martin Wimpress b0e643d1c3 feat(quickemu): warn on unstable TSC for macOS Ventura+ on AMD
- Add check_macos_tsc_stability() to detect unstable TSC on Linux hosts
with
  AuthenticAMD CPUs when launching macOS Ventura+ guests
- Log a clear warning to the VM log and prompt interactively to continue
or
  abort to avoid guest freezes
- Abort by default in non-interactive mode to prevent unattended VM
hangs
- Add --ignore-tsc-warning to bypass the check and invoke the check
during
  vm_boot so it runs early in startup
Closes #1273

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 15:20:59 +00:00
Martin Wimpress 086128530f fix(quickget): support algorithm-prefixed hashes and b2sum
- Accept hashes in the form "algo:hash" and normalise prefix to
lowercase
- Map common prefixes (md5, sha1, sha256, sha512, b2sum|blake2|blake2b)
to tools
- Warn and skip verification for unknown prefixes
- Add macOS GNU coreutils mapping for gb2sum when using b2sum
- Use printf '%s  %s\n' to produce a stable "hash  filename" input for
--check

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 14:42:11 +00:00
Martin Wimpress e86d9980cd fix(quickemu): accept HygonGenuine CPUs and skip x86 checks on ARM hosts
- Treat HygonGenuine as AMD-compatible and check svm for AMD-style hosts
- On aarch64/arm64 hosts, skip x86-specific VT-x/SVM validation (HVF/KVM
handled by hypervisor)
- Add warning for unknown CPU vendors to aid troubleshooting

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 14:25:42 +00:00
Martin Wimpress e3fb8c3372 fix: use portable extended grep regex
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-01-24 14:02:38 +00:00
Martin Wimpress 18451fe6c1 feat(quickemu): enable GL on macOS (cocoa) and prefer virtio GL
- Add check_cocoa_gl_es_support(): detect QEMU cocoa gl=es support and
look for
  ANGLE/libEGL in QEMU prefix, Homebrew and DYLD paths
- Use the check in configure_display() to enable "gl=es" for cocoa when
available
  and fall back to disabling GL (preserving previous stability
behaviour)
- Improve virtio GL selection: prefer virtio-gpu(-gl) /
virtio-gpu-gl-pci /
  virtio-vga-gl variants when GL is enabled and QEMU exposes the device
- Remove the hard disable of GL for cocoa in display_param_check() (now
handled
  by the detection function)
- Ensure user-visible display/GL/VirGL status remains printed for
diagnostics
Enables safer GL usage on macOS (covers Nix/Homebrew QEMU and ANGLE
cases);
falls back cleanly when support is absent.

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 14:02:38 +00:00
Martin Wimpress 7668519b8d fix: prevent FAT directory name munging
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-01-24 12:42:51 +00:00
Martin Wimpress c96a2484e6 fix: prevent FAT direectory name munging
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-01-24 12:42:51 +00:00
Martin Wimpress f9249d657f fix: verify all mtools are available
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-01-24 12:42:51 +00:00
Martin Wimpress 1783381e29 feat(quickget): integrate OpenCore into macOS disk image by default
Create macOS VMs with OpenCore embedded in the EFI partition of disk.qcow2
instead of using a separate OpenCore.qcow2 file. This simplifies VM management
by reducing from two disk images to one.

Implementation:
- Add create_macos_disk_with_opencore() using mtools/sgdisk for cross-platform
  EFI partition creation without mounting or root privileges
- Add download_opencore() to extract OpenCore files from OSX-KVM image
- Use LC_ALL='' with mcopy to prevent FAT directory name mangling
- Adjust disk size threshold for macOS integrated mode (1GB vs 1.5MB)

Backwards compatibility:
- If OpenCore.qcow2 exists, use legacy two-disk boot method
- If mtools/sgdisk unavailable, fall back to legacy method automatically

New dependencies: mtools, gptfdisk (added to devshell.nix and package.nix)

Closes #1720
2026-01-24 12:42:51 +00:00
Martin Wimpress 2fe51d5671 fix(quickemu): skip x86 CPU feature checks on Apple Silicon
When using TCG emulation for cross-architecture VMs (e.g., x86_64 guest
on arm64 host), skip the SSE/AVX CPU feature detection since QEMU
emulates these features in software. This fixes macOS guest startup on
Apple Silicon Macs.

Fixes #1457
2026-01-24 10:40:23 +00:00
Martin Wimpress 81143afaab fix(devshell): enable EFI boot on macOS by patching OVMF paths
Nix's qemu_full bundles EDK2 firmware with different filenames than
quickemu expects. Add darwin-specific sed patterns to:
- Set SHARE_PATH to qemu_full's share directory
- Prepend correct firmware paths (edk2-x86_64-code.fd, edk2-i386-vars.fd)
  to the ovmfs search array
2026-01-24 10:02:16 +00:00
Martin Wimpress 9cc54ff365 fix(quickemu): remove duplicate +invtsc flag for AMD macOS guests
The invtsc flag is already added by the configure_cpu_flag loop when
check_cpu_flag recognises constant_tsc as equivalent to invtsc on AMD.
Adding it again in the AMD-specific TSC block caused duplication.

Only +tsc and +tsc-deadline are needed as additional flags.
2026-01-24 02:42:52 +00:00
Martin Wimpress 3cfbfb1a30 fix(quickemu): improve TSC flag detection for macOS on AMD CPUs 2026-01-24 02:42:52 +00:00
Martin Wimpress a2539d3c56 fix(quickget): resize Batocera image for GPT expansion 2026-01-24 02:10:49 +00:00
Martin Wimpress c66827ccb1 fix(quickget): extract Archcraft version folder from redirect URL
The hash URL was incorrectly using 'v${RELEASE}' (e.g., 'vlatest')
instead of extracting the actual version folder from the redirect URL.
Since releases_archcraft returns 'latest', the download redirect goes
to a versioned folder like 'v25.10', but the hash file lookup used
'vlatest' which doesn't exist.

Extract the version folder from the redirect URL to construct the
correct hash file path.
2026-01-24 01:43:24 +00:00
Martin Wimpress 7a59041120 fix(quickget): add hash verification for Mabox Linux 2026-01-24 01:43:24 +00:00
Martin Wimpress 9d4171b0d6 fix(quickget): add hash verification for KolibriOS 2026-01-24 01:43:24 +00:00
Martin Wimpress 2e5b29ad43 fix(quickget): add hash verification for Archcraft 2026-01-24 01:43:24 +00:00
Martin Wimpress 5090385dbd fix(quickemu): conditionalise KVM-specific CPU flags for Windows
Fixes #1731
2026-01-24 01:02:49 +00:00
Martin Wimpress 5ef6d1ffeb
chore: bump version to 4.9.9 2026-01-24 00:33:33 +00:00
Martin Wimpress 848ed99ef6
feat(quickget): add macOS Tahoe support and update board IDs. fixes #1731 2026-01-24 00:04:07 +00:00
Martin Wimpress 959a9a3546
docs: add AGENTS.md describing agents and contribution workflow
Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 00:01:16 +00:00
Martin Wimpress e7c17eded2 fix(quickget): address PR review feedback
- Fix misleading comment in releases_fedora() to match actual behaviour
- Fix editions_zorin() to handle unset RELEASE in csv_data() context
2026-01-23 23:52:27 +00:00
Martin Wimpress 7dc93266c9 fix(quickget): remove Athena OS (no longer getting updates) 2026-01-23 23:52:27 +00:00