2 * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved.
4 * SPDX-License-Identifier: BSD-3-Clause
10 #include <lib/utils_def.h>
13 * The log output macros print output to the console. These macros produce
14 * compiled log output only if the LOG_LEVEL defined in the makefile (or the
15 * make command line) is greater or equal than the level required for that
18 * The format expected is the same as for printf(). For example:
19 * INFO("Info %s.\n", "message") -> INFO: Info message.
20 * WARN("Warning %s.\n", "message") -> WARNING: Warning message.
23 #define LOG_LEVEL_NONE U(0)
24 #define LOG_LEVEL_ERROR U(10)
25 #define LOG_LEVEL_NOTICE U(20)
26 #define LOG_LEVEL_WARNING U(30)
27 #define LOG_LEVEL_INFO U(40)
28 #define LOG_LEVEL_VERBOSE U(50)
37 #include <drivers/console.h>
40 * Define Log Markers corresponding to each log level which will
41 * be embedded in the format string and is expected by tf_log() to determine
44 #define LOG_MARKER_ERROR "\xa" /* 10 */
45 #define LOG_MARKER_NOTICE "\x14" /* 20 */
46 #define LOG_MARKER_WARNING "\x1e" /* 30 */
47 #define LOG_MARKER_INFO "\x28" /* 40 */
48 #define LOG_MARKER_VERBOSE "\x32" /* 50 */
51 * If the log output is too low then this macro is used in place of tf_log()
52 * below. The intent is to get the compiler to evaluate the function call for
53 * type checking and format specifier correctness but let it optimize it out.
55 #define no_tf_log(fmt, ...) \
58 tf_log(fmt, ##__VA_ARGS__); \
62 #if LOG_LEVEL >= LOG_LEVEL_ERROR
63 # define ERROR(...) tf_log(LOG_MARKER_ERROR __VA_ARGS__)
65 # define ERROR(...) no_tf_log(LOG_MARKER_ERROR __VA_ARGS__)
68 #if LOG_LEVEL >= LOG_LEVEL_NOTICE
69 # define NOTICE(...) tf_log(LOG_MARKER_NOTICE __VA_ARGS__)
71 # define NOTICE(...) no_tf_log(LOG_MARKER_NOTICE __VA_ARGS__)
74 #if LOG_LEVEL >= LOG_LEVEL_WARNING
75 # define WARN(...) tf_log(LOG_MARKER_WARNING __VA_ARGS__)
77 # define WARN(...) no_tf_log(LOG_MARKER_WARNING __VA_ARGS__)
80 #if LOG_LEVEL >= LOG_LEVEL_INFO
81 # define INFO(...) tf_log(LOG_MARKER_INFO __VA_ARGS__)
83 # define INFO(...) no_tf_log(LOG_MARKER_INFO __VA_ARGS__)
86 #if LOG_LEVEL >= LOG_LEVEL_VERBOSE
87 # define VERBOSE(...) tf_log(LOG_MARKER_VERBOSE __VA_ARGS__)
89 # define VERBOSE(...) no_tf_log(LOG_MARKER_VERBOSE __VA_ARGS__)
93 void backtrace(const char *cookie
);
98 void __dead2
do_panic(void);
102 backtrace(__func__); \
103 (void)console_flush(); \
107 /* Function called when stack protection check code detects a corrupted stack */
108 void __dead2
__stack_chk_fail(void);
110 void tf_log(const char *fmt
, ...) __printflike(1, 2);
111 void tf_log_set_max_level(unsigned int log_level
);
113 #endif /* __ASSEMBLY__ */