[coreboot-gerrit] New patch to review for coreboot: e471cd0 Replaced hardcoded SMBIOS Max Struct size with a calculated one

Ben Frisch (bfrisch@gmail.com) gerrit at coreboot.org
Sun May 10 02:56:27 CEST 2015


Ben Frisch (bfrisch at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/10163

-gerrit

commit e471cd07a1cea118b7a20475f8e836df1d9e00d2
Author: Ben Frisch <bfrisch at gmail.com>
Date:   Sat May 9 19:52:18 2015 -0500

    Replaced hardcoded SMBIOS Max Struct size with a calculated one
    
    The SMBIOS Specification defines Max Struct size as the maximum size of
    any table in the entire SMBIOS.  The hardcoded size is too small to
    accurately represent the maximum SMBIOS structure sizes.  While the field
    is not used by Linux it is used by some RTOS implementations.
    
    Change-Id: I98087975c53a02857742dea283f4e303485b2ffe
    Signed-off-by: Ben Frisch <bfrisch at gmail.com>
---
 src/arch/x86/boot/smbios.c | 48 +++++++++++++++++++++++++++++++++-------------
 1 file changed, 35 insertions(+), 13 deletions(-)

diff --git a/src/arch/x86/boot/smbios.c b/src/arch/x86/boot/smbios.c
index c3ac54a..c2e4c3a 100644
--- a/src/arch/x86/boot/smbios.c
+++ b/src/arch/x86/boot/smbios.c
@@ -531,7 +531,7 @@ unsigned long smbios_write_tables(unsigned long current)
 {
 	struct smbios_entry *se;
 	unsigned long tables;
-	int len, handle = 0;
+	int len, max_struct_size, table_len, handle = 0;
 
 	current = ALIGN(current, 16);
 	printk(BIOS_DEBUG, "%s: %08lx\n", __func__, current);
@@ -541,28 +541,50 @@ unsigned long smbios_write_tables(unsigned long current)
 	current = ALIGN(current, 16);
 
 	tables = current;
-	len = smbios_write_type0(&current, handle++);
-	len += smbios_write_type1(&current, handle++);
-	len += smbios_write_type2(&current, handle++);
-	len += smbios_write_type3(&current, handle++);
-	len += smbios_write_type4(&current, handle++);
-	len += smbios_write_type11(&current, &handle);
+	table_len = smbios_write_type0(&current, handle++);
+	max_struct_size = table_len;
+	len = table_len;
+	table_len = smbios_write_type1(&current, handle++);
+	max_struct_size = MAX(max_struct_size, table_len);
+	len += table_len;
+	table_len = smbios_write_type2(&current, handle++);
+	max_struct_size = MAX(max_struct_size, table_len);
+	len += table_len;
+	table_len = smbios_write_type3(&current, handle++);
+	max_struct_size = MAX(max_struct_size, table_len);
+	len += table_len;
+	table_len = smbios_write_type4(&current, handle++);
+	max_struct_size = MAX(max_struct_size, table_len);
+	len += table_len;
+	table_len = smbios_write_type11(&current, &handle);
+	max_struct_size = MAX(max_struct_size, table_len);
+	len += table_len;
 #if CONFIG_ELOG
-	len += elog_smbios_write_type15(&current, handle++);
+	table_len = elog_smbios_write_type15(&current, handle++);
+	max_struct_size = MAX(max_struct_size, table_len);
+	len += table_len;
 #endif
-	len += smbios_write_type17(&current, &handle);
-	len += smbios_write_type32(&current, handle++);
+	table_len = smbios_write_type17(&current, &handle);
+	max_struct_size = MAX(max_struct_size, table_len);
+	len += table_len;
+	table_len = smbios_write_type32(&current, handle++);
+	max_struct_size = MAX(max_struct_size, table_len);
+	len += table_len;
 
-	len += smbios_walk_device_tree(all_devices, &handle, &current);
+	table_len = smbios_walk_device_tree(all_devices, &handle, &current);
+	max_struct_size = MAX(max_struct_size, table_len);
+	len += table_len;
 
-	len += smbios_write_type127(&current, handle++);
+	table_len = smbios_write_type127(&current, handle++);
+	max_struct_size = MAX(max_struct_size, table_len);
+	len += table_len;
 
 	memset(se, 0, sizeof(struct smbios_entry));
 	memcpy(se->anchor, "_SM_", 4);
 	se->length = sizeof(struct smbios_entry);
 	se->major_version = 2;
 	se->minor_version = 7;
-	se->max_struct_size = 24;
+	se->max_struct_size = max_struct_size;
 	se->struct_count = handle;
 	memcpy(se->intermediate_anchor_string, "_DMI_", 5);
 



More information about the coreboot-gerrit mailing list