From nobody Wed Mar 12 13:01:11 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1740601061948362.5426607916844; Wed, 26 Feb 2025 12:17:41 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 14DA71856; Wed, 26 Feb 2025 15:17:41 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 6558318FC; Wed, 26 Feb 2025 15:16:35 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 5B7D4168A; Wed, 26 Feb 2025 15:16:30 -0500 (EST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 81F9516EA for ; Wed, 26 Feb 2025 15:16:29 -0500 (EST) Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-213-cKaITIqZPMOqxfRmJSf9nw-1; Wed, 26 Feb 2025 15:16:27 -0500 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 858F41800871 for ; Wed, 26 Feb 2025 20:16:26 +0000 (UTC) Received: from toolbx.redhat.com (unknown [10.44.33.32]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id C6CD3300018D; Wed, 26 Feb 2025 20:16:24 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H5,RCVD_IN_MSPIKE_WL,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1740600989; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=mx69jwZ3h66tFNTpDObasbMDZwkoh01U4xhAQG2yONs=; b=HJ4H7b1+Iq85Bzd9vsjHsDsVMMV+1S58xahatlMCIkvZFv9wYAFgrcBW16INbQgb29I+w8 aILy0Z4PXZM7se2SAkRQxiMylT5j3tgKY/74rPJWtneUrQBbsk778bHdifyx72w4v0vgPz whs7HPQAjcR3atxrE1keCr2UQc8xfqs= X-MC-Unique: cKaITIqZPMOqxfRmJSf9nw-1 X-Mimecast-MFC-AGG-ID: cKaITIqZPMOqxfRmJSf9nw_1740600986 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: devel@lists.libvirt.org Subject: [PATCH v2 1/7] conf: introduce support for multiple ACPI tables Date: Wed, 26 Feb 2025 20:16:13 +0000 Message-ID: <20250226201619.2730066-2-berrange@redhat.com> In-Reply-To: <20250226201619.2730066-1-berrange@redhat.com> References: <20250226201619.2730066-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: ezWo6xVklYM07K2OzIpESUBrEJSIykSJdwrWA_Gylos_1740600986 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 4NKZ2ID56G5ZKUZKM4EYEEGNEMOU53C7 X-Message-ID-Hash: 4NKZ2ID56G5ZKUZKM4EYEEGNEMOU53C7 X-MailFrom: berrange@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Victor Toso X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1740601064479019000 Content-Type: text/plain; charset="utf-8" Currently we parse ...path...
into a flat 'char *slic_table' field which is rather an anti-pattern as it has special cased a single attribute type. This rewrites the internal design to permit multiple table types to be parsed, should we add more in future. Each type is currently permitted to only appear once. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- src/conf/domain_conf.c | 90 +++++++++++++++++++++++---------- src/conf/domain_conf.h | 21 +++++++- src/libvirt_private.syms | 2 + src/libxl/libxl_conf.c | 5 +- src/libxl/xen_xl.c | 15 ++++-- src/qemu/qemu_command.c | 13 +++-- src/security/security_dac.c | 18 ++++--- src/security/security_selinux.c | 16 +++--- src/security/virt-aa-helper.c | 5 +- 9 files changed, 133 insertions(+), 52 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 5630a469be..fc8ed9fc54 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1457,6 +1457,11 @@ VIR_ENUM_IMPL(virDomainOsDefFirmwareFeature, "secure-boot", ); =20 +VIR_ENUM_IMPL(virDomainOsACPITable, + VIR_DOMAIN_OS_ACPI_TABLE_TYPE_LAST, + "slic", +); + VIR_ENUM_IMPL(virDomainCFPC, VIR_DOMAIN_CFPC_LAST, "none", @@ -3899,6 +3904,15 @@ virDomainSecDefFree(virDomainSecDef *def) g_free(def); } =20 +void virDomainOSACPITableDefFree(virDomainOSACPITableDef *def) +{ + if (!def) + return; + g_free(def->path); + g_free(def); +} + + static void virDomainOSDefClear(virDomainOSDef *os) { @@ -3924,7 +3938,9 @@ virDomainOSDefClear(virDomainOSDef *os) g_free(os->cmdline); g_free(os->dtb); g_free(os->root); - g_free(os->slic_table); + for (i =3D 0; i < os->nacpiTables; i++) + virDomainOSACPITableDefFree(os->acpiTables[i]); + g_free(os->acpiTables); virDomainLoaderDefFree(os->loader); g_free(os->bootloader); g_free(os->bootloaderArgs); @@ -17883,40 +17899,57 @@ virDomainDefParseBootAcpiOptions(virDomainDef *de= f, int n; g_autofree xmlNodePtr *nodes =3D NULL; g_autofree char *tmp =3D NULL; + size_t ntables =3D 0; + virDomainOSACPITableDef **tables =3D NULL; + size_t i; =20 if ((n =3D virXPathNodeSet("./os/acpi/table", ctxt, &nodes)) < 0) return -1; =20 - if (n > 1) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("Only one acpi table is supported")); - return -1; - } + if (n =3D=3D 0) + return 0; =20 - if (n =3D=3D 1) { - tmp =3D virXMLPropString(nodes[0], "type"); + tables =3D g_new0(virDomainOSACPITableDef *, n); + for (i =3D 0; i < n; i++) { + g_autofree char *path =3D virXMLNodeContentString(nodes[i]); + virDomainOsACPITable type; + size_t j; =20 - if (!tmp) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("Missing acpi table type")); - return -1; - } + if (!path) + goto error; =20 - if (STREQ_NULLABLE(tmp, "slic")) { - VIR_FREE(tmp); - if (!(tmp =3D virXMLNodeContentString(nodes[0]))) - return -1; + if (virXMLPropEnum(nodes[i], "type", + virDomainOsACPITableTypeFromString, + VIR_XML_PROP_REQUIRED, + &type) < 0) + goto error; =20 - def->os.slic_table =3D virFileSanitizePath(tmp); - } else { - virReportError(VIR_ERR_XML_ERROR, - _("Unknown acpi table type: %1$s"), - tmp); - return -1; + for (j =3D 0; j < i; j++) { + if (tables[j]->type =3D=3D type) { + virReportError(VIR_ERR_XML_ERROR, + _("ACPI table type '%1$s' may only appear o= nce"), + virDomainOsACPITableTypeToString(type)); + goto error; + } } + + tables[ntables] =3D g_new0(virDomainOSACPITableDef, 1); + tables[ntables]->type =3D type; + tables[ntables]->path =3D virFileSanitizePath(path); + ntables++; } =20 + def->os.nacpiTables =3D ntables; + def->os.acpiTables =3D tables; + return 0; + + error: + for (i =3D 0; i < ntables; i++) { + virDomainOSACPITableDefFree(tables[i]); + } + g_free(tables); + return -1; } =20 =20 @@ -28478,11 +28511,16 @@ virDomainDefFormatInternalSetRootName(virDomainDe= f *def, def->os.dtb); virBufferEscapeString(buf, "%s\n", def->os.root); - if (def->os.slic_table) { + + if (def->os.nacpiTables) { virBufferAddLit(buf, "\n"); virBufferAdjustIndent(buf, 2); - virBufferEscapeString(buf, "%s
\n", - def->os.slic_table); + for (i =3D 0; i < def->os.nacpiTables; i++) { + virBufferAsprintf(buf, "", + virDomainOsACPITableTypeToString(def->os.acp= iTables[i]->type)); + virBufferEscapeString(buf, "%s
\n", + def->os.acpiTables[i]->path); + } virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "
\n"); } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index d4fa79cb84..cc9fd503fa 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2474,6 +2474,24 @@ typedef enum { =20 VIR_ENUM_DECL(virDomainOsDefFirmwareFeature); =20 +typedef enum { + VIR_DOMAIN_OS_ACPI_TABLE_TYPE_SLIC, + + VIR_DOMAIN_OS_ACPI_TABLE_TYPE_LAST +} virDomainOsACPITable; + +VIR_ENUM_DECL(virDomainOsACPITable); + +struct _virDomainOSACPITableDef { + virDomainOsACPITable type; + char *path; +}; + +typedef struct _virDomainOSACPITableDef virDomainOSACPITableDef; +void virDomainOSACPITableDefFree(virDomainOSACPITableDef *def); +G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainOSACPITableDef, virDomainOSACPITabl= eDefFree); + + struct _virDomainOSDef { int type; virDomainOsDefFirmware firmware; @@ -2496,7 +2514,8 @@ struct _virDomainOSDef { char *cmdline; char *dtb; char *root; - char *slic_table; + size_t nacpiTables; + virDomainOSACPITableDef **acpiTables; virDomainLoaderDef *loader; char *bootloader; char *bootloaderArgs; diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 30a9f806f0..db8c29ec1d 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -611,6 +611,8 @@ virDomainObjTaint; virDomainObjUpdateModificationImpact; virDomainObjWait; virDomainObjWaitUntil; +virDomainOsACPITableTypeFromString; +virDomainOsACPITableTypeToString; virDomainOsDefFirmwareTypeFromString; virDomainOsDefFirmwareTypeToString; virDomainOSTypeFromString; diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index c404226e43..7d845b97ec 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -582,8 +582,9 @@ libxlMakeDomBuildInfo(virDomainDef *def, VIR_TRISTATE_SWITCH_ON); #endif =20 - /* copy SLIC table path to acpi_firmware */ - b_info->u.hvm.acpi_firmware =3D g_strdup(def->os.slic_table); + /* copy the table path to acpi_firmware */ + if (def->os.nacpiTables) + b_info->u.hvm.acpi_firmware =3D g_strdup(def->os.acpiTables[0]= ->path); =20 if (def->nsounds > 0) { /* diff --git a/src/libxl/xen_xl.c b/src/libxl/xen_xl.c index 53f6871efc..062b753cea 100644 --- a/src/libxl/xen_xl.c +++ b/src/libxl/xen_xl.c @@ -106,6 +106,7 @@ xenParseXLOS(virConf *conf, virDomainDef *def, virCaps = *caps) g_autofree char *bios =3D NULL; g_autofree char *bios_path =3D NULL; g_autofree char *boot =3D NULL; + g_autofree char *slic =3D NULL; int val =3D 0; =20 if (xenConfigGetString(conf, "bios", &bios, NULL) < 0) @@ -133,8 +134,15 @@ xenParseXLOS(virConf *conf, virDomainDef *def, virCaps= *caps) } } =20 - if (xenConfigCopyStringOpt(conf, "acpi_firmware", &def->os.slic_ta= ble) < 0) + if (xenConfigCopyStringOpt(conf, "acpi_firmware", &slic) < 0) return -1; + if (slic !=3D NULL) { + def->os.nacpiTables =3D 1; + def->os.acpiTables =3D g_new0(virDomainOSACPITableDef *, 1); + def->os.acpiTables[0] =3D g_new0(virDomainOSACPITableDef, 1); + def->os.acpiTables[0]->type =3D VIR_DOMAIN_OS_ACPI_TABLE_TYPE_= SLIC; + def->os.acpiTables[0]->path =3D g_steal_pointer(&slic); + } =20 if (xenConfigCopyStringOpt(conf, "kernel", &def->os.kernel) < 0) return -1; @@ -1134,8 +1142,9 @@ xenFormatXLOS(virConf *conf, virDomainDef *def) return -1; } =20 - if (def->os.slic_table && - xenConfigSetString(conf, "acpi_firmware", def->os.slic_table) = < 0) + if (def->os.nacpiTables && + xenConfigSetString(conf, "acpi_firmware", + def->os.acpiTables[0]->path) < 0) return -1; =20 if (def->os.kernel && diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 0ad73af335..6048c755fc 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -127,6 +127,11 @@ VIR_ENUM_IMPL(qemuNumaPolicy, "restrictive", ); =20 +VIR_ENUM_DECL(qemuACPITableSIG); +VIR_ENUM_IMPL(qemuACPITableSIG, + VIR_DOMAIN_OS_ACPI_TABLE_TYPE_LAST, + "SLIC"); + =20 const char * qemuAudioDriverTypeToString(virDomainAudioType type) @@ -5995,6 +6000,7 @@ qemuBuildBootCommandLine(virCommand *cmd, { g_auto(virBuffer) boot_buf =3D VIR_BUFFER_INITIALIZER; g_autofree char *boot_opts_str =3D NULL; + size_t i; =20 if (def->os.bootmenu) { if (def->os.bootmenu =3D=3D VIR_TRISTATE_BOOL_YES) @@ -6028,11 +6034,12 @@ qemuBuildBootCommandLine(virCommand *cmd, virCommandAddArgList(cmd, "-append", def->os.cmdline, NULL); if (def->os.dtb) virCommandAddArgList(cmd, "-dtb", def->os.dtb, NULL); - if (def->os.slic_table) { + for (i =3D 0; i < def->os.nacpiTables; i++) { g_auto(virBuffer) buf =3D VIR_BUFFER_INITIALIZER; virCommandAddArg(cmd, "-acpitable"); - virBufferAddLit(&buf, "sig=3DSLIC,file=3D"); - virQEMUBuildBufferEscapeComma(&buf, def->os.slic_table); + virBufferAsprintf(&buf, "sig=3D%s,file=3D", + qemuACPITableSIGTypeToString(def->os.acpiTables[= i]->type)); + virQEMUBuildBufferEscapeComma(&buf, def->os.acpiTables[i]->path); virCommandAddArgBuffer(cmd, &buf); } =20 diff --git a/src/security/security_dac.c b/src/security/security_dac.c index 0505f4e4a3..b4d61bc576 100644 --- a/src/security/security_dac.c +++ b/src/security/security_dac.c @@ -2050,9 +2050,10 @@ virSecurityDACRestoreAllLabel(virSecurityManager *mg= r, virSecurityDACRestoreFileLabel(mgr, def->os.dtb) < 0) rc =3D -1; =20 - if (def->os.slic_table && - virSecurityDACRestoreFileLabel(mgr, def->os.slic_table) < 0) - rc =3D -1; + for (i =3D 0; i < def->os.nacpiTables; i++) { + if (virSecurityDACRestoreFileLabel(mgr, def->os.acpiTables[i]->pat= h) < 0) + rc =3D -1; + } =20 if (def->pstore && virSecurityDACRestoreFileLabel(mgr, def->pstore->path) < 0) @@ -2300,11 +2301,12 @@ virSecurityDACSetAllLabel(virSecurityManager *mgr, user, group, true) < 0) return -1; =20 - if (def->os.slic_table && - virSecurityDACSetOwnership(mgr, NULL, - def->os.slic_table, - user, group, true) < 0) - return -1; + for (i =3D 0; i < def->os.nacpiTables; i++) { + if (virSecurityDACSetOwnership(mgr, NULL, + def->os.acpiTables[i]->path, + user, group, true) < 0) + return -1; + } =20 if (def->pstore && virSecurityDACSetOwnership(mgr, NULL, diff --git a/src/security/security_selinux.c b/src/security/security_selinu= x.c index cdc32d9b34..b8659e33d6 100644 --- a/src/security/security_selinux.c +++ b/src/security/security_selinux.c @@ -3013,9 +3013,10 @@ virSecuritySELinuxRestoreAllLabel(virSecurityManager= *mgr, virSecuritySELinuxRestoreFileLabel(mgr, def->os.dtb, true) < 0) rc =3D -1; =20 - if (def->os.slic_table && - virSecuritySELinuxRestoreFileLabel(mgr, def->os.slic_table, true) = < 0) - rc =3D -1; + for (i =3D 0; i < def->os.nacpiTables; i++) { + if (virSecuritySELinuxRestoreFileLabel(mgr, def->os.acpiTables[i]-= >path, true) < 0) + rc =3D -1; + } =20 if (def->pstore && virSecuritySELinuxRestoreFileLabel(mgr, def->pstore->path, true) <= 0) @@ -3443,10 +3444,11 @@ virSecuritySELinuxSetAllLabel(virSecurityManager *m= gr, data->content_context, true) < 0) return -1; =20 - if (def->os.slic_table && - virSecuritySELinuxSetFilecon(mgr, def->os.slic_table, - data->content_context, true) < 0) - return -1; + for (i =3D 0; i < def->os.nacpiTables; i++) { + if (virSecuritySELinuxSetFilecon(mgr, def->os.acpiTables[i]->path, + data->content_context, true) < 0) + return -1; + } =20 if (def->pstore && virSecuritySELinuxSetFilecon(mgr, def->pstore->path, diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c index 1626d5a89c..23de0be9db 100644 --- a/src/security/virt-aa-helper.c +++ b/src/security/virt-aa-helper.c @@ -974,9 +974,10 @@ get_files(vahControl * ctl) if (vah_add_file(&buf, ctl->def->os.dtb, "r") !=3D 0) goto cleanup; =20 - if (ctl->def->os.slic_table) - if (vah_add_file(&buf, ctl->def->os.slic_table, "r") !=3D 0) + for (i =3D 0; i < ctl->def->os.nacpiTables; i++) { + if (vah_add_file(&buf, ctl->def->os.acpiTables[i]->path, "r") !=3D= 0) goto cleanup; + } =20 if (ctl->def->pstore) if (vah_add_file(&buf, ctl->def->pstore->path, "rw") !=3D 0) --=20 2.47.1 From nobody Wed Mar 12 13:01:11 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1740601096188335.8831010177154; Wed, 26 Feb 2025 12:18:16 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 2C9E61979; Wed, 26 Feb 2025 15:18:15 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 86E8D18B1; Wed, 26 Feb 2025 15:16:44 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 9D70E1942; Wed, 26 Feb 2025 15:16:39 -0500 (EST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id A644D183D for ; Wed, 26 Feb 2025 15:16:31 -0500 (EST) Received: from mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-301-X46TEUFDPr6j7bLkgcseqA-1; Wed, 26 Feb 2025 15:16:29 -0500 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id E21D919373D9 for ; Wed, 26 Feb 2025 20:16:28 +0000 (UTC) Received: from toolbx.redhat.com (unknown [10.44.33.32]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 2C0BE300018D; Wed, 26 Feb 2025 20:16:26 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H5,RCVD_IN_MSPIKE_WL,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1740600991; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Jx5cAVYFf959x8ou/heJBQQgGTX7F4n/ji4ksr8gYzM=; b=NOCtXy1qU0BfcGwh0h4nLahJfhlsk0s7CFwot0fr6k5zRm0d8CI2iHWXFEFf2I57XuJmls 7FsThibasJVJYG69Q14Pr0MfJHwqKkxeMbAx9NbXpR7cakQiiy8NN1vhXbEqBwNmvqJ5Ls ulpqyZQH4Mo4k0GMHtQ/6pSByDr/U/c= X-MC-Unique: X46TEUFDPr6j7bLkgcseqA-1 X-Mimecast-MFC-AGG-ID: X46TEUFDPr6j7bLkgcseqA_1740600989 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: devel@lists.libvirt.org Subject: [PATCH v2 2/7] src: validate permitted ACPI table types in libxl/qemu drivers Date: Wed, 26 Feb 2025 20:16:14 +0000 Message-ID: <20250226201619.2730066-3-berrange@redhat.com> In-Reply-To: <20250226201619.2730066-1-berrange@redhat.com> References: <20250226201619.2730066-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: NjCfnU6P-cY7CWaIU3L72Qm9HOTCOC_sDC84sJPNabQ_1740600989 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 7CBOB3DMXIP5MXPSLLPAZ5LEANLZTQOD X-Message-ID-Hash: 7CBOB3DMXIP5MXPSLLPAZ5LEANLZTQOD X-MailFrom: berrange@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Victor Toso X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1740601097546019100 Content-Type: text/plain; charset="utf-8" This forces us to update the drivers when defining new table types to avoid incorrectly accepting them by default. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- src/libxl/libxl_domain.c | 19 +++++++++++++++++++ src/qemu/qemu_validate.c | 15 +++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 6805160923..efd01840de 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -306,6 +306,7 @@ libxlDomainDefValidate(const virDomainDef *def, libxlDriverPrivate *driver =3D opaque; g_autoptr(libxlDriverConfig) cfg =3D libxlDriverConfigGet(driver); bool reqSecureBoot =3D false; + size_t i; =20 if (!virCapabilitiesDomainSupported(cfg->caps, def->os.type, def->os.arch, @@ -330,6 +331,24 @@ libxlDomainDefValidate(const virDomainDef *def, return -1; } =20 + for (i =3D 0; i < def->os.nacpiTables; i++) { + switch (def->os.acpiTables[i]->type) { + case VIR_DOMAIN_OS_ACPI_TABLE_TYPE_SLIC: + break; + + default: + case VIR_DOMAIN_OS_ACPI_TABLE_TYPE_LAST: + virReportEnumRangeError(virDomainOsACPITable, + def->os.acpiTables[i]->type); + return -1; + } + } + if (def->os.nacpiTables > 1) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Only a single ACPI table is supported")); + return -1; + } + if (def->nsounds > 0) { virDomainSoundDef *snd =3D def->sounds[0]; =20 diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index f3ef1be660..1759ab4e6e 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -701,6 +701,8 @@ static int qemuValidateDomainDefBoot(const virDomainDef *def, virQEMUCaps *qemuCaps) { + size_t i; + if (def->os.bootloader || def->os.bootloaderArgs) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("bootloader is not supported by QEMU")); @@ -740,6 +742,19 @@ qemuValidateDomainDefBoot(const virDomainDef *def, return -1; } =20 + for (i =3D 0; i < def->os.nacpiTables; i++) { + switch (def->os.acpiTables[i]->type) { + case VIR_DOMAIN_OS_ACPI_TABLE_TYPE_SLIC: + break; + + default: + case VIR_DOMAIN_OS_ACPI_TABLE_TYPE_LAST: + virReportEnumRangeError(virDomainOsACPITable, + def->os.acpiTables[i]->type); + return -1; + } + } + return 0; } =20 --=20 2.47.1 From nobody Wed Mar 12 13:01:11 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1740601122217668.4276160660461; Wed, 26 Feb 2025 12:18:42 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 22B0C196C; Wed, 26 Feb 2025 15:18:41 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 3A3E01951; Wed, 26 Feb 2025 15:16:52 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 7244B17B9; Wed, 26 Feb 2025 15:16:47 -0500 (EST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 7DBED191E for ; Wed, 26 Feb 2025 15:16:35 -0500 (EST) Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-91-4trrRQeRPxqYfkK4p_kYHQ-1; Wed, 26 Feb 2025 15:16:31 -0500 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id A852D1800871 for ; Wed, 26 Feb 2025 20:16:30 +0000 (UTC) Received: from toolbx.redhat.com (unknown [10.44.33.32]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 5040B300018D; Wed, 26 Feb 2025 20:16:29 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H5,RCVD_IN_MSPIKE_WL,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1740600995; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=YNJdtsU/XYgQnvnSkZtfoS4h6atxQ9EAafocSR0ETME=; b=Q8NOsn0FTl7VfIbWxQ2KJUzuFQhQL0jYdKFnFruUqKZKuSylQoSkhytMd1go1MbgaYojp9 LIIfSjmcPlvhuLzZp0DD/IsjIjlKKp8OOF9/jr3EtJ9t5qvM2eRZ8g67HVoctVKXJlNntA ix8sQRqkIOfjllb6ZlbZ1ujhN405qQQ= X-MC-Unique: 4trrRQeRPxqYfkK4p_kYHQ-1 X-Mimecast-MFC-AGG-ID: 4trrRQeRPxqYfkK4p_kYHQ_1740600990 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: devel@lists.libvirt.org Subject: [PATCH v2 3/7] src: introduce 'raw' and 'rawset' ACPI table types Date: Wed, 26 Feb 2025 20:16:15 +0000 Message-ID: <20250226201619.2730066-4-berrange@redhat.com> In-Reply-To: <20250226201619.2730066-1-berrange@redhat.com> References: <20250226201619.2730066-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: ViHJuojZbOAdtNQKxGsxPbrdNdw2T2DYz13TT6knRt0_1740600990 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: PCZC5WQK4CSIYVZR3SNQYZT2WELQMSJO X-Message-ID-Hash: PCZC5WQK4CSIYVZR3SNQYZT2WELQMSJO X-MailFrom: berrange@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Victor Toso X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1740601123642019100 Content-Type: text/plain; charset="utf-8" The QEMU driver has only accepted type=3Dslic even though QEMU is able to accept individual tables of any type, without needing to specify a signature. Introduce type=3Draw to address this usage scenario. Contrary to other types, this one may appear multiple times. The Xen driver has mistakenly accepted type=3Dslic and use it to set the Xen acpi_firmware setting, which performs a simple passthrough of multiple concatenated data table. Introduce type=3Drawset to address this usage scenario. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- docs/formatdomain.rst | 19 ++++++++++++++++--- src/conf/domain_conf.c | 5 ++++- src/conf/domain_conf.h | 2 ++ src/conf/schemas/domaincommon.rng | 6 +++++- src/libxl/libxl_domain.c | 7 +++++++ src/qemu/qemu_command.c | 2 ++ src/qemu/qemu_validate.c | 7 +++++++ 7 files changed, 43 insertions(+), 5 deletions(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index fdb3c2459e..d3add663e2 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -490,9 +490,22 @@ These options apply to any form of booting of the gues= t OS. ... =20 ``acpi`` - The ``table`` element contains a fully-qualified path to the ACPI table= . The - ``type`` attribute contains the ACPI table type (currently only ``slic`= ` is - supported) :since:`Since 1.3.5 (QEMU)` :since:`Since 5.9.0 (Xen)` + The ``table`` element contains a fully-qualified path to the ACPI table, + with the ``type`` attribute dictating what data must be present in the + file: + + * ``raw``: a single ACPI table with header and data, with ACPI + signature auto-detected from header (:since:`Since 11.2.0`). + * ``rawset``: concatenation of multiple ACPI tables with header + and data, each with any ACPI signature, auto-detected from header + (:since:`Since 11.2.0`). + * ``slic``: a single ACPI table with header and data, providing + software licensing information. The ACPI table signature in the + header will be forced to ``SLIC`` (:since:`Since 1.3.5 (QEMU)`, + mis-interpreted as ``rawset`` :since:`Since 5.9.0 (Xen)`). + + Each type may be used only once, except for ``raw`` which can + appear multiple times. =20 =20 SMBIOS System Information diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index fc8ed9fc54..530473e200 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1459,6 +1459,8 @@ VIR_ENUM_IMPL(virDomainOsDefFirmwareFeature, =20 VIR_ENUM_IMPL(virDomainOsACPITable, VIR_DOMAIN_OS_ACPI_TABLE_TYPE_LAST, + "raw", + "rawset", "slic", ); =20 @@ -17925,7 +17927,8 @@ virDomainDefParseBootAcpiOptions(virDomainDef *def, goto error; =20 for (j =3D 0; j < i; j++) { - if (tables[j]->type =3D=3D type) { + if (tables[j]->type =3D=3D type && + type !=3D VIR_DOMAIN_OS_ACPI_TABLE_TYPE_RAW) { virReportError(VIR_ERR_XML_ERROR, _("ACPI table type '%1$s' may only appear o= nce"), virDomainOsACPITableTypeToString(type)); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index cc9fd503fa..299e2cbd5b 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2475,6 +2475,8 @@ typedef enum { VIR_ENUM_DECL(virDomainOsDefFirmwareFeature); =20 typedef enum { + VIR_DOMAIN_OS_ACPI_TABLE_TYPE_RAW, + VIR_DOMAIN_OS_ACPI_TABLE_TYPE_RAWSET, VIR_DOMAIN_OS_ACPI_TABLE_TYPE_SLIC, =20 VIR_DOMAIN_OS_ACPI_TABLE_TYPE_LAST diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincom= mon.rng index 824da9d066..b5eaf7c233 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -7180,7 +7180,11 @@ - slic + + raw + rawset + slic + diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index efd01840de..e564d9e5fe 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -336,6 +336,13 @@ libxlDomainDefValidate(const virDomainDef *def, case VIR_DOMAIN_OS_ACPI_TABLE_TYPE_SLIC: break; =20 + case VIR_DOMAIN_OS_ACPI_TABLE_TYPE_RAW: + case VIR_DOMAIN_OS_ACPI_TABLE_TYPE_RAWSET: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("ACPI table type '%1$s' is not supported"), + virDomainOsACPITableTypeToString(def->os.acpiTa= bles[i]->type)); + return -1; + default: case VIR_DOMAIN_OS_ACPI_TABLE_TYPE_LAST: virReportEnumRangeError(virDomainOsACPITable, diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 6048c755fc..bef06049ec 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -130,6 +130,8 @@ VIR_ENUM_IMPL(qemuNumaPolicy, VIR_ENUM_DECL(qemuACPITableSIG); VIR_ENUM_IMPL(qemuACPITableSIG, VIR_DOMAIN_OS_ACPI_TABLE_TYPE_LAST, + "", /* raw */ + "", /* rawset */ "SLIC"); =20 =20 diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 1759ab4e6e..de36bfc7ea 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -747,6 +747,13 @@ qemuValidateDomainDefBoot(const virDomainDef *def, case VIR_DOMAIN_OS_ACPI_TABLE_TYPE_SLIC: break; =20 + case VIR_DOMAIN_OS_ACPI_TABLE_TYPE_RAW: + case VIR_DOMAIN_OS_ACPI_TABLE_TYPE_RAWSET: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("ACPI table type '%1$s' is not supported"), + virDomainOsACPITableTypeToString(def->os.acpiTa= bles[i]->type)); + return -1; + default: case VIR_DOMAIN_OS_ACPI_TABLE_TYPE_LAST: virReportEnumRangeError(virDomainOsACPITable, --=20 2.47.1 From nobody Wed Mar 12 13:01:11 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1740601153983396.7079695738778; Wed, 26 Feb 2025 12:19:13 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id EB6CE1A1B; Wed, 26 Feb 2025 15:19:12 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 007C41878; Wed, 26 Feb 2025 15:16:56 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 3EA15191A; Wed, 26 Feb 2025 15:16:51 -0500 (EST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 85F27191A for ; Wed, 26 Feb 2025 15:16:35 -0500 (EST) Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-220-iPiwQ3tYN5617-Akyoxzgg-1; Wed, 26 Feb 2025 15:16:33 -0500 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id CED631800878 for ; Wed, 26 Feb 2025 20:16:32 +0000 (UTC) Received: from toolbx.redhat.com (unknown [10.44.33.32]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 516BD300018D; Wed, 26 Feb 2025 20:16:31 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1740600995; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=h2Jr9piIbGe3HZqE/2VRKNV+2O6hWWh6WtOm77DhAs8=; b=DdzX10sNtlh5z0vp1RIPT7YzJGeDAjSTO4z1c4juZ6z5mJsiovETmyJ/4WsdTjpNfIl5Ng 6tmgvXXwuq0HEJewziN3Wz1jfC3sSXqDurnxlGJ8UkpFLttF/zMEU2HFCe7DUm2dHZw6Pz KHXd/lkbIPR3InvR11kwSqpVW9pbt9g= X-MC-Unique: iPiwQ3tYN5617-Akyoxzgg-1 X-Mimecast-MFC-AGG-ID: iPiwQ3tYN5617-Akyoxzgg_1740600993 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: devel@lists.libvirt.org Subject: [PATCH v2 4/7] qemu: support 'raw' ACPI table type Date: Wed, 26 Feb 2025 20:16:16 +0000 Message-ID: <20250226201619.2730066-5-berrange@redhat.com> In-Reply-To: <20250226201619.2730066-1-berrange@redhat.com> References: <20250226201619.2730066-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: dhq8F7WYHnmQA8vfg_upYVpPilzm6xRDV_vmJTcSHJM_1740600993 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 2HY3IKXYTYHUWLHVS6BKXDR6E6NNT2JK X-Message-ID-Hash: 2HY3IKXYTYHUWLHVS6BKXDR6E6NNT2JK X-MailFrom: berrange@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Victor Toso X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1740601155808019100 Content-Type: text/plain; charset="utf-8" This allows passing a single ACPI table of any type through to QEMU with the signture autodetected from the header. Signed-off-by: Daniel P. Berrang=C3=A9 Reviewed-by: Michal Privoznik --- docs/formatdomain.rst | 2 +- src/qemu/qemu_command.c | 6 ++- src/qemu/qemu_validate.c | 2 +- .../acpi-table-many.x86_64-latest.args | 36 ++++++++++++++++ .../acpi-table-many.x86_64-latest.xml | 41 +++++++++++++++++++ tests/qemuxmlconfdata/acpi-table-many.xml | 33 +++++++++++++++ tests/qemuxmlconftest.c | 1 + 7 files changed, 117 insertions(+), 4 deletions(-) create mode 100644 tests/qemuxmlconfdata/acpi-table-many.x86_64-latest.args create mode 100644 tests/qemuxmlconfdata/acpi-table-many.x86_64-latest.xml create mode 100644 tests/qemuxmlconfdata/acpi-table-many.xml diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index d3add663e2..895f74a42a 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -495,7 +495,7 @@ These options apply to any form of booting of the guest= OS. file: =20 * ``raw``: a single ACPI table with header and data, with ACPI - signature auto-detected from header (:since:`Since 11.2.0`). + signature auto-detected from header (:since:`Since 11.2.0` (QEMU)). * ``rawset``: concatenation of multiple ACPI tables with header and data, each with any ACPI signature, auto-detected from header (:since:`Since 11.2.0`). diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index bef06049ec..5ecc50d838 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6038,9 +6038,11 @@ qemuBuildBootCommandLine(virCommand *cmd, virCommandAddArgList(cmd, "-dtb", def->os.dtb, NULL); for (i =3D 0; i < def->os.nacpiTables; i++) { g_auto(virBuffer) buf =3D VIR_BUFFER_INITIALIZER; + const char *sig =3D qemuACPITableSIGTypeToString(def->os.acpiTable= s[i]->type); virCommandAddArg(cmd, "-acpitable"); - virBufferAsprintf(&buf, "sig=3D%s,file=3D", - qemuACPITableSIGTypeToString(def->os.acpiTables[= i]->type)); + if (*sig !=3D '\0') + virBufferAsprintf(&buf, "sig=3D%s,", sig); + virBufferAddLit(&buf, "file=3D"); virQEMUBuildBufferEscapeComma(&buf, def->os.acpiTables[i]->path); virCommandAddArgBuffer(cmd, &buf); } diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index de36bfc7ea..397e2073ef 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -744,10 +744,10 @@ qemuValidateDomainDefBoot(const virDomainDef *def, =20 for (i =3D 0; i < def->os.nacpiTables; i++) { switch (def->os.acpiTables[i]->type) { + case VIR_DOMAIN_OS_ACPI_TABLE_TYPE_RAW: case VIR_DOMAIN_OS_ACPI_TABLE_TYPE_SLIC: break; =20 - case VIR_DOMAIN_OS_ACPI_TABLE_TYPE_RAW: case VIR_DOMAIN_OS_ACPI_TABLE_TYPE_RAWSET: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("ACPI table type '%1$s' is not supported"), diff --git a/tests/qemuxmlconfdata/acpi-table-many.x86_64-latest.args b/tes= ts/qemuxmlconfdata/acpi-table-many.x86_64-latest.args new file mode 100644 index 0000000000..4d5d02cb3c --- /dev/null +++ b/tests/qemuxmlconfdata/acpi-table-many.x86_64-latest.args @@ -0,0 +1,36 @@ +LC_ALL=3DC \ +PATH=3D/bin \ +HOME=3D/var/lib/libvirt/qemu/domain--1-QEMUGuest1 \ +USER=3Dtest \ +LOGNAME=3Dtest \ +XDG_DATA_HOME=3D/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=3D/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=3D/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-x86_64 \ +-name guest=3DQEMUGuest1,debug-threads=3Don \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/va= r/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=3Doff,dump-guest-core=3Doff,memory-backend=3Dpc.ram,acpi= =3Don \ +-accel tcg \ +-cpu qemu64 \ +-m size=3D219136k \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}'= \ +-overcommit mem-lock=3Doff \ +-smp 1,sockets=3D1,cores=3D1,threads=3D1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=3Dcharmonitor,fd=3D1729,server=3Don,wait=3Doff \ +-mon chardev=3Dcharmonitor,id=3Dmonitor,mode=3Dcontrol \ +-rtc base=3Dutc \ +-no-shutdown \ +-boot strict=3Don \ +-acpitable file=3D/var/lib/libvirt/acpi/exm1.dat \ +-acpitable file=3D/var/lib/libvirt/acpi/exm2.dat \ +-acpitable file=3D/var/lib/libvirt/acpi/exm3.dat \ +-acpitable sig=3DSLIC,file=3D/var/lib/libvirt/acpi/slic.dat \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0= x2"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-sandbox on,obsolete=3Ddeny,elevateprivileges=3Ddeny,spawn=3Ddeny,resource= control=3Ddeny \ +-msg timestamp=3Don diff --git a/tests/qemuxmlconfdata/acpi-table-many.x86_64-latest.xml b/test= s/qemuxmlconfdata/acpi-table-many.x86_64-latest.xml new file mode 100644 index 0000000000..b7f7e18d28 --- /dev/null +++ b/tests/qemuxmlconfdata/acpi-table-many.x86_64-latest.xml @@ -0,0 +1,41 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + hvm + + /var/lib/libvirt/acpi/exm1.dat
+ /var/lib/libvirt/acpi/exm2.dat
+ /var/lib/libvirt/acpi/exm3.dat
+ /var/lib/libvirt/acpi/slic.dat
+
+ +
+ + + + + qemu64 + + + destroy + restart + destroy + + /usr/bin/qemu-system-x86_64 + +
+ + +
+ + + + +