From aaf00ca76a5e5a56a8ff5340e9ff6e7d26483c19 Mon Sep 17 00:00:00 2001 From: Alex Haydock Date: Fri, 17 Oct 2025 21:42:24 +0100 Subject: [PATCH] fix: Support 4M qcow2 images (#1749) * Initial changes to support qcow2 firmware --- quickemu | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/quickemu b/quickemu index baee457..caa8454 100755 --- a/quickemu +++ b/quickemu @@ -614,6 +614,12 @@ function configure_ram() { fi } +function is_firmware_qcow2() { + # Check for the magic bytes that indicate the firmware is in qcow2 format, + # otherwise default to assuming firmware files are in raw format + [ "$(head -c 4 "$1")" = "QFI"$'\xfb' ] && echo "true" || echo "false" +} + function configure_bios() { # Always Boot macOS using EFI if [ "${guest_os}" == "macos" ]; then @@ -680,7 +686,8 @@ function configure_bios() { "${SHARE_PATH}/qemu/ovmf-x86_64-smm-ms-code.bin","${SHARE_PATH}/qemu/ovmf-x86_64-smm-ms-vars.bin" \ "${SHARE_PATH}/qemu/edk2-x86_64-secure-code.fd","${SHARE_PATH}/qemu/edk2-x86_64-code.fd" \ "${SHARE_PATH}/edk2-ovmf/x64/OVMF_CODE.secboot.fd","${SHARE_PATH}/edk2-ovmf/x64/OVMF_VARS.fd" \ - "${SHARE_PATH}/edk2/x64/OVMF_CODE.secboot.4m.fd","${SHARE_PATH}/edk2/x64/OVMF_VARS.4m.fd" + "${SHARE_PATH}/edk2/x64/OVMF_CODE.secboot.4m.fd","${SHARE_PATH}/edk2/x64/OVMF_VARS.4m.fd" \ + "${SHARE_PATH}/edk2/ovmf/OVMF_CODE_4M.secboot.qcow2","${SHARE_PATH}/edk2/ovmf/OVMF_VARS_4M.secboot.qcow2" );; *) # shellcheck disable=SC2054,SC2140 ovmfs=("${SHARE_PATH}/OVMF/OVMF_CODE_4M.fd","${SHARE_PATH}/OVMF/OVMF_VARS_4M.fd" \ @@ -691,7 +698,8 @@ function configure_bios() { "${SHARE_PATH}/qemu/ovmf-x86_64-4m-code.bin","${SHARE_PATH}/qemu/ovmf-x86_64-4m-vars.bin" \ "${SHARE_PATH}/qemu/edk2-x86_64-code.fd","${SHARE_PATH}/qemu/edk2-x86_64-code.fd" \ "${SHARE_PATH}/edk2-ovmf/x64/OVMF_CODE.fd","${SHARE_PATH}/edk2-ovmf/x64/OVMF_VARS.fd" \ - "${SHARE_PATH}/edk2/x64/OVMF_CODE.4m.fd","${SHARE_PATH}/edk2/x64/OVMF_VARS.4m.fd" + "${SHARE_PATH}/edk2/x64/OVMF_CODE.4m.fd","${SHARE_PATH}/edk2/x64/OVMF_VARS.4m.fd" \ + "${SHARE_PATH}/edk2/ovmf/OVMF_CODE_4M.qcow2","${SHARE_PATH}/edk2/ovmf/OVMF_VARS_4M.qcow2" );; esac # Attempt each EFI_CODE file one by one, selecting the corresponding code and vars @@ -722,6 +730,14 @@ function configure_bios() { echo " - EFI: ERROR! EFI_EXTRA_VARS file ${EFI_EXTRA_VARS} does not exist." exit 1 fi + # Write destination vars file with correct extension + # based on source format of the EFI_EXTRA_VARS file + QCOW2VARS=$(is_firmware_qcow2 "${EFI_EXTRA_VARS}") + if [ "${QCOW2VARS}" = "true" ]; then + EFI_VARS="${VMDIR}/OVMF_VARS.qcow2" + else + EFI_VARS="${VMDIR}/OVMF_VARS.fd" + fi efi_vars "${EFI_EXTRA_VARS}" "${EFI_VARS}" fi @@ -740,7 +756,7 @@ function configure_bios() { EFI_CODE=$(realpath "${EFI_CODE}") echo "${EFI_CODE}" fi - BOOT_STATUS="EFI (${guest_os^}), OVMF (${EFI_CODE}), SecureBoot (${secureboot})." + BOOT_STATUS="EFI (${guest_os^}), OVMF (${EFI_CODE}), EFI Vars (${EFI_VARS}), SecureBoot (${secureboot})." else BOOT_STATUS="Legacy BIOS (${guest_os^})" boot="legacy" @@ -1375,10 +1391,14 @@ function vm_boot() { # Add the disks # - https://turlucode.com/qemu-disk-io-performance-comparison-native-or-threads-windows-10-version/ if [[ "${boot}" == *"efi"* ]]; then + QCOW2CODE=$(is_firmware_qcow2 "${EFI_CODE}") + QCOW2VARS=$(is_firmware_qcow2 "${EFI_VARS}") + if [ "${QCOW2CODE}" = "true" ]; then EFI_CODE_FORMAT="qcow2"; else EFI_CODE_FORMAT="raw"; fi + if [ "${QCOW2VARS}" = "true" ]; then EFI_VARS_FORMAT="qcow2"; else EFI_VARS_FORMAT="raw"; fi # shellcheck disable=SC2054 args+=(-global driver=cfi.pflash01,property=secure,value=on - -drive if=pflash,format=raw,unit=0,file="${EFI_CODE}",readonly=on - -drive if=pflash,format=raw,unit=1,file="${EFI_VARS}") + -drive if=pflash,format="${EFI_CODE_FORMAT}",unit=0,file="${EFI_CODE}",readonly=on + -drive if=pflash,format="${EFI_VARS_FORMAT}",unit=1,file="${EFI_VARS}") fi if [ -n "${iso}" ] && [ "${guest_os}" == "freedos" ]; then