qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 1/5] hw/smbios: add core_count2 to smbios table type 4


From: Igor Mammedov
Subject: Re: [PATCH v2 1/5] hw/smbios: add core_count2 to smbios table type 4
Date: Wed, 24 Aug 2022 18:00:25 +0200

On Sun, 31 Jul 2022 18:21:37 +0200
Julia Suvorova <jusual@redhat.com> wrote:

> In order to use the increased number of cpus, we need to bring smbios
> tables in line with the SMBIOS 3.0 specification. This allows us to
> introduce core_count2 which acts as a duplicate of core_count if we have
> fewer cores than 256, and contains the actual core number per socket if
> we have more.
> 
> core_enabled2 and thread_count2 fields work the same way.
> 
> Signed-off-by: Julia Suvorova <jusual@redhat.com>

I'd fix up checkpatch warnings but otherwise looks good to me

Reviewed-by: Igor Mammedov <imammedo@redhat.com>

> ---
>  hw/smbios/smbios_build.h     |  9 +++++++--
>  include/hw/firmware/smbios.h | 11 +++++++++++
>  hw/smbios/smbios.c           | 18 +++++++++++++++---
>  3 files changed, 33 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/smbios/smbios_build.h b/hw/smbios/smbios_build.h
> index 56b5a1e3f3..351660024e 100644
> --- a/hw/smbios/smbios_build.h
> +++ b/hw/smbios/smbios_build.h
> @@ -27,6 +27,11 @@ extern unsigned smbios_table_max;
>  extern unsigned smbios_table_cnt;
>  
>  #define SMBIOS_BUILD_TABLE_PRE(tbl_type, tbl_handle, tbl_required)        \
> +        SMBIOS_BUILD_TABLE_PRE_SIZE(tbl_type, tbl_handle, tbl_required,   \
> +                                    sizeof(struct smbios_type_##tbl_type))\
> +
> +#define SMBIOS_BUILD_TABLE_PRE_SIZE(tbl_type, tbl_handle,                 \
> +                                    tbl_required, tbl_len)                \
>      struct smbios_type_##tbl_type *t;                                     \
>      size_t t_off; /* table offset into smbios_tables */                   \
>      int str_index = 0;                                                    \
> @@ -39,12 +44,12 @@ extern unsigned smbios_table_cnt;
>          /* use offset of table t within smbios_tables */                  \
>          /* (pointer must be updated after each realloc) */                \
>          t_off = smbios_tables_len;                                        \
> -        smbios_tables_len += sizeof(*t);                                  \
> +        smbios_tables_len += tbl_len;                                     \
>          smbios_tables = g_realloc(smbios_tables, smbios_tables_len);      \
>          t = (struct smbios_type_##tbl_type *)(smbios_tables + t_off);     \
>                                                                            \
>          t->header.type = tbl_type;                                        \
> -        t->header.length = sizeof(*t);                                    \
> +        t->header.length = tbl_len;                                       \
>          t->header.handle = cpu_to_le16(tbl_handle);                       \
>      } while (0)
>  
> diff --git a/include/hw/firmware/smbios.h b/include/hw/firmware/smbios.h
> index 4b7ad77a44..56f7bf0fea 100644
> --- a/include/hw/firmware/smbios.h
> +++ b/include/hw/firmware/smbios.h
> @@ -18,6 +18,8 @@
>  
>  
>  #define SMBIOS_MAX_TYPE 127
> +#define offsetofend(TYPE, MEMBER) \
> +       (offsetof(TYPE, MEMBER) + sizeof_field(TYPE, MEMBER))
>  
>  /* memory area description, used by type 19 table */
>  struct smbios_phys_mem_area {
> @@ -187,8 +189,17 @@ struct smbios_type_4 {
>      uint8_t thread_count;
>      uint16_t processor_characteristics;
>      uint16_t processor_family2;
> +    /* SMBIOS spec 3.0.0, Table 21 */
> +    uint16_t core_count2;
> +    uint16_t core_enabled2;
> +    uint16_t thread_count2;
>  } QEMU_PACKED;
>  
> +typedef enum smbios_type_4_len_ver {
> +    SMBIOS_TYPE_4_LEN_V28 = offsetofend(struct smbios_type_4, 
> processor_family2),
> +    SMBIOS_TYPE_4_LEN_V30 = offsetofend(struct smbios_type_4, thread_count2),
> +} smbios_type_4_len_ver;
> +
>  /* SMBIOS type 11 - OEM strings */
>  struct smbios_type_11 {
>      struct smbios_structure_header header;
> diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
> index 60349ee402..657093e5f6 100644
> --- a/hw/smbios/smbios.c
> +++ b/hw/smbios/smbios.c
> @@ -681,8 +681,13 @@ static void smbios_build_type_3_table(void)
>  static void smbios_build_type_4_table(MachineState *ms, unsigned instance)
>  {
>      char sock_str[128];
> +    size_t tbl_len = SMBIOS_TYPE_4_LEN_V28;
>  
> -    SMBIOS_BUILD_TABLE_PRE(4, T4_BASE + instance, true); /* required */
> +    if (smbios_ep_type == SMBIOS_ENTRY_POINT_TYPE_64) {
> +        tbl_len = SMBIOS_TYPE_4_LEN_V30;
> +    }
> +
> +    SMBIOS_BUILD_TABLE_PRE_SIZE(4, T4_BASE + instance, true, tbl_len); /* 
> required */
>  
>      snprintf(sock_str, sizeof(sock_str), "%s%2x", type4.sock_pfx, instance);
>      SMBIOS_TABLE_SET_STR(4, socket_designation_str, sock_str);
> @@ -709,8 +714,15 @@ static void smbios_build_type_4_table(MachineState *ms, 
> unsigned instance)
>      SMBIOS_TABLE_SET_STR(4, serial_number_str, type4.serial);
>      SMBIOS_TABLE_SET_STR(4, asset_tag_number_str, type4.asset);
>      SMBIOS_TABLE_SET_STR(4, part_number_str, type4.part);
> -    t->core_count = t->core_enabled = ms->smp.cores;
> -    t->thread_count = ms->smp.threads;
> +
> +    t->core_count = (ms->smp.cores > 255) ? 0xFF : ms->smp.cores;
> +    t->core_enabled = t->core_count;
> +
> +    t->core_count2 = t->core_enabled2 = cpu_to_le16(ms->smp.cores);
> +
> +    t->thread_count = (ms->smp.threads > 255) ? 0xFF : ms->smp.threads;
> +    t->thread_count2 = cpu_to_le16(ms->smp.threads);
> +
>      t->processor_characteristics = cpu_to_le16(0x02); /* Unknown */
>      t->processor_family2 = cpu_to_le16(0x01); /* Other */
>  




reply via email to

[Prev in Thread] Current Thread [Next in Thread]