From nobody Wed Mar 12 17:47:04 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 --- 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