From 7f56e9a31c91099cd0147883a0282ec89ae0b346 Mon Sep 17 00:00:00 2001 From: Soby Mathew Date: Mon, 4 Sep 2017 11:49:29 +0100 Subject: Implement log framework This patch gives users control over logging messages printed from the C code using the LOG macros defined in debug.h Users now have the ability to reduce the log_level at run time using the tf_log_set_max_level() function. The default prefix string can be defined by platform by overriding the `plat_log_get_prefix()` platform API which is also introduced in this patch. The new log framework results in saving of some RO data. For example, when BL1 is built for FVP with LOG_LEVEL=LOG_LEVEL_VERBOSE, resulted in saving 384 bytes of RO data and increase of 8 bytes of RW data. The framework also adds about 108 bytes of code to the release build of FVP. Fixes ARM-software/tf-issues#462 Change-Id: I476013d9c3deedfdd4c8b0b0f125665ba6250554 Co-authored-by: Eleanor Bonnici Signed-off-by: Soby Mathew --- include/common/debug.h | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) (limited to 'include/common/debug.h') diff --git a/include/common/debug.h b/include/common/debug.h index b8582419..3f0f84a1 100644 --- a/include/common/debug.h +++ b/include/common/debug.h @@ -27,47 +27,59 @@ #include #include +/* + * Define Log Markers corresponding to each log level which will + * be embedded in the format string and is expected by tf_log() to determine + * the log level. + */ +#define LOG_MARKER_ERROR "\xa" /* 10 */ +#define LOG_MARKER_NOTICE "\x14" /* 20 */ +#define LOG_MARKER_WARNING "\x1e" /* 30 */ +#define LOG_MARKER_INFO "\x28" /* 40 */ +#define LOG_MARKER_VERBOSE "\x32" /* 50 */ + #if LOG_LEVEL >= LOG_LEVEL_NOTICE -# define NOTICE(...) tf_printf("NOTICE: " __VA_ARGS__) +# define NOTICE(...) tf_log(LOG_MARKER_NOTICE __VA_ARGS__) #else # define NOTICE(...) #endif #if LOG_LEVEL >= LOG_LEVEL_ERROR -# define ERROR(...) tf_printf("ERROR: " __VA_ARGS__) +# define ERROR(...) tf_log(LOG_MARKER_ERROR __VA_ARGS__) #else # define ERROR(...) #endif #if LOG_LEVEL >= LOG_LEVEL_WARNING -# define WARN(...) tf_printf("WARNING: " __VA_ARGS__) +# define WARN(...) tf_log(LOG_MARKER_WARNING __VA_ARGS__) #else # define WARN(...) #endif #if LOG_LEVEL >= LOG_LEVEL_INFO -# define INFO(...) tf_printf("INFO: " __VA_ARGS__) +# define INFO(...) tf_log(LOG_MARKER_INFO __VA_ARGS__) #else # define INFO(...) #endif #if LOG_LEVEL >= LOG_LEVEL_VERBOSE -# define VERBOSE(...) tf_printf("VERBOSE: " __VA_ARGS__) +# define VERBOSE(...) tf_log(LOG_MARKER_VERBOSE __VA_ARGS__) #else # define VERBOSE(...) #endif - void __dead2 do_panic(void); #define panic() do_panic() /* Function called when stack protection check code detects a corrupted stack */ void __dead2 __stack_chk_fail(void); +void tf_log(const char *fmt, ...) __printflike(1, 2); void tf_printf(const char *fmt, ...) __printflike(1, 2); int tf_snprintf(char *s, size_t n, const char *fmt, ...) __printflike(3, 4); void tf_vprintf(const char *fmt, va_list args); void tf_string_print(const char *str); +void tf_log_set_max_level(unsigned int log_level); #endif /* __ASSEMBLY__ */ #endif /* __DEBUG_H__ */ -- cgit v1.2.3