From nobody Sat May 4 06:36:30 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1554448828102999.633654750306; Fri, 5 Apr 2019 00:20:28 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8A0D43008CF6; Fri, 5 Apr 2019 07:20:26 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5C847605AF; Fri, 5 Apr 2019 07:20:26 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 9FB0D3FB10; Fri, 5 Apr 2019 07:20:13 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x357JtSE027662 for ; Fri, 5 Apr 2019 03:19:55 -0400 Received: by smtp.corp.redhat.com (Postfix) id E70E05D719; Fri, 5 Apr 2019 07:19:55 +0000 (UTC) Received: from moe.brq.redhat.com (unknown [10.43.2.30]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3A9C85D735; Fri, 5 Apr 2019 07:19:55 +0000 (UTC) From: Michal Privoznik To: libvir-list@redhat.com Date: Fri, 5 Apr 2019 09:19:45 +0200 Message-Id: <5ead17d04246fab7088fb29b504d8c93a1912fcb.1554448728.git.mprivozn@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Cc: lersek@redhat.com Subject: [libvirt] [PATCH v1 1/4] qemu_firmware: Separate firmware loading into a function X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.48]); Fri, 05 Apr 2019 07:20:27 +0000 (UTC) Content-Type: text/plain; charset="utf-8" This piece of code will be reused later. Signed-off-by: Michal Privoznik --- src/qemu/qemu_firmware.c | 53 ++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/src/qemu/qemu_firmware.c b/src/qemu/qemu_firmware.c index 787b76b531..065e0d11aa 100644 --- a/src/qemu/qemu_firmware.c +++ b/src/qemu/qemu_firmware.c @@ -1314,15 +1314,49 @@ qemuFirmwareSanityCheck(const qemuFirmware *fw, } =20 =20 +static ssize_t +qemuFirmwareFetchParsedConfigs(bool privileged, + qemuFirmwarePtr **firmwaresRet, + char ***pathsRet) +{ + VIR_AUTOSTRINGLIST paths =3D NULL; + size_t npaths; + qemuFirmwarePtr *firmwares =3D NULL; + size_t i; + + if (qemuFirmwareFetchConfigs(&paths, privileged) < 0) + return -1; + + npaths =3D virStringListLength((const char **)paths); + + if (VIR_ALLOC_N(firmwares, npaths) < 0) + return -1; + + for (i =3D 0; i < npaths; i++) { + if (!(firmwares[i] =3D qemuFirmwareParse(paths[i]))) + goto error; + } + + VIR_STEAL_PTR(*firmwaresRet, firmwares); + VIR_STEAL_PTR(*pathsRet, paths); + return npaths; + + error: + while (i > 0) + qemuFirmwareFree(firmwares[--i]); + VIR_FREE(firmwares); + return -1; +} + + int qemuFirmwareFillDomain(virQEMUDriverPtr driver, virDomainObjPtr vm, unsigned int flags) { VIR_AUTOSTRINGLIST paths =3D NULL; - size_t npaths =3D 0; qemuFirmwarePtr *firmwares =3D NULL; - size_t nfirmwares =3D 0; + ssize_t nfirmwares =3D 0; const qemuFirmware *theone =3D NULL; size_t i; int ret =3D -1; @@ -1333,21 +1367,10 @@ qemuFirmwareFillDomain(virQEMUDriverPtr driver, if (vm->def->os.firmware =3D=3D VIR_DOMAIN_OS_DEF_FIRMWARE_NONE) return 0; =20 - if (qemuFirmwareFetchConfigs(&paths, driver->privileged) < 0) + if ((nfirmwares =3D qemuFirmwareFetchParsedConfigs(driver->privileged, + &firmwares, &paths)) = < 0) return -1; =20 - npaths =3D virStringListLength((const char **)paths); - - if (VIR_ALLOC_N(firmwares, npaths) < 0) - return -1; - - nfirmwares =3D npaths; - - for (i =3D 0; i < nfirmwares; i++) { - if (!(firmwares[i] =3D qemuFirmwareParse(paths[i]))) - goto cleanup; - } - for (i =3D 0; i < nfirmwares; i++) { if (qemuFirmwareMatchDomain(vm->def, firmwares[i], paths[i])) { theone =3D firmwares[i]; --=20 2.21.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat May 4 06:36:30 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1554448828714847.7238379906842; Fri, 5 Apr 2019 00:20:28 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2793D3004E6C; Fri, 5 Apr 2019 07:20:27 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E97CC5D9CD; Fri, 5 Apr 2019 07:20:14 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 912B8181AC47; Fri, 5 Apr 2019 07:20:00 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x357Jvc2027671 for ; Fri, 5 Apr 2019 03:19:57 -0400 Received: by smtp.corp.redhat.com (Postfix) id 00CCB5D735; Fri, 5 Apr 2019 07:19:57 +0000 (UTC) Received: from moe.brq.redhat.com (unknown [10.43.2.30]) by smtp.corp.redhat.com (Postfix) with ESMTP id 468EB5D705; Fri, 5 Apr 2019 07:19:56 +0000 (UTC) From: Michal Privoznik To: libvir-list@redhat.com Date: Fri, 5 Apr 2019 09:19:46 +0200 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Cc: lersek@redhat.com Subject: [libvirt] [PATCH v1 2/4] qemu_firmware: Separate machine and arch matching into a function X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.48]); Fri, 05 Apr 2019 07:20:27 +0000 (UTC) Content-Type: text/plain; charset="utf-8" This part of the code will be reused later. Signed-off-by: Michal Privoznik --- src/qemu/qemu_firmware.c | 47 +++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/src/qemu/qemu_firmware.c b/src/qemu/qemu_firmware.c index 065e0d11aa..8e9a225982 100644 --- a/src/qemu/qemu_firmware.c +++ b/src/qemu/qemu_firmware.c @@ -1054,6 +1054,34 @@ qemuFirmwareFetchConfigs(char ***firmwares, } =20 =20 +static bool +qemuFirmwareMatchesMachineArch(const qemuFirmware *fw, + const char *machine, + virArch arch) +{ + size_t i; + + for (i =3D 0; i < fw->ntargets; i++) { + size_t j; + + if (arch !=3D fw->targets[i]->architecture) + continue; + + for (j =3D 0; j < fw->targets[i]->nmachines; j++) { + if (fnmatch(fw->targets[i]->machines[j], machine, 0) =3D=3D 0) + break; + } + + if (j =3D=3D fw->targets[i]->nmachines) + continue; + + break; + } + + return i !=3D fw->ntargets; +} + + static bool qemuFirmwareMatchDomain(const virDomainDef *def, const qemuFirmware *fw, @@ -1078,24 +1106,7 @@ qemuFirmwareMatchDomain(const virDomainDef *def, return false; } =20 - for (i =3D 0; i < fw->ntargets; i++) { - size_t j; - - if (def->os.arch !=3D fw->targets[i]->architecture) - continue; - - for (j =3D 0; j < fw->targets[i]->nmachines; j++) { - if (fnmatch(fw->targets[i]->machines[j], def->os.machine, 0) = =3D=3D 0) - break; - } - - if (j =3D=3D fw->targets[i]->nmachines) - continue; - - break; - } - - if (i =3D=3D fw->ntargets) { + if (!qemuFirmwareMatchesMachineArch(fw, def->os.machine, def->os.arch)= ) { VIR_DEBUG("No matching machine type in '%s'", path); return false; } --=20 2.21.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat May 4 06:36:30 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1554448847086303.81292150030356; Fri, 5 Apr 2019 00:20:47 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C9A8030C8484; Fri, 5 Apr 2019 07:20:45 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 7DC245D9E2; Fri, 5 Apr 2019 07:20:45 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 423FF3FB14; Fri, 5 Apr 2019 07:20:45 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x357JwNI027679 for ; Fri, 5 Apr 2019 03:19:58 -0400 Received: by smtp.corp.redhat.com (Postfix) id 077BC5D719; Fri, 5 Apr 2019 07:19:58 +0000 (UTC) Received: from moe.brq.redhat.com (unknown [10.43.2.30]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5151C5D756; Fri, 5 Apr 2019 07:19:57 +0000 (UTC) From: Michal Privoznik To: libvir-list@redhat.com Date: Fri, 5 Apr 2019 09:19:47 +0200 Message-Id: <1a11fb963ac691c11da8eecc22b4c2cc541f8c00.1554448728.git.mprivozn@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Cc: lersek@redhat.com Subject: [libvirt] [PATCH v1 3/4] qemu_firmware: Introduce qemuFirmwareGetSupported X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.43]); Fri, 05 Apr 2019 07:20:46 +0000 (UTC) Content-Type: text/plain; charset="utf-8" The point of this API is to fetch all FW descriptors, parse them and return list of supported interfaces for given combination of machine type and guest architecture. Signed-off-by: Michal Privoznik --- src/qemu/qemu_firmware.c | 51 ++++++++++++++++++++++++++++++++++- src/qemu/qemu_firmware.h | 9 +++++++ tests/qemufirmwaretest.c | 58 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 117 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_firmware.c b/src/qemu/qemu_firmware.c index 8e9a225982..07ac47c62b 100644 --- a/src/qemu/qemu_firmware.c +++ b/src/qemu/qemu_firmware.c @@ -1349,7 +1349,8 @@ qemuFirmwareFetchParsedConfigs(bool privileged, } =20 VIR_STEAL_PTR(*firmwaresRet, firmwares); - VIR_STEAL_PTR(*pathsRet, paths); + if (pathsRet) + VIR_STEAL_PTR(*pathsRet, paths); return npaths; =20 error: @@ -1415,3 +1416,51 @@ qemuFirmwareFillDomain(virQEMUDriverPtr driver, VIR_FREE(firmwares); return ret; } + + +int +qemuFirmwareGetSupported(const char *machine, + virArch arch, + bool privileged, + unsigned int *supported) +{ + qemuFirmwarePtr *firmwares =3D NULL; + ssize_t nfirmwares =3D 0; + size_t i; + + *supported =3D VIR_DOMAIN_OS_DEF_FIRMWARE_NONE; + + if ((nfirmwares =3D qemuFirmwareFetchParsedConfigs(privileged, + &firmwares, NULL)) < = 0) + return -1; + + for (i =3D 0; i < nfirmwares; i++) { + qemuFirmwarePtr fw =3D firmwares[i]; + size_t j; + + if (!qemuFirmwareMatchesMachineArch(fw, machine, arch)) + continue; + + for (j =3D 0; j < fw->ninterfaces; j++) { + switch (fw->interfaces[j]) { + case QEMU_FIRMWARE_OS_INTERFACE_UEFI: + *supported |=3D (1 << VIR_DOMAIN_OS_DEF_FIRMWARE_EFI); + break; + case QEMU_FIRMWARE_OS_INTERFACE_BIOS: + *supported |=3D (1 << VIR_DOMAIN_OS_DEF_FIRMWARE_BIOS); + break; + case QEMU_FIRMWARE_OS_INTERFACE_NONE: + case QEMU_FIRMWARE_OS_INTERFACE_OPENFIRMWARE: + case QEMU_FIRMWARE_OS_INTERFACE_UBOOT: + case QEMU_FIRMWARE_OS_INTERFACE_LAST: + default: + break; + } + } + } + + for (i =3D 0; i < nfirmwares; i++) + qemuFirmwareFree(firmwares[i]); + VIR_FREE(firmwares); + return 0; +} diff --git a/src/qemu/qemu_firmware.h b/src/qemu/qemu_firmware.h index 7f8a0e4a15..0be5284ac1 100644 --- a/src/qemu/qemu_firmware.h +++ b/src/qemu/qemu_firmware.h @@ -24,6 +24,7 @@ # include "domain_conf.h" # include "viralloc.h" # include "qemu_conf.h" +# include "virarch.h" =20 typedef struct _qemuFirmware qemuFirmware; typedef qemuFirmware *qemuFirmwarePtr; @@ -48,4 +49,12 @@ qemuFirmwareFillDomain(virQEMUDriverPtr driver, virDomainObjPtr vm, unsigned int flags); =20 +int +qemuFirmwareGetSupported(const char *machine, + virArch arch, + bool privileged, + unsigned int *supported); + +verify(sizeof(unsigned int) >=3D ((1ULL << VIR_DOMAIN_OS_DEF_FIRMWARE_LAST= ) >> 2)); + #endif /* LIBVIRT_QEMU_FIRMWARE_H */ diff --git a/tests/qemufirmwaretest.c b/tests/qemufirmwaretest.c index 2b5cbf649b..9e9dfd9b1b 100644 --- a/tests/qemufirmwaretest.c +++ b/tests/qemufirmwaretest.c @@ -99,6 +99,42 @@ testFWPrecedence(const void *opaque ATTRIBUTE_UNUSED) } =20 =20 +struct supportedData { + const char *machine; + virArch arch; + unsigned int *interfaces; + size_t ninterfaces; +}; + + +static int +testSupportedFW(const void *opaque) +{ + const struct supportedData *data =3D opaque; + unsigned int actual; + unsigned int expected =3D 0; + size_t i; + + for (i =3D 0; i < data->ninterfaces; i++) + expected |=3D (1 << data->interfaces[i]); + + if (qemuFirmwareGetSupported(data->machine, data->arch, false, &actual= ) < 0) { + fprintf(stderr, "Unable to get list of supported interfaces\n"); + return -1; + } + + if (actual !=3D expected) { + fprintf(stderr, + "Mismatch in supported interfaces. " + "Expected 0x%x got 0x%x\n", + expected, actual); + return -1; + } + + return 0; +} + + static int mymain(void) { @@ -127,6 +163,28 @@ mymain(void) if (virTestRun("QEMU FW precedence test", testFWPrecedence, NULL) < 0) ret =3D -1; =20 +#define DO_SUPPORTED_TEST(machine, arch, ...) \ + do { \ + unsigned int interfaces[] =3D {__VA_ARGS__}; \ + struct supportedData data =3D {machine, arch, interfaces, ARRAY_CA= RDINALITY(interfaces)}; \ + if (virTestRun("QEMU FW SUPPORTED " machine " " #arch, \ + testSupportedFW, &data) < 0) \ + ret =3D -1; \ + } while (0) + + DO_SUPPORTED_TEST("pc-i440fx-3.1", VIR_ARCH_X86_64, + VIR_DOMAIN_OS_DEF_FIRMWARE_BIOS, + VIR_DOMAIN_OS_DEF_FIRMWARE_EFI); + DO_SUPPORTED_TEST("pc-i440fx-3.1", VIR_ARCH_I686, + VIR_DOMAIN_OS_DEF_FIRMWARE_BIOS); + DO_SUPPORTED_TEST("pc-q35-3.1", VIR_ARCH_X86_64, + VIR_DOMAIN_OS_DEF_FIRMWARE_BIOS, + VIR_DOMAIN_OS_DEF_FIRMWARE_EFI); + DO_SUPPORTED_TEST("pc-q35-3.1", VIR_ARCH_I686, + VIR_DOMAIN_OS_DEF_FIRMWARE_BIOS); + DO_SUPPORTED_TEST("virt-3.1", VIR_ARCH_AARCH64, + VIR_DOMAIN_OS_DEF_FIRMWARE_EFI); + virFileWrapperClearPrefixes(); =20 return ret =3D=3D 0 ? EXIT_SUCCESS : EXIT_FAILURE; --=20 2.21.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat May 4 06:36:30 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1554448846979788.4368039181129; Fri, 5 Apr 2019 00:20:46 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AA412B837C; Fri, 5 Apr 2019 07:20:45 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 82BF9611D5; Fri, 5 Apr 2019 07:20:45 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 46E6E3FB15; Fri, 5 Apr 2019 07:20:45 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x357K0T0027692 for ; Fri, 5 Apr 2019 03:20:00 -0400 Received: by smtp.corp.redhat.com (Postfix) id E1B7A5D72E; Fri, 5 Apr 2019 07:20:00 +0000 (UTC) Received: from moe.brq.redhat.com (unknown [10.43.2.30]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0B7B95D719; Fri, 5 Apr 2019 07:19:58 +0000 (UTC) From: Michal Privoznik To: libvir-list@redhat.com Date: Fri, 5 Apr 2019 09:19:48 +0200 Message-Id: <7a4e6000d419cebdbe7770693cd463f4aa008876.1554448728.git.mprivozn@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Cc: lersek@redhat.com Subject: [libvirt] [PATCH v1 4/4] domain capabilities: Expose firmware auto selection feature X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Fri, 05 Apr 2019 07:20:46 +0000 (UTC) Content-Type: text/plain; charset="utf-8" If a management application wants to use firmware auto selection feature it can't currently know if the libvirtd it's talking to support is or not. Moreover, it doesn't know which values that are accepted for the @firmware attribute of when parsing will allow successful start of the domain later, i.e. if the mgmt application wants to use 'bios' whether there exists a FW descriptor in the system that describes bios. This commit then adds 'firmware' enum to element in XML like this: bios efi We can see both 'bios' and 'efi' listed which means that there are descriptors for both found in the system (matched with the machine type and architecture reported in the domain capabilities earlier and not shown here). Signed-off-by: Michal Privoznik --- docs/formatdomaincaps.html.in | 14 +++++++++++ docs/schemas/domaincaps.rng | 3 +++ src/conf/domain_capabilities.c | 2 ++ src/conf/domain_capabilities.h | 1 + src/qemu/qemu_capabilities.c | 23 ++++++++++++++++++- src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_driver.c | 1 + tests/Makefile.am | 4 +++- .../qemu_1.7.0.x86_64.xml | 4 ++++ .../qemu_2.12.0-virt.aarch64.xml | 3 +++ .../qemu_2.12.0.ppc64.xml | 1 + .../qemu_2.12.0.s390x.xml | 1 + .../qemu_2.12.0.x86_64.xml | 4 ++++ .../qemu_2.6.0-virt.aarch64.xml | 3 +++ .../qemu_2.6.0.aarch64.xml | 1 + .../domaincapsschemadata/qemu_2.6.0.ppc64.xml | 1 + .../qemu_2.6.0.x86_64.xml | 4 ++++ .../domaincapsschemadata/qemu_2.7.0.s390x.xml | 1 + .../qemu_2.8.0-tcg.x86_64.xml | 4 ++++ .../domaincapsschemadata/qemu_2.8.0.s390x.xml | 1 + .../qemu_2.8.0.x86_64.xml | 4 ++++ .../qemu_2.9.0-q35.x86_64.xml | 4 ++++ .../qemu_2.9.0-tcg.x86_64.xml | 4 ++++ .../qemu_2.9.0.x86_64.xml | 4 ++++ .../domaincapsschemadata/qemu_3.0.0.s390x.xml | 1 + .../qemu_4.0.0.x86_64.xml | 4 ++++ tests/domaincapstest.c | 16 +++++++++++++ 27 files changed, 112 insertions(+), 2 deletions(-) diff --git a/docs/formatdomaincaps.html.in b/docs/formatdomaincaps.html.in index 2583f9bead..4b7d9630a4 100644 --- a/docs/formatdomaincaps.html.in +++ b/docs/formatdomaincaps.html.in @@ -119,6 +119,10 @@ <domainCapabilities> ... <os supported=3D'yes'> + <enum name=3D'firmware'> + <value>bios</value> + <value>efi</value> + </enum> <loader supported=3D'yes'> <value>/usr/share/OVMF/OVMF_CODE.fd</value> <enum name=3D'type'> @@ -135,6 +139,16 @@ <domainCapabilities> =20 +

The firmware enum corresponds to + firmware attribute of the os element. + Plain presence of this enum means that libvirt is capable of so + called firmware auto selection. The listed values then represent + accepted values for the domain attribute. Only values for which + there exists a firmware descriptor that matches machine type and + architecture are listed, i.e. those which won't cause a failure + on domain startup. +

+

For the loader element, the following can occur:

=20
diff --git a/docs/schemas/domaincaps.rng b/docs/schemas/domaincaps.rng index 3c42cb8075..230697f824 100644 --- a/docs/schemas/domaincaps.rng +++ b/docs/schemas/domaincaps.rng @@ -77,6 +77,9 @@ + + + diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c index 5a8f48da61..29d9f1f640 100644 --- a/src/conf/domain_capabilities.c +++ b/src/conf/domain_capabilities.c @@ -427,6 +427,8 @@ virDomainCapsOSFormat(virBufferPtr buf, =20 FORMAT_PROLOGUE(os); =20 + ENUM_PROCESS(os, firmware, virDomainOsDefFirmwareTypeToString); + virDomainCapsLoaderFormat(buf, loader); =20 FORMAT_EPILOGUE(os); diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h index 26f4b8c394..4d4a3f0cf1 100644 --- a/src/conf/domain_capabilities.h +++ b/src/conf/domain_capabilities.h @@ -57,6 +57,7 @@ typedef struct _virDomainCapsOS virDomainCapsOS; typedef virDomainCapsOS *virDomainCapsOSPtr; struct _virDomainCapsOS { virTristateBool supported; + virDomainCapsEnum firmware; /* Info about virDomainOsDefFirmware */ virDomainCapsLoader loader; /* Info about virDomainLoaderDef */ }; =20 diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 71d4c01296..452d092069 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -46,6 +46,7 @@ #include "qemu_capspriv.h" #include "qemu_qapi.h" #include "qemu_process.h" +#include "qemu_firmware.h" =20 #include #include @@ -4962,12 +4963,27 @@ virQEMUCapsFillDomainLoaderCaps(virDomainCapsLoader= Ptr capsLoader, =20 static int virQEMUCapsFillDomainOSCaps(virDomainCapsOSPtr os, + const char *machine, + virArch arch, + bool privileged, virFirmwarePtr *firmwares, size_t nfirmwares) { virDomainCapsLoaderPtr capsLoader =3D &os->loader; + unsigned int autoFirmwares =3D 0; =20 os->supported =3D VIR_TRISTATE_BOOL_YES; + + if (qemuFirmwareGetSupported(machine, arch, privileged, &autoFirmwares= ) < 0) + return -1; + + os->firmware.report =3D true; + + if (autoFirmwares & (1 << VIR_DOMAIN_OS_DEF_FIRMWARE_BIOS)) + VIR_DOMAIN_CAPS_ENUM_SET(os->firmware, VIR_DOMAIN_OS_DEF_FIRMWARE_= BIOS); + if (autoFirmwares & (1 << VIR_DOMAIN_OS_DEF_FIRMWARE_EFI)) + VIR_DOMAIN_CAPS_ENUM_SET(os->firmware, VIR_DOMAIN_OS_DEF_FIRMWARE_= EFI); + if (virQEMUCapsFillDomainLoaderCaps(capsLoader, firmwares, nfirmwares)= < 0) return -1; return 0; @@ -5298,6 +5314,7 @@ int virQEMUCapsFillDomainCaps(virCapsPtr caps, virDomainCapsPtr domCaps, virQEMUCapsPtr qemuCaps, + bool privileged, virFirmwarePtr *firmwares, size_t nfirmwares) { @@ -5324,7 +5341,11 @@ virQEMUCapsFillDomainCaps(virCapsPtr caps, domCaps->genid =3D virTristateBoolFromBool( virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VMGENID)); =20 - if (virQEMUCapsFillDomainOSCaps(os, firmwares, nfirmwares) < 0 || + if (virQEMUCapsFillDomainOSCaps(os, + domCaps->machine, + domCaps->arch, + privileged, + firmwares, nfirmwares) < 0 || virQEMUCapsFillDomainCPUCaps(caps, qemuCaps, domCaps) < 0 || virQEMUCapsFillDomainIOThreadCaps(qemuCaps, domCaps) < 0 || virQEMUCapsFillDomainDeviceDiskCaps(qemuCaps, diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index c6f6980684..2b099c15c9 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -631,6 +631,7 @@ int virQEMUCapsInitGuestFromBinary(virCapsPtr caps, int virQEMUCapsFillDomainCaps(virCapsPtr caps, virDomainCapsPtr domCaps, virQEMUCapsPtr qemuCaps, + bool privileged, virFirmwarePtr *firmwares, size_t nfirmwares); =20 diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 7e5bbc3cc9..7fa5c985ec 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -19856,6 +19856,7 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn, goto cleanup; =20 if (virQEMUCapsFillDomainCaps(caps, domCaps, qemuCaps, + driver->privileged, cfg->firmwares, cfg->nfirmwares) < 0) goto cleanup; =20 diff --git a/tests/Makefile.am b/tests/Makefile.am index 1319c3b12c..46d94d2236 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1033,7 +1033,9 @@ domaincapsmock_la_LDFLAGS =3D $(MOCKLIBS_LDFLAGS) domaincapsmock_la_LIBADD =3D $(MOCKLIBS_LIBS) =20 domaincapstest_SOURCES =3D \ - domaincapstest.c testutils.h testutils.c + domaincapstest.c testutils.h testutils.c \ + virfilewrapper.c virfilewrapper.h \ + $(NULL) domaincapstest_LDADD =3D $(LDADDS) =20 if WITH_QEMU diff --git a/tests/domaincapsschemadata/qemu_1.7.0.x86_64.xml b/tests/domai= ncapsschemadata/qemu_1.7.0.x86_64.xml index 497363bbe9..13ff70695c 100644 --- a/tests/domaincapsschemadata/qemu_1.7.0.x86_64.xml +++ b/tests/domaincapsschemadata/qemu_1.7.0.x86_64.xml @@ -6,6 +6,10 @@ + + bios + efi + /usr/share/AAVMF/AAVMF_CODE.fd /usr/share/AAVMF/AAVMF32_CODE.fd diff --git a/tests/domaincapsschemadata/qemu_2.12.0-virt.aarch64.xml b/test= s/domaincapsschemadata/qemu_2.12.0-virt.aarch64.xml index 7639df44c6..8c225e3c89 100644 --- a/tests/domaincapsschemadata/qemu_2.12.0-virt.aarch64.xml +++ b/tests/domaincapsschemadata/qemu_2.12.0-virt.aarch64.xml @@ -6,6 +6,9 @@ + + efi + /usr/share/AAVMF/AAVMF_CODE.fd /usr/share/AAVMF/AAVMF32_CODE.fd diff --git a/tests/domaincapsschemadata/qemu_2.12.0.ppc64.xml b/tests/domai= ncapsschemadata/qemu_2.12.0.ppc64.xml index f10d361359..24fbbf505a 100644 --- a/tests/domaincapsschemadata/qemu_2.12.0.ppc64.xml +++ b/tests/domaincapsschemadata/qemu_2.12.0.ppc64.xml @@ -6,6 +6,7 @@ + /usr/share/AAVMF/AAVMF_CODE.fd /usr/share/AAVMF/AAVMF32_CODE.fd diff --git a/tests/domaincapsschemadata/qemu_2.12.0.s390x.xml b/tests/domai= ncapsschemadata/qemu_2.12.0.s390x.xml index 41a81ff02f..35ff91c53a 100644 --- a/tests/domaincapsschemadata/qemu_2.12.0.s390x.xml +++ b/tests/domaincapsschemadata/qemu_2.12.0.s390x.xml @@ -6,6 +6,7 @@ + /usr/share/AAVMF/AAVMF_CODE.fd /usr/share/AAVMF/AAVMF32_CODE.fd diff --git a/tests/domaincapsschemadata/qemu_2.12.0.x86_64.xml b/tests/doma= incapsschemadata/qemu_2.12.0.x86_64.xml index 5913e7fc63..e71d6e7bba 100644 --- a/tests/domaincapsschemadata/qemu_2.12.0.x86_64.xml +++ b/tests/domaincapsschemadata/qemu_2.12.0.x86_64.xml @@ -6,6 +6,10 @@ + + bios + efi + /usr/share/AAVMF/AAVMF_CODE.fd /usr/share/AAVMF/AAVMF32_CODE.fd diff --git a/tests/domaincapsschemadata/qemu_2.6.0-virt.aarch64.xml b/tests= /domaincapsschemadata/qemu_2.6.0-virt.aarch64.xml index 9ee801092e..3bd46b566b 100644 --- a/tests/domaincapsschemadata/qemu_2.6.0-virt.aarch64.xml +++ b/tests/domaincapsschemadata/qemu_2.6.0-virt.aarch64.xml @@ -6,6 +6,9 @@ + + efi + /usr/share/AAVMF/AAVMF_CODE.fd /usr/share/AAVMF/AAVMF32_CODE.fd diff --git a/tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml b/tests/doma= incapsschemadata/qemu_2.6.0.aarch64.xml index 4dd0b52ed3..148ffc8539 100644 --- a/tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml +++ b/tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml @@ -6,6 +6,7 @@ + /usr/share/AAVMF/AAVMF_CODE.fd /usr/share/AAVMF/AAVMF32_CODE.fd diff --git a/tests/domaincapsschemadata/qemu_2.6.0.ppc64.xml b/tests/domain= capsschemadata/qemu_2.6.0.ppc64.xml index aa982d237e..a0ff809775 100644 --- a/tests/domaincapsschemadata/qemu_2.6.0.ppc64.xml +++ b/tests/domaincapsschemadata/qemu_2.6.0.ppc64.xml @@ -6,6 +6,7 @@ + /usr/share/AAVMF/AAVMF_CODE.fd /usr/share/AAVMF/AAVMF32_CODE.fd diff --git a/tests/domaincapsschemadata/qemu_2.6.0.x86_64.xml b/tests/domai= ncapsschemadata/qemu_2.6.0.x86_64.xml index 6aa3f52ee4..993c4bb396 100644 --- a/tests/domaincapsschemadata/qemu_2.6.0.x86_64.xml +++ b/tests/domaincapsschemadata/qemu_2.6.0.x86_64.xml @@ -6,6 +6,10 @@ + + bios + efi + /usr/share/AAVMF/AAVMF_CODE.fd /usr/share/AAVMF/AAVMF32_CODE.fd diff --git a/tests/domaincapsschemadata/qemu_2.7.0.s390x.xml b/tests/domain= capsschemadata/qemu_2.7.0.s390x.xml index 8daa15ab9d..e7b72912e7 100644 --- a/tests/domaincapsschemadata/qemu_2.7.0.s390x.xml +++ b/tests/domaincapsschemadata/qemu_2.7.0.s390x.xml @@ -6,6 +6,7 @@ + /usr/share/AAVMF/AAVMF_CODE.fd /usr/share/AAVMF/AAVMF32_CODE.fd diff --git a/tests/domaincapsschemadata/qemu_2.8.0-tcg.x86_64.xml b/tests/d= omaincapsschemadata/qemu_2.8.0-tcg.x86_64.xml index 081805aa4a..b80745864e 100644 --- a/tests/domaincapsschemadata/qemu_2.8.0-tcg.x86_64.xml +++ b/tests/domaincapsschemadata/qemu_2.8.0-tcg.x86_64.xml @@ -6,6 +6,10 @@ + + bios + efi + /usr/share/AAVMF/AAVMF_CODE.fd /usr/share/AAVMF/AAVMF32_CODE.fd diff --git a/tests/domaincapsschemadata/qemu_2.8.0.s390x.xml b/tests/domain= capsschemadata/qemu_2.8.0.s390x.xml index 62c51e4087..80810cd876 100644 --- a/tests/domaincapsschemadata/qemu_2.8.0.s390x.xml +++ b/tests/domaincapsschemadata/qemu_2.8.0.s390x.xml @@ -6,6 +6,7 @@ + /usr/share/AAVMF/AAVMF_CODE.fd /usr/share/AAVMF/AAVMF32_CODE.fd diff --git a/tests/domaincapsschemadata/qemu_2.8.0.x86_64.xml b/tests/domai= ncapsschemadata/qemu_2.8.0.x86_64.xml index 1bb034aa4f..ef4972fbc3 100644 --- a/tests/domaincapsschemadata/qemu_2.8.0.x86_64.xml +++ b/tests/domaincapsschemadata/qemu_2.8.0.x86_64.xml @@ -6,6 +6,10 @@ + + bios + efi + /usr/share/AAVMF/AAVMF_CODE.fd /usr/share/AAVMF/AAVMF32_CODE.fd diff --git a/tests/domaincapsschemadata/qemu_2.9.0-q35.x86_64.xml b/tests/d= omaincapsschemadata/qemu_2.9.0-q35.x86_64.xml index 67c6d5e77e..8de185e5cc 100644 --- a/tests/domaincapsschemadata/qemu_2.9.0-q35.x86_64.xml +++ b/tests/domaincapsschemadata/qemu_2.9.0-q35.x86_64.xml @@ -6,6 +6,10 @@ + + bios + efi + /usr/share/AAVMF/AAVMF_CODE.fd /usr/share/AAVMF/AAVMF32_CODE.fd diff --git a/tests/domaincapsschemadata/qemu_2.9.0-tcg.x86_64.xml b/tests/d= omaincapsschemadata/qemu_2.9.0-tcg.x86_64.xml index 588ef08199..1a7fdd5402 100644 --- a/tests/domaincapsschemadata/qemu_2.9.0-tcg.x86_64.xml +++ b/tests/domaincapsschemadata/qemu_2.9.0-tcg.x86_64.xml @@ -6,6 +6,10 @@ + + bios + efi + /usr/share/AAVMF/AAVMF_CODE.fd /usr/share/AAVMF/AAVMF32_CODE.fd diff --git a/tests/domaincapsschemadata/qemu_2.9.0.x86_64.xml b/tests/domai= ncapsschemadata/qemu_2.9.0.x86_64.xml index 598937a971..1f59f1a2f4 100644 --- a/tests/domaincapsschemadata/qemu_2.9.0.x86_64.xml +++ b/tests/domaincapsschemadata/qemu_2.9.0.x86_64.xml @@ -6,6 +6,10 @@ + + bios + efi + /usr/share/AAVMF/AAVMF_CODE.fd /usr/share/AAVMF/AAVMF32_CODE.fd diff --git a/tests/domaincapsschemadata/qemu_3.0.0.s390x.xml b/tests/domain= capsschemadata/qemu_3.0.0.s390x.xml index 1d97f1f344..64acf4727d 100644 --- a/tests/domaincapsschemadata/qemu_3.0.0.s390x.xml +++ b/tests/domaincapsschemadata/qemu_3.0.0.s390x.xml @@ -6,6 +6,7 @@ + /usr/share/AAVMF/AAVMF_CODE.fd /usr/share/AAVMF/AAVMF32_CODE.fd diff --git a/tests/domaincapsschemadata/qemu_4.0.0.x86_64.xml b/tests/domai= ncapsschemadata/qemu_4.0.0.x86_64.xml index df66be9e29..319407be0a 100644 --- a/tests/domaincapsschemadata/qemu_4.0.0.x86_64.xml +++ b/tests/domaincapsschemadata/qemu_4.0.0.x86_64.xml @@ -6,6 +6,10 @@ + + bios + efi + /usr/share/AAVMF/AAVMF_CODE.fd /usr/share/AAVMF/AAVMF32_CODE.fd diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c index 2cccfbc8e2..7637435e1f 100644 --- a/tests/domaincapstest.c +++ b/tests/domaincapstest.c @@ -20,6 +20,8 @@ =20 #include "testutils.h" #include "domain_capabilities.h" +#include "virfilewrapper.h" +#include "configmake.h" =20 =20 #define VIR_FROM_THIS VIR_FROM_NONE @@ -104,6 +106,7 @@ fillQemuCaps(virDomainCapsPtr domCaps, goto cleanup; =20 if (virQEMUCapsFillDomainCaps(caps, domCaps, qemuCaps, + false, cfg->firmwares, cfg->nfirmwares) < 0) goto cleanup; @@ -364,6 +367,13 @@ mymain(void) =20 #if WITH_QEMU =20 + virFileWrapperAddPrefix(SYSCONFDIR "/qemu/firmware", + abs_srcdir "/qemufirmwaredata/etc/qemu/firmwar= e"); + virFileWrapperAddPrefix(PREFIX "/share/qemu/firmware", + abs_srcdir "/qemufirmwaredata/usr/share/qemu/f= irmware"); + virFileWrapperAddPrefix("/home/user/.config/qemu/firmware", + abs_srcdir "/qemufirmwaredata/home/user/.confi= g/qemu/firmware"); + DO_TEST_QEMU("1.7.0", "caps_1.7.0", "/usr/bin/qemu-system-x86_64", NULL, "x86_64", VIR_DOMAIN_VIRT_KVM); @@ -437,6 +447,10 @@ mymain(void) "x86_64", VIR_DOMAIN_VIRT_KVM); virObjectUnref(cfg); =20 + virFileWrapperRemovePrefix(SYSCONFDIR "/qemu/firmware"); + virFileWrapperRemovePrefix(PREFIX "/share/qemu/firmware"); + virFileWrapperRemovePrefix("/home/user/.config/qemu/firmware"); + #endif /* WITH_QEMU */ =20 #if WITH_LIBXL @@ -458,6 +472,8 @@ mymain(void) DO_TEST_BHYVE("fbuf", "/usr/sbin/bhyve", &bhyve_caps, VIR_DOMAIN_VIRT_= BHYVE); #endif /* WITH_BHYVE */ =20 + virFileWrapperClearPrefixes(); + return ret; } =20 --=20 2.21.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list