Commit Graph

2241 Commits

Author SHA1 Message Date
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
Martin Wimpress 083ae65ae3 fix(quickget): remove VX Linux (project website down) 2026-01-23 23:52:27 +00:00
Martin Wimpress 5b67c0808f fix(quickget): handle Solus Xfce beta naming for older releases
Xfce was a beta edition with uppercase naming (XFCE-Beta) in releases
prior to 2025-11-29. Fall back to beta naming when standard fails.
2026-01-23 23:52:27 +00:00
Martin Wimpress e560c22d69 fix(quickget): update Zorin OS download method and editions
- Use direct mirror URL instead of unreliable shortlink redirects
- Remove lite64 edition from Zorin 18 (now Pro-only)
- Automatically detect latest revision for each version
2026-01-23 23:52:27 +00:00
Martin Wimpress cb67f82e6c fix(quickget): dynamically find PCLinuxOS edition releases
Different editions have different release dates. Changed to 'latest'
release with dynamic ISO discovery per edition.
2026-01-23 23:52:27 +00:00
Martin Wimpress b1ccbe9e61 fix(quickget): update Parrot Security releases and editions
- Only list releases that have ISO files available
- Remove htb edition (discontinued in 7.0 series)
- Filter out releases with empty ISO directories
2026-01-23 23:52:27 +00:00
Martin Wimpress a10864541b fix(quickget): remove unavailable KolibriOS Italian locale
The it_IT locale no longer has ISO builds available.
2026-01-23 23:52:27 +00:00
Martin Wimpress 08f8313a96 fix(quickget): update Garuda Linux editions
Remove discontinued editions: kde-git, lxqt-kwin, mate, qtile, wayfire
Add new editions: hyprland, mokka
2026-01-23 23:52:27 +00:00
Martin Wimpress b94bc69728 fix(quickget): update MX Linux Xfce ISO naming
Xfce edition now uses 'MX-VERSION_Xfce_x64.iso' naming convention.
2026-01-23 23:52:27 +00:00
Martin Wimpress c67a9971f6 fix(quickget): remove discontinued KDE Neon developer edition
The developer edition no longer provides ISO images.
2026-01-23 23:52:27 +00:00
Martin Wimpress e08e84c720 fix(quickget): update Guix releases to 1.5.0 and 1.4.0
Remove EOL 1.3.0 which has unreliable mirror availability.
Add latest 1.5.0 release.
2026-01-23 23:52:27 +00:00
Martin Wimpress 98735ad60a fix(quickget): only list Debian archive versions with live images
Filter archive releases to only include those with -live directories,
ensuring live image editions are actually available for download.
2026-01-23 23:52:27 +00:00
Martin Wimpress f725c1998b fix(quickget): fix Artix Linux editions parsing
Community editions now include init system suffix (e.g., community-gtk-openrc).
Updated parsing to correctly extract full edition-init combinations.
2026-01-23 23:52:27 +00:00
Martin Wimpress 542987bdbc fix(quickget): update Athena OS ISO naming for v23.11+
Newer releases use 'athenaos-rolling' prefix instead of 'athena-rolling'.
Detect which naming scheme to use by checking URL availability.
2026-01-23 23:52:27 +00:00
Martin Wimpress 07dee441b0 fix(quickget): fix failing downloads and remove discontinued distros
Fixes:
- slint: Update version from 15.0-5 to 15.0-10
- blendos: Replace dead mirror with official GitLab build server
- void: Filter out directories without standard base ISOs (fixes
20250401)

Removals:
- holoiso: Project archived Feb 2024, download server returns 404
- truenas-core: Discontinued, merged into TrueNAS Community Edition
- truenas-scale: Rebranded to TrueNAS Community Edition
2026-01-23 23:52:27 +00:00
Martin Wimpress 9d76158196 fix(quickget): use mirrors.kernel.org for Gentoo, Linux Mint and LMDE
- Replace mirror.bytemark.co.uk with mirrors.kernel.org in get_gentoo,
  get_linuxmint and get_lmde
- Prefer kernel.org mirrors for improved availability and fresher
releases
- No change to ISO selection or hash verification logic; behaviour
unchanged

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-23 23:52:27 +00:00
Martin Wimpress 7d5de87c2f fix(quickget): exclude EOL and pre-release distro versions
- Remove Devuan 'beowulf' from the release list
- Drop Mageia '8' from the release list
- Filter Fedora releases JSON and exclude Fedora 41 (prevent EOL
entries)
- Restrict GNOME OS parsing to stable numeric versions and keep
"nightly"
- Rationale: avoid presenting EOL or alpha/beta/rc images to users and
reduce failed downloads

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-23 23:52:27 +00:00
Martin Wimpress fed267550d ci(test-quickget): use temp file to collect distro rows for sorting
Replace string concatenation with temp file approach to fix issue where
only the first distro appeared in the summary table. Writing rows to a
temp file and sorting it directly is more robust than piping concatenated
strings through sort.
2026-01-23 19:29:23 +00:00
Martin Wimpress 84c77bd3c3 ci(test-quickget): improve test summary formatting and status logic
- Set status to  only when failed>0 and passed==0; use ⚠️ when failures
exist but some passed
- Build per-distro rows with printf to preserve newlines and avoid
trailing whitespace
- Replace heredoc cat with explicit echo lines for consistent GitHub
summary formatting
- Append sorted distro rows without extra blank lines

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-23 19:29:23 +00:00
Martin Wimpress a2baa3b489 ci(test-quickget): narrow artifact globs and remove merge-multiple
- Remove merge-multiple: true from actions/download-artifact step
- Use results/result-*/result.json and results/result-*/failed.txt globs
- Ensure per-distro result files and failed lists are read consistently
for summary

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-23 19:29:23 +00:00
Martin Wimpress 9073738ade ci(test-quickget): use wc -l to count test results
Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-23 19:29:23 +00:00