[PATCH 3/3] lib: acpica + fwts_framework: add --acpica-debug option

Colin King colin.king at canonical.com
Fri Jun 7 08:41:39 UTC 2013


From: Colin Ian King <colin.king at canonical.com>

fwts_acpica had some ACPICA debug helpers that were originally
intended to dump out ACPICA debug messages, but it was never
fully implemented.

Remove these helpers fwts_acpica_set_log_callback and
fwts_acpica_debug_command as well as the callback func pointer
fwts_acpica_log_callback_func as we can implement the debug
in a better way.

Re-work fwts_acpica_vprintf to now dump directly to the fwts
log if fw->flags has FWTS_FLAG_ACPICA_DEBUG set. Add the new
--acpica-debug option to the framework and documentation.

The --acpica-debug option is to help the fwts developers to see
the ACPICA internal warning and error messages rather than trying
to guess why fwts has caused ACPICA to misfunction.

Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
 doc/fwts.1                       |  4 ++++
 src/acpica/fwts_acpica.c         | 39 +++++++++++++++------------------------
 src/lib/include/fwts_acpica.h    |  2 --
 src/lib/include/fwts_framework.h |  1 +
 src/lib/src/fwts_framework.c     |  4 ++++
 5 files changed, 24 insertions(+), 26 deletions(-)

diff --git a/doc/fwts.1 b/doc/fwts.1
index b6ef362..187751c 100644
--- a/doc/fwts.1
+++ b/doc/fwts.1
@@ -60,6 +60,10 @@ fwts options are as follow:
 .B \-
 output results to stdout.
 .TP
+.B \-\-acpica\-debug
+enable ACPICA debug warning and error messages when invoking the ACPICA subsystem. This is mainly
+for fwts developers to help track down any ACPICA interfacing issues with fwts.
+.TP
 .B \-a, \-\-all
 run all the tests.
 .TP
diff --git a/src/acpica/fwts_acpica.c b/src/acpica/fwts_acpica.c
index 42b68f1..e396cd9 100644
--- a/src/acpica/fwts_acpica.c
+++ b/src/acpica/fwts_acpica.c
@@ -17,6 +17,8 @@
  *
  */
 
+#define _GNU_SOURCE
+
 #include <unistd.h>
 #include <stdio.h>
 #include <string.h>
@@ -96,7 +98,6 @@ static void 			*fwts_acpica_DSDT;
 
 static fwts_framework		*fwts_acpica_fw;		/* acpica context copy of fw */
 static bool			fwts_acpica_init_called;	/* > 0, ACPICA initialised */
-static fwts_acpica_log_callback fwts_acpica_log_callback_func = NULL;	/* logging call back func */
 
 /* Semaphore Tracking */
 
@@ -384,25 +385,6 @@ ACPI_PHYSICAL_ADDRESS AeLocalGetRootPointer(void)
 }
 
 /*
- *  fwts_acpica_set_log_callback()
- *	define logging callback function as used by fwts_acpica_vprintf()
- */
-void fwts_acpica_set_log_callback(fwts_framework *fw, fwts_acpica_log_callback func)
-{
-	fwts_acpica_log_callback_func = func;
-}
-
-/*
- *  fwts_acpica_debug_command()
- *	run a debugging command, requires a logging callback function (or set to NULL for none).
- */
-void fwts_acpica_debug_command(fwts_framework *fw, fwts_acpica_log_callback func, char *command)
-{
-	fwts_acpica_set_log_callback(fw, func);
-	AcpiDbCommandDispatch(command, NULL, NULL);
-}
-
-/*
  *  fwts_acpica_vprintf()
  *	accumulate prints from ACPICA engine, emit them when we hit terminal '\n'
  */
@@ -411,10 +393,18 @@ void fwts_acpica_vprintf(const char *fmt, va_list args)
 	static char *buffer;
 	static size_t buffer_len;
 
-	char tmp[4096];
+	char *tmp;
 	size_t tmp_len;
 
-	vsnprintf(tmp, sizeof(tmp), fmt, args);
+	/* Only emit messages if in ACPICA debug mode */
+	if (!(fwts_acpica_fw->flags & FWTS_FLAG_ACPICA_DEBUG))
+		return;
+
+	if (vasprintf(&tmp, fmt, args) < 0) {
+		fwts_log_info(fwts_acpica_fw, "Out of memory allocating ACPICA printf buffer.");
+		return;
+	}
+
 	tmp_len = strlen(tmp);
 
 	if (buffer_len == 0) {
@@ -434,11 +424,12 @@ void fwts_acpica_vprintf(const char *fmt, va_list args)
 	}
 
 	if (index(buffer, '\n') != NULL) {
-		if (fwts_acpica_log_callback_func)
-			fwts_acpica_log_callback_func(fwts_acpica_fw, buffer);
+		fwts_log_info(fwts_acpica_fw, "%s", buffer);
 		free(buffer);
 		buffer_len = 0;
 	}
+
+	free(tmp);
 }
 
 /*
diff --git a/src/lib/include/fwts_acpica.h b/src/lib/include/fwts_acpica.h
index 17a5988..ab492e7 100644
--- a/src/lib/include/fwts_acpica.h
+++ b/src/lib/include/fwts_acpica.h
@@ -26,8 +26,6 @@ typedef void (*fwts_acpica_log_callback)(fwts_framework *fw, const char *buffer)
 
 int  fwts_acpica_init(fwts_framework *fw);
 int  fwts_acpica_deinit(void);
-void fwts_acpica_set_log_callback(fwts_framework *fw, fwts_acpica_log_callback func);
-void fwts_acpica_debug_command(fwts_framework *fw, fwts_acpica_log_callback func, char *command);
 fwts_list *fwts_acpica_get_object_names(int type);
 void fwts_acpica_sem_count_clear(void);
 void fwts_acpica_sem_count_get(int *acquired, int *released);
diff --git a/src/lib/include/fwts_framework.h b/src/lib/include/fwts_framework.h
index 7a540ad..ab831a9 100644
--- a/src/lib/include/fwts_framework.h
+++ b/src/lib/include/fwts_framework.h
@@ -36,6 +36,7 @@ typedef enum {
 	FWTS_FLAG_FORCE_CLEAN			= 0x00000004,
 	FWTS_FLAG_SHOW_TESTS			= 0x00000008,
 	FWTS_FLAG_SHOW_PROGRESS_DIALOG		= 0x00000010,
+	FWTS_FLAG_ACPICA_DEBUG			= 0x00000020,
 	FWTS_FLAG_BATCH				= 0x00001000,
 	FWTS_FLAG_INTERACTIVE			= 0x00002000,
 	FWTS_FLAG_BATCH_EXPERIMENTAL		= 0x00004000,
diff --git a/src/lib/src/fwts_framework.c b/src/lib/src/fwts_framework.c
index ff1e3b3..1cf49fc 100644
--- a/src/lib/src/fwts_framework.c
+++ b/src/lib/src/fwts_framework.c
@@ -82,6 +82,7 @@ static fwts_option fwts_framework_options[] = {
 	{ "unsafe",		"U",  0, "Unsafe tests (tests that can potentially cause kernel oopses." },
 	{ "filter-error-discard", "", 1, "Discard errors that match any of the specified labels." },
 	{ "filter-error-keep",	"",   1, "Keep errors that match any of the specified labels." },
+	{ "acpica-debug",	"",   0, "Enable ACPICA debug/warning messages." },
 	{ NULL, NULL, 0, NULL }
 };
 
@@ -1099,6 +1100,9 @@ int fwts_framework_options_handler(fwts_framework *fw, int argc, char * const ar
 			if (fwts_framework_filter_error_parse(optarg, &fw->errors_filter_keep) != FWTS_OK)
 				return FWTS_ERROR;
 			break;
+		case 36: /* --acpica-debug */
+			fw->flags |= FWTS_FLAG_ACPICA_DEBUG;
+			break;
 		}
 		break;
 	case 'a': /* --all */
-- 
1.8.3




More information about the fwts-devel mailing list