]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Add QemuFirmware=auto 1876/head
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 7 Sep 2023 11:56:44 +0000 (13:56 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 7 Sep 2023 12:09:28 +0000 (14:09 +0200)
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
mkosi/qemu.py
mkosi/resources/mkosi.md

index 7f7f83b20b10d81631ff4654b8358f347e7e4912..231886cb31cfb3b50738de07efbca2efc14bbf42 100644 (file)
@@ -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(),
     ),
index 97b2bcab6c29b476de3f4b4f9314f5d79ffbbb33..6cf5d821088d95f754023dbc4ce224945a7c942d 100644 (file)
@@ -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"]
index 439f6ad87dc9b67c66f05810d0c64894ba70c2e0..b3cf92d4046daecdf3ec9ddd5213245b8a7d8029 100644 (file)
@@ -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=`