Blame packages/q/qemu/hw-smbios-add-core_count2-to-smbios-tabl.patch

Bernhard M. Wiedemann 399b1f
From: Julia Suvorova <jusual@redhat.com>
Bernhard M. Wiedemann 399b1f
Date: Tue, 11 Oct 2022 13:17:27 +0200
Bernhard M. Wiedemann 399b1f
Subject: hw/smbios: add core_count2 to smbios table type 4
Bernhard M. Wiedemann 399b1f
Bernhard M. Wiedemann 399b1f
In order to use the increased number of cpus, we need to bring smbios
Bernhard M. Wiedemann 399b1f
tables in line with the SMBIOS 3.0 specification. This allows us to
Bernhard M. Wiedemann 399b1f
introduce core_count2 which acts as a duplicate of core_count if we have
Bernhard M. Wiedemann 399b1f
fewer cores than 256, and contains the actual core number per socket if
Bernhard M. Wiedemann 399b1f
we have more.
Bernhard M. Wiedemann 399b1f
Bernhard M. Wiedemann 399b1f
core_enabled2 and thread_count2 fields work the same way.
Bernhard M. Wiedemann 399b1f
Bernhard M. Wiedemann 399b1f
Signed-off-by: Julia Suvorova <jusual@redhat.com>
Bernhard M. Wiedemann 399b1f
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Bernhard M. Wiedemann 399b1f
Message-Id: <20220731162141.178443-2-jusual@redhat.com>
Bernhard M. Wiedemann 399b1f
Message-Id: <20221011111731.101412-2-jusual@redhat.com>
Bernhard M. Wiedemann 399b1f
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Bernhard M. Wiedemann 399b1f
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Bernhard M. Wiedemann 399b1f
(cherry picked from commit 05e27d74c7dc5318367521f020bf0d4a32228dcc)
Bernhard M. Wiedemann 399b1f
References: bsc#1202282, jsc#PED-2592
Bernhard M. Wiedemann 399b1f
Signed-off-by: Dario Faggioli <dfaggioli@suse.com>
Bernhard M. Wiedemann 399b1f
---
Bernhard M. Wiedemann 399b1f
 hw/smbios/smbios.c           | 19 ++++++++++++++++---
Bernhard M. Wiedemann 399b1f
 hw/smbios/smbios_build.h     |  9 +++++++--
Bernhard M. Wiedemann 399b1f
 include/hw/firmware/smbios.h | 12 ++++++++++++
Bernhard M. Wiedemann 399b1f
 3 files changed, 35 insertions(+), 5 deletions(-)
Bernhard M. Wiedemann 399b1f
Bernhard M. Wiedemann 399b1f
diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
Bernhard M. Wiedemann 399b1f
index 417d65471704ee6babaebb2ba02e..e55bca8e42c834508df820c05eb9 100644
Bernhard M. Wiedemann 399b1f
--- a/hw/smbios/smbios.c
Bernhard M. Wiedemann 399b1f
+++ b/hw/smbios/smbios.c
Bernhard M. Wiedemann 399b1f
@@ -711,8 +711,14 @@ static void smbios_build_type_3_table(void)
Bernhard M. Wiedemann 399b1f
 static void smbios_build_type_4_table(MachineState *ms, unsigned instance)
Bernhard M. Wiedemann 399b1f
 {
Bernhard M. Wiedemann 399b1f
     char sock_str[128];
Bernhard M. Wiedemann 399b1f
+    size_t tbl_len = SMBIOS_TYPE_4_LEN_V28;
Bernhard M. Wiedemann 399b1f
 
Bernhard M. Wiedemann 399b1f
-    SMBIOS_BUILD_TABLE_PRE(4, T4_BASE + instance, true); /* required */
Bernhard M. Wiedemann 399b1f
+    if (smbios_ep_type == SMBIOS_ENTRY_POINT_TYPE_64) {
Bernhard M. Wiedemann 399b1f
+        tbl_len = SMBIOS_TYPE_4_LEN_V30;
Bernhard M. Wiedemann 399b1f
+    }
Bernhard M. Wiedemann 399b1f
+
Bernhard M. Wiedemann 399b1f
+    SMBIOS_BUILD_TABLE_PRE_SIZE(4, T4_BASE + instance,
Bernhard M. Wiedemann 399b1f
+                                true, tbl_len); /* required */
Bernhard M. Wiedemann 399b1f
 
Bernhard M. Wiedemann 399b1f
     snprintf(sock_str, sizeof(sock_str), "%s%2x", type4.sock_pfx, instance);
Bernhard M. Wiedemann 399b1f
     SMBIOS_TABLE_SET_STR(4, socket_designation_str, sock_str);
Bernhard M. Wiedemann 399b1f
@@ -739,8 +745,15 @@ static void smbios_build_type_4_table(MachineState *ms, unsigned instance)
Bernhard M. Wiedemann 399b1f
     SMBIOS_TABLE_SET_STR(4, serial_number_str, type4.serial);
Bernhard M. Wiedemann 399b1f
     SMBIOS_TABLE_SET_STR(4, asset_tag_number_str, type4.asset);
Bernhard M. Wiedemann 399b1f
     SMBIOS_TABLE_SET_STR(4, part_number_str, type4.part);
Bernhard M. Wiedemann 399b1f
-    t->core_count = t->core_enabled = ms->smp.cores;
Bernhard M. Wiedemann 399b1f
-    t->thread_count = ms->smp.threads;
Bernhard M. Wiedemann 399b1f
+
Bernhard M. Wiedemann 399b1f
+    t->core_count = (ms->smp.cores > 255) ? 0xFF : ms->smp.cores;
Bernhard M. Wiedemann 399b1f
+    t->core_enabled = t->core_count;
Bernhard M. Wiedemann 399b1f
+
Bernhard M. Wiedemann 399b1f
+    t->core_count2 = t->core_enabled2 = cpu_to_le16(ms->smp.cores);
Bernhard M. Wiedemann 399b1f
+
Bernhard M. Wiedemann 399b1f
+    t->thread_count = (ms->smp.threads > 255) ? 0xFF : ms->smp.threads;
Bernhard M. Wiedemann 399b1f
+    t->thread_count2 = cpu_to_le16(ms->smp.threads);
Bernhard M. Wiedemann 399b1f
+
Bernhard M. Wiedemann 399b1f
     t->processor_characteristics = cpu_to_le16(0x02); /* Unknown */
Bernhard M. Wiedemann 399b1f
     t->processor_family2 = cpu_to_le16(0x01); /* Other */
Bernhard M. Wiedemann 399b1f
 
Bernhard M. Wiedemann 399b1f
diff --git a/hw/smbios/smbios_build.h b/hw/smbios/smbios_build.h
Bernhard M. Wiedemann 399b1f
index 56b5a1e3f301b24a134141859076..351660024e6ecb599b88f4975042 100644
Bernhard M. Wiedemann 399b1f
--- a/hw/smbios/smbios_build.h
Bernhard M. Wiedemann 399b1f
+++ b/hw/smbios/smbios_build.h
Bernhard M. Wiedemann 399b1f
@@ -27,6 +27,11 @@ extern unsigned smbios_table_max;
Bernhard M. Wiedemann 399b1f
 extern unsigned smbios_table_cnt;
Bernhard M. Wiedemann 399b1f
 
Bernhard M. Wiedemann 399b1f
 #define SMBIOS_BUILD_TABLE_PRE(tbl_type, tbl_handle, tbl_required)        \
Bernhard M. Wiedemann 399b1f
+        SMBIOS_BUILD_TABLE_PRE_SIZE(tbl_type, tbl_handle, tbl_required,   \
Bernhard M. Wiedemann 399b1f
+                                    sizeof(struct smbios_type_##tbl_type))\
Bernhard M. Wiedemann 399b1f
+
Bernhard M. Wiedemann 399b1f
+#define SMBIOS_BUILD_TABLE_PRE_SIZE(tbl_type, tbl_handle,                 \
Bernhard M. Wiedemann 399b1f
+                                    tbl_required, tbl_len)                \
Bernhard M. Wiedemann 399b1f
     struct smbios_type_##tbl_type *t;                                     \
Bernhard M. Wiedemann 399b1f
     size_t t_off; /* table offset into smbios_tables */                   \
Bernhard M. Wiedemann 399b1f
     int str_index = 0;                                                    \
Bernhard M. Wiedemann 399b1f
@@ -39,12 +44,12 @@ extern unsigned smbios_table_cnt;
Bernhard M. Wiedemann 399b1f
         /* use offset of table t within smbios_tables */                  \
Bernhard M. Wiedemann 399b1f
         /* (pointer must be updated after each realloc) */                \
Bernhard M. Wiedemann 399b1f
         t_off = smbios_tables_len;                                        \
Bernhard M. Wiedemann 399b1f
-        smbios_tables_len += sizeof(*t);                                  \
Bernhard M. Wiedemann 399b1f
+        smbios_tables_len += tbl_len;                                     \
Bernhard M. Wiedemann 399b1f
         smbios_tables = g_realloc(smbios_tables, smbios_tables_len);      \
Bernhard M. Wiedemann 399b1f
         t = (struct smbios_type_##tbl_type *)(smbios_tables + t_off);     \
Bernhard M. Wiedemann 399b1f
                                                                           \
Bernhard M. Wiedemann 399b1f
         t->header.type = tbl_type;                                        \
Bernhard M. Wiedemann 399b1f
-        t->header.length = sizeof(*t);                                    \
Bernhard M. Wiedemann 399b1f
+        t->header.length = tbl_len;                                       \
Bernhard M. Wiedemann 399b1f
         t->header.handle = cpu_to_le16(tbl_handle);                       \
Bernhard M. Wiedemann 399b1f
     } while (0)
Bernhard M. Wiedemann 399b1f
 
Bernhard M. Wiedemann 399b1f
diff --git a/include/hw/firmware/smbios.h b/include/hw/firmware/smbios.h
Bernhard M. Wiedemann 399b1f
index e7d386f7c837b16f341aba22bcf8..7f3259a6300af0d7b8a359b879f5 100644
Bernhard M. Wiedemann 399b1f
--- a/include/hw/firmware/smbios.h
Bernhard M. Wiedemann 399b1f
+++ b/include/hw/firmware/smbios.h
Bernhard M. Wiedemann 399b1f
@@ -18,6 +18,8 @@
Bernhard M. Wiedemann 399b1f
 
Bernhard M. Wiedemann 399b1f
 
Bernhard M. Wiedemann 399b1f
 #define SMBIOS_MAX_TYPE 127
Bernhard M. Wiedemann 399b1f
+#define offsetofend(TYPE, MEMBER) \
Bernhard M. Wiedemann 399b1f
+       (offsetof(TYPE, MEMBER) + sizeof_field(TYPE, MEMBER))
Bernhard M. Wiedemann 399b1f
 
Bernhard M. Wiedemann 399b1f
 /* memory area description, used by type 19 table */
Bernhard M. Wiedemann 399b1f
 struct smbios_phys_mem_area {
Bernhard M. Wiedemann 399b1f
@@ -187,8 +189,18 @@ struct smbios_type_4 {
Bernhard M. Wiedemann 399b1f
     uint8_t thread_count;
Bernhard M. Wiedemann 399b1f
     uint16_t processor_characteristics;
Bernhard M. Wiedemann 399b1f
     uint16_t processor_family2;
Bernhard M. Wiedemann 399b1f
+    /* SMBIOS spec 3.0.0, Table 21 */
Bernhard M. Wiedemann 399b1f
+    uint16_t core_count2;
Bernhard M. Wiedemann 399b1f
+    uint16_t core_enabled2;
Bernhard M. Wiedemann 399b1f
+    uint16_t thread_count2;
Bernhard M. Wiedemann 399b1f
 } QEMU_PACKED;
Bernhard M. Wiedemann 399b1f
 
Bernhard M. Wiedemann 399b1f
+typedef enum smbios_type_4_len_ver {
Bernhard M. Wiedemann 399b1f
+    SMBIOS_TYPE_4_LEN_V28 = offsetofend(struct smbios_type_4,
Bernhard M. Wiedemann 399b1f
+                                        processor_family2),
Bernhard M. Wiedemann 399b1f
+    SMBIOS_TYPE_4_LEN_V30 = offsetofend(struct smbios_type_4, thread_count2),
Bernhard M. Wiedemann 399b1f
+} smbios_type_4_len_ver;
Bernhard M. Wiedemann 399b1f
+
Bernhard M. Wiedemann 399b1f
 /* SMBIOS type 8 - Port Connector Information */
Bernhard M. Wiedemann 399b1f
 struct smbios_type_8 {
Bernhard M. Wiedemann 399b1f
     struct smbios_structure_header header;