From 289c28a8f5954bd548e6ab9ac8515479981fb6d1 Mon Sep 17 00:00:00 2001 From: Dan Handley Date: Fri, 8 Aug 2014 14:36:42 +0100 Subject: [PATCH] Add concept of console output log levels Create new LOG_LEVEL build option, which controls the amount of console output compiled into the build. This should be one of the following: 0 (LOG_LEVEL_NONE) 10 (LOG_LEVEL_NOTICE) 20 (LOG_LEVEL_ERROR) 30 (LOG_LEVEL_WARNING) 40 (LOG_LEVEL_INFO) 50 (LOG_LEVEL_VERBOSE) All log output up to and including the log level is compiled into the build. The default value is 40 in debug builds and 20 in release builds. Complement the existing INFO, WARN and ERROR console output macros with NOTICE and VERBOSE macros, which are conditionally compiled in depending on the value of LOG_LEVEL. Fixes ARM-software/tf-issues#232 Change-Id: I951e2f333e7b90fc4b1060741d9a6db699d5aa72 --- Makefile | 7 ++++++ docs/user-guide.md | 13 ++++++++++ include/common/debug.h | 57 +++++++++++++++++++++++++++++++----------- 3 files changed, 63 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index fef89c2e8..60ef86425 100644 --- a/Makefile +++ b/Makefile @@ -80,8 +80,12 @@ export Q ifneq (${DEBUG}, 0) BUILD_TYPE := debug + # Use LOG_LEVEL_INFO by default for debug builds + LOG_LEVEL := 40 else BUILD_TYPE := release + # Use LOG_LEVEL_NOTICE by default for release builds + LOG_LEVEL := 20 endif # Default build string (git branch and commit) @@ -213,6 +217,9 @@ $(eval $(call add_define,ARM_GIC_ARCH)) $(eval $(call assert_boolean,ASM_ASSERTION)) $(eval $(call add_define,ASM_ASSERTION)) +# Process LOG_LEVEL flag +$(eval $(call add_define,LOG_LEVEL)) + ASFLAGS += -nostdinc -ffreestanding -Wa,--fatal-warnings \ -Werror -Wmissing-include-dirs \ -mgeneral-regs-only -D__ASSEMBLY__ \ diff --git a/docs/user-guide.md b/docs/user-guide.md index ef5de7144..00de3e50e 100644 --- a/docs/user-guide.md +++ b/docs/user-guide.md @@ -146,6 +146,19 @@ performed. * `DEBUG`: Chooses between a debug and release build. It can take either 0 (release) or 1 (debug) as values. 0 is the default +* `LOG_LEVEL`: Chooses the log level, which controls the amount of console log + output compiled into the build. This should be one of the following: + + 0 (LOG_LEVEL_NONE) + 10 (LOG_LEVEL_NOTICE) + 20 (LOG_LEVEL_ERROR) + 30 (LOG_LEVEL_WARNING) + 40 (LOG_LEVEL_INFO) + 50 (LOG_LEVEL_VERBOSE) + + All log output up to and including the log level is compiled into the build. + The default value is 40 in debug builds and 20 in release builds. + * `NS_TIMER_SWITCH`: Enable save and restore for non-secure timer register contents upon world switch. It can take either 0 (don't save and restore) or 1 (do save and restore). 0 is the default. An SPD could set this to 1 if it diff --git a/include/common/debug.h b/include/common/debug.h index 3f5655ba8..a8dcb8da3 100644 --- a/include/common/debug.h +++ b/include/common/debug.h @@ -33,24 +33,53 @@ #include -/* If building the project with DEBUG disabled the INFO and WARN macros - * won't produce any output. The ERROR macro is always enabled. - * The format expected is the same as for printf(). - * INFO("Info %s.\n", "message") -> INFO: Info message. - * WARN("Warning %s.\n", "message") -> WARN: Warning message. - * ERROR("Error %s.\n", "message") -> ERROR: Error message. - * - * TODO : add debug levels. +/* The log output macros print output to the console. These macros produce + * compiled log output only if the LOG_LEVEL defined in the makefile (or the + * make command line) is greater or equal than the level required for that + * type of log output. + * The format expected is the same as for printf(). For example: + * INFO("Info %s.\n", "message") -> INFO: Info message. + * WARN("Warning %s.\n", "message") -> WARNING: Warning message. */ -#if DEBUG - #define INFO(...) tf_printf("INFO: " __VA_ARGS__) - #define WARN(...) tf_printf("WARN: " __VA_ARGS__) + +#define LOG_LEVEL_NONE 0 +#define LOG_LEVEL_ERROR 10 +#define LOG_LEVEL_NOTICE 20 +#define LOG_LEVEL_WARNING 30 +#define LOG_LEVEL_INFO 40 +#define LOG_LEVEL_VERBOSE 50 + + +#if LOG_LEVEL >= LOG_LEVEL_NOTICE +# define NOTICE(...) tf_printf("NOTICE: " __VA_ARGS__) #else - #define INFO(...) - #define WARN(...) +# define NOTICE(...) +#endif + +#if LOG_LEVEL >= LOG_LEVEL_ERROR +# define ERROR(...) tf_printf("ERROR: " __VA_ARGS__) +#else +# define ERROR(...) +#endif + +#if LOG_LEVEL >= LOG_LEVEL_WARNING +# define WARN(...) tf_printf("WARNING: " __VA_ARGS__) +#else +# define WARN(...) +#endif + +#if LOG_LEVEL >= LOG_LEVEL_INFO +# define INFO(...) tf_printf("INFO: " __VA_ARGS__) +#else +# define INFO(...) +#endif + +#if LOG_LEVEL >= LOG_LEVEL_VERBOSE +# define VERBOSE(...) tf_printf("VERBOSE: " __VA_ARGS__) +#else +# define VERBOSE(...) #endif -#define ERROR(...) tf_printf("ERROR: " __VA_ARGS__) void __dead2 do_panic(void); #define panic() do_panic()