diff -Nru fwts-0.20.03/config.h.in fwts-0.20.10/config.h.in --- fwts-0.20.03/config.h.in 2010-12-03 15:49:43.000000000 +0000 +++ fwts-0.20.10/config.h.in 2010-12-15 11:33:48.000000000 +0000 @@ -36,6 +36,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_JSON_JSON_H +/* Define to 1 if you have the `pcre' library (-lpcre). */ +#undef HAVE_LIBPCRE + /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H diff -Nru fwts-0.20.03/configure fwts-0.20.10/configure --- fwts-0.20.03/configure 2010-12-03 15:49:43.000000000 +0000 +++ fwts-0.20.10/configure 2010-12-15 11:33:48.000000000 +0000 @@ -4935,7 +4935,12 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcre_pcre_compile" >&5 $as_echo "$ac_cv_lib_pcre_pcre_compile" >&6; } if test "x$ac_cv_lib_pcre_pcre_compile" = x""yes; then : - json + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBPCRE 1 +_ACEOF + + LIBS="-lpcre $LIBS" + fi for ac_header in stdlib.h diff -Nru fwts-0.20.03/configure.ac fwts-0.20.10/configure.ac --- fwts-0.20.03/configure.ac 2010-12-03 15:49:43.000000000 +0000 +++ fwts-0.20.10/configure.ac 2010-12-15 11:33:48.000000000 +0000 @@ -54,7 +54,7 @@ AC_CHECK_HEADERS([sys/ioctl.h]) AC_CHECK_HEADERS([sys/time.h]) AC_CHECK_HEADERS([json/json.h]) - AC_CHECK_LIB(pcre, pcre_compile, json) + AC_CHECK_LIB(pcre, pcre_compile) AC_FUNC_MALLOC AC_FUNC_FORK AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK diff -Nru fwts-0.20.03/data/klog.json fwts-0.20.10/data/klog.json --- fwts-0.20.03/data/klog.json 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/data/klog.json 2010-12-15 11:33:48.000000000 +0000 @@ -568,13 +568,6 @@ "compare_mode": "regex", "log_level": "LOG_LEVEL_HIGH", "tag": "FWTS_TAG_ACPI", - "pattern": "\\[Firmware Bug\\]: ACPI:", - "advice": "ACPI driver has detected an ACPI bug. This generally points to a bug in an ACPI table. Examine the kernel log for more details." - }, - { - "compare_mode": "regex", - "log_level": "LOG_LEVEL_HIGH", - "tag": "FWTS_TAG_ACPI", "pattern": "\\[Firmware Bug\\]: BIOS needs update for CPU frequency support", "advice": "Having _PPC but missing frequencies (_PSS, _PCT) is a good hint that the BIOS is older than the CPU and does not know the CPU frequencies." }, @@ -605,6 +598,34 @@ "tag": "FWTS_TAG_ACPI_BRIGHTNESS", "pattern": "\\[Firmware Bug\\]:.*_BCQ is used instead of _BQC", "advice": "ACPI Method _BCQ was defined (typo) instead of _BQC - this should be fixed.however the kernel has detected this and is working around this typo." + }, + { + "compare_mode": "regex", + "log_level": "LOG_LEVEL_HIGH", + "tag": "FWTS_TAG_BIOS_IRQ", + "pattern": "BIOS bug.*timer not connected to IO-APIC", + "advice": "The BIOS is reporting the ExtINTA I/O APIC input from the cascaded 8259A as the timer interrupt input. The kernel has detected just one pin, so it has to check the timer directly and through the 8259A because of the broken BIOS reporting." + }, + { + "compare_mode": "regex", + "log_level": "LOG_LEVEL_HIGH", + "tag": "FWTS_TAG_BIOS_IRQ", + "pattern": "BIOS bug,.*IO-APIC.*ID is.*in the MPC table.*", + "advice": "The IO-APIC id in the MPC table is wrong and the kernel has detected this and attempted to fix it. The MPC table in the firmware needs to be fixed." + }, + { + "compare_mode": "regex", + "log_level": "LOG_LEVEL_HIGH", + "tag": "FWTS_TAG_BIOS_IRQ", + "pattern": "BIOS bug,.*IO-APIC.*ID is already used!", + "advice": "The IO-APIC id has been defined more than once in the MPC table, which is a firmware bug and should be fixed. The kernel has detected this and skopped this duplication to avoid stuck on smp_invalidate_needed IPI wait' messages." + }, + { + "compare_mode": "regex", + "log_level": "LOG_LEVEL_CRITICAL", + "tag": "FWTS_TAG_BIOS", + "pattern": "WARNING.*BIOS bug.*CPU MTRRs don't cover all of memory, losing", + "advice": "The Memory Type Range Registers (MTRRs) which define memory caching policy are misconfigued by the BIOS and don't appear to cover all available physical memory. The kernel has detected this and has reduced the amount of memory available to be safe. Either check that the BIOS memory caching options are set correctly or contact your BIOS vendor to get this fixed." }, { "compare_mode": "regex", @@ -615,6 +636,20 @@ }, { "compare_mode": "regex", + "log_level": "LOG_LEVEL_HIGH", + "tag": "FWTS_TAG_ACPI", + "pattern": "WARNING:.*bogus zero IO-APIC address found in MPTABLE", + "advice": "An IO-APIC address of zero has been found in the MPTABLE and is thus treated as misconfigured or bogus. I/O APIC support has been disabled. This is considered a firmware bug and the MPTABLE needs to be fixed." + }, + { + "compare_mode": "regex", + "log_level": "LOG_LEVEL_HIGH", + "tag": "FWTS_TAG_ACPI", + "pattern": "WARNING:.*Bogus.*APIC address found in table", + "advice": "An IO-APIC address of zero has been found in the MPTABLE and is thus treated as misconfigured or bogus. I/O APIC support has been disabled. This is considered a firmware bug and the MPTABLE needs to be fixed." + }, + { + "compare_mode": "regex", "log_level": "LOG_LEVEL_MEDIUM", "tag": "FWTS_TAG_ACPI", "pattern": "\\[Firmware Bug\\]:.*Duplicate ACPI video bus", @@ -636,6 +671,20 @@ }, { "compare_mode": "regex", + "log_level": "LOG_LEVEL_INFO", + "tag": "FWTS_TAG_ACPI", + "pattern": "\\[Firmware Bug\\]:.*_OSI.*Linux.*ignored", + "advice": "This is not exactly a failure mode but a warning from the kernel. The _OSI() method has implemented a match to the 'Linux' query in the DSDT and this is redundant because the ACPI driver matches onto the Windows _OSI strings by default." + }, + { + "compare_mode": "regex", + "log_level": "LOG_LEVEL_HIGH", + "tag": "FWTS_TAG_ACPI", + "pattern": "\\[Firmware Bug\\]: ACPI:", + "advice": "ACPI driver has detected an ACPI bug. This generally points to a bug in an ACPI table. Examine the kernel log for more details." + }, + { + "compare_mode": "regex", "log_level": "LOG_LEVEL_HIGH", "tag": "FWTS_TAG_ACPI", "pattern": "\\[Firmware Bug\\]:.*", diff -Nru fwts-0.20.03/debian/changelog fwts-0.20.10/debian/changelog --- fwts-0.20.03/debian/changelog 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/debian/changelog 2010-12-15 11:33:48.000000000 +0000 @@ -1,3 +1,63 @@ +fwts (0.20.10) natty; urgency=low + + * New version for release (LP: #690598) + * Fix a couple of memory leaks + * Add MTRR misconfiguration klog checks + * oscilinux: make test a warning rather than a low failure + * klog, only scan unique error messages and report repeats, reduces noise + * _OSI(Linux) klog errors logged as just information rather than an error + * New upstream version 0.20.10 + + -- Colin King Wed, 15 Dec 2010 11:27:27 +0000 + +fwts (0.20.09) natty; urgency=low + + * show available tests in short form + * don't display progress on interactive tests + * New upstream version 0.20.09 + + -- Colin King Wed, 15 Dec 2010 00:01:23 +0000 + +fwts (0.20.08) natty; urgency=low + + * method test: check for null object returns. + * New upstream version 0.20.08 + + -- Colin King Thu, 9 Dec 2010 15:05:44 +0000 + +fwts (0.20.07) natty; urgency=low + + * s4 test: only attempt to hibernate if swap is available + * klog test: only dump advice if it's available. + * More info in _WAK test failure + * New upstream version 0.20.07 + + -- Colin King Thu, 9 Dec 2010 09:15:00 +0000 + +fwts (0.20.06) natty; urgency=low + + * Fix hangs on corrupt input ACPI table data + * Add some IO APIC kernel log scanning checks + * New upstream version 0.20.06 + + -- Colin King Tue, 7 Dec 2010 11:53:00 +0000 + +fwts (0.20.05) natty; urgency=low + + * Add --lp-tags-log option to log LP tags into the results log + * Make --lp-tags just dump out all LP tags found in testing + * New upstream version 0.20.05 + + -- Colin King Sat, 4 Dec 2010 19:22:39 +0000 + +fwts (0.20.04) natty; urgency=low + + * Fix stack smashing on corrupt ACPI dumped data input + * Add -j, --json-data-path options + * New upstream version 0.20.04 + + -- Colin King Sat, 4 Dec 2010 01:12:22 +0000 + fwts (0.20.03) natty; urgency=low * Changes to run successfully on UEFI systems. diff -Nru fwts-0.20.03/doc/fwts.1 fwts-0.20.10/doc/fwts.1 --- fwts-0.20.03/doc/fwts.1 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/doc/fwts.1 2010-12-15 11:33:48.000000000 +0000 @@ -116,6 +116,10 @@ .B \-\-interactive\-experimental run only interactive experimental tests. .TP +.B \-j, \-\-json\-data\-path +specifies the path to the fwts json data files. These files contain json formatted +configuation tables, for example klog scanning patterns. +.TP .B \-k, \-\-klog=file read the kernel log from the specified file rather than from the kernel log ring buffer. This allows one to run the kernel log scanning tests such as klog against pre-gathered log data. @@ -151,6 +155,15 @@ .br e.g. \-\-log\-format="%date %time [%field] (%owner): " .TP +.B \-\-lp\-tags +run tests and just output LaunchPad bug triaging tags relevant to the +classification of the errors found, no other information is output. +.TP +.B \-\-lp\-tags\-log +run tests and at the end of each test output LaunchPad bug triaging tags relevant +to the classifications of teh errors found. At the end of all the tests a summary +of all tags picked up by all the tests is output. +.TP .B \-\-lspci=path specify the full path and filename to the the lspci binary. .TP diff -Nru fwts-0.20.03/src/acpi/acpidump/acpidump.c fwts-0.20.10/src/acpi/acpidump/acpidump.c --- fwts-0.20.03/src/acpi/acpidump/acpidump.c 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/src/acpi/acpidump/acpidump.c 2010-12-15 11:33:48.000000000 +0000 @@ -304,7 +304,7 @@ FIELD_END }; - if (length < (sizeof(fwts_acpi_table_header) + 4)) { + if (length < (int)(sizeof(fwts_acpi_table_header) + 4)) { fwts_log_info(fw, "Boot table too short\n"); return; } @@ -685,7 +685,7 @@ data += sizeof(fwts_acpi_table_madt); length -= sizeof(fwts_acpi_table_madt); - while (length > sizeof(fwts_acpi_madt_sub_table_header)) { + while (length > (int)sizeof(fwts_acpi_madt_sub_table_header)) { int skip = 0; fwts_acpi_madt_sub_table_header *hdr = (fwts_acpi_madt_sub_table_header*)data; diff -Nru fwts-0.20.03/src/acpi/acpiinfo/acpiinfo.c fwts-0.20.10/src/acpi/acpiinfo/acpiinfo.c --- fwts-0.20.03/src/acpi/acpiinfo/acpiinfo.c 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/src/acpi/acpiinfo/acpiinfo.c 2010-12-15 11:33:48.000000000 +0000 @@ -30,7 +30,7 @@ #include #include -static void acpiinfo_check(fwts_framework *fw, char *line, char *prevline, void *private, int *errors) +static void acpiinfo_check(fwts_framework *fw, char *line, int repeated, char *prevline, void *private, int *errors) { if (strstr(line, "ACPI: Subsystem revision")!=NULL) { char *version = strstr(line,"sion "); diff -Nru fwts-0.20.03/src/acpi/acpitables/acpitables.c fwts-0.20.10/src/acpi/acpitables/acpitables.c --- fwts-0.20.03/src/acpi/acpitables/acpitables.c 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/src/acpi/acpitables/acpitables.c 2010-12-15 11:33:48.000000000 +0000 @@ -235,7 +235,7 @@ data += sizeof(fwts_acpi_table_madt); length -= sizeof(fwts_acpi_table_madt); - while (length > sizeof(fwts_acpi_madt_sub_table_header)) { + while (length > (int)sizeof(fwts_acpi_madt_sub_table_header)) { int skip = 0; i++; fwts_acpi_madt_sub_table_header *hdr = (fwts_acpi_madt_sub_table_header*)data; diff -Nru fwts-0.20.03/src/acpi/dmar/dmar.c fwts-0.20.10/src/acpi/dmar/dmar.c --- fwts-0.20.03/src/acpi/dmar/dmar.c 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/src/acpi/dmar/dmar.c 2010-12-15 11:33:48.000000000 +0000 @@ -276,7 +276,7 @@ return FWTS_OK; } -static void acpiinfo_check(fwts_framework *fw, char *line, char *prevline, void *private, int *errors) +static void acpiinfo_check(fwts_framework *fw, char *line, int repeated, char *prevline, void *private, int *errors) { if (strstr(line, "DMAR:[fault reason")) fwts_failed(fw, "Found DMAR error: %s", line); diff -Nru fwts-0.20.03/src/acpi/klog/klog.c fwts-0.20.10/src/acpi/klog/klog.c --- fwts-0.20.03/src/acpi/klog/klog.c 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/src/acpi/klog/klog.c 2010-12-15 11:33:48.000000000 +0000 @@ -70,7 +70,7 @@ if (errors > 0) /* Checks will log errors as failures automatically */ - fwts_log_info(fw, "Found %d errors in kernel log.", errors); + fwts_log_info(fw, "Found %d unique errors in kernel log.", errors); else fwts_passed(fw, "Found no errors in kernel log."); diff -Nru fwts-0.20.03/src/acpi/method/method.c fwts-0.20.10/src/acpi/method/method.c --- fwts-0.20.03/src/acpi/method/method.c 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/src/acpi/method/method.c 2010-12-15 11:33:48.000000000 +0000 @@ -237,7 +237,14 @@ static int method_check_type__(fwts_framework *fw, char *name, ACPI_BUFFER *buf, int type, char *type_name) { - ACPI_OBJECT *obj = buf->Pointer; + ACPI_OBJECT *obj; + + if ((buf == NULL) || (buf->Pointer == NULL)){ + fwts_failed(fw, "Method %s returned a NULL object, and did not return %s.", name, type_name); + return FWTS_ERROR; + } + + obj = buf->Pointer; if (obj->Type != type) { fwts_failed(fw, "Method %s did not return %s.", name, type_name); @@ -857,7 +864,9 @@ "This can confuse the operating system as this _WAK return indicates that the " "S-state was not entered because of too much current being drawn from the " "power supply, however, the BIOS may have actually entered this state and the " - "_WAK method is misinforming the operating system."); + "_WAK method is misinforming the operating system. Currently Linux does not " + "check for the return type from _WAK, so it should theoretically not affect the " + "operation of suspend/resume."); failed++; } diff -Nru fwts-0.20.03/src/acpi/osilinux/osilinux.c fwts-0.20.10/src/acpi/osilinux/osilinux.c --- fwts-0.20.03/src/acpi/osilinux/osilinux.c 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/src/acpi/osilinux/osilinux.c 2010-12-15 11:33:48.000000000 +0000 @@ -79,14 +79,13 @@ if (strstr(line, "}")) { depth--; if (dumpdepth != 0 && dumpdepth != depth) { - fwts_log_warning(fw, "WARNING: Found _OSI(\"Linux\")."); found++; while (dumpitem != NULL && dumpitem != item->next) { fwts_log_warning_verbatum(fw, "%s", fwts_text_list_text(dumpitem)); dumpitem = dumpitem->next; } dumpdepth = 0; - fwts_failed_low(fw, "DSDT implements a deprecated _OSI(\"Linux\") test."); + fwts_warning(fw, "DSDT implements a deprecated _OSI(\"Linux\") test."); } } if ((str = strstr(line, "_OSI")) != NULL) { diff -Nru fwts-0.20.03/src/acpi/s4/s4.c fwts-0.20.10/src/acpi/s4/s4.c --- fwts-0.20.03/src/acpi/s4/s4.c 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/src/acpi/s4/s4.c 2010-12-15 11:33:48.000000000 +0000 @@ -35,17 +35,27 @@ static int s4_init(fwts_framework *fw) { + fwts_list* swap_devs; + if (fwts_klog_clear()) { fwts_log_error(fw, "Cannot clear kernel log."); return FWTS_ERROR; } + swap_devs = fwts_file_open_and_read("/proc/swaps"); + if (fwts_text_list_strstr(swap_devs, "/dev/") == NULL) { + fwts_list_free(swap_devs, free); + fwts_failed(fw, "Cannot run hibernate test - machine appears to have NO swap."); + return FWTS_ERROR; + } + fwts_list_free(swap_devs, free); + if (fwts_wakealarm_test_firing(fw, 1)) { fwts_log_error(fw, "Cannot automatically wake machine up - aborting S4 test."); fwts_failed(fw, "Check if wakealarm works reliably for S4 tests."); return FWTS_ERROR; } - + return FWTS_OK; } diff -Nru fwts-0.20.03/src/acpica/Makefile.am fwts-0.20.10/src/acpica/Makefile.am --- fwts-0.20.03/src/acpica/Makefile.am 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/src/acpica/Makefile.am 2010-12-15 11:33:48.000000000 +0000 @@ -7,7 +7,7 @@ ACPICA_COMP = $(ACPICA_SRC)/components -AM_CPPFLAGS = -D_LINUX -DNDEBUG -D_CONSOLE -DACPI_EXEC_APP -I$(top_srcdir)/src/lib/include -I$(ACPICA_SRC)/include -Wall $(CFLAGS) +AM_CPPFLAGS = -D_LINUX -DNDEBUG -D_CONSOLE -DACPI_EXEC_APP -I$(top_srcdir)/src/lib/include -I$(ACPICA_SRC)/include -Wall noinst_LIBRARIES = libacpica.a libacpica_a_SOURCES = \ diff -Nru fwts-0.20.03/src/acpica/Makefile.in fwts-0.20.10/src/acpica/Makefile.in --- fwts-0.20.03/src/acpica/Makefile.in 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/src/acpica/Makefile.in 2010-12-15 11:33:48.000000000 +0000 @@ -211,7 +211,7 @@ ACPICA_TOOLS = $(ACPICA_SRC)/tools ACPICA_OSL = $(ACPICA_SRC)/os_specific/service_layers ACPICA_COMP = $(ACPICA_SRC)/components -AM_CPPFLAGS = -D_LINUX -DNDEBUG -D_CONSOLE -DACPI_EXEC_APP -I$(top_srcdir)/src/lib/include -I$(ACPICA_SRC)/include -Wall $(CFLAGS) +AM_CPPFLAGS = -D_LINUX -DNDEBUG -D_CONSOLE -DACPI_EXEC_APP -I$(top_srcdir)/src/lib/include -I$(ACPICA_SRC)/include -Wall noinst_LIBRARIES = libacpica.a libacpica_a_SOURCES = \ $(ACPICA_COMP)/debugger/dbcmds.c \ diff -Nru fwts-0.20.03/src/cmos/cmosdump/cmosdump.c fwts-0.20.10/src/cmos/cmosdump/cmosdump.c --- fwts-0.20.03/src/cmos/cmosdump/cmosdump.c 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/src/cmos/cmosdump/cmosdump.c 2010-12-15 11:33:48.000000000 +0000 @@ -129,7 +129,7 @@ unsigned char data[0x80]; /* Read CMOS Data */ - for (i=0;i #include #include @@ -223,7 +222,6 @@ printf("\nTotal of %d tests\n", total); } - /* * fwts_framework_strtrunc() * truncate overlong string @@ -300,7 +298,7 @@ progress += (float)(percent) * process_percent; /* Feedback required? */ - if (fw->flags & FWTS_FRAMEWORK_FLAGS_SHOW_PROGRESS) { + if (fw->show_progress) { int percent; char buf[55]; @@ -331,7 +329,6 @@ } } - /* * fwts_framework_underline() * underlining into log @@ -351,7 +348,7 @@ { int i; - for (i=0;iresults); + if (!(fw->flags & FWTS_FRAMEWORK_FLAGS_LP_TAGS)) + fwts_log_newline(fw->results); return FWTS_OK; } @@ -442,6 +440,8 @@ fw->current_ops = test->ops; fw->current_minor_test_num = 1; + fw->show_progress = (fw->flags & FWTS_FRAMEWORK_FLAGS_SHOW_PROGRESS) && + (FWTS_TEST_INTERACTIVE(test->flags) == 0); /* Not a utility test?, then we require a test summary at end of the test run */ if (!(test->flags & FWTS_UTILS)) @@ -450,7 +450,7 @@ if (test->ops->headline) { fwts_log_heading(fw, "%s", test->ops->headline()); fwts_framework_underline(fw,'-'); - if (fw->flags & FWTS_FRAMEWORK_FLAGS_SHOW_PROGRESS) { + if (fw->show_progress) { char buf[70]; fwts_framework_strtrunc(buf, test->ops->headline(), sizeof(buf)); fprintf(stderr, "Test: %-70.70s\n", buf); @@ -468,7 +468,7 @@ fw->major_tests.skipped++; fw->total.skipped++; } - if (fw->flags & FWTS_FRAMEWORK_FLAGS_SHOW_PROGRESS) + if (fw->show_progress) fprintf(stderr, " Test skipped.\n"); } else { @@ -477,7 +477,7 @@ fw->major_tests.aborted++; fw->total.aborted++; } - if (fw->flags & FWTS_FRAMEWORK_FLAGS_SHOW_PROGRESS) + if (fw->show_progress) fprintf(stderr, " Test aborted.\n"); } if (!(test->flags & FWTS_UTILS)) @@ -506,8 +506,8 @@ fw->major_tests.warning += fw->minor_tests.warning; fw->major_tests.skipped += fw->minor_tests.skipped; - if (fw->flags & FWTS_FRAMEWORK_FLAGS_SHOW_PROGRESS) { - char resbuf[80]; + if (fw->show_progress) { + char resbuf[128]; char namebuf[55]; fwts_framework_format_results(resbuf, sizeof(resbuf), &fw->minor_tests); fwts_framework_strtrunc(namebuf, minor_test->name, sizeof(namebuf)); @@ -526,7 +526,9 @@ if (test->ops->deinit) test->ops->deinit(fw); - fwts_tag_report(fw, fw->test_taglist); + if (fw->flags & FWTS_FRAMEWORK_FLAGS_LP_TAGS_LOG) + fwts_tag_report(fw, LOG_TAG, fw->test_taglist); + fwts_list_free(fw->test_taglist, free); fw->test_taglist = NULL; @@ -733,6 +735,7 @@ { "--iasl=path", "Specify path to iasl." }, { "-i, --interactive", "Just run Interactive tests." }, { "--interactive-experimental", "Just run Interactive Experimental tests." }, + { "-j, --json-data-path", "Path to fwts json data files." }, { "-k, --klog=file", "Specify kernel log file rather than reading it" }, { "", "from the kernel." }, { "--log-fields", "Show available log filtering fields." }, @@ -747,7 +750,8 @@ { "\t\t\%owner - name of test program", NULL }, { "\t\t\%level - failure test level", NULL }, { "\t\t\%line - log line number", NULL }, - { "--lp-tags", "Output LaunchPad bug tags." }, + { "--lp-tags", "Output just LaunchPad bug tags." }, + { "--lp-tags-log", "Output LaunchPad bug tags in results log." }, { "--lspci=path", "Specify path to lspci." }, { "--no-s3", "Don't run S3 suspend/resume tests." }, { "", " deprecated, use --skip-test=s3 instead." }, @@ -833,7 +837,8 @@ fwts_log_info(fw, "Running tests: %s.\n", fwts_list_len(tests_to_run) == 0 ? "None" : tests); - fwts_log_newline(fw->results); + if (!(fw->flags & FWTS_FRAMEWORK_FLAGS_LP_TAGS)) + fwts_log_newline(fw->results); free(tests); } } @@ -925,6 +930,8 @@ { "lp-tags", 0, 0, 0 }, { "show-tests-full", 0, 0, 0 }, { "utils", 0, 0, 0 }, + { "json-data-path", 1, 0, 0 }, + { "lp-tags-log", 0, 0, 0 }, { 0, 0, 0, 0 } }; @@ -952,6 +959,7 @@ fwts_framework_strdup(&fw->dmidecode, FWTS_DMIDECODE_PATH); fwts_framework_strdup(&fw->lspci, FWTS_LSPCI_PATH); fwts_framework_strdup(&fw->results_logname, RESULTS_LOG); + fwts_framework_strdup(&fw->json_data_path, FWTS_JSON_DATA_PATH); tests_to_run = fwts_list_init(); tests_to_skip = fwts_list_init(); @@ -964,7 +972,7 @@ int c; int option_index; - if ((c = getopt_long(argc, argv, "abdDfhik:pPqr:sS:t:uvw:?", long_options, &option_index)) == -1) + if ((c = getopt_long(argc, argv, "abdDfhij:k:pPqr:sS:t:uvw:?", long_options, &option_index)) == -1) break; switch (c) { @@ -1009,7 +1017,6 @@ ~(FWTS_FRAMEWORK_FLAGS_QUIET | FWTS_FRAMEWORK_FLAGS_SHOW_PROGRESS_DIALOG)) | FWTS_FRAMEWORK_FLAGS_SHOW_PROGRESS; - break; break; case 11: /* --show-tests */ fw->flags |= FWTS_FRAMEWORK_FLAGS_SHOW_TESTS; @@ -1098,10 +1105,12 @@ | FWTS_FRAMEWORK_FLAGS_QUIET; break; case 36: /* --dumpfile */ - fw->acpi_table_acpidump_file = strdup(optarg); + fwts_framework_strdup(&fw->acpi_table_acpidump_file, optarg); break; - case 37: /* --lp-flags */ + case 37: /* --lp-tags */ fw->flags |= FWTS_FRAMEWORK_FLAGS_LP_TAGS; + fwts_log_filter_unset_field(~0); + fwts_log_filter_set_field(LOG_TAG); break; case 38: /* --show-tests-full */ fw->flags |= FWTS_FRAMEWORK_FLAGS_SHOW_TESTS_FULL; @@ -1109,6 +1118,12 @@ case 39: /* --utils */ fw->flags |= FWTS_FRAMEWORK_FLAGS_UTILS; break; + case 40: /* --json-data-path */ + fwts_framework_strdup(&fw->json_data_path, optarg); + break; + case 41: /* --lp-tags-log */ + fw->flags |= FWTS_FRAMEWORK_FLAGS_LP_TAGS_LOG; + break; } break; case 'a': /* --all */ @@ -1138,6 +1153,9 @@ case 'i': /* --interactive */ fw->flags |= FWTS_FRAMEWORK_FLAGS_INTERACTIVE; break; + case 'j': /* --json-data-path */ + fwts_framework_strdup(&fw->json_data_path, optarg); + break; case 'k': /* --klog */ fwts_framework_strdup(&fw->klog, optarg); break; @@ -1208,7 +1226,6 @@ fprintf(stderr, "--s3-delay_delta cannot be less than 0.001\n"); goto tidy_close; } - if (fw->flags & FWTS_FRAMEWORK_FLAGS_SHOW_TESTS) { fwts_framework_show_tests(fw, FWTS_FALSE); goto tidy_close; @@ -1217,11 +1234,8 @@ fwts_framework_show_tests(fw, FWTS_TRUE); goto tidy_close; } - - if ((fw->flags & FWTS_RUN_ALL_FLAGS) == 0) fw->flags |= FWTS_FRAMEWORK_FLAGS_BATCH; - if ((fw->iasl == NULL) || (fw->dmidecode == NULL) || (fw->lspci == NULL) || @@ -1240,7 +1254,6 @@ goto tidy_close; } - if (optind < argc) { /* Run specified tests */ for (; optind < argc; optind++) { @@ -1250,8 +1263,25 @@ fwts_framework_test *test = fwts_framework_test_find(fw, argv[optind]); if (test == NULL) { - fprintf(stderr, "No such test '%s'\n",argv[optind]); - fwts_framework_show_tests(fw, FWTS_FALSE); + int width = fwts_tty_width(fileno(stderr), 80); + int n = 0; + fwts_list_link *item; + fprintf(stderr, "No such test '%s', available tests:\n",argv[optind]); + + fwts_list_foreach(item, fwts_framework_test_list) { + int len; + fwts_framework_test *test = (fwts_framework_test*)item->data; + len = strlen(test->name) + 1; + if ((n + len) > width) { + fprintf(stderr, "\n"); + n = 0; + } + + fprintf(stderr, "%s ", test->name); + n += len; + } + fprintf(stderr, "\n\nuse: fwts --show-tests or fwts --show-tests-full for more information.\n"); + ret = FWTS_ERROR; goto tidy; } @@ -1283,13 +1313,17 @@ if (fw->print_summary) { fwts_log_set_owner(fw->results, "summary"); fwts_log_nl(fw); - fwts_tag_report(fw, fw->total_taglist); + if (fw->flags & FWTS_FRAMEWORK_FLAGS_LP_TAGS_LOG) + fwts_tag_report(fw, LOG_SUMMARY, fw->total_taglist); fwts_list_free(fw->test_taglist, free); fwts_framework_total_summary(fw); fwts_log_nl(fw); fwts_summary_report(fw); } + if (fw->flags & FWTS_FRAMEWORK_FLAGS_LP_TAGS) + fwts_tag_report(fw, LOG_TAG | LOG_NO_FIELDS, fw->total_taglist); + tidy: fwts_list_free(tests_to_skip, NULL); fwts_list_free(tests_to_run, NULL); @@ -1303,7 +1337,10 @@ free(fw->dmidecode); free(fw->lspci); free(fw->results_logname); + free(fw->klog); + free(fw->json_data_path); fwts_framework_free_env(); + fwts_list_free(fw->total_taglist, free); fwts_list_free(fwts_framework_test_list, free); /* Failed tests flagged an error */ diff -Nru fwts-0.20.03/src/lib/src/gpe.c fwts-0.20.10/src/lib/src/gpe.c --- fwts-0.20.03/src/lib/src/gpe.c 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/src/lib/src/gpe.c 2010-12-15 11:33:48.000000000 +0000 @@ -111,6 +111,30 @@ return FWTS_OK; } +int fwts_gpe_delta_get(fwts_framework *fw, + const fwts_gpe *gpes_start, const fwts_gpe *gpes_end, const int gpe_count, + int *sci, int *gpe) +{ + int *deltas = NULL; + *sci = 0; + *gpe = 0; + + if (fwts_gpe_delta(&deltas, gpes_start, gpes_end, gpe_count) == FWTS_ERROR) { + fwts_log_error(fw, "Cannot calculate GPE delta, out of memory."); + return FWTS_ERROR; + } else { + int i; + for (i=0;i 0)) + *sci += deltas[i]; + if ((strncmp(gpes_end[i].name, "gpe", 3) == 0) && (deltas[i] > 0)) + *gpe += deltas[i]; + } + } + free(deltas); + + return FWTS_OK; +} /* * fwts_gpe_test() @@ -127,8 +151,10 @@ else { int i; for (i=0;i 0)) + if ((strcmp(gpes_end[i].name, "sci") == 0) && (deltas[i] > 0)) { + fwts_log_info(fw, "Got %d SCI interrupt(s).", deltas[i]); sci += deltas[i]; + } if ((strncmp(gpes_end[i].name, "gpe", 3) == 0) && (deltas[i] > 0)) { fwts_log_info(fw, "Got %d interrupt(s) on GPE %s.", deltas[i], gpes_end[i].name); gpe += deltas[i]; diff -Nru fwts-0.20.03/src/lib/src/klog.c fwts-0.20.10/src/lib/src/klog.c --- fwts-0.20.03/src/lib/src/klog.c 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/src/lib/src/klog.c 2010-12-15 11:33:48.000000000 +0000 @@ -29,7 +29,7 @@ /* * klog pattern matching strings data file, data stored in json format */ -#define KLOG_DATA_JSON_PATH "/usr/share/fwts/klog.json" +#define KLOG_DATA_JSON_FILE "klog.json" /* @@ -81,6 +81,22 @@ return list; } +static char *remove_timestamp(char *text) +{ + char *ptr = text; + + if ((ptr[0] == '<') && (ptr[2] == '>')) + ptr += 3; + + if (*ptr == '[') + while (*ptr && *ptr !=']') + ptr++; + if (*ptr == ']') + ptr+=2; /* Skip ] and trailing space */ + + return ptr; +} + int fwts_klog_scan(fwts_framework *fw, fwts_list *klog, fwts_klog_scan_func scan_func, @@ -88,33 +104,82 @@ void *private, int *match) { + typedef struct { + char *line; + int repeated; + } klog_reduced_item; + *match= 0; char *prev; fwts_list_link *item; + fwts_list *klog_reduced; int i; if (!klog) return FWTS_ERROR; + if ((klog_reduced = fwts_list_init()) == NULL) + return FWTS_ERROR; + + /* + * Form a reduced log by stripping out repeated kernel warnings + */ + fwts_list_foreach(item, klog) { + char *newline = remove_timestamp((char *)item->data); + if (*newline) { + int matched = 0; + fwts_list_link *l; + fwts_list_foreach(l, klog_reduced) { + char *line; + klog_reduced_item *reduced = (klog_reduced_item *)l->data; + + line = remove_timestamp(reduced->line); + if (strcmp(newline, line) == 0) { + reduced->repeated++; + matched = 1; + break; + } + } + if (!matched) { + klog_reduced_item *new; + + if ((new = calloc(1, sizeof(klog_reduced_item))) == NULL) { + fwts_list_free(klog_reduced, free); + return FWTS_ERROR; + } + new->line = (char *)item->data; + new->repeated = 0; + + fwts_list_append(klog_reduced, new); + } + } + } + prev = ""; - for (i=0,item = klog->head; item != NULL; item=item->next,i++) { - char *ptr = (char *)item->data; + i = 0; + fwts_list_foreach(item, klog_reduced) { + klog_reduced_item *reduced = (klog_reduced_item *)item->data; + char *line = reduced->line; - if ((ptr[0] == '<') && (ptr[2] == '>')) - ptr += 3; + if ((line[0] == '<') && (line[2] == '>')) + line += 3; - scan_func(fw, ptr, prev, private, match); + scan_func(fw, line, reduced->repeated, prev, private, match); if (progress_func && ((i % 25) == 0)) progress_func(fw, 100 * i / fwts_list_len(klog)); - prev = ptr; + prev = line; + i++; } + fwts_list_free(klog_reduced, free); + return FWTS_OK; } void fwts_klog_scan_patterns(fwts_framework *fw, char *line, + int repeated, char *prevline, void *private, int *errors) @@ -126,31 +191,33 @@ "firmware test suite has no diagnostic advice for this particular problem."; while (pattern->pattern != NULL) { + int matched = 0; switch (pattern->compare_mode) { case FWTS_COMPARE_REGEX: - if (pcre_exec(pattern->re, NULL, line, strlen(line), 0, 0, vector, 1) == 0) { - fwts_tag_failed(fw, pattern->tag); - fwts_failed_level(fw, pattern->level, "%s Kernel message: %s", fwts_log_level_to_str(pattern->level), line); - (*errors)++; - if (pattern->advice != NULL) - fwts_advice(fw, "%s", pattern->advice); - else - fwts_advice(fw, "%s", advice); - return; - } + matched = (pcre_exec(pattern->re, NULL, line, strlen(line), 0, 0, vector, 1) == 0); break; case FWTS_COMPARE_STRING: default: - if (strstr(line, pattern->pattern) != NULL) { + matched = (strstr(line, pattern->pattern) != NULL) ; + break; + } + + if (matched) { + if (pattern->level == LOG_LEVEL_INFO) + fwts_log_info(fw, "Kernel message: %s", line); + else { fwts_tag_failed(fw, pattern->tag); fwts_failed_level(fw, pattern->level, "%s Kernel message: %s", fwts_log_level_to_str(pattern->level), line); (*errors)++; - if (pattern->advice != NULL) - fwts_advice(fw, "%s", pattern->advice); - else - fwts_advice(fw, "%s", advice); - return; } + if (repeated) + fwts_log_info(fw, "Message repeated %d times.", repeated); + + if ((pattern->advice) != NULL && (*pattern->advice)) + fwts_advice(fw, "%s", pattern->advice); + else + fwts_advice(fw, "%s", advice); + return; } pattern++; } @@ -200,14 +267,17 @@ json_object *klog_objs; json_object *klog_table; fwts_klog_pattern *patterns; + char json_data_path[PATH_MAX]; + + snprintf(json_data_path, sizeof(json_data_path), "%s/%s", fw->json_data_path, KLOG_DATA_JSON_FILE); - if ((klog_objs = json_object_from_file(KLOG_DATA_JSON_PATH)) == JSON_ERROR) { - fwts_log_error(fw, "Cannot load klog data from %s.", KLOG_DATA_JSON_PATH); + if ((klog_objs = json_object_from_file(json_data_path)) == JSON_ERROR) { + fwts_log_error(fw, "Cannot load klog data from %s.", json_data_path); return FWTS_ERROR; } if ((klog_table = json_object_object_get(klog_objs, table)) == JSON_ERROR) { - fwts_log_error(fw, "Cannot fetch klog table object '%s' from %s.", table, KLOG_DATA_JSON_PATH); + fwts_log_error(fw, "Cannot fetch klog table object '%s' from %s.", table, json_data_path); goto fail_put; } @@ -286,7 +356,7 @@ progress, klog, errors); } -static void fwts_klog_regex_find_callback(fwts_framework *fw, char *line, +static void fwts_klog_regex_find_callback(fwts_framework *fw, char *line, int repeated, char *prev, void *pattern, int *match) { const char *error; diff -Nru fwts-0.20.03/src/lib/src/log.c fwts-0.20.10/src/lib/src/log.c --- fwts-0.20.03/src/lib/src/log.c 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/src/lib/src/log.c 2010-12-15 11:33:48.000000000 +0000 @@ -102,6 +102,8 @@ return LOG_LEVEL_MEDIUM; if (strstr(str, "LOW")) return LOG_LEVEL_LOW; + if (strstr(str, "INFO")) + return LOG_LEVEL_INFO; } return LOG_LEVEL_MEDIUM; /* Default */ @@ -122,9 +124,11 @@ return "MEDIUM"; case LOG_LEVEL_LOW: return "LOW"; + case LOG_LEVEL_INFO: + return "INFO"; case LOG_LEVEL_NONE: default: - return " "; + return " "; } } @@ -327,10 +331,13 @@ fwts_list_foreach(item, lines) { char *text = fwts_text_list_text(item); - /* Re-format up a log heading with current line number which - may increment with multiple line log messages */ - fwts_log_header(log, buffer, sizeof(buffer), field, level); - fwrite(buffer, 1, n, log->fp); + + if (!(field & LOG_NO_FIELDS)) { + /* Re-format up a log heading with current line number which + may increment with multiple line log messages */ + fwts_log_header(log, buffer, sizeof(buffer), field, level); + fwrite(buffer, 1, n, log->fp); + } fwrite(text, 1, strlen(text), log->fp); fwrite("\n", 1, 1, log->fp); fflush(log->fp); @@ -405,7 +412,6 @@ fwts_log *fwts_log_open(const char *owner, const char *name, const char *mode) { fwts_log *newlog; - int fd; if ((newlog = calloc(1, sizeof(fwts_log))) == NULL) return NULL; @@ -429,21 +435,11 @@ return NULL; } - fd = fileno(newlog->fp); if (log_line_width) { /* User has specified width, so use it */ newlog->line_width = log_line_width; } else { - struct winsize ws; -#ifdef TIOCGWINSZ - if (isatty(fd) && - (ioctl(fd, TIOCGWINSZ, &ws) != -1) && - (0 < ws.ws_col) && - (ws.ws_col == (size_t)ws.ws_col)) - newlog->line_width = ws.ws_col; - else -#endif - newlog->line_width = LOG_LINE_WIDTH; + newlog->line_width = fwts_tty_width(fileno(newlog->fp), LOG_LINE_WIDTH); } return newlog; diff -Nru fwts-0.20.03/src/lib/src/Makefile.am fwts-0.20.10/src/lib/src/Makefile.am --- fwts-0.20.03/src/lib/src/Makefile.am 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/src/lib/src/Makefile.am 2010-12-15 11:33:48.000000000 +0000 @@ -1,4 +1,4 @@ -AM_CPPFLAGS = -I$(top_srcdir)/src/lib/include -I$(top_srcdir)/src/acpica/source/include -Wall -Werror $(CFLAGS) +AM_CPPFLAGS = -I$(top_srcdir)/src/lib/include -I$(top_srcdir)/src/acpica/source/include -Wall -Werror noinst_LIBRARIES = libtestsuite.a libtestsuite_a_SOURCES = \ @@ -29,6 +29,7 @@ set.c \ stringextras.c \ text_list.c \ + tty.c \ wakealarm.c \ summary.c \ microcode.c \ diff -Nru fwts-0.20.03/src/lib/src/Makefile.in fwts-0.20.10/src/lib/src/Makefile.in --- fwts-0.20.03/src/lib/src/Makefile.in 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/src/lib/src/Makefile.in 2010-12-15 11:33:48.000000000 +0000 @@ -58,8 +58,8 @@ gpe.$(OBJEXT) iasl.$(OBJEXT) keymap.$(OBJEXT) klog.$(OBJEXT) \ log.$(OBJEXT) memorymap.$(OBJEXT) pipeio.$(OBJEXT) \ set.$(OBJEXT) stringextras.$(OBJEXT) text_list.$(OBJEXT) \ - wakealarm.$(OBJEXT) summary.$(OBJEXT) microcode.$(OBJEXT) \ - virt.$(OBJEXT) tag.$(OBJEXT) + tty.$(OBJEXT) wakealarm.$(OBJEXT) summary.$(OBJEXT) \ + microcode.$(OBJEXT) virt.$(OBJEXT) tag.$(OBJEXT) libtestsuite_a_OBJECTS = $(am_libtestsuite_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp @@ -169,7 +169,7 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -AM_CPPFLAGS = -I$(top_srcdir)/src/lib/include -I$(top_srcdir)/src/acpica/source/include -Wall -Werror $(CFLAGS) +AM_CPPFLAGS = -I$(top_srcdir)/src/lib/include -I$(top_srcdir)/src/acpica/source/include -Wall -Werror noinst_LIBRARIES = libtestsuite.a libtestsuite_a_SOURCES = \ list.c \ @@ -199,6 +199,7 @@ set.c \ stringextras.c \ text_list.c \ + tty.c \ wakealarm.c \ summary.c \ microcode.c \ @@ -283,6 +284,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/summary.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/text_list.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tty.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/virt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wakealarm.Po@am__quote@ diff -Nru fwts-0.20.03/src/lib/src/tag.c fwts-0.20.10/src/lib/src/tag.c --- fwts-0.20.03/src/lib/src/tag.c 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/src/lib/src/tag.c 2010-12-15 11:33:48.000000000 +0000 @@ -172,16 +172,14 @@ * fwts_tag_report() * report to the log the tags found in the taglist */ -void fwts_tag_report(fwts_framework *fw, fwts_list *taglist) +void fwts_tag_report(fwts_framework *fw, fwts_log_field field, fwts_list *taglist) { - if ((fw->flags & FWTS_FRAMEWORK_FLAGS_LP_TAGS) && - (taglist != NULL) && - (fwts_list_len(taglist) > 0)) { - char *tags; - - tags = fwts_tag_list_to_str(taglist); - fwts_log_tag(fw, "Tags: %s", tags); - free(tags); + if ((taglist != NULL) && (fwts_list_len(taglist) > 0)) { + char *tags = fwts_tag_list_to_str(taglist); + if (tags) { + fwts_log_printf(fw->results, field | LOG_VERBATUM, LOG_LEVEL_NONE, "Tags: %s", tags); + free(tags); + } } } diff -Nru fwts-0.20.03/src/lib/src/tty.c fwts-0.20.10/src/lib/src/tty.c --- fwts-0.20.03/src/lib/src/tty.c 1970-01-01 01:00:00.000000000 +0100 +++ fwts-0.20.10/src/lib/src/tty.c 2010-12-15 11:33:48.000000000 +0000 @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2010 Canonical + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ +#include +#include + +int fwts_tty_width(const int fd, const int default_width) +{ +#ifdef TIOCGWINSZ + struct winsize ws; + + if (isatty(fd) && + (ioctl(fd, TIOCGWINSZ, &ws) != -1) && + (0 < ws.ws_col) && + (ws.ws_col == (size_t)ws.ws_col)) + return ws.ws_col; + else +#endif + return default_width; +} diff -Nru fwts-0.20.03/src/Makefile.am fwts-0.20.10/src/Makefile.am --- fwts-0.20.03/src/Makefile.am 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/src/Makefile.am 2010-12-15 11:33:48.000000000 +0000 @@ -1,6 +1,6 @@ SUBDIRS = lib acpica -AM_CPPFLAGS = -I$(top_srcdir)/src/lib/include -I$(top_srcdir)/src/acpica/source/include -Wall -Werror $(CFLAGS) +AM_CPPFLAGS = -I$(top_srcdir)/src/lib/include -I$(top_srcdir)/src/acpica/source/include -Wall -Werror AM_LDFLAGS = -Xlinker --allow-multiple-definition bin_PROGRAMS = fwts diff -Nru fwts-0.20.03/src/Makefile.in fwts-0.20.10/src/Makefile.in --- fwts-0.20.03/src/Makefile.in 2010-12-03 15:49:44.000000000 +0000 +++ fwts-0.20.10/src/Makefile.in 2010-12-15 11:33:48.000000000 +0000 @@ -238,7 +238,7 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = lib acpica -AM_CPPFLAGS = -I$(top_srcdir)/src/lib/include -I$(top_srcdir)/src/acpica/source/include -Wall -Werror $(CFLAGS) +AM_CPPFLAGS = -I$(top_srcdir)/src/lib/include -I$(top_srcdir)/src/acpica/source/include -Wall -Werror AM_LDFLAGS = -Xlinker --allow-multiple-definition fwts_SOURCES = main.c \ acpi/klog/klog.c \