From: Christian Ludwig <christian_ludwig@genua.de>
To: <pve-devel@lists.proxmox.com>
Subject: [PATCH qemu-server v3 09/19] config: define bios schema as property-string
Date: Tue, 27 Oct 2026 11:12:21 +0100 [thread overview]
Message-ID: <85e63753ada8c733e10dd43b7600a749592f3ccd.1793029144.git@genua.de> (raw)
In-Reply-To: <cover.1793029144.git@genua.de>
Convert the bios parameter to a property-string and use the BIOS type as
the default key for backward compatibility. This allows adding further
BIOS related options, like a custom firmware image, as sub-properties.
Add helpers to parse and print the property-string and to query the
BIOS type, and use the latter everywhere the bios option was compared
directly. No functional change intended.
Signed-off-by: Christian Ludwig <christian_ludwig@genua.de>
---
src/PVE/QemuConfig.pm | 3 ++-
src/PVE/QemuServer.pm | 15 ++++++-----
src/PVE/QemuServer/BIOS.pm | 48 +++++++++++++++++++++++++++++++++
src/PVE/QemuServer/CPUConfig.pm | 5 ++--
src/PVE/QemuServer/Makefile | 1 +
src/PVE/QemuServer/PCI.pm | 3 ++-
6 files changed, 64 insertions(+), 11 deletions(-)
create mode 100644 src/PVE/QemuServer/BIOS.pm
diff --git a/src/PVE/QemuConfig.pm b/src/PVE/QemuConfig.pm
index 2ef6c075..d83a474c 100644
--- a/src/PVE/QemuConfig.pm
+++ b/src/PVE/QemuConfig.pm
@@ -10,6 +10,7 @@ use PVE::INotify;
use PVE::JSONSchema;
use PVE::QemuMigrate::Helpers;
use PVE::QemuServer::Agent;
+use PVE::QemuServer::BIOS;
use PVE::QemuServer::Blockdev;
use PVE::QemuServer::CPUConfig;
use PVE::QemuServer::Drive;
@@ -192,7 +193,7 @@ sub get_backup_volumes {
my $reason = "backup=";
$reason .= defined($drive->{backup}) ? 'no' : 'yes';
- if ($key =~ m/^efidisk/ && (!defined($conf->{bios}) || $conf->{bios} ne 'ovmf')) {
+ if ($key =~ m/^efidisk/ && PVE::QemuServer::BIOS::get_bios_type($conf) ne 'ovmf') {
$included = 0;
$reason = "efidisk but no OVMF BIOS";
}
diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
index 74772fdd..c288ba22 100644
--- a/src/PVE/QemuServer.pm
+++ b/src/PVE/QemuServer.pm
@@ -53,6 +53,7 @@ use PVE::QemuConfig;
use PVE::QemuConfig::NoWrite;
use PVE::QemuMigrate::Helpers;
use PVE::QemuServer::Agent qw(get_qga_key parse_guest_agent qga_check_running);
+use PVE::QemuServer::BIOS qw(get_bios_type);
use PVE::QemuServer::Blockdev;
use PVE::QemuServer::BlockJob;
use PVE::QemuServer::Cfg2Cmd;
@@ -659,7 +660,7 @@ EODESCR
bios => {
optional => 1,
type => 'string',
- enum => [qw(seabios ovmf)],
+ format => 'pve-qm-bios',
description => "Select BIOS implementation.",
default => 'seabios',
},
@@ -1535,7 +1536,7 @@ sub print_vga_device {
my $edidoff = "";
if ($type eq 'VGA' && windows_version($conf->{ostype})) {
- $edidoff = ",edid=off" if (!defined($conf->{bios}) || $conf->{bios} ne 'ovmf');
+ $edidoff = ",edid=off" if get_bios_type($conf) ne 'ovmf';
}
my $q35 = PVE::QemuServer::Machine::machine_type_is_q35($conf);
@@ -3075,7 +3076,7 @@ my sub should_disable_smm {
return if $machine =~ m/^virt/; # there is no smm flag that could be disabled
return
- (!defined($conf->{bios}) || $conf->{bios} eq 'seabios')
+ get_bios_type($conf) eq 'seabios'
&& $vga->{type}
&& $vga->{type} =~ m/^(serial\d+|none)$/;
}
@@ -3258,7 +3259,7 @@ sub config_to_command {
push @$cmd, '-smbios', "type=1" . $smbios_string;
}
- if ($conf->{bios} && $conf->{bios} eq 'ovmf') {
+ if (get_bios_type($conf) eq 'ovmf') {
die "OVMF (UEFI) BIOS is not supported on 32-bit CPU types\n"
if !$forcecpu && get_cpu_bitness($conf->{cpu}, $arch) == 32;
@@ -3771,10 +3772,10 @@ sub config_to_command {
}
if ($conf->{'amd-sev'}) {
- push @$devices, '-object', get_amd_sev_object($conf->{'amd-sev'}, $conf->{bios});
+ push @$devices, '-object', get_amd_sev_object($conf->{'amd-sev'}, get_bios_type($conf));
push @$machineFlags, 'confidential-guest-support=sev0';
} elsif ($conf->{'intel-tdx'}) {
- my $tdx_object = get_intel_tdx_object($conf->{'intel-tdx'}, $conf->{bios});
+ my $tdx_object = get_intel_tdx_object($conf->{'intel-tdx'}, get_bios_type($conf));
push @$devices, '-object', to_json($tdx_object, { canonical => 1 });
push @$machineFlags, 'confidential-guest-support=tdx0';
push @$machineFlags, 'kernel_irqchip=split';
@@ -5631,7 +5632,7 @@ sub vm_start_nolock {
my $storage_hints = generate_storage_hints($conf, 1);
PVE::Storage::activate_volumes($storecfg, $vollist, undef, $storage_hints);
- check_efi_vars($storecfg, $vmid, $conf) if $conf->{bios} && $conf->{bios} eq 'ovmf';
+ check_efi_vars($storecfg, $vmid, $conf) if get_bios_type($conf) eq 'ovmf';
PVE::QemuServer::Drive::warn_about_virtio_win_issues_in_config($conf);
diff --git a/src/PVE/QemuServer/BIOS.pm b/src/PVE/QemuServer/BIOS.pm
new file mode 100644
index 00000000..4e1a3936
--- /dev/null
+++ b/src/PVE/QemuServer/BIOS.pm
@@ -0,0 +1,48 @@
+package PVE::QemuServer::BIOS;
+
+use strict;
+use warnings;
+
+use PVE::JSONSchema qw(parse_property_string print_property_string);
+
+use base 'Exporter';
+
+our @EXPORT_OK = qw(
+ parse_bios
+ print_bios
+ get_bios_type
+);
+
+my $bios_fmt = {
+ type => {
+ type => 'string',
+ enum => [qw(seabios ovmf)],
+ default_key => 1,
+ description => "Select BIOS implementation.",
+ },
+};
+PVE::JSONSchema::register_format('pve-qm-bios', $bios_fmt);
+
+sub parse_bios {
+ my ($value) = @_;
+
+ return {} if !defined($value);
+
+ return parse_property_string($bios_fmt, $value);
+}
+
+sub print_bios {
+ my ($bios) = @_;
+
+ return print_property_string($bios, $bios_fmt);
+}
+
+# Returns the configured BIOS implementation, 'seabios' or 'ovmf'.
+sub get_bios_type {
+ my ($conf) = @_;
+
+ # SeaBIOS is the default if the bios option is not set
+ return parse_bios($conf->{bios})->{type} // 'seabios';
+}
+
+1;
diff --git a/src/PVE/QemuServer/CPUConfig.pm b/src/PVE/QemuServer/CPUConfig.pm
index 2bae55b2..c672302b 100644
--- a/src/PVE/QemuServer/CPUConfig.pm
+++ b/src/PVE/QemuServer/CPUConfig.pm
@@ -11,6 +11,7 @@ use PVE::ProcFSTools;
use PVE::RESTEnvironment qw(log_warn);
use PVE::Tools qw(run_command);
+use PVE::QemuServer::BIOS qw(get_bios_type);
use PVE::QemuServer::Helpers qw(min_version get_host_arch);
use PVE::QemuServer::CPUFlags qw(cpu_flag_supported_re cpu_flag_any_re supported_cpu_flags_names);
@@ -910,7 +911,7 @@ sub get_cpu_options(
$hv_flags = get_hyperv_enlightenments(
$winversion,
$version_guard,
- $conf->{bios},
+ get_bios_type($conf),
$gpu_passthrough,
$hv_vendor_id,
);
@@ -991,7 +992,7 @@ sub get_cpu_options(
$cpu_str .= $phys_bits;
}
- check_phys_bits_above_40_compat($conf->{bios}, $cputype, $resolved_flags)
+ check_phys_bits_above_40_compat(get_bios_type($conf), $cputype, $resolved_flags)
if $using_phys_bits_above_40;
return ('-cpu', $cpu_str);
diff --git a/src/PVE/QemuServer/Makefile b/src/PVE/QemuServer/Makefile
index 060fac23..242f1155 100644
--- a/src/PVE/QemuServer/Makefile
+++ b/src/PVE/QemuServer/Makefile
@@ -3,6 +3,7 @@ PREFIX=/usr
PERLDIR=$(PREFIX)/share/perl5
SOURCES=Agent.pm \
+ BIOS.pm \
Blockdev.pm \
BlockJob.pm \
Cfg2Cmd.pm \
diff --git a/src/PVE/QemuServer/PCI.pm b/src/PVE/QemuServer/PCI.pm
index d7dc6121..38640ff0 100644
--- a/src/PVE/QemuServer/PCI.pm
+++ b/src/PVE/QemuServer/PCI.pm
@@ -10,6 +10,7 @@ use PVE::Mapping::PCI;
use PVE::SysFSTools;
use PVE::Tools;
+use PVE::QemuServer::BIOS qw(get_bios_type);
use PVE::QemuServer::Helpers;
use PVE::QemuServer::Machine;
use PVE::QemuServer::PCI::Mdev;
@@ -666,7 +667,7 @@ sub print_hostpci_devices {
my $xvga = '';
if ($d->{'x-vga'}) {
- $xvga = ',x-vga=on' if !($conf->{bios} && $conf->{bios} eq 'ovmf');
+ $xvga = ',x-vga=on' if get_bios_type($conf) ne 'ovmf';
$kvm_off = 1;
$vga->{type} = 'none' if !defined($conf->{vga});
$gpu_passthrough = 1;
--
2.34.1
next prev parent reply other threads:[~2026-10-27 10:14 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-27 10:12 [PATCH v3 00/19] Support for custom EFI firmware Christian Ludwig
2026-10-27 10:12 ` [PATCH pve-storage v3 01/19] plugin: add efi-firmware content type Christian Ludwig
2026-10-27 10:12 ` [PATCH pve-storage v3 02/19] test: get_subdir: cover the " Christian Ludwig
2026-10-27 10:12 ` [PATCH pve-storage v3 03/19] plugins: allow the efi-firmware content type on file based storages Christian Ludwig
2026-10-27 10:12 ` [PATCH pve-storage v3 04/19] plugin: support efi-firmware volumes in volume export and import Christian Ludwig
2026-10-27 10:12 ` [PATCH pve-storage v3 05/19] api: status: support efi-firmware in upload and download-url Christian Ludwig
2026-10-27 10:12 ` [PATCH pve-storage v3 06/19] test: volume access: cover efi-firmware volumes Christian Ludwig
2026-10-27 10:12 ` [PATCH pve-storage v3 07/19] test: list volumes: " Christian Ludwig
2026-10-27 10:12 ` [PATCH pve-storage v3 08/19] test: cover efi-firmware volumes in parse_volname and path_to_volume_id Christian Ludwig
2026-10-27 10:12 ` Christian Ludwig [this message]
2026-10-27 10:12 ` [PATCH qemu-server v3 10/19] bios: add a custom firmware sub-property Christian Ludwig
2026-10-27 10:12 ` [PATCH qemu-server v3 11/19] api: check the custom firmware of the bios option Christian Ludwig
2026-10-27 10:12 ` [PATCH qemu-server v3 12/19] test: custom firmware in " Christian Ludwig
2026-10-27 10:12 ` [PATCH qemu-server v3 13/19] test: custom firmware volumes in replication and migration Christian Ludwig
2026-10-27 10:12 ` [PATCH pve-manager v3 14/19] ui: storage: add efi-firmware content type support Christian Ludwig
2026-10-27 10:12 ` [PATCH pve-manager v3 15/19] ui: form: support other content types in the ISO selector Christian Ludwig
2026-10-27 10:12 ` [PATCH pve-manager v3 16/19] ui: qemu: allow selecting a custom EFI firmware image Christian Ludwig
2026-10-27 10:12 ` [PATCH pve-manager v3 17/19] ui: migrate: refuse migration with a local custom " Christian Ludwig
2026-10-27 10:12 ` [PATCH pve-docs v3 18/19] pvesm: document the efi-firmware content type Christian Ludwig
2026-10-27 10:12 ` [PATCH pve-docs v3 19/19] qm: document the custom firmware of the bios option Christian Ludwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=85e63753ada8c733e10dd43b7600a749592f3ccd.1793029144.git@genua.de \
--to=christian_ludwig@genua.de \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox