Add concept of console output log levels
authorDan Handley <dan.handley@arm.com>
Fri, 8 Aug 2014 13:36:42 +0000 (14:36 +0100)
committerDan Handley <dan.handley@arm.com>
Tue, 12 Aug 2014 15:51:05 +0000 (16:51 +0100)
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
docs/user-guide.md
include/common/debug.h

index fef89c2e83358cdacfbb82fb7bd6990175db46e1..60ef8642597042c5d607908cb13a7bc68c599dd0 100644 (file)
--- 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__              \
index ef5de7144b0f65462d66eb813bc710decf02b58e..00de3e50ed474d50c5886c112ba17ed19b625808 100644 (file)
@@ -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
index 3f5655ba88b1e024447296cbb98c138bee564b30..a8dcb8da353aafc742df2a298918e6aaa1170926 100644 (file)
 
 #include <stdio.h>
 
-/* 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 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 INFO(...)
- #define WARN(...)
+# define VERBOSE(...)
 #endif
 
-#define ERROR(...)     tf_printf("ERROR: " __VA_ARGS__)
 
 void __dead2 do_panic(void);
 #define panic()        do_panic()