[PATCH 0/3] smbios: correct handling of table size

* In the smbios command show the orrect table size for SMBIOS 2.1 entry point. * The SMBIOS 3 entry point has not field for the maximum structure size. Avoid to determine it needlessly. * Name Structure Table Maximum Size field in the SMBIOS 3 entry point structure accordance to its meaning.
Heinrich Schuchardt (3): cmd: smbios: show correct table size for SMBIOS2.1 entry point smbios: do not determine maximum structure size smbios: correctly name Structure Table Maximum Size field
cmd/smbios.c | 8 ++++---- drivers/misc/qfw_smbios.c | 2 +- include/smbios.h | 2 +- lib/efi_loader/efi_tcg2.c | 4 ++-- lib/efi_loader/smbiosdump.c | 6 +++--- lib/smbios-parser.c | 2 +- lib/smbios.c | 9 ++------- 7 files changed, 14 insertions(+), 19 deletions(-)

The SMBIOS table size for SMBIOS2.1 entry points is in field 'Structure Table Length' (offset 0x16) and not in field 'Maximum Structure Size' (offset 0x08).
Rename the receiving variable max_struct_size to table_maximum_size to avoid future confusion.
Signed-off-by: Heinrich Schuchardt heinrich.schuchardt@canonical.com --- cmd/smbios.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/cmd/smbios.c b/cmd/smbios.c index 95bdff6026..e2d82be163 100644 --- a/cmd/smbios.c +++ b/cmd/smbios.c @@ -126,7 +126,7 @@ static int do_smbios(struct cmd_tbl *cmdtp, int flag, int argc, static const char smbios_sig[] = "_SM_"; static const char smbios3_sig[] = "_SM3_"; size_t count = 0; - u32 max_struct_size; + u32 table_maximum_size;
addr = gd_smbios_start(); if (!addr) { @@ -142,7 +142,7 @@ static int do_smbios(struct cmd_tbl *cmdtp, int flag, int argc, entry3->major_ver, entry3->minor_ver, entry3->doc_rev); table = (void *)(uintptr_t)entry3->struct_table_address; size = entry3->length; - max_struct_size = entry3->max_struct_size; + table_maximum_size = entry3->max_struct_size; } else if (!memcmp(entry, smbios_sig, sizeof(smbios_sig) - 1)) { struct smbios_entry *entry2 = entry;
@@ -150,7 +150,7 @@ static int do_smbios(struct cmd_tbl *cmdtp, int flag, int argc, entry2->major_ver, entry2->minor_ver); table = (void *)(uintptr_t)entry2->struct_table_address; size = entry2->length; - max_struct_size = entry2->max_struct_size; + table_maximum_size = entry2->struct_table_length; } else { log_err("Unknown SMBIOS anchor format\n"); return CMD_RET_FAILURE; @@ -163,7 +163,7 @@ static int do_smbios(struct cmd_tbl *cmdtp, int flag, int argc,
for (struct smbios_header *pos = table; pos; pos = next_table(pos)) ++count; - printf("%zd structures occupying %d bytes\n", count, max_struct_size); + printf("%zd structures occupying %d bytes\n", count, table_maximum_size); printf("Table at 0x%llx\n", (unsigned long long)map_to_sysmem(table));
for (struct smbios_header *pos = table; pos; pos = next_table(pos)) {

On Thu, 1 Feb 2024 at 02:20, Heinrich Schuchardt heinrich.schuchardt@canonical.com wrote:
The SMBIOS table size for SMBIOS2.1 entry points is in field 'Structure Table Length' (offset 0x16) and not in field 'Maximum Structure Size' (offset 0x08).
Rename the receiving variable max_struct_size to table_maximum_size to avoid future confusion.
Signed-off-by: Heinrich Schuchardt heinrich.schuchardt@canonical.com
cmd/smbios.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/cmd/smbios.c b/cmd/smbios.c index 95bdff6026..e2d82be163 100644 --- a/cmd/smbios.c +++ b/cmd/smbios.c @@ -126,7 +126,7 @@ static int do_smbios(struct cmd_tbl *cmdtp, int flag, int argc, static const char smbios_sig[] = "_SM_"; static const char smbios3_sig[] = "_SM3_"; size_t count = 0;
u32 max_struct_size;
u32 table_maximum_size; addr = gd_smbios_start(); if (!addr) {
@@ -142,7 +142,7 @@ static int do_smbios(struct cmd_tbl *cmdtp, int flag, int argc, entry3->major_ver, entry3->minor_ver, entry3->doc_rev); table = (void *)(uintptr_t)entry3->struct_table_address; size = entry3->length;
max_struct_size = entry3->max_struct_size;
table_maximum_size = entry3->max_struct_size; } else if (!memcmp(entry, smbios_sig, sizeof(smbios_sig) - 1)) { struct smbios_entry *entry2 = entry;
@@ -150,7 +150,7 @@ static int do_smbios(struct cmd_tbl *cmdtp, int flag, int argc, entry2->major_ver, entry2->minor_ver); table = (void *)(uintptr_t)entry2->struct_table_address; size = entry2->length;
max_struct_size = entry2->max_struct_size;
table_maximum_size = entry2->struct_table_length; } else { log_err("Unknown SMBIOS anchor format\n"); return CMD_RET_FAILURE;
@@ -163,7 +163,7 @@ static int do_smbios(struct cmd_tbl *cmdtp, int flag, int argc,
for (struct smbios_header *pos = table; pos; pos = next_table(pos)) ++count;
printf("%zd structures occupying %d bytes\n", count, max_struct_size);
printf("%zd structures occupying %d bytes\n", count, table_maximum_size); printf("Table at 0x%llx\n", (unsigned long long)map_to_sysmem(table)); for (struct smbios_header *pos = table; pos; pos = next_table(pos)) {
-- 2.43.0
Reviewed-by: Ilias Apalodimas ilias.apalodimas@linaro.org

Only the SMBIOS 2.1 entry point has a field for the maximum structure size. As we have switched to an SMBIOS 3 entry point remove the superfluous calculation.
Signed-off-by: Heinrich Schuchardt heinrich.schuchardt@canonical.com --- lib/smbios.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/lib/smbios.c b/lib/smbios.c index cd750cc218..327f78c8b0 100644 --- a/lib/smbios.c +++ b/lib/smbios.c @@ -566,7 +566,6 @@ ulong write_smbios_table(ulong addr) struct smbios_ctx ctx; ulong tables; int len = 0; - int max_struct_size = 0; int handle = 0; int i;
@@ -588,7 +587,6 @@ ulong write_smbios_table(ulong addr) /* populate minimum required tables */ for (i = 0; i < ARRAY_SIZE(smbios_write_funcs); i++) { const struct smbios_write_method *method; - int tmp;
method = &smbios_write_funcs[i]; ctx.subnode_name = NULL; @@ -598,10 +596,7 @@ ulong write_smbios_table(ulong addr) ctx.node = ofnode_find_subnode(parent_node, method->subnode_name); } - tmp = method->write((ulong *)&addr, handle++, &ctx); - - max_struct_size = max(max_struct_size, tmp); - len += tmp; + len += method->write((ulong *)&addr, handle++, &ctx); }
/*

In the SMBIOS 3 entry point the Structure Table Maximum Size field was incorrectly named max_struct_size. A Maximum Structure Size field only exists in the SMBIOS 2.1 entry point and has a different meaning.
Call the Structure Table Length field table_maximum_size.
Signed-off-by: Heinrich Schuchardt heinrich.schuchardt@canonical.com --- cmd/smbios.c | 2 +- drivers/misc/qfw_smbios.c | 2 +- include/smbios.h | 2 +- lib/efi_loader/efi_tcg2.c | 4 ++-- lib/efi_loader/smbiosdump.c | 6 +++--- lib/smbios-parser.c | 2 +- lib/smbios.c | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/cmd/smbios.c b/cmd/smbios.c index e2d82be163..66f6b76137 100644 --- a/cmd/smbios.c +++ b/cmd/smbios.c @@ -142,7 +142,7 @@ static int do_smbios(struct cmd_tbl *cmdtp, int flag, int argc, entry3->major_ver, entry3->minor_ver, entry3->doc_rev); table = (void *)(uintptr_t)entry3->struct_table_address; size = entry3->length; - table_maximum_size = entry3->max_struct_size; + table_maximum_size = entry3->table_maximum_size; } else if (!memcmp(entry, smbios_sig, sizeof(smbios_sig) - 1)) { struct smbios_entry *entry2 = entry;
diff --git a/drivers/misc/qfw_smbios.c b/drivers/misc/qfw_smbios.c index a898cb4eea..c3e8c310d0 100644 --- a/drivers/misc/qfw_smbios.c +++ b/drivers/misc/qfw_smbios.c @@ -90,7 +90,7 @@ static int qfw_parse_smbios_anchor(struct udevice *dev, entry->length = sizeof(struct smbios3_entry); entry->major_ver = entry2->major_ver; entry->minor_ver = entry2->minor_ver; - entry->max_struct_size = entry2->struct_table_length; + entry->table_maximum_size = entry2->struct_table_length; } else { ret = -ENOENT; goto out; diff --git a/include/smbios.h b/include/smbios.h index e2b7f69584..3df8827b60 100644 --- a/include/smbios.h +++ b/include/smbios.h @@ -75,7 +75,7 @@ struct __packed smbios3_entry { /** @reserved: reserved */ u8 reserved; /** maximum size of SMBIOS table */ - u32 max_struct_size; + u32 table_maximum_size; /** @struct_table_address: 64-bit physical starting address */ u64 struct_table_address; }; diff --git a/lib/efi_loader/efi_tcg2.c b/lib/efi_loader/efi_tcg2.c index b5d4aa7be5..b07e0099c2 100644 --- a/lib/efi_loader/efi_tcg2.c +++ b/lib/efi_loader/efi_tcg2.c @@ -1098,7 +1098,7 @@ tcg2_measure_smbios(struct udevice *dev, */ event_size = sizeof(struct smbios_handoff_table_pointers2) + FIELD_SIZEOF(struct efi_configuration_table, guid) + - entry->max_struct_size; + entry->table_maximum_size; event = calloc(1, event_size); if (!event) { ret = EFI_OUT_OF_RESOURCES; @@ -1113,7 +1113,7 @@ tcg2_measure_smbios(struct udevice *dev, smbios_copy = (struct smbios_header *)((uintptr_t)&event->table_entry[0].table); memcpy(&event->table_entry[0].table, (void *)((uintptr_t)entry->struct_table_address), - entry->max_struct_size); + entry->table_maximum_size);
smbios_prepare_measurement(entry, smbios_copy);
diff --git a/lib/efi_loader/smbiosdump.c b/lib/efi_loader/smbiosdump.c index f0b901897e..2f0b91a353 100644 --- a/lib/efi_loader/smbiosdump.c +++ b/lib/efi_loader/smbiosdump.c @@ -329,7 +329,7 @@ efi_status_t do_check(void) return EFI_LOAD_ERROR; } table = (void *)(uintptr_t)smbios3_anchor->struct_table_address; - len = smbios3_anchor->max_struct_size; + len = smbios3_anchor->table_maximum_size; } else { struct smbios_entry *smbios_anchor; int r; @@ -469,7 +469,7 @@ static efi_status_t do_save(u16 *filename)
smbios3_anchor = get_config_table(&smbios3_guid); if (smbios3_anchor) { - size = 0x20 + smbios3_anchor->max_struct_size; + size = 0x20 + smbios3_anchor->table_maximum_size; ret = bs->allocate_pool(EFI_LOADER_DATA, size, (void **)&buf); if (ret != EFI_SUCCESS) { error(u"Out of memory\n"); @@ -480,7 +480,7 @@ static efi_status_t do_save(u16 *filename) memcpy(buf, smbios3_anchor, smbios3_anchor->length); memcpy(buf + 0x20, (void *)(uintptr_t)smbios3_anchor->struct_table_address, - smbios3_anchor->max_struct_size); + smbios3_anchor->table_maximum_size);
smbios3_anchor = (struct smbios3_entry *)buf; smbios3_anchor->struct_table_address = 0x20; diff --git a/lib/smbios-parser.c b/lib/smbios-parser.c index 0d1ac781b3..9a62b3c760 100644 --- a/lib/smbios-parser.c +++ b/lib/smbios-parser.c @@ -230,7 +230,7 @@ void smbios_prepare_measurement(const struct smbios3_entry *entry, void *table_end; struct smbios_header *header;
- table_end = (void *)((u8 *)smbios_copy + entry->max_struct_size); + table_end = (void *)((u8 *)smbios_copy + entry->table_maximum_size);
for (i = 0; i < ARRAY_SIZE(smbios_filter_tables); i++) { header = smbios_copy; diff --git a/lib/smbios.c b/lib/smbios.c index 327f78c8b0..c83af730a9 100644 --- a/lib/smbios.c +++ b/lib/smbios.c @@ -615,7 +615,7 @@ ulong write_smbios_table(ulong addr) se->minor_ver = SMBIOS_MINOR_VER; se->doc_rev = 0; se->entry_point_rev = 1; - se->max_struct_size = len; + se->table_maximum_size = len; se->struct_table_address = table_addr; se->checksum = table_compute_checksum(se, sizeof(struct smbios3_entry)); unmap_sysmem(se);

On Thu, 1 Feb 2024 at 02:20, Heinrich Schuchardt heinrich.schuchardt@canonical.com wrote:
In the SMBIOS 3 entry point the Structure Table Maximum Size field was incorrectly named max_struct_size. A Maximum Structure Size field only exists in the SMBIOS 2.1 entry point and has a different meaning.
Call the Structure Table Length field table_maximum_size.
Signed-off-by: Heinrich Schuchardt heinrich.schuchardt@canonical.com
cmd/smbios.c | 2 +- drivers/misc/qfw_smbios.c | 2 +- include/smbios.h | 2 +- lib/efi_loader/efi_tcg2.c | 4 ++-- lib/efi_loader/smbiosdump.c | 6 +++--- lib/smbios-parser.c | 2 +- lib/smbios.c | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/cmd/smbios.c b/cmd/smbios.c index e2d82be163..66f6b76137 100644 --- a/cmd/smbios.c +++ b/cmd/smbios.c @@ -142,7 +142,7 @@ static int do_smbios(struct cmd_tbl *cmdtp, int flag, int argc, entry3->major_ver, entry3->minor_ver, entry3->doc_rev); table = (void *)(uintptr_t)entry3->struct_table_address; size = entry3->length;
table_maximum_size = entry3->max_struct_size;
table_maximum_size = entry3->table_maximum_size; } else if (!memcmp(entry, smbios_sig, sizeof(smbios_sig) - 1)) { struct smbios_entry *entry2 = entry;
diff --git a/drivers/misc/qfw_smbios.c b/drivers/misc/qfw_smbios.c index a898cb4eea..c3e8c310d0 100644 --- a/drivers/misc/qfw_smbios.c +++ b/drivers/misc/qfw_smbios.c @@ -90,7 +90,7 @@ static int qfw_parse_smbios_anchor(struct udevice *dev, entry->length = sizeof(struct smbios3_entry); entry->major_ver = entry2->major_ver; entry->minor_ver = entry2->minor_ver;
entry->max_struct_size = entry2->struct_table_length;
entry->table_maximum_size = entry2->struct_table_length; } else { ret = -ENOENT; goto out;
diff --git a/include/smbios.h b/include/smbios.h index e2b7f69584..3df8827b60 100644 --- a/include/smbios.h +++ b/include/smbios.h @@ -75,7 +75,7 @@ struct __packed smbios3_entry { /** @reserved: reserved */ u8 reserved; /** maximum size of SMBIOS table */
u32 max_struct_size;
u32 table_maximum_size; /** @struct_table_address: 64-bit physical starting address */ u64 struct_table_address;
}; diff --git a/lib/efi_loader/efi_tcg2.c b/lib/efi_loader/efi_tcg2.c index b5d4aa7be5..b07e0099c2 100644 --- a/lib/efi_loader/efi_tcg2.c +++ b/lib/efi_loader/efi_tcg2.c @@ -1098,7 +1098,7 @@ tcg2_measure_smbios(struct udevice *dev, */ event_size = sizeof(struct smbios_handoff_table_pointers2) + FIELD_SIZEOF(struct efi_configuration_table, guid) +
entry->max_struct_size;
entry->table_maximum_size; event = calloc(1, event_size); if (!event) { ret = EFI_OUT_OF_RESOURCES;
@@ -1113,7 +1113,7 @@ tcg2_measure_smbios(struct udevice *dev, smbios_copy = (struct smbios_header *)((uintptr_t)&event->table_entry[0].table); memcpy(&event->table_entry[0].table, (void *)((uintptr_t)entry->struct_table_address),
entry->max_struct_size);
entry->table_maximum_size); smbios_prepare_measurement(entry, smbios_copy);
diff --git a/lib/efi_loader/smbiosdump.c b/lib/efi_loader/smbiosdump.c index f0b901897e..2f0b91a353 100644 --- a/lib/efi_loader/smbiosdump.c +++ b/lib/efi_loader/smbiosdump.c @@ -329,7 +329,7 @@ efi_status_t do_check(void) return EFI_LOAD_ERROR; } table = (void *)(uintptr_t)smbios3_anchor->struct_table_address;
len = smbios3_anchor->max_struct_size;
len = smbios3_anchor->table_maximum_size; } else { struct smbios_entry *smbios_anchor; int r;
@@ -469,7 +469,7 @@ static efi_status_t do_save(u16 *filename)
smbios3_anchor = get_config_table(&smbios3_guid); if (smbios3_anchor) {
size = 0x20 + smbios3_anchor->max_struct_size;
size = 0x20 + smbios3_anchor->table_maximum_size; ret = bs->allocate_pool(EFI_LOADER_DATA, size, (void **)&buf); if (ret != EFI_SUCCESS) { error(u"Out of memory\n");
@@ -480,7 +480,7 @@ static efi_status_t do_save(u16 *filename) memcpy(buf, smbios3_anchor, smbios3_anchor->length); memcpy(buf + 0x20, (void *)(uintptr_t)smbios3_anchor->struct_table_address,
smbios3_anchor->max_struct_size);
smbios3_anchor->table_maximum_size); smbios3_anchor = (struct smbios3_entry *)buf; smbios3_anchor->struct_table_address = 0x20;
diff --git a/lib/smbios-parser.c b/lib/smbios-parser.c index 0d1ac781b3..9a62b3c760 100644 --- a/lib/smbios-parser.c +++ b/lib/smbios-parser.c @@ -230,7 +230,7 @@ void smbios_prepare_measurement(const struct smbios3_entry *entry, void *table_end; struct smbios_header *header;
table_end = (void *)((u8 *)smbios_copy + entry->max_struct_size);
table_end = (void *)((u8 *)smbios_copy + entry->table_maximum_size); for (i = 0; i < ARRAY_SIZE(smbios_filter_tables); i++) { header = smbios_copy;
diff --git a/lib/smbios.c b/lib/smbios.c index 327f78c8b0..c83af730a9 100644 --- a/lib/smbios.c +++ b/lib/smbios.c @@ -615,7 +615,7 @@ ulong write_smbios_table(ulong addr) se->minor_ver = SMBIOS_MINOR_VER; se->doc_rev = 0; se->entry_point_rev = 1;
se->max_struct_size = len;
se->table_maximum_size = len; se->struct_table_address = table_addr; se->checksum = table_compute_checksum(se, sizeof(struct smbios3_entry)); unmap_sysmem(se);
-- 2.43.0
Reviewed-by: Ilias Apalodimas ilias.apalodimas@linaro.org
participants (2)
-
Heinrich Schuchardt
-
Ilias Apalodimas