From nobody Mon Apr 29 08:44:55 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 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 15181062984731020.1733697583327; Thu, 8 Feb 2018 08:11:38 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A01A48AE44; Thu, 8 Feb 2018 16:11:36 +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 B952160CA2; Thu, 8 Feb 2018 16:11:35 +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 55D7B41F4D; Thu, 8 Feb 2018 16:11:33 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w1878da3025042 for ; Thu, 8 Feb 2018 02:08:39 -0500 Received: by smtp.corp.redhat.com (Postfix) id AD4C05F90D; Thu, 8 Feb 2018 07:08:39 +0000 (UTC) Received: from mx1.redhat.com (ext-mx08.extmail.prod.ext.phx2.redhat.com [10.5.110.32]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 698C25D9CA; Thu, 8 Feb 2018 07:08:37 +0000 (UTC) Received: from huawei.com (szxga04-in.huawei.com [45.249.212.190]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B8F05C057F85; Thu, 8 Feb 2018 07:08:34 +0000 (UTC) Received: from DGGEMS403-HUB.china.huawei.com (unknown [172.30.72.58]) by Forcepoint Email with ESMTP id 83CE6C5FD7FC9; Thu, 8 Feb 2018 15:08:21 +0800 (CST) Received: from localhost (10.177.21.2) by DGGEMS403-HUB.china.huawei.com (10.3.19.203) with Microsoft SMTP Server id 14.3.361.1; Thu, 8 Feb 2018 15:08:16 +0800 From: Zhuangyanying To: , , Date: Thu, 8 Feb 2018 15:05:05 +0800 Message-ID: <1518073505-16828-1-git-send-email-ann.zhuangyanying@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.177.21.2] X-CFilter-Loop: Reflected X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 207 matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 08 Feb 2018 07:08:36 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 08 Feb 2018 07:08:36 +0000 (UTC) for IP:'45.249.212.190' DOMAIN:'szxga04-in.huawei.com' HELO:'huawei.com' FROM:'ann.zhuangyanying@huawei.com' RCPT:'' X-RedHat-Spam-Score: -0.022 (RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS, T_RP_MATCHES_RCVD) 45.249.212.190 szxga04-in.huawei.com 45.249.212.190 szxga04-in.huawei.com X-Scanned-By: MIMEDefang 2.78 on 10.5.110.32 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com X-Mailman-Approved-At: Thu, 08 Feb 2018 11:11:31 -0500 Cc: arei.gonglei@huawei.com, jiangyifei@huawei.com Subject: [libvirt] [RFC] virSysinfo: Introduce SMBIOS type 3 support 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.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Thu, 08 Feb 2018 16:11:37 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: Zhuang Yanying Some applications inside VM need to access SMBIOS Chassis Asset Tag, which should be emulated. It has already been realized in qemu, SMBIOS: Build aggregate smbios tables and entry point https://git.qemu.org/?p=3Dqemu.git;a=3Dcommit;h=3Dc97294ec1b9e36887e119589d= 456557d72ab37b5 but not in libvirt. we realize it here. As an example, you could use something like LENOVO 0B98401 Pro W1KS427111E 344dfTYH# --- src/conf/domain_conf.c | 52 +++++++++++++++++++++++++++++++++++++++++++++= ++++ src/qemu/qemu_command.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++ src/util/virsysinfo.c | 37 +++++++++++++++++++++++++++++++++++ src/util/virsysinfo.h | 13 +++++++++++++ 4 files changed, 151 insertions(+) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 34aae82..b0d5d68 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -14506,6 +14506,47 @@ virSysinfoBaseBoardParseXML(xmlXPathContextPtr ctx= t, return ret; } =20 +static int +virSysinfoChassisParseXML(xmlNodePtr node, + xmlXPathContextPtr ctxt, + virSysinfoChassisDefPtr *chassisdef) +{ + int ret =3D -1; + virSysinfoChassisDefPtr def; + + if (!xmlStrEqual(node->name, BAD_CAST "chassis")) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("XML does not contain expected 'chassis' element"= )); + return ret; + } + + if (VIR_ALLOC(def) < 0) + goto cleanup; + + def->manufacturer =3D + virXPathString("string(entry[@name=3D'manufacturer'])", ctxt); + def->version =3D + virXPathString("string(entry[@name=3D'version'])", ctxt); + def->serial =3D + virXPathString("string(entry[@name=3D'serial'])", ctxt); + def->asset =3D + virXPathString("string(entry[@name=3D'asset'])", ctxt); + def->sku =3D + virXPathString("string(entry[@name=3D'sku'])", ctxt); + + if (!def->manufacturer && !def->version && + !def->serial && !def->asset && !def->sku) { + virSysinfoChassisDefFree(def); + def =3D NULL; + } + + *chassisdef =3D def; + def =3D NULL; + ret =3D 0; + cleanup: + virSysinfoChassisDefFree(def); + return ret; +} =20 static int virSysinfoOEMStringsParseXML(xmlXPathContextPtr ctxt, @@ -14600,6 +14641,17 @@ virSysinfoParseXML(xmlNodePtr node, if (virSysinfoBaseBoardParseXML(ctxt, &def->baseBoard, &def->nbaseBoar= d) < 0) goto error; =20 + /* Extract chassis metadata */ + if ((tmpnode =3D virXPathNode("./chassis[1]", ctxt)) !=3D NULL) { + oldnode =3D ctxt->node; + ctxt->node =3D tmpnode; + if (virSysinfoChassisParseXML(tmpnode, ctxt, &def->chassis) < 0) { + ctxt->node =3D oldnode; + goto error; + } + ctxt->node =3D oldnode; + } + /* Extract system related metadata */ if ((tmpnode =3D virXPathNode("./oemStrings[1]", ctxt)) !=3D NULL) { oldnode =3D ctxt->node; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 24b434a..cf88e75 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5813,6 +5813,49 @@ qemuBuildSmbiosBaseBoardStr(virSysinfoBaseBoardDefPt= r def) return NULL; } =20 +static char * +qemuBuildSmbiosChassisStr(virSysinfoChassisDefPtr def) +{ + virBuffer buf =3D VIR_BUFFER_INITIALIZER; + + if (!def) + return NULL; + + virBufferAddLit(&buf, "type=3D3"); + + /* 2:Manufacturer */ + virBufferAddLit(&buf, ",manufacturer=3D"); + virQEMUBuildBufferEscapeComma(&buf, def->manufacturer); + /* 2:Version */ + if (def->version) { + virBufferAddLit(&buf, ",version=3D"); + virQEMUBuildBufferEscapeComma(&buf, def->version); + } + /* 2:Serial Number */ + if (def->serial) { + virBufferAddLit(&buf, ",serial=3D"); + virQEMUBuildBufferEscapeComma(&buf, def->serial); + } + /* 2:Asset Tag */ + if (def->asset) { + virBufferAddLit(&buf, ",asset=3D"); + virQEMUBuildBufferEscapeComma(&buf, def->asset); + } + /* 2:Sku */ + if (def->sku) { + virBufferAddLit(&buf, ",sku=3D"); + virQEMUBuildBufferEscapeComma(&buf, def->sku); + } + + if (virBufferCheckError(&buf) < 0) + goto error; + + return virBufferContentAndReset(&buf); + + error: + virBufferFreeAndReset(&buf); + return NULL; +} =20 static char * qemuBuildSmbiosOEMStringsStr(virSysinfoOEMStringsDefPtr def) @@ -5905,6 +5948,12 @@ qemuBuildSmbiosCommandLine(virCommandPtr cmd, VIR_FREE(smbioscmd); } =20 + smbioscmd =3D qemuBuildSmbiosChassisStr(source->chassis); + if (smbioscmd !=3D NULL) { + virCommandAddArgList(cmd, "-smbios", smbioscmd, NULL); + VIR_FREE(smbioscmd); + } + if (source->oemStrings) { if (!(smbioscmd =3D qemuBuildSmbiosOEMStringsStr(source->oemSt= rings))) return -1; diff --git a/src/util/virsysinfo.c b/src/util/virsysinfo.c index e8d3371..af434e0 100644 --- a/src/util/virsysinfo.c +++ b/src/util/virsysinfo.c @@ -108,6 +108,18 @@ void virSysinfoBaseBoardDefClear(virSysinfoBaseBoardDe= fPtr def) VIR_FREE(def->location); } =20 +void virSysinfoChassisDefFree(virSysinfoChassisDefPtr def) +{ + if (def =3D=3D NULL) + return; + + VIR_FREE(def->manufacturer); + VIR_FREE(def->version); + VIR_FREE(def->serial); + VIR_FREE(def->asset); + VIR_FREE(def->sku); +} + void virSysinfoOEMStringsDefFree(virSysinfoOEMStringsDefPtr def) { size_t i; @@ -143,6 +155,8 @@ void virSysinfoDefFree(virSysinfoDefPtr def) virSysinfoBaseBoardDefClear(def->baseBoard + i); VIR_FREE(def->baseBoard); =20 + virSysinfoChassisDefFree(def->chassis); + for (i =3D 0; i < def->nprocessor; i++) { VIR_FREE(def->processor[i].processor_socket_destination); VIR_FREE(def->processor[i].processor_type); @@ -1203,6 +1217,28 @@ virSysinfoBaseBoardFormat(virBufferPtr buf, } =20 static void +virSysinfoChassisFormat(virBufferPtr buf, virSysinfoChassisDefPtr def) +{ + if (!def) + return; + + virBufferAddLit(buf, "\n"); + virBufferAdjustIndent(buf, 2); + virBufferEscapeString(buf, "%s\n", + def->manufacturer); + virBufferEscapeString(buf, "%s\n", + def->version); + virBufferEscapeString(buf, "%s\n", + def->serial); + virBufferEscapeString(buf, "%s\n", + def->asset); + virBufferEscapeString(buf, "%s\n", + def->sku); + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n"); +} + +static void virSysinfoProcessorFormat(virBufferPtr buf, virSysinfoDefPtr def) { size_t i; @@ -1354,6 +1390,7 @@ virSysinfoFormat(virBufferPtr buf, virSysinfoDefPtr d= ef) virSysinfoBIOSFormat(&childrenBuf, def->bios); virSysinfoSystemFormat(&childrenBuf, def->system); virSysinfoBaseBoardFormat(&childrenBuf, def->baseBoard, def->nbaseBoar= d); + virSysinfoChassisFormat(&childrenBuf, def->chassis); virSysinfoProcessorFormat(&childrenBuf, def); virSysinfoMemoryFormat(&childrenBuf, def); virSysinfoOEMStringsFormat(&childrenBuf, def->oemStrings); diff --git a/src/util/virsysinfo.h b/src/util/virsysinfo.h index ecb3a36..00a15db 100644 --- a/src/util/virsysinfo.h +++ b/src/util/virsysinfo.h @@ -98,6 +98,16 @@ struct _virSysinfoBaseBoardDef { /* XXX board type */ }; =20 +typedef struct _virSysinfoChassisDef virSysinfoChassisDef; +typedef virSysinfoChassisDef *virSysinfoChassisDefPtr; +struct _virSysinfoChassisDef { + char *manufacturer; + char *version; + char *serial; + char *asset; + char *sku; +}; + typedef struct _virSysinfoOEMStringsDef virSysinfoOEMStringsDef; typedef virSysinfoOEMStringsDef *virSysinfoOEMStringsDefPtr; struct _virSysinfoOEMStringsDef { @@ -116,6 +126,8 @@ struct _virSysinfoDef { size_t nbaseBoard; virSysinfoBaseBoardDefPtr baseBoard; =20 + virSysinfoChassisDefPtr chassis; + size_t nprocessor; virSysinfoProcessorDefPtr processor; =20 @@ -130,6 +142,7 @@ virSysinfoDefPtr virSysinfoRead(void); void virSysinfoBIOSDefFree(virSysinfoBIOSDefPtr def); void virSysinfoSystemDefFree(virSysinfoSystemDefPtr def); void virSysinfoBaseBoardDefClear(virSysinfoBaseBoardDefPtr def); +void virSysinfoChassisDefFree(virSysinfoChassisDefPtr def); void virSysinfoOEMStringsDefFree(virSysinfoOEMStringsDefPtr def); void virSysinfoDefFree(virSysinfoDefPtr def); =20 --=20 1.8.3.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list