diff options
Diffstat (limited to 'src/arch/x86/boot/smbios.c')
-rw-r--r-- | src/arch/x86/boot/smbios.c | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/src/arch/x86/boot/smbios.c b/src/arch/x86/boot/smbios.c index 1dbe32dc2d..fc5ac6634f 100644 --- a/src/arch/x86/boot/smbios.c +++ b/src/arch/x86/boot/smbios.c @@ -529,11 +529,14 @@ static int smbios_walk_device_tree(struct device *tree, int *handle, unsigned lo return len; } +#define update_max(len, max_len, stmt) do { int tmp = stmt; max_len = MAX(max_len, tmp); len += tmp; } while(0) unsigned long smbios_write_tables(unsigned long current) { struct smbios_entry *se; unsigned long tables; - int len, handle = 0; + int len = 0; + int max_struct_size = 0; + int handle = 0; current = ALIGN(current, 16); printk(BIOS_DEBUG, "%s: %08lx\n", __func__, current); @@ -543,28 +546,28 @@ unsigned long smbios_write_tables(unsigned long current) current = ALIGN(current, 16); tables = current; - len = smbios_write_type0(¤t, handle++); - len += smbios_write_type1(¤t, handle++); - len += smbios_write_type2(¤t, handle++); - len += smbios_write_type3(¤t, handle++); - len += smbios_write_type4(¤t, handle++); - len += smbios_write_type11(¤t, &handle); + update_max(len, max_struct_size, smbios_write_type0(¤t, handle++)); + update_max(len, max_struct_size, smbios_write_type1(¤t, handle++)); + update_max(len, max_struct_size, smbios_write_type2(¤t, handle++)); + update_max(len, max_struct_size, smbios_write_type3(¤t, handle++)); + update_max(len, max_struct_size, smbios_write_type4(¤t, handle++)); + update_max(len, max_struct_size, smbios_write_type11(¤t, &handle)); #if CONFIG_ELOG - len += elog_smbios_write_type15(¤t, handle++); + update_max(len, max_struct_size, smbios_write_type15(¤t, &handle)); #endif - len += smbios_write_type17(¤t, &handle); - len += smbios_write_type32(¤t, handle++); + update_max(len, max_struct_size, smbios_write_type17(¤t, &handle)); + update_max(len, max_struct_size, smbios_write_type32(¤t, handle++)); - len += smbios_walk_device_tree(all_devices, &handle, ¤t); + update_max(len, max_struct_size, smbios_walk_device_tree(all_devices, &handle, ¤t)); - len += smbios_write_type127(¤t, handle++); + update_max(len, max_struct_size, smbios_write_type127(¤t, handle++)); 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); |