[PATCH 2/3] dmi_decode: Only be pedantic if we are sure about the board type (LP:#1021674)
IvanHu
ivan.hu at canonical.com
Mon Jul 9 09:03:52 UTC 2012
On 07/06/2012 10:30 PM, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> We only should really compare board type and preferred PM profile if we
> are totally sure about the the types. If either are CHASSIS_OTHER then
> don't bother being pedantic and ship the check. Also, because CERT can't
> figure out if this error is bad or not, add some advice text to fully
> explain what this error really means.
>
> To make this more friendly, I've added the a textual description of the
> chassis type and PM preferred profiles rather than just dump out some
> undecipherable magic numbers.
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
> src/dmi/dmi_decode/dmi_decode.c | 131 +++++++++++++++++++++++++--------------
> 1 file changed, 84 insertions(+), 47 deletions(-)
>
> diff --git a/src/dmi/dmi_decode/dmi_decode.c b/src/dmi/dmi_decode/dmi_decode.c
> index f8c37ed..67dfea2 100644
> --- a/src/dmi/dmi_decode/dmi_decode.c
> +++ b/src/dmi/dmi_decode/dmi_decode.c
> @@ -73,6 +73,7 @@ typedef struct {
> } fwts_dmi_version;
>
> typedef struct {
> + const char *name;
> uint8_t original;
> uint8_t mapped;
> } fwts_chassis_type_map;
> @@ -90,48 +91,48 @@ static const char *uuid_patterns[] = {
> };
>
> static const fwts_chassis_type_map fwts_dmi_chassis_type[] = {
> - { FWTS_SMBIOS_CHASSIS_INVALID, CHASSIS_OTHER },
> - { FWTS_SMBIOS_CHASSIS_OTHER, CHASSIS_OTHER },
> - { FWTS_SMBIOS_CHASSIS_UNKNOWN, CHASSIS_OTHER },
> - { FWTS_SMBIOS_CHASSIS_DESKTOP, CHASSIS_DESKTOP },
> - { FWTS_SMBIOS_CHASSIS_LOW_PROFILE_DESKTOP, CHASSIS_DESKTOP },
> - { FWTS_SMBIOS_CHASSIS_PIZZA_BOX, CHASSIS_DESKTOP },
> - { FWTS_SMBIOS_CHASSIS_MINI_TOWER, CHASSIS_DESKTOP },
> - { FWTS_SMBIOS_CHASSIS_TOWER, CHASSIS_DESKTOP },
> - { FWTS_SMBIOS_CHASSIS_PORTABLE, CHASSIS_MOBILE },
> - { FWTS_SMBIOS_CHASSIS_LAPTOP, CHASSIS_MOBILE },
> - { FWTS_SMBIOS_CHASSIS_NOTEBOOK, CHASSIS_MOBILE },
> - { FWTS_SMBIOS_CHASSIS_HANDHELD, CHASSIS_MOBILE },
> - { FWTS_SMBIOS_CHASSIS_DOCKING_STATION, CHASSIS_DESKTOP },
> - { FWTS_SMBIOS_CHASSIS_ALL_IN_ONE, CHASSIS_DESKTOP },
> - { FWTS_SMBIOS_CHASSIS_SUB_NOTEBOOK, CHASSIS_MOBILE },
> - { FWTS_SMBIOS_CHASSIS_SPACE_SAVING, CHASSIS_DESKTOP },
> - { FWTS_SMBIOS_CHASSIS_LUNCH_BOX, CHASSIS_DESKTOP | CHASSIS_MOBILE},
> - { FWTS_SMBIOS_CHASSIS_MAIN_SERVER_CHASSIS, CHASSIS_SERVER },
> - { FWTS_SMBIOS_CHASSIS_EXPANISON_CHASSIS, CHASSIS_OTHER },
> - { FWTS_SMBIOS_CHASSIS_SUB_CHASSIS, CHASSIS_OTHER },
> - { FWTS_SMBIOS_CHASSIS_BUS_EXPANSION_CHASSIS, CHASSIS_OTHER },
> - { FWTS_SMBIOS_CHASSIS_PERIPHERAL_CHASSIS, CHASSIS_OTHER },
> - { FWTS_SMBIOS_CHASSIS_RAID_CHASSIS, CHASSIS_OTHER },
> - { FWTS_SMBIOS_CHASSIS_RACK_MOUNT_CHASSIS, CHASSIS_OTHER },
> - { FWTS_SMBIOS_CHASSIS_SEALED_CASE_PC, CHASSIS_DESKTOP },
> - { FWTS_SMBIOS_CHASSIS_MULTI_SYSTEM_CHASSIS, CHASSIS_OTHER },
> - { FWTS_SMBIOS_CHASSIS_COMPACT_PCI, CHASSIS_OTHER },
> - { FWTS_SMBIOS_CHASSIS_ADVANCED_TCA, CHASSIS_OTHER },
> - { FWTS_SMBIOS_CHASSIS_BLADE, CHASSIS_SERVER },
> - { FWTS_SMBIOS_CHASSIS_BLASE_ENCLOSURE, CHASSIS_SERVER }
> + { "Invalid", FWTS_SMBIOS_CHASSIS_INVALID, CHASSIS_OTHER },
> + { "Other", FWTS_SMBIOS_CHASSIS_OTHER, CHASSIS_OTHER },
> + { "Unknown", FWTS_SMBIOS_CHASSIS_UNKNOWN, CHASSIS_OTHER },
> + { "Desktop", FWTS_SMBIOS_CHASSIS_DESKTOP, CHASSIS_DESKTOP },
> + { "Low Profile Desktop",FWTS_SMBIOS_CHASSIS_LOW_PROFILE_DESKTOP, CHASSIS_DESKTOP },
> + { "Pizza Box", FWTS_SMBIOS_CHASSIS_PIZZA_BOX, CHASSIS_DESKTOP },
> + { "Mini Tower", FWTS_SMBIOS_CHASSIS_MINI_TOWER, CHASSIS_DESKTOP },
> + { "Chassis Tower", FWTS_SMBIOS_CHASSIS_TOWER, CHASSIS_DESKTOP },
> + { "Portable", FWTS_SMBIOS_CHASSIS_PORTABLE, CHASSIS_MOBILE },
> + { "Laptop", FWTS_SMBIOS_CHASSIS_LAPTOP, CHASSIS_MOBILE },
> + { "Notebook", FWTS_SMBIOS_CHASSIS_NOTEBOOK, CHASSIS_MOBILE },
> + { "Handheld", FWTS_SMBIOS_CHASSIS_HANDHELD, CHASSIS_MOBILE },
> + { "Docking Station", FWTS_SMBIOS_CHASSIS_DOCKING_STATION, CHASSIS_DESKTOP },
> + { "All In One", FWTS_SMBIOS_CHASSIS_ALL_IN_ONE, CHASSIS_DESKTOP },
> + { "Sub Notebook", FWTS_SMBIOS_CHASSIS_SUB_NOTEBOOK, CHASSIS_MOBILE },
> + { "Space Saving", FWTS_SMBIOS_CHASSIS_SPACE_SAVING, CHASSIS_DESKTOP },
> + { "Lunch Box", FWTS_SMBIOS_CHASSIS_LUNCH_BOX, CHASSIS_DESKTOP | CHASSIS_MOBILE},
> + { "Server Chassis", FWTS_SMBIOS_CHASSIS_MAIN_SERVER_CHASSIS, CHASSIS_SERVER },
> + { "Expansion Chassis", FWTS_SMBIOS_CHASSIS_EXPANISON_CHASSIS, CHASSIS_OTHER },
> + { "Sub Chassis", FWTS_SMBIOS_CHASSIS_SUB_CHASSIS, CHASSIS_OTHER },
> + { "Bus Expansion Chassis", FWTS_SMBIOS_CHASSIS_BUS_EXPANSION_CHASSIS, CHASSIS_OTHER },
> + { "Peripheral Chassis", FWTS_SMBIOS_CHASSIS_PERIPHERAL_CHASSIS, CHASSIS_OTHER },
> + { "Raid Chassis", FWTS_SMBIOS_CHASSIS_RAID_CHASSIS, CHASSIS_OTHER },
> + { "Rack Mount Chassis", FWTS_SMBIOS_CHASSIS_RACK_MOUNT_CHASSIS, CHASSIS_OTHER },
> + { "Sealed Case PC", FWTS_SMBIOS_CHASSIS_SEALED_CASE_PC, CHASSIS_DESKTOP },
> + { "Multi System Chassis",FWTS_SMBIOS_CHASSIS_MULTI_SYSTEM_CHASSIS, CHASSIS_OTHER },
> + { "Compact PCI", FWTS_SMBIOS_CHASSIS_COMPACT_PCI, CHASSIS_OTHER },
> + { "Advanced TCA", FWTS_SMBIOS_CHASSIS_ADVANCED_TCA, CHASSIS_OTHER },
> + { "Blade", FWTS_SMBIOS_CHASSIS_BLADE, CHASSIS_SERVER },
> + { "Enclosure", FWTS_SMBIOS_CHASSIS_BLASE_ENCLOSURE, CHASSIS_SERVER }
> };
>
> static const fwts_chassis_type_map fwts_acpi_pm_profile_type[] = {
> - { FWTS_FACP_UNSPECIFIED, CHASSIS_OTHER },
> - { FWTS_FACP_DESKTOP, CHASSIS_DESKTOP },
> - { FWTS_FACP_MOBILE, CHASSIS_MOBILE },
> - { FWTS_FACP_WORKSTATION, CHASSIS_WORKSTATION },
> - { FWTS_FACP_ENTERPRISE_SERVER, CHASSIS_SERVER },
> - { FWTS_FACP_SOHO_SERVER, CHASSIS_SERVER | CHASSIS_DESKTOP },
> - { FWTS_FACP_APPLIANCE_PC, CHASSIS_DESKTOP },
> - { FWTS_FACP_PERFORMANCE_SERVER, CHASSIS_SERVER },
> - { FWTS_FACP_TABLET, CHASSIS_MOBILE }
> + { "Unspecified", FWTS_FACP_UNSPECIFIED, CHASSIS_OTHER },
> + { "Desktop", FWTS_FACP_DESKTOP, CHASSIS_DESKTOP },
> + { "Mobile", FWTS_FACP_MOBILE, CHASSIS_MOBILE },
> + { "Workstation", FWTS_FACP_WORKSTATION, CHASSIS_WORKSTATION },
> + { "Enterprise Server", FWTS_FACP_ENTERPRISE_SERVER, CHASSIS_SERVER },
> + { "SOHO Server", FWTS_FACP_SOHO_SERVER, CHASSIS_SERVER | CHASSIS_DESKTOP },
> + { "Appliance PC", FWTS_FACP_APPLIANCE_PC, CHASSIS_DESKTOP },
> + { "Performance Server", FWTS_FACP_PERFORMANCE_SERVER, CHASSIS_SERVER },
> + { "Tablet", FWTS_FACP_TABLET, CHASSIS_MOBILE }
> };
>
> /* Remapping table from buggy version numbers to correct values */
> @@ -300,8 +301,10 @@ static void dmi_decode_entry(fwts_framework *fw,
> int failed_count = fw->minor_tests.failed;
> int battery_count;
> int ret;
> + int both_ok;
> fwts_acpi_table_info *acpi_table;
> fwts_acpi_table_fadt *fadt;
> + bool advice_given = false;
>
> switch (hdr->type) {
> case 0: /* 7.1 */
> @@ -359,6 +362,7 @@ static void dmi_decode_entry(fwts_framework *fw,
> if (acpi_table == NULL)
> break;
> fadt = (fwts_acpi_table_fadt *)acpi_table->data;
> +
> if (fadt->preferred_pm_profile >=
> (sizeof(fwts_acpi_pm_profile_type) / sizeof(fwts_chassis_type_map))) {
> fwts_failed(fw, LOG_LEVEL_HIGH, DMI_INVALID_HARDWARE_ENTRY,
> @@ -371,18 +375,51 @@ static void dmi_decode_entry(fwts_framework *fw,
> (sizeof(fwts_dmi_chassis_type) / sizeof(fwts_chassis_type_map))) {
> fwts_failed(fw, LOG_LEVEL_HIGH, DMI_INVALID_HARDWARE_ENTRY,
> "Incorrect Chassis Type "
> - "SMBIOS Type 3 reports 0x%x ",
> + "SMBIOS Type 3 reports 0x%x",
> data[5]);
> break;
> }
> - if (!(fwts_acpi_pm_profile_type[fadt->preferred_pm_profile].mapped &
> - fwts_dmi_chassis_type[data[5]].mapped)) {
> +
> + /*
> + * LP: #1021674
> + * We should only check profile and chassis types when we know for sure
> + * that we can compare valid types togther. So it is only valid to do
> + * a check if both aren't CHASSIS_OTHER types
> + */
> + both_ok = (fwts_acpi_pm_profile_type[fadt->preferred_pm_profile].mapped != CHASSIS_OTHER) &
> + (fwts_dmi_chassis_type[data[5]].mapped != CHASSIS_OTHER);
> +
> + if ( both_ok &&
> + !(fwts_acpi_pm_profile_type[fadt->preferred_pm_profile].mapped &
> + fwts_dmi_chassis_type[data[5]].mapped)) {
> fwts_failed(fw, LOG_LEVEL_HIGH, DMI_INVALID_HARDWARE_ENTRY,
> - "Unmatched Chassis Type "
> - "SMBIOS Type 3 reports 0x%x "
> - "ACPI FACP reports 0x%x",
> + "Unmatched Chassis Type: "
> + "SMBIOS Type 3 reports 0x%x '%s' "
> + "ACPI FACP reports 0x%x '%s'",
> data[5],
> - fadt->preferred_pm_profile);
> + fwts_dmi_chassis_type[data[5]].name,
> + fadt->preferred_pm_profile,
> + fwts_acpi_pm_profile_type[fadt->preferred_pm_profile].name);
> + /*
> + * Make it a bit more wordy to explain the ramifications
> + */
> + fwts_advice(fw,
> + "The SMBIOS System Enclosure/Chassis type is defined as "
> + "0x%x '%s' where as the ACPI FACP reports the preferred "
> + "power management profile is 0x%x '%s' so we possibly "
> + "have conflicting definitions of the machine's PM profile "
> + "for the type of machine. "
> + "See Table 16 of section 4.5.1 of the SMBIOS specification "
> + "and Table 5-34 of section 5.2.9 of the ACPI specification "
> + "for more details. "
> + "This kind of mismatch may lead to incorrect power "
> + "management handling for the type of workload expected "
> + "for this hardware.",
> + data[5],
> + fwts_dmi_chassis_type[data[5]].name,
> + fadt->preferred_pm_profile,
> + fwts_acpi_pm_profile_type[fadt->preferred_pm_profile].name);
> + advice_given = true;
> }
> dmi_min_max_mask_uint8_check(fw, table, addr, "Chassis Lock", hdr, 0x5, 0x0, 0x1, 0x7, 0x1);
> dmi_str_check(fw, table, addr, "Version", hdr, 0x6);
> @@ -956,7 +993,7 @@ static void dmi_decode_entry(fwts_framework *fw,
> }
> if (fw->minor_tests.failed == failed_count)
> fwts_passed(fw, "Entry @ 0x%8.8x '%s'", addr, table);
> - else if (hdr->type <= 42)
> + else if (!advice_given && hdr->type <= 42)
> fwts_advice(fw,
> "It may be worth checking against section 7.%d of the "
> "System Management BIOS (SMBIOS) Reference Specification "
>
Acked-by: Ivan Hu<ivan.hu at canonical.com>
More information about the fwts-devel
mailing list