All of lore.kernel.org
 help / color / mirror / Atom feed
From: Xin Li <talons.lee@gmail.com>
To: xen-devel@lists.xen.org
Cc: Xin Li <xin.li@citrix.com>,
	Sergey Dyasli <sergey.dyasli@citrix.com>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	Jan Beulich <JBeulich@suse.com>,
	Igor Druzhinin <igor.druzhinin@citrix.com>
Subject: [PATCH v2 1/1] hvmloader: add SMBIOS type 2 info for customized string
Date: Thu, 28 Mar 2019 09:05:06 +0000	[thread overview]
Message-ID: <20190328090506.26035-1-xin.li@citrix.com> (raw)

Extend smbios type 2 struct to match specification, add support to
write it when customized string provided and no smbios passed in.

Signed-off-by: Xin Li <xin.li@citrix.com>

---
CC: Jan Beulich <JBeulich@suse.com>
CC: Igor Druzhinin <igor.druzhinin@citrix.com>
CC: Sergey Dyasli <sergey.dyasli@citrix.com>
CC: Andrew Cooper <andrew.cooper3@citrix.com>

v2
1: write the struct if any of the strings is provided
2: add contained_handles as flexible array member
3: update commit message and fix style issue
---
 tools/firmware/hvmloader/smbios.c       | 69 ++++++++++++++++++++++++-
 tools/firmware/hvmloader/smbios_types.h |  7 +++
 xen/include/public/hvm/hvm_xs_strings.h |  6 +++
 3 files changed, 80 insertions(+), 2 deletions(-)

diff --git a/tools/firmware/hvmloader/smbios.c b/tools/firmware/hvmloader/smbios.c
index 40d8399be1..226c38efb2 100644
--- a/tools/firmware/hvmloader/smbios.c
+++ b/tools/firmware/hvmloader/smbios.c
@@ -497,9 +497,11 @@ static void *
 smbios_type_2_init(void *start)
 {
     struct smbios_type_2 *p = (struct smbios_type_2 *)start;
+    const char *s;
     uint8_t *ptr;
     void *pts;
     uint32_t length;
+    uint32_t counter = 0;
 
     pts = get_smbios_pt_struct(2, &length);
     if ( (pts != NULL)&&(length > 0) )
@@ -518,8 +520,71 @@ smbios_type_2_init(void *start)
         return (start + length);
     }
 
-    /* Only present when passed in */
-    return start;
+    memset(p, 0, sizeof(*p));
+    p->header.type = 2;
+    p->header.length = sizeof(struct smbios_type_2);
+    p->header.handle = SMBIOS_HANDLE_TYPE2;
+    p->feature_flags = 0x09; /* Board is a hosting board and replaceable */
+    p->chassis_handle = SMBIOS_HANDLE_TYPE3;
+    p->board_type = 0x0a; /* Motherboard */
+    start += sizeof(struct smbios_type_2);
+
+    s = xenstore_read(HVM_XS_BASEBOARD_MANUFACTURER, NULL);
+    if ( (s != NULL) && (*s != '\0') )
+    {
+        strcpy(start, s);
+        start += strlen(s) + 1;
+        p->manufacturer_str = ++counter;
+    }
+
+    s = xenstore_read(HVM_XS_BASEBOARD_PRODUCT_NAME, NULL);
+    if ( (s != NULL) && (*s != '\0') )
+    {
+        strcpy(start, s);
+        start += strlen(s) + 1;
+        p->product_name_str = ++counter;
+    }
+
+    s = xenstore_read(HVM_XS_BASEBOARD_VERSION, NULL);
+    if ( (s != NULL) && (*s != '\0') )
+    {
+        strcpy(start, s);
+        start += strlen(s) + 1;
+        p->version_str = ++counter;
+    }
+
+    s = xenstore_read(HVM_XS_BASEBOARD_SERIAL_NUMBER, NULL);
+    if ( (s != NULL) && (*s != '\0') )
+    {
+        strcpy(start, s);
+        start += strlen(s) + 1;
+        p->serial_number_str = ++counter;
+    }
+
+    s = xenstore_read(HVM_XS_BASEBOARD_ASSET_TAG, NULL);
+    if ( (s != NULL) && (*s != '\0') )
+    {
+        strcpy(start, s);
+        start += strlen(s) + 1;
+        p->asset_tag_str = ++counter;
+    }
+
+    s = xenstore_read(HVM_XS_BASEBOARD_LOCATION_IN_CHASSIS, NULL);
+    if ( (s != NULL) && (*s != '\0') )
+    {
+        strcpy(start, s);
+        start += strlen(s) + 1;
+        p->location_in_chassis_str = ++counter;
+    }
+
+    if ( counter )
+    {
+        *((uint8_t *)start) = 0;
+        return (start + 1);
+    }
+    else
+        /* Only present when passed in or with customized string */
+        return (start - sizeof(struct smbios_type_2));
 }
 
 /* Type 3 -- System Enclosure */
diff --git a/tools/firmware/hvmloader/smbios_types.h b/tools/firmware/hvmloader/smbios_types.h
index acb63e2fe9..7c648ece71 100644
--- a/tools/firmware/hvmloader/smbios_types.h
+++ b/tools/firmware/hvmloader/smbios_types.h
@@ -90,6 +90,13 @@ struct smbios_type_2 {
     uint8_t product_name_str;
     uint8_t version_str;
     uint8_t serial_number_str;
+    uint8_t asset_tag_str;
+    uint8_t feature_flags;
+    uint8_t location_in_chassis_str;
+    uint16_t chassis_handle;
+    uint8_t board_type;
+    uint8_t contained_handle_count;
+    uint16_t contained_handles[];
 } __attribute__ ((packed));
 
 /* System Enclosure - Contained Elements */
diff --git a/xen/include/public/hvm/hvm_xs_strings.h b/xen/include/public/hvm/hvm_xs_strings.h
index fea1dd4407..fba2546424 100644
--- a/xen/include/public/hvm/hvm_xs_strings.h
+++ b/xen/include/public/hvm/hvm_xs_strings.h
@@ -69,6 +69,12 @@
 #define HVM_XS_SYSTEM_PRODUCT_NAME     "bios-strings/system-product-name"
 #define HVM_XS_SYSTEM_VERSION          "bios-strings/system-version"
 #define HVM_XS_SYSTEM_SERIAL_NUMBER    "bios-strings/system-serial-number"
+#define HVM_XS_BASEBOARD_MANUFACTURER  "bios-strings/baseboard-manufacturer"
+#define HVM_XS_BASEBOARD_PRODUCT_NAME  "bios-strings/baseboard-product-name"
+#define HVM_XS_BASEBOARD_VERSION       "bios-strings/baseboard-version"
+#define HVM_XS_BASEBOARD_SERIAL_NUMBER "bios-strings/baseboard-serial-number"
+#define HVM_XS_BASEBOARD_ASSET_TAG     "bios-strings/baseboard-asset-tag"
+#define HVM_XS_BASEBOARD_LOCATION_IN_CHASSIS "bios-strings/baseboard-location-in-chassis"
 #define HVM_XS_ENCLOSURE_MANUFACTURER  "bios-strings/enclosure-manufacturer"
 #define HVM_XS_ENCLOSURE_SERIAL_NUMBER "bios-strings/enclosure-serial-number"
 #define HVM_XS_ENCLOSURE_ASSET_TAG     "bios-strings/enclosure-asset-tag"
-- 
2.20.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

             reply	other threads:[~2019-03-28  9:05 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-28  9:05 Xin Li [this message]
2019-03-28 10:48 ` [PATCH v2 1/1] hvmloader: add SMBIOS type 2 info for customized string Jan Beulich
2019-03-28 13:56 Xin Li
2019-03-28 14:26 ` Jan Beulich
2019-03-29  3:28 Xin Li
2019-03-29 11:08 ` Jan Beulich
2019-04-01  1:24   ` Xin Li (Talons)

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190328090506.26035-1-xin.li@citrix.com \
    --to=talons.lee@gmail.com \
    --cc=JBeulich@suse.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=igor.druzhinin@citrix.com \
    --cc=sergey.dyasli@citrix.com \
    --cc=xen-devel@lists.xen.org \
    --cc=xin.li@citrix.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.