[PATCH v3 01/10] smbios: Refactor the smbios headfile

Heinrich Schuchardt xypron.glpk at gmx.de
Thu Dec 19 16:52:46 CET 2024


On 06.12.24 23:54, Raymond Mao wrote:
> Move the smbios field definitions to a separated simple headfile,
> which is a prerequisite to be included by dts files.
> Add new definitions for cache information.
> This patch also includes a few of code optimizations in smbios.
>
> Signed-off-by: Raymond Mao <raymond.mao at linaro.org>

Acked-by: Heinrich Schuchardt <xypron.glpk at gmx.de>

> ---
> Changes in v2
> - Initial patch.
> Changes in v3
> - Miscellaneous updates.
>
>   cmd/smbios.c         |   4 +-
>   include/smbios.h     |  81 +++---------------
>   include/smbios_def.h | 194 +++++++++++++++++++++++++++++++++++++++++++
>   lib/smbios.c         |  44 +++++-----
>   4 files changed, 231 insertions(+), 92 deletions(-)
>   create mode 100644 include/smbios_def.h
>
> diff --git a/cmd/smbios.c b/cmd/smbios.c
> index d3bd8b12a67..2122ac04e55 100644
> --- a/cmd/smbios.c
> +++ b/cmd/smbios.c
> @@ -99,12 +99,12 @@ static void smbios_print_type1(struct smbios_type1 *table)
>   	smbios_print_str("Product Name", table, table->product_name);
>   	smbios_print_str("Version", table, table->version);
>   	smbios_print_str("Serial Number", table, table->serial_number);
> -	if (table->length >= 0x19) {
> +	if (table->hdr.length >= SMBIOS_TYPE1_LENGTH_V21) {
>   		printf("\tUUID: %pUl\n", table->uuid);
>   		printf("\tWake-up Type: %s\n",
>   		       smbios_wakeup_type_str(table->wakeup_type));
>   	}
> -	if (table->length >= 0x1b) {
> +	if (table->hdr.length >= SMBIOS_TYPE1_LENGTH_V24) {
>   		smbios_print_str("SKU Number", table, table->sku_number);
>   		smbios_print_str("Family", table, table->family);
>   	}
> diff --git a/include/smbios.h b/include/smbios.h
> index 00119d7a60c..78fd14d881b 100644
> --- a/include/smbios.h
> +++ b/include/smbios.h
> @@ -9,6 +9,7 @@
>   #define _SMBIOS_H_
>
>   #include <linux/types.h>
> +#include <smbios_def.h>
>
>   /* SMBIOS spec version implemented */
>   #define SMBIOS_MAJOR_VER	3
> @@ -80,19 +81,14 @@ struct __packed smbios3_entry {
>   	u64 struct_table_address;
>   };
>
> -/* BIOS characteristics */
> -#define BIOS_CHARACTERISTICS_PCI_SUPPORTED	(1 << 7)
> -#define BIOS_CHARACTERISTICS_UPGRADEABLE	(1 << 11)
> -#define BIOS_CHARACTERISTICS_SELECTABLE_BOOT	(1 << 16)
> -
> -#define BIOS_CHARACTERISTICS_EXT1_ACPI		(1 << 0)
> -#define BIOS_CHARACTERISTICS_EXT2_UEFI		(1 << 3)
> -#define BIOS_CHARACTERISTICS_EXT2_TARGET	(1 << 2)
> -
> -struct __packed smbios_type0 {
> +struct __packed smbios_header {
>   	u8 type;
>   	u8 length;
>   	u16 handle;
> +};
> +
> +struct __packed smbios_type0 {
> +	struct smbios_header hdr;
>   	u8 vendor;
>   	u8 bios_ver;
>   	u16 bios_start_segment;
> @@ -109,37 +105,12 @@ struct __packed smbios_type0 {
>   	char eos[SMBIOS_STRUCT_EOS_BYTES];
>   };
>
> -/**
> - * enum smbios_wakeup_type - wake-up type
> - *
> - * These constants are used for the Wake-Up Type field in the SMBIOS
> - * System Information (Type 1) structure.
> - */
> -enum smbios_wakeup_type {
> -	/** @SMBIOS_WAKEUP_TYPE_RESERVED: Reserved */
> -	SMBIOS_WAKEUP_TYPE_RESERVED,
> -	/** @SMBIOS_WAKEUP_TYPE_OTHER: Other */
> -	SMBIOS_WAKEUP_TYPE_OTHER,
> -	/** @SMBIOS_WAKEUP_TYPE_UNKNOWN: Unknown */
> -	SMBIOS_WAKEUP_TYPE_UNKNOWN,
> -	/** @SMBIOS_WAKEUP_TYPE_APM_TIMER: APM Timer */
> -	SMBIOS_WAKEUP_TYPE_APM_TIMER,
> -	/** @SMBIOS_WAKEUP_TYPE_MODEM_RING: Modem Ring */
> -	SMBIOS_WAKEUP_TYPE_MODEM_RING,
> -	/** @SMBIOS_WAKEUP_TYPE_LAN_REMOTE: LAN Remote */
> -	SMBIOS_WAKEUP_TYPE_LAN_REMOTE,
> -	/** @SMBIOS_WAKEUP_TYPE_POWER_SWITCH: Power Switch */
> -	SMBIOS_WAKEUP_TYPE_POWER_SWITCH,
> -	/** @SMBIOS_WAKEUP_TYPE_PCI_PME: PCI PME# */
> -	SMBIOS_WAKEUP_TYPE_PCI_PME,
> -	/** @SMBIOS_WAKEUP_TYPE_AC_POWER_RESTORED: AC Power Restored */
> -	SMBIOS_WAKEUP_TYPE_AC_POWER_RESTORED,
> -};
> +#define SMBIOS_TYPE1_LENGTH_V20		0x08
> +#define SMBIOS_TYPE1_LENGTH_V21		0x19
> +#define SMBIOS_TYPE1_LENGTH_V24		0x1b
>
>   struct __packed smbios_type1 {
> -	u8 type;
> -	u8 length;
> -	u16 handle;
> +	struct smbios_header hdr;
>   	u8 manufacturer;
>   	u8 product_name;
>   	u8 version;
> @@ -151,13 +122,8 @@ struct __packed smbios_type1 {
>   	char eos[SMBIOS_STRUCT_EOS_BYTES];
>   };
>
> -#define SMBIOS_BOARD_FEATURE_HOSTING	(1 << 0)
> -#define SMBIOS_BOARD_MOTHERBOARD	10
> -
>   struct __packed smbios_type2 {
> -	u8 type;
> -	u8 length;
> -	u16 handle;
> +	struct smbios_header hdr;
>   	u8 manufacturer;
>   	u8 product_name;
>   	u8 version;
> @@ -171,14 +137,8 @@ struct __packed smbios_type2 {
>   	char eos[SMBIOS_STRUCT_EOS_BYTES];
>   };
>
> -#define SMBIOS_ENCLOSURE_DESKTOP	3
> -#define SMBIOS_STATE_SAFE		3
> -#define SMBIOS_SECURITY_NONE		3
> -
>   struct __packed smbios_type3 {
> -	u8 type;
> -	u8 length;
> -	u16 handle;
> +	struct smbios_header hdr;
>   	u8 manufacturer;
>   	u8 chassis_type;
>   	u8 version;
> @@ -196,17 +156,8 @@ struct __packed smbios_type3 {
>   	char eos[SMBIOS_STRUCT_EOS_BYTES];
>   };
>
> -#define SMBIOS_PROCESSOR_TYPE_CENTRAL	3
> -#define SMBIOS_PROCESSOR_STATUS_ENABLED	1
> -#define SMBIOS_PROCESSOR_UPGRADE_NONE	6
> -
> -#define SMBIOS_PROCESSOR_FAMILY_OTHER	1
> -#define SMBIOS_PROCESSOR_FAMILY_UNKNOWN	2
> -
>   struct __packed smbios_type4 {
> -	u8 type;
> -	u8 length;
> -	u16 handle;
> +	struct smbios_header hdr;
>   	u8 socket_designation;
>   	u8 processor_type;
>   	u8 processor_family;
> @@ -252,12 +203,6 @@ struct __packed smbios_type127 {
>   	char eos[SMBIOS_STRUCT_EOS_BYTES];
>   };
>
> -struct __packed smbios_header {
> -	u8 type;
> -	u8 length;
> -	u16 handle;
> -};
> -
>   /**
>    * fill_smbios_header() - Fill the header of an SMBIOS table
>    *
> diff --git a/include/smbios_def.h b/include/smbios_def.h
> new file mode 100644
> index 00000000000..81c5781217f
> --- /dev/null
> +++ b/include/smbios_def.h
> @@ -0,0 +1,194 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (c) 2024 Linaro Limited
> + * Author: Raymond Mao <raymond.mao at linaro.org>
> + */
> +
> +#ifndef _SMBIOS_DEF_H_
> +#define _SMBIOS_DEF_H_
> +
> +/*
> + * BIOS characteristics
> + */
> +
> +#define BIOS_CHARACTERISTICS_PCI_SUPPORTED	0x80 /* BIT(7) */
> +#define BIOS_CHARACTERISTICS_UPGRADEABLE	0x800 /* BIT(11) */
> +#define BIOS_CHARACTERISTICS_SELECTABLE_BOOT	0x10000  /* BIT(16) */
> +
> +#define BIOS_CHARACTERISTICS_EXT1_ACPI		1 /* BIT(0) */
> +#define BIOS_CHARACTERISTICS_EXT2_UEFI		8 /* BIT(3) */
> +#define BIOS_CHARACTERISTICS_EXT2_TARGET	4 /* BIT(2) */
> +
> +/*
> + * System Information
> + */
> +
> +#define SMBIOS_WAKEUP_TYPE_RESERVED		0
> +#define SMBIOS_WAKEUP_TYPE_OTHER		1
> +#define SMBIOS_WAKEUP_TYPE_UNKNOWN		2
> +#define SMBIOS_WAKEUP_TYPE_APM_TIMER		3
> +#define SMBIOS_WAKEUP_TYPE_MODEM_RING		4
> +#define SMBIOS_WAKEUP_TYPE_LAN_REMOTE		5
> +#define SMBIOS_WAKEUP_TYPE_POWER_SWITCH		6
> +#define SMBIOS_WAKEUP_TYPE_PCI_PME		7
> +#define SMBIOS_WAKEUP_TYPE_AC_POWER_RESTORED	8
> +
> +/*
> + * Baseboard Information
> + */
> +
> +#define SMBIOS_BOARD_FEAT_HOST_BOARD		1 /* BIT(0) */
> +#define SMBIOS_BOARD_FEAT_REQ_AUX		2 /* BIT(1) */
> +#define SMBIOS_BOARD_FEAT_REMOVABLE		4 /* BIT(2) */
> +#define SMBIOS_BOARD_FEAT_REPLACEABLE		8 /* BIT(3) */
> +#define SMBIOS_BOARD_FEAT_HOT_SWAPPABLE		16 /* BIT(4) */
> +
> +#define SMBIOS_BOARD_TYPE_UNKNOWN		1
> +#define SMBIOS_BOARD_TYPE_OTHER			2
> +#define SMBIOS_BOARD_TYPE_SERVER_BLADE		3
> +#define SMBIOS_BOARD_TYPE_CON_SWITCH		4
> +#define SMBIOS_BOARD_TYPE_SM_MODULE		5
> +#define SMBIOS_BOARD_TYPE_PROCESSOR_MODULE	6
> +#define SMBIOS_BOARD_TYPE_IO_MODULE		7
> +#define SMBIOS_BOARD_TYPE_MEM_MODULE		8
> +#define SMBIOS_BOARD_TYPE_DAUGHTER_BOARD	9
> +#define SMBIOS_BOARD_TYPE_MOTHERBOARD		10
> +#define SMBIOS_BOARD_TYPE_PROC_MEM_MODULE	11
> +#define SMBIOS_BOARD_TYPE_PROC_IO_MODULE	12
> +#define SMBIOS_BOARD_TYPE_INTERCON		13
> +
> +/*
> + * System Enclosure or Chassis
> + */
> +#define SMBIOS_ENCLOSURE_UNKNOWN	2
> +#define SMBIOS_ENCLOSURE_DESKTOP	3
> +
> +#define SMBIOS_STATE_OTHER		1
> +#define SMBIOS_STATE_UNKNOWN		2
> +#define SMBIOS_STATE_SAFE		3
> +#define SMBIOS_STATE_WARNING		4
> +#define SMBIOS_STATE_CRITICAL		5
> +#define SMBIOS_STATE_NONRECOVERABLE	6
> +
> +#define SMBIOS_SECURITY_OTHER		1
> +#define SMBIOS_SECURITY_UNKNOWN		2
> +#define SMBIOS_SECURITY_NONE		3
> +#define SMBIOS_SECURITY_EXTINT_LOCK	4
> +#define SMBIOS_SECURITY_EXTINT_EN	5
> +
> +#define SMBIOS_ENCLOSURE_OEM_UND	0
> +#define SMBIOS_ENCLOSURE_HEIGHT_UND	0
> +#define SMBIOS_POWCORD_NUM_UND		0
> +#define SMBIOS_ELEMENT_TYPE_SELECT	0x80 /* BIT(7) */
> +
> +/*
> + * Processor Information
> + */
> +
> +#define SMBIOS_PROCESSOR_TYPE_OTHER	1
> +#define SMBIOS_PROCESSOR_TYPE_UNKNOWN	2
> +#define SMBIOS_PROCESSOR_TYPE_CENTRAL	3
> +#define SMBIOS_PROCESSOR_TYPE_MATH	4
> +#define SMBIOS_PROCESSOR_TYPE_DSP	5
> +#define SMBIOS_PROCESSOR_TYPE_VIDEO	6
> +
> +#define SMBIOS_PROCESSOR_STATUS_UNKNOWN		0
> +#define SMBIOS_PROCESSOR_STATUS_ENABLED		1
> +#define SMBIOS_PROCESSOR_STATUS_DISABLED_USER	2
> +#define SMBIOS_PROCESSOR_STATUS_DISABLED_BIOS	3
> +#define SMBIOS_PROCESSOR_STATUS_IDLE		4
> +#define SMBIOS_PROCESSOR_STATUS_OTHER		7
> +
> +#define SMBIOS_PROCESSOR_UPGRADE_OTHER		1
> +#define SMBIOS_PROCESSOR_UPGRADE_UNKNOWN	2
> +#define SMBIOS_PROCESSOR_UPGRADE_NONE		6
> +
> +#define SMBIOS_PROCESSOR_FAMILY_OTHER	1
> +#define SMBIOS_PROCESSOR_FAMILY_UNKNOWN	2
> +#define SMBIOS_PROCESSOR_FAMILY_RSVD	255
> +#define SMBIOS_PROCESSOR_FAMILY_ARMV7	256
> +#define SMBIOS_PROCESSOR_FAMILY_ARMV8	257
> +#define SMBIOS_PROCESSOR_FAMILY_RV32	512
> +#define SMBIOS_PROCESSOR_FAMILY_RV64	513
> +
> +#define SMBIOS_PROCESSOR_FAMILY_EXT	0xfe
> +
> +/* Processor Characteristics */
> +#define SMBIOS_PROCESSOR_RSVD		1 /* BIT(0) */
> +#define SMBIOS_PROCESSOR_UND		2 /* BIT(1) */
> +#define SMBIOS_PROCESSOR_64BIT		4 /* BIT(2) */
> +#define SMBIOS_PROCESSOR_MULTICORE	8 /* BIT(3) */
> +#define SMBIOS_PROCESSOR_HWTHREAD	16 /* BIT(4) */
> +#define SMBIOS_PROCESSOR_EXEC_PROT	32 /* BIT(5) */
> +#define SMBIOS_PROCESSOR_ENH_VIRT	64 /* BIT(6) */
> +#define SMBIOS_PROCESSOR_POW_CON	0x80 /* BIT(7) */
> +#define SMBIOS_PROCESSOR_128BIT		0x100 /* BIT(8) */
> +#define SMBIOS_PROCESSOR_ARM64_SOCID	0x200 /* BIT(9) */
> +
> +/*
> + * Cache Information
> + */
> +
> +#define SMBIOS_CACHE_SIZE_EXT_KB (2047 * 1024) /* 2047 MiB */
> +#define SMBIOS_CACHE_HANDLE_NONE 0xffff
> +
> +/* System Cache Type */
> +#define SMBIOS_CACHE_SYSCACHE_TYPE_OTHER	1
> +#define SMBIOS_CACHE_SYSCACHE_TYPE_UNKNOWN	2
> +#define SMBIOS_CACHE_SYSCACHE_TYPE_INST		3
> +#define SMBIOS_CACHE_SYSCACHE_TYPE_DATA		4
> +#define SMBIOS_CACHE_SYSCACHE_TYPE_UNIFIED	5
> +
> +/* Cache Speed */
> +#define SMBIOS_CACHE_SPEED_UNKNOWN	0
> +
> +/* SRAM Type */
> +#define SMBIOS_CACHE_SRAM_TYPE_UNKNOWN	2 /* BIT(1) */
> +
> +/* Error Correction Type */
> +#define SMBIOS_CACHE_ERRCORR_OTHER	1
> +#define SMBIOS_CACHE_ERRCORR_UNKNOWN	2
> +#define SMBIOS_CACHE_ERRCORR_NONE	3
> +#define SMBIOS_CACHE_ERRCORR_PARITY	4
> +#define SMBIOS_CACHE_ERRCORR_SBITECC	5
> +#define SMBIOS_CACHE_ERRCORR_MBITECC	6
> +
> +/* Cache Configuration */
> +#define SMBIOS_CACHE_LEVEL_1	0
> +#define SMBIOS_CACHE_LEVEL_2	1
> +#define SMBIOS_CACHE_LEVEL_3	2
> +#define SMBIOS_CACHE_LEVEL_4	3
> +#define SMBIOS_CACHE_LEVEL_5	4
> +#define SMBIOS_CACHE_LEVEL_6	5
> +#define SMBIOS_CACHE_LEVEL_7	6
> +#define SMBIOS_CACHE_LEVEL_8	7
> +#define SMBIOS_CACHE_SOCKETED	8 /* BIT(3) */
> +#define SMBIOS_CACHE_LOCATE_EXTERNAL	32 /* BIT(5) */
> +#define SMBIOS_CACHE_LOCATE_RESERVED	64 /* BIT(6) */
> +#define SMBIOS_CACHE_LOCATE_UNKNOWN	96 /* (BIT(5) | BIT(6)) */
> +#define SMBIOS_CACHE_ENABLED	0x80 /* BIT(7) */
> +#define SMBIOS_CACHE_OP_WB	0x100 /* BIT(8), Write Back */
> +#define SMBIOS_CACHE_OP_VAR	0x200 /* BIT(9), Varies with Memory Address */
> +#define SMBIOS_CACHE_OP_UND	0x300 /* (BIT(8) | BIT(9)), Unknown*/
> +
> +/* Cache Granularity */
> +#define SMBIOS_CACHE_GRANU_1K	0
> +#define SMBIOS_CACHE_GRANU_64K	1
> +
> +/* Cache Associativity */
> +#define SMBIOS_CACHE_ASSOC_OTHER	1
> +#define SMBIOS_CACHE_ASSOC_UNKNOWN	2
> +#define SMBIOS_CACHE_ASSOC_DMAPPED	3
> +#define SMBIOS_CACHE_ASSOC_2WAY		4
> +#define SMBIOS_CACHE_ASSOC_4WAY		5
> +#define SMBIOS_CACHE_ASSOC_FULLY	6
> +#define SMBIOS_CACHE_ASSOC_8WAY		7
> +#define SMBIOS_CACHE_ASSOC_16WAY	8
> +#define SMBIOS_CACHE_ASSOC_12WAY	9
> +#define SMBIOS_CACHE_ASSOC_24WAY	10
> +#define SMBIOS_CACHE_ASSOC_32WAY	11
> +#define SMBIOS_CACHE_ASSOC_48WAY	12
> +#define SMBIOS_CACHE_ASSOC_64WAY	13
> +#define SMBIOS_CACHE_ASSOC_20WAY	14
> +
> +#endif /* _SMBIOS_DEF_H_ */
> diff --git a/lib/smbios.c b/lib/smbios.c
> index a36d4b4e54a..1dd564a1762 100644
> --- a/lib/smbios.c
> +++ b/lib/smbios.c
> @@ -330,10 +330,10 @@ static int smbios_write_type0(ulong *current, int handle,
>   			      struct smbios_ctx *ctx)
>   {
>   	struct smbios_type0 *t;
> -	int len = sizeof(struct smbios_type0);
> +	int len = sizeof(*t);
>
>   	t = map_sysmem(*current, len);
> -	memset(t, 0, sizeof(struct smbios_type0));
> +	memset(t, 0, len);
>   	fill_smbios_header(t, SMBIOS_BIOS_INFORMATION, len, handle);
>   	smbios_set_eos(ctx, t->eos);
>   	t->vendor = smbios_add_prop(ctx, NULL, "U-Boot");
> @@ -374,7 +374,7 @@ static int smbios_write_type0(ulong *current, int handle,
>   	t->ec_major_release = 0xff;
>   	t->ec_minor_release = 0xff;
>
> -	len = t->length + smbios_string_table_len(ctx);
> +	len = t->hdr.length + smbios_string_table_len(ctx);
>   	*current += len;
>   	unmap_sysmem(t);
>
> @@ -385,11 +385,11 @@ static int smbios_write_type1(ulong *current, int handle,
>   			      struct smbios_ctx *ctx)
>   {
>   	struct smbios_type1 *t;
> -	int len = sizeof(struct smbios_type1);
> +	int len = sizeof(*t);
>   	char *serial_str = env_get("serial#");
>
>   	t = map_sysmem(*current, len);
> -	memset(t, 0, sizeof(struct smbios_type1));
> +	memset(t, 0, len);
>   	fill_smbios_header(t, SMBIOS_SYSTEM_INFORMATION, len, handle);
>   	smbios_set_eos(ctx, t->eos);
>   	t->manufacturer = smbios_add_prop_si(ctx, "manufacturer",
> @@ -403,7 +403,7 @@ static int smbios_write_type1(ulong *current, int handle,
>   					NULL);
>   	if (serial_str) {
>   		t->serial_number = smbios_add_prop(ctx, NULL, serial_str);
> -		strncpy((char *)t->uuid, serial_str, sizeof(t->uuid));
> +		strlcpy((char *)t->uuid, serial_str, sizeof(t->uuid));
>   	} else {
>   		t->serial_number = smbios_add_prop_si(ctx, "serial",
>   						      SYSID_SM_SYSTEM_SERIAL,
> @@ -415,7 +415,7 @@ static int smbios_write_type1(ulong *current, int handle,
>   	t->family = smbios_add_prop_si(ctx, "family",
>   				       SYSID_SM_SYSTEM_FAMILY, NULL);
>
> -	len = t->length + smbios_string_table_len(ctx);
> +	len = t->hdr.length + smbios_string_table_len(ctx);
>   	*current += len;
>   	unmap_sysmem(t);
>
> @@ -426,10 +426,10 @@ static int smbios_write_type2(ulong *current, int handle,
>   			      struct smbios_ctx *ctx)
>   {
>   	struct smbios_type2 *t;
> -	int len = sizeof(struct smbios_type2);
> +	int len = sizeof(*t);
>
>   	t = map_sysmem(*current, len);
> -	memset(t, 0, sizeof(struct smbios_type2));
> +	memset(t, 0, len);
>   	fill_smbios_header(t, SMBIOS_BOARD_INFORMATION, len, handle);
>   	smbios_set_eos(ctx, t->eos);
>   	t->manufacturer = smbios_add_prop_si(ctx, "manufacturer",
> @@ -448,11 +448,11 @@ static int smbios_write_type2(ulong *current, int handle,
>   	t->asset_tag_number = smbios_add_prop_si(ctx, "asset-tag",
>   						 SYSID_SM_BASEBOARD_ASSET_TAG,
>   						 NULL);
> -	t->feature_flags = SMBIOS_BOARD_FEATURE_HOSTING;
> -	t->board_type = SMBIOS_BOARD_MOTHERBOARD;
> +	t->feature_flags = SMBIOS_BOARD_FEAT_HOST_BOARD;
> +	t->board_type = SMBIOS_BOARD_TYPE_MOTHERBOARD;
>   	t->chassis_handle = handle + 1;
>
> -	len = t->length + smbios_string_table_len(ctx);
> +	len = t->hdr.length + smbios_string_table_len(ctx);
>   	*current += len;
>   	unmap_sysmem(t);
>
> @@ -463,10 +463,10 @@ static int smbios_write_type3(ulong *current, int handle,
>   			      struct smbios_ctx *ctx)
>   {
>   	struct smbios_type3 *t;
> -	int len = sizeof(struct smbios_type3);
> +	int len = sizeof(*t);
>
>   	t = map_sysmem(*current, len);
> -	memset(t, 0, sizeof(struct smbios_type3));
> +	memset(t, 0, len);
>   	fill_smbios_header(t, SMBIOS_SYSTEM_ENCLOSURE, len, handle);
>   	smbios_set_eos(ctx, t->eos);
>   	t->manufacturer = smbios_add_prop(ctx, "manufacturer", NULL);
> @@ -476,7 +476,7 @@ static int smbios_write_type3(ulong *current, int handle,
>   	t->thermal_state = SMBIOS_STATE_SAFE;
>   	t->security_status = SMBIOS_SECURITY_NONE;
>
> -	len = t->length + smbios_string_table_len(ctx);
> +	len = t->hdr.length + smbios_string_table_len(ctx);
>   	*current += len;
>   	unmap_sysmem(t);
>
> @@ -521,10 +521,10 @@ static int smbios_write_type4(ulong *current, int handle,
>   			      struct smbios_ctx *ctx)
>   {
>   	struct smbios_type4 *t;
> -	int len = sizeof(struct smbios_type4);
> +	int len = sizeof(*t);
>
>   	t = map_sysmem(*current, len);
> -	memset(t, 0, sizeof(struct smbios_type4));
> +	memset(t, 0, len);
>   	fill_smbios_header(t, SMBIOS_PROCESSOR_INFORMATION, len, handle);
>   	smbios_set_eos(ctx, t->eos);
>   	t->processor_type = SMBIOS_PROCESSOR_TYPE_CENTRAL;
> @@ -535,7 +535,7 @@ static int smbios_write_type4(ulong *current, int handle,
>   	t->l2_cache_handle = 0xffff;
>   	t->l3_cache_handle = 0xffff;
>
> -	len = t->length + smbios_string_table_len(ctx);
> +	len = t->hdr.length + smbios_string_table_len(ctx);
>   	*current += len;
>   	unmap_sysmem(t);
>
> @@ -546,10 +546,10 @@ static int smbios_write_type32(ulong *current, int handle,
>   			       struct smbios_ctx *ctx)
>   {
>   	struct smbios_type32 *t;
> -	int len = sizeof(struct smbios_type32);
> +	int len = sizeof(*t);
>
>   	t = map_sysmem(*current, len);
> -	memset(t, 0, sizeof(struct smbios_type32));
> +	memset(t, 0, len);
>   	fill_smbios_header(t, SMBIOS_SYSTEM_BOOT_INFORMATION, len, handle);
>   	smbios_set_eos(ctx, t->eos);
>
> @@ -563,10 +563,10 @@ static int smbios_write_type127(ulong *current, int handle,
>   				struct smbios_ctx *ctx)
>   {
>   	struct smbios_type127 *t;
> -	int len = sizeof(struct smbios_type127);
> +	int len = sizeof(*t);
>
>   	t = map_sysmem(*current, len);
> -	memset(t, 0, sizeof(struct smbios_type127));
> +	memset(t, 0, len);
>   	fill_smbios_header(t, SMBIOS_END_OF_TABLE, len, handle);
>
>   	*current += len;



More information about the U-Boot mailing list