From 347c79fdcae9ddf8481661be193cc51d7d4c2145 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Thu, 7 Sep 2023 13:56:44 +0200 Subject: [PATCH] Add QemuFirmware=auto Let's introduce a new "auto" mode where we decide the firmware based on whether we built a cpio image or a disk image. Let's also use this as the new default. --- mkosi/config.py | 3 ++- mkosi/qemu.py | 18 +++++++++++------- mkosi/resources/mkosi.md | 11 ++++++----- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/mkosi/config.py b/mkosi/config.py index 7f7f83b20..231886cb3 100644 --- a/mkosi/config.py +++ b/mkosi/config.py @@ -128,6 +128,7 @@ class BiosBootloader(StrEnum): class QemuFirmware(StrEnum): + auto = enum.auto() direct = enum.auto() uefi = enum.auto() bios = enum.auto() @@ -1569,7 +1570,7 @@ SETTINGS = ( metavar="FIRMWARE", section="Host", parse=config_make_enum_parser(QemuFirmware), - default=QemuFirmware.uefi, + default=QemuFirmware.auto, help="Set qemu firmware to use", choices=QemuFirmware.values(), ), diff --git a/mkosi/qemu.py b/mkosi/qemu.py index 97b2bcab6..6cf5d8210 100644 --- a/mkosi/qemu.py +++ b/mkosi/qemu.py @@ -220,13 +220,17 @@ def run_qemu(args: MkosiArgs, config: MkosiConfig) -> None: if config.qemu_kvm == ConfigFeature.enabled or auto: accel = "kvm" - ovmf, ovmf_supports_sb = find_ovmf_firmware(config) - smm = "on" if config.qemu_firmware == QemuFirmware.uefi and ovmf_supports_sb else "off" + if config.qemu_firmware == QemuFirmware.auto: + firmware = QemuFirmware.direct if config.output_format == OutputFormat.cpio else QemuFirmware.uefi + else: + firmware = config.qemu_firmware + + ovmf, ovmf_supports_sb = find_ovmf_firmware(config) if firmware == QemuFirmware.uefi else (None, False) if config.architecture == Architecture.arm64: machine = f"type=virt,accel={accel}" else: - machine = f"type=q35,accel={accel},smm={smm}" + machine = f"type=q35,accel={accel},smm={'on' if ovmf_supports_sb else 'off'}" cmdline: list[PathString] = [ find_qemu_binary(config), @@ -263,13 +267,13 @@ def run_qemu(args: MkosiArgs, config: MkosiConfig) -> None: cmdline += ["-smbios", f"type=11,value=io.systemd.stub.kernel-cmdline-extra={' '.join(config.kernel_command_line_extra)}"] # QEMU has built-in logic to look for the BIOS firmware so we don't need to do anything special for that. - if config.qemu_firmware == QemuFirmware.uefi: + if firmware == QemuFirmware.uefi: cmdline += ["-drive", f"if=pflash,format=raw,readonly=on,file={ovmf}"] notifications: dict[str, str] = {} with contextlib.ExitStack() as stack: - if config.qemu_firmware == QemuFirmware.uefi and ovmf_supports_sb: + if firmware == QemuFirmware.uefi and ovmf_supports_sb: ovmf_vars = stack.enter_context(tempfile.NamedTemporaryFile(prefix=".mkosi-")) shutil.copy2(find_ovmf_vars(config), Path(ovmf_vars.name)) cmdline += [ @@ -307,7 +311,7 @@ def run_qemu(args: MkosiArgs, config: MkosiConfig) -> None: "--offline=yes", fname]) - if config.qemu_firmware == QemuFirmware.direct or config.output_format == OutputFormat.cpio: + if firmware == QemuFirmware.direct or config.output_format == OutputFormat.cpio: if config.qemu_kernel: kernel = config.qemu_kernel elif "-kernel" not in args.cmdline: @@ -329,7 +333,7 @@ def run_qemu(args: MkosiArgs, config: MkosiConfig) -> None: "-device", "virtio-scsi-pci,id=scsi", "-device", f"scsi-{'cd' if config.qemu_cdrom else 'hd'},drive=mkosi,bootindex=1"] - if config.qemu_firmware == QemuFirmware.uefi and config.qemu_swtpm != ConfigFeature.disabled and shutil.which("swtpm") is not None: + if firmware == QemuFirmware.uefi and config.qemu_swtpm != ConfigFeature.disabled and shutil.which("swtpm") is not None: sock = stack.enter_context(start_swtpm()) cmdline += ["-chardev", f"socket,id=chrtpm,path={sock}", "-tpmdev", "emulator,id=tpm0,chardev=chrtpm"] diff --git a/mkosi/resources/mkosi.md b/mkosi/resources/mkosi.md index 439f6ad87..b3cf92d40 100644 --- a/mkosi/resources/mkosi.md +++ b/mkosi/resources/mkosi.md @@ -1050,11 +1050,12 @@ boolean argument: either `1`, `yes`, or `true` to enable, or `0`, `no`, `QemuFirmware=`, `--qemu-firmware=` : When used with the `qemu` verb, this option which firmware to use. - Takes one of `uefi`, `bios` or `direct`. Defaults to `uefi`. When set - to `uefi`, the OVMF firmware is used. When set to `bios`, the default - SeaBIOS firmware is used. When set to `direct`, direct kernel boot is - used. See the `QemuKernel=` option for more details on which kernel - image is used with direct kernel boot. + Takes one of `uefi`, `bios`, `direct`, or `auto`. Defaults to `auto`. + When set to `uefi`, the OVMF firmware is used. When set to `bios`, the + default SeaBIOS firmware is used. When set to `direct`, direct kernel + boot is used. See the `QemuKernel=` option for more details on which + kernel image is used with direct kernel boot. When set to `auto`, + `direct` is used if a cpio image is being booted, `uefi` otherwise. `QemuKernel=`, `--qemu-kernel=` -- 2.47.2