diff -Nru fwts-0.24.17/auto-packager/mkpackage.sh fwts-0.24.20/auto-packager/mkpackage.sh --- fwts-0.24.17/auto-packager/mkpackage.sh 2012-01-31 06:15:22.000000000 +0000 +++ fwts-0.24.20/auto-packager/mkpackage.sh 2012-02-10 01:55:32.000000000 +0000 @@ -23,8 +23,8 @@ # Get fwts sources, strip out .git directory, add in necessary debian packaging # files, build source package ready for upload. # -RELEASES="lucid maverick natty oneiric" -REPO=git://kernel.ubuntu.com/cking/fwts +RELEASES="lucid maverick natty oneiric precise" +REPO=git://kernel.ubuntu.com/hwe/fwts.git FWTS=fwts # diff -Nru fwts-0.24.17/debian/changelog fwts-0.24.20/debian/changelog --- fwts-0.24.17/debian/changelog 2012-01-31 09:41:10.000000000 +0000 +++ fwts-0.24.20/debian/changelog 2012-02-10 01:55:32.000000000 +0000 @@ -1,6 +1,40 @@ -fwts (0.24.17) precise; urgency=low +fwts (0.24.20) precise; urgency=low + + [Chris Van Hoof] + * debian: update fwts-frontend.install to include + fwts-frontend-text man page + * doc: addition of fwts-frontend-text man page + * src/Makefile: include fwts-frontend-text.1 to man_MANS + + [Keng-Yu Lin] + * auto-packager: change the git location + * auto-packager: add Precise release - New upstream version. (LP: #924192) + -- Keng-Yu Lin Thu, 09 Feb 2012 18:00:42 +0800 + +fwts (0.24.19) precise; urgency=low + + [Alex Hung] + * dmi: dmi_decode: check type 3 chassis type with acpi preferred_pm_profile + * dmi: dmi_decode: check acpi battery if type 22 is present. + * pcie: aspm: use FWTS_ROOT_PRIV flag + + [Colin Ian King] + * cpu: msr: GPF avoidance on BOCHs QEMU systems (LP: #925001) + + -- Keng-Yu Lin Thu, 09 Feb 2012 13:52:50 +0800 + +fwts (0.24.18) precise; urgency=low + + [Alex Hung] + * cpu:msr: fixed errors for checking SMRR MSR registers + + [Keng-Yu Lin] + * Fix a typo error of "DSTD" + + -- Keng-Yu Lin Mon, 06 Feb 2012 16:39:43 +0800 + +fwts (0.24.17) precise; urgency=low [Alex Hung] * pcie: aspm: add aspm option and detect if the diff -Nru fwts-0.24.17/debian/fwts-frontend.install fwts-0.24.20/debian/fwts-frontend.install --- fwts-0.24.17/debian/fwts-frontend.install 2012-01-31 06:15:22.000000000 +0000 +++ fwts-0.24.20/debian/fwts-frontend.install 2012-02-10 01:55:32.000000000 +0000 @@ -1,2 +1,3 @@ live-image/fwts-frontend-text usr/bin live-image/fwts-live-dialogrc usr/share/fwts +usr/share/man/man1/fwts-frontend-text.1 usr/share/man/man1 diff -Nru fwts-0.24.17/doc/fwts-frontend-text.1 fwts-0.24.20/doc/fwts-frontend-text.1 --- fwts-0.24.17/doc/fwts-frontend-text.1 1970-01-01 00:00:00.000000000 +0000 +++ fwts-0.24.20/doc/fwts-frontend-text.1 2012-02-10 01:55:32.000000000 +0000 @@ -0,0 +1,65 @@ +.\" Hey, EMACS: -*- nroff -*- +.\" First parameter, NAME, should be all caps +.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection +.\" other parameters are allowed: see man(7), man(1) +.TH FWTS-FRONTEND 1 "January 26, 2012" +.\" Please adjust this date whenever revising the manpage. +.\" +.\" Some roff macros, for reference: +.\" .nh disable hyphenation +.\" .hy enable hyphenation +.\" .ad l left justify +.\" .ad b justify to both left and right margins +.\" .nf disable filling +.\" .fi enable filling +.\" .br insert line break +.\" .sp insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +fwts-frontend-text \- text based interface to fwts. +.br + +.SH SYNOPSIS +.B fwts-frontend-text +.br + +.SH DESCRIPTION +This manual page briefly documents the +.B fwts-frontend-text +utility. +The tool +.B fwts-frontend-text +executes a user-friendly interface to the Firmware Test Suite, providing the +user a simple interface to execute all batch tests or the ability to select +individual tests to execute. +.B +fwts-frontend-text +should be run with root priviledge, for example using sudo. +.br +.LP +Running +.B +fwts-frontend-text +with the argument noautoshutdown will prevent the system +from shutting down after tests have been executed. +.P +.SH EXAMPLES +.LP +Execute fwts-frontend-text +.RS 8 +sudo fwts-frontend-text +.RE +.LP +Execute fwts-frontend-text and disable automatic shutdown +.RS 8 +sudo fwts-frontend-text noautoshutdown +.SH SEE ALSO +.BR fwts (1), +.BR dmidecode (8), +.BR lspci (8) +.SH AUTHOR +fwts-frontend-text was written by Colin King , +and Chris Van Hoof +.PP +This manual page was written by Chris Van Hoof , +for the Ubuntu project (but may be used by others). diff -Nru fwts-0.24.17/src/cpu/msr/msr.c fwts-0.24.20/src/cpu/msr/msr.c --- fwts-0.24.17/src/cpu/msr/msr.c 2012-01-31 06:15:22.000000000 +0000 +++ fwts-0.24.20/src/cpu/msr/msr.c 2012-02-10 01:55:32.000000000 +0000 @@ -30,6 +30,8 @@ static int msr_init(fwts_framework *fw) { + char *bios_vendor; + if ((cpuinfo = fwts_cpu_get_info(0)) == NULL) { fwts_log_error(fw, "Cannot get CPU info"); return FWTS_ERROR; @@ -45,6 +47,23 @@ fwts_log_error(fw, "Cannot detect the number of CPUs on this machine."); return FWTS_ABORTED; } + + /* + * Running MSR tests inside virtual machines such as QEMU with some kernel/kvm + * combinations have been observed to cause GPFs. We kludge around this by + * avoiding MSR tests for a Bochs BIOS based QEMU virtual machine. + */ + if ((bios_vendor = fwts_get("/sys/class/dmi/id/bios_vendor")) != NULL) { + if (strstr(bios_vendor, "Bochs")) { + fwts_log_error(fw, + "MSR test being avoiding inside a virtual machine as " + "this is known to cause General Protection Faults on " + "some configurations."); + free(bios_vendor); + return FWTS_SKIP; + } + free(bios_vendor); + } return FWTS_OK; } @@ -194,14 +213,14 @@ if (fwts_cpu_readmsr(0, 0x1f2, &val) == FWTS_OK) { uint64_t physbase = val & 0xfffff000; uint64_t type = val & 7; - if ((physbase % 0x7fffff) != 0) + if ((physbase & 0x7fffff) != 0) fwts_failed(fw, LOG_LEVEL_HIGH, "MSRSMRR_PHYSBASE8MBBoundary", "SMRR: SMRR_PHYSBASE is NOT on an 8MB boundary: %llx.", (unsigned long long)physbase); if (type != 6) fwts_failed(fw, LOG_LEVEL_HIGH, "MSRSMRR_TYPE", "SMRR: SMRR_TYPE is 0x%x, should be 0x6 (Write-Back).", (int)type); } - if (fwts_cpu_readmsr(0, 0x1f2, &val) == FWTS_OK) { + if (fwts_cpu_readmsr(0, 0x1f3, &val) == FWTS_OK) { uint64_t physmask = val & 0xfffff000; uint64_t valid = (val >> 11) & 1; diff -Nru fwts-0.24.17/src/dmi/dmi_decode/dmi_decode.c fwts-0.24.20/src/dmi/dmi_decode/dmi_decode.c --- fwts-0.24.17/src/dmi/dmi_decode/dmi_decode.c 2012-01-31 06:15:22.000000000 +0000 +++ fwts-0.24.20/src/dmi/dmi_decode/dmi_decode.c 2012-02-10 01:55:32.000000000 +0000 @@ -49,11 +49,18 @@ #define DMI_ILLEGAL_MAPPED_ADDR_RANGE "DMIIllegalMappedAddrRange" #define DMI_MGMT_CTRL_HOST_TYPE "DMIMgmtCtrlHostType" #define DMI_INVALID_ENTRY_LENGTH "DMIInvalidEntryLength" +#define DMI_INVALID_HARDWARE_ENTRY "DMIInvalidHardwareEntry" #define GET_UINT16(x) (uint16_t)(*(const uint16_t *)(x)) #define GET_UINT32(x) (uint32_t)(*(const uint32_t *)(x)) #define GET_UINT64(x) (uint64_t)(*(const uint64_t *)(x)) +#define CHASSIS_OTHER 0x00 +#define CHASSIS_DESKTOP 0x01 +#define CHASSIS_WORKSTATION 0x02 +#define CHASSIS_MOBILE 0x04 +#define CHASSIS_SERVER 0x08 + typedef struct { const char *label; const char *field; @@ -65,6 +72,11 @@ uint16_t new; } fwts_dmi_version; +typedef struct { + uint8_t original; + uint8_t mapped; +} fwts_chassis_type_map; + static const fwts_dmi_pattern dmi_patterns[] = { { "DMISerialNumber", "Serial Number", "0123456789" }, { "DMIAssetTag", "Asset Tag", "1234567890" }, @@ -77,6 +89,51 @@ NULL, }; +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 } +}; + +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 } +}; + /* Remapping table from buggy version numbers to correct values */ static const fwts_dmi_version dmi_versions[] = { { 0x021f, 0x0203 }, @@ -241,6 +298,10 @@ int i; int len; int failed_count = fw->minor_tests.failed; + int battery_count; + int ret; + fwts_acpi_table_info *acpi_table; + fwts_acpi_table_fadt *fadt; switch (hdr->type) { case 0: /* 7.1 */ @@ -293,6 +354,36 @@ break; dmi_str_check(fw, table, addr, "Manufacturer", hdr, 0x4); dmi_min_max_mask_uint8_check(fw, table, addr, "Chassis Type", hdr, 0x5, 0x1, 0x1d, 0x0, 0x7f); + if (fwts_acpi_find_table(fw, "FACP", 0, &acpi_table) != FWTS_OK) + break; + 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, + "Incorrect Chassis Type " + "ACPI FACP reports %x", + fadt->preferred_pm_profile); + break; + } + if (data[5] >= + (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 %x ", + data[5]); + break; + } + if (!(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 %x " + "ACPI FACP reports %x", + data[5], + fadt->preferred_pm_profile); + } 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); dmi_str_check(fw, table, addr, "Serial Number", hdr, 0x7); @@ -644,7 +735,7 @@ "(range allowed 0x01..0x08, 0xa0..0xa2) " "while accessing '%s', field '%s', offset 0x%2.2x", data[0x5], table, "Interface", 0x5); -} + } break; case 22: /* 7.23 */ @@ -666,8 +757,14 @@ break; if (data[0x09] == 0x02) dmi_str_check(fw, table, addr, "SBDS Device Chemistry", hdr, 0x14); - break; + ret = fwts_battery_get_count(fw, &battery_count); + if (ret != FWTS_OK || battery_count < 1) { + fwts_failed(fw, LOG_LEVEL_MEDIUM, DMI_INVALID_HARDWARE_ENTRY, + "Invalid Hardware Configuration " + "(no battery found) "); + } + break; case 23: /* 7.24 */ table = "System Reset (Type 23)"; if (hdr->length < 0x0D) diff -Nru fwts-0.24.17/src/lib/include/fwts_acpi.h fwts-0.24.20/src/lib/include/fwts_acpi.h --- fwts-0.24.17/src/lib/include/fwts_acpi.h 2012-01-31 06:15:22.000000000 +0000 +++ fwts-0.24.20/src/lib/include/fwts_acpi.h 2012-02-10 01:55:32.000000000 +0000 @@ -22,6 +22,16 @@ #define FWTS_ACPI_TABLES_PATH "/sys/firmware/acpi/tables" +#define FWTS_FACP_UNSPECIFIED (0x00) +#define FWTS_FACP_DESKTOP (0x01) +#define FWTS_FACP_MOBILE (0x02) +#define FWTS_FACP_WORKSTATION (0x03) +#define FWTS_FACP_ENTERPRISE_SERVER (0x04) +#define FWTS_FACP_SOHO_SERVER (0x05) +#define FWTS_FACP_APPLIANCE_PC (0x06) +#define FWTS_FACP_PERFORMANCE_SERVER (0x07) +#define FWTS_FACP_TABLET (0x08) + #define FWTS_FACP_IAPC_BOOT_ARCH_LEGACY_DEVICES (0x0001) #define FWTS_FACP_IAPC_BOOT_ARCH_8042 (0x0002) #define FWTS_FACP_IAPC_BOOT_ARCH_VGA_NOT_PRESENT (0x0004) diff -Nru fwts-0.24.17/src/lib/include/fwts_smbios.h fwts-0.24.20/src/lib/include/fwts_smbios.h --- fwts-0.24.17/src/lib/include/fwts_smbios.h 2012-01-31 06:15:22.000000000 +0000 +++ fwts-0.24.20/src/lib/include/fwts_smbios.h 2012-02-10 01:55:32.000000000 +0000 @@ -27,6 +27,37 @@ #define FWTS_SMBIOS_REGION_END (0x000fffff) #define FWTS_SMBIOS_REGION_SIZE (FWTS_SMBIOS_REGION_END - FWTS_SMBIOS_REGION_START) +#define FWTS_SMBIOS_CHASSIS_INVALID (0x00) +#define FWTS_SMBIOS_CHASSIS_OTHER (0X01) +#define FWTS_SMBIOS_CHASSIS_UNKNOWN (0x02) +#define FWTS_SMBIOS_CHASSIS_DESKTOP (0x03) +#define FWTS_SMBIOS_CHASSIS_LOW_PROFILE_DESKTOP (0x04) +#define FWTS_SMBIOS_CHASSIS_PIZZA_BOX (0x05) +#define FWTS_SMBIOS_CHASSIS_MINI_TOWER (0x06) +#define FWTS_SMBIOS_CHASSIS_TOWER (0x07) +#define FWTS_SMBIOS_CHASSIS_PORTABLE (0x08) +#define FWTS_SMBIOS_CHASSIS_LAPTOP (0x09) +#define FWTS_SMBIOS_CHASSIS_NOTEBOOK (0x0A) +#define FWTS_SMBIOS_CHASSIS_HANDHELD (0x0B) +#define FWTS_SMBIOS_CHASSIS_DOCKING_STATION (0x0C) +#define FWTS_SMBIOS_CHASSIS_ALL_IN_ONE (0x0D) +#define FWTS_SMBIOS_CHASSIS_SUB_NOTEBOOK (0x0E) +#define FWTS_SMBIOS_CHASSIS_SPACE_SAVING (0x0F) +#define FWTS_SMBIOS_CHASSIS_LUNCH_BOX (0x10) +#define FWTS_SMBIOS_CHASSIS_MAIN_SERVER_CHASSIS (0x11) +#define FWTS_SMBIOS_CHASSIS_EXPANISON_CHASSIS (0x12) +#define FWTS_SMBIOS_CHASSIS_SUB_CHASSIS (0x13) +#define FWTS_SMBIOS_CHASSIS_BUS_EXPANSION_CHASSIS (0x14) +#define FWTS_SMBIOS_CHASSIS_PERIPHERAL_CHASSIS (0x15) +#define FWTS_SMBIOS_CHASSIS_RAID_CHASSIS (0x16) +#define FWTS_SMBIOS_CHASSIS_RACK_MOUNT_CHASSIS (0x17) +#define FWTS_SMBIOS_CHASSIS_SEALED_CASE_PC (0x18) +#define FWTS_SMBIOS_CHASSIS_MULTI_SYSTEM_CHASSIS (0x19) +#define FWTS_SMBIOS_CHASSIS_COMPACT_PCI (0x1A) +#define FWTS_SMBIOS_CHASSIS_ADVANCED_TCA (0x1B) +#define FWTS_SMBIOS_CHASSIS_BLADE (0x1C) +#define FWTS_SMBIOS_CHASSIS_BLASE_ENCLOSURE (0x1D) + typedef enum { FWTS_SMBIOS_UNKNOWN = -1, FWTS_SMBIOS_DMI_LEGACY = 0, diff -Nru fwts-0.24.17/src/lib/include/fwts_version.h fwts-0.24.20/src/lib/include/fwts_version.h --- fwts-0.24.17/src/lib/include/fwts_version.h 2012-01-31 06:15:22.000000000 +0000 +++ fwts-0.24.20/src/lib/include/fwts_version.h 2012-02-10 01:55:32.000000000 +0000 @@ -16,5 +16,5 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ -#define FWTS_VERSION "V0.24.17" -#define FWTS_DATE "Tue Jan 31 14:10:02 CST 2012" +#define FWTS_VERSION "V0.24.20" +#define FWTS_DATE "Fri Feb 10 09:39:03 CST 2012" diff -Nru fwts-0.24.17/src/lib/src/fwts_iasl.c fwts-0.24.20/src/lib/src/fwts_iasl.c --- fwts-0.24.17/src/lib/src/fwts_iasl.c 2012-01-31 06:15:22.000000000 +0000 +++ fwts-0.24.20/src/lib/src/fwts_iasl.c 2012-02-10 01:55:32.000000000 +0000 @@ -119,7 +119,7 @@ return FWTS_ERROR; } if (ret == FWTS_OK) - printf("Disassembled DSTD to DSDT.dsl\n"); + printf("Disassembled DSDT to DSDT.dsl\n"); for (i=0; ;i++) { char filename[PATH_MAX]; diff -Nru fwts-0.24.17/src/Makefile.am fwts-0.24.20/src/Makefile.am --- fwts-0.24.17/src/Makefile.am 2012-01-31 06:15:22.000000000 +0000 +++ fwts-0.24.20/src/Makefile.am 2012-02-10 01:55:32.000000000 +0000 @@ -74,4 +74,4 @@ -Llib/src -lfwts \ -L$(top_srcdir)/src/acpica -lfwtsacpica -man_MANS = ../doc/fwts.1 ../doc/fwts-collect.1 +man_MANS = ../doc/fwts.1 ../doc/fwts-collect.1 ../doc/fwts-frontend-text.1 diff -Nru fwts-0.24.17/src/pci/aspm/aspm.c fwts-0.24.20/src/pci/aspm/aspm.c --- fwts-0.24.17/src/pci/aspm/aspm.c 2012-01-31 06:15:22.000000000 +0000 +++ fwts-0.24.20/src/pci/aspm/aspm.c 2012-02-10 01:55:32.000000000 +0000 @@ -75,4 +75,4 @@ .minor_tests = aspm_tests }; -FWTS_REGISTER(aspm, &aspm_ops, FWTS_TEST_ANYTIME, FWTS_BATCH); +FWTS_REGISTER(aspm, &aspm_ops, FWTS_TEST_ANYTIME, FWTS_BATCH | FWTS_ROOT_PRIV);