[pve-devel] [PATCH qemu-server 04/13] use AAVMF for arm
Wolfgang Bumiller
w.bumiller at proxmox.com
Wed Oct 24 10:56:40 CEST 2018
Signed-off-by: Wolfgang Bumiller <w.bumiller at proxmox.com>
---
PVE/API2/Qemu.pm | 10 ++++++----
PVE/QemuServer.pm | 39 +++++++++++++++++++++++++++++----------
2 files changed, 35 insertions(+), 14 deletions(-)
diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index 5a3a0a8..fb765ea 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -130,7 +130,7 @@ my $check_storage_access_clone = sub {
# Note: $pool is only needed when creating a VM, because pool permissions
# are automatically inherited if VM already exists inside a pool.
my $create_disks = sub {
- my ($rpcenv, $authuser, $conf, $storecfg, $vmid, $pool, $settings, $default_storage) = @_;
+ my ($rpcenv, $authuser, $conf, $arch, $storecfg, $vmid, $pool, $settings, $default_storage) = @_;
my $vollist = [];
@@ -175,7 +175,7 @@ my $create_disks = sub {
my $volid;
if ($ds eq 'efidisk0') {
- ($volid, $size) = PVE::QemuServer::create_efidisk($storecfg, $storeid, $vmid, $fmt);
+ ($volid, $size) = PVE::QemuServer::create_efidisk($storecfg, $storeid, $vmid, $fmt, $arch);
} else {
$volid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid, $fmt, undef, $size);
}
@@ -589,7 +589,7 @@ __PACKAGE__->register_method({
eval {
- $vollist = &$create_disks($rpcenv, $authuser, $conf, $storecfg, $vmid, $pool, $param, $storage);
+ $vollist = &$create_disks($rpcenv, $authuser, $conf, $arch, $storecfg, $vmid, $pool, $param, $storage);
if (!$conf->{bootdisk}) {
my $firstdisk = PVE::QemuServer::resolve_first_disk($conf);
@@ -1180,6 +1180,8 @@ my $update_vm_api = sub {
$conf = PVE::QemuConfig->load_config($vmid); # update/reload
next if defined($conf->{pending}->{$opt}) && ($param->{$opt} eq $conf->{pending}->{$opt}); # skip if nothing changed
+ my ($arch, undef) = PVE::QemuServer::get_basic_machine_info($conf);
+
if (PVE::QemuServer::is_valid_drivename($opt)) {
my $drive = PVE::QemuServer::parse_drive($opt, $param->{$opt});
# FIXME: cloudinit: CDROM or Disk?
@@ -1191,7 +1193,7 @@ my $update_vm_api = sub {
PVE::QemuServer::vmconfig_register_unused_drive($storecfg, $vmid, $conf, PVE::QemuServer::parse_drive($opt, $conf->{pending}->{$opt}))
if defined($conf->{pending}->{$opt});
- &$create_disks($rpcenv, $authuser, $conf->{pending}, $storecfg, $vmid, undef, {$opt => $param->{$opt}});
+ &$create_disks($rpcenv, $authuser, $conf->{pending}, $arch, $storecfg, $vmid, undef, {$opt => $param->{$opt}});
} else {
$conf->{pending}->{$opt} = $param->{$opt};
}
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 0385fbd..0d8ec06 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -40,8 +40,16 @@ use File::Copy qw(copy);
use URI::Escape;
my $EDK2_FW_BASE = '/usr/share/pve-edk2-firmware/';
-my $OVMF_CODE = "$EDK2_FW_BASE/OVMF_CODE.fd";
-my $OVMF_VARS = "$EDK2_FW_BASE/OVMF_VARS.fd";
+my $OVMF = {
+ amd64 => [
+ "$EDK2_FW_BASE/OVMF_CODE.fd",
+ "$EDK2_FW_BASE/OVMF_VARS.fd"
+ ],
+ arm64 => [
+ "$EDK2_FW_BASE/AAVMF_CODE.fd",
+ "$EDK2_FW_BASE/AAVMF_VARS.fd"
+ ],
+};
my $qemu_snap_storage = {rbd => 1, sheepdog => 1};
@@ -3178,6 +3186,15 @@ sub get_basic_machine_info {
return ($arch, $base_machine);
}
+sub get_ovmf_files($) {
+ my ($arch) = @_;
+
+ my $ovmf = $OVMF->{$arch}
+ or die "no OVMF images known for architecture '$arch'\n";
+
+ return @$ovmf;
+}
+
sub config_to_command {
my ($storecfg, $vmid, $conf, $defaults, $forcemachine) = @_;
@@ -3254,8 +3271,9 @@ sub config_to_command {
push @$devices, '-device', 'vmgenid,guid='.$conf->{vmgenid};
}
+ my ($ovmf_code, $ovmf_vars) = get_ovmf_files($arch);
if ($conf->{bios} && $conf->{bios} eq 'ovmf') {
- die "uefi base image not found\n" if ! -f $OVMF_CODE;
+ die "uefi base image not found\n" if ! -f $ovmf_code;
my $path;
my $format;
@@ -3277,11 +3295,11 @@ sub config_to_command {
} else {
warn "no efidisk configured! Using temporary efivars disk.\n";
$path = "/tmp/$vmid-ovmf.fd";
- PVE::Tools::file_copy($OVMF_VARS, $path, -s $OVMF_VARS);
+ PVE::Tools::file_copy($ovmf_vars, $path, -s $ovmf_vars);
$format = 'raw';
}
- push @$cmd, '-drive', "if=pflash,unit=0,format=raw,readonly,file=$OVMF_CODE";
+ push @$cmd, '-drive', "if=pflash,unit=0,format=raw,readonly,file=$ovmf_code";
push @$cmd, '-drive', "if=pflash,unit=1,format=$format,id=drive-efidisk0,file=$path";
}
@@ -6675,18 +6693,19 @@ sub qemu_use_old_bios_files {
return ($use_old_bios_files, $machine_type);
}
-sub create_efidisk {
- my ($storecfg, $storeid, $vmid, $fmt) = @_;
+sub create_efidisk($$$$$) {
+ my ($storecfg, $storeid, $vmid, $fmt, $arch) = @_;
- die "EFI vars default image not found\n" if ! -f $OVMF_VARS;
+ my (undef, $ovmf_vars) = get_ovmf_files($arch);
+ die "EFI vars default image not found\n" if ! -f $ovmf_vars;
- my $vars_size = PVE::Tools::convert_size(-s $OVMF_VARS, 'b' => 'kb');
+ my $vars_size = PVE::Tools::convert_size(-s $ovmf_vars, 'b' => 'kb');
my $volid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid, $fmt, undef, $vars_size);
PVE::Storage::activate_volumes($storecfg, [$volid]);
my $path = PVE::Storage::path($storecfg, $volid);
eval {
- run_command(['/usr/bin/qemu-img', 'convert', '-n', '-f', 'raw', '-O', $fmt, $OVMF_VARS, $path]);
+ run_command(['/usr/bin/qemu-img', 'convert', '-n', '-f', 'raw', '-O', $fmt, $ovmf_vars, $path]);
};
die "Copying EFI vars image failed: $@" if $@;
--
2.11.0
More information about the pve-devel
mailing list