14ecca339SDan Handley /* 2*cf24229eSSandrine Bailleux * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. 34ecca339SDan Handley * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 54ecca339SDan Handley */ 64ecca339SDan Handley 74ecca339SDan Handley #ifndef __DEBUG_H__ 84ecca339SDan Handley #define __DEBUG_H__ 94ecca339SDan Handley 10*cf24229eSSandrine Bailleux /* 11*cf24229eSSandrine Bailleux * The log output macros print output to the console. These macros produce 12289c28a8SDan Handley * compiled log output only if the LOG_LEVEL defined in the makefile (or the 13289c28a8SDan Handley * make command line) is greater or equal than the level required for that 14289c28a8SDan Handley * type of log output. 15*cf24229eSSandrine Bailleux * 16289c28a8SDan Handley * The format expected is the same as for printf(). For example: 174ecca339SDan Handley * INFO("Info %s.\n", "message") -> INFO: Info message. 18289c28a8SDan Handley * WARN("Warning %s.\n", "message") -> WARNING: Warning message. 194ecca339SDan Handley */ 20289c28a8SDan Handley 21289c28a8SDan Handley #define LOG_LEVEL_NONE 0 22289c28a8SDan Handley #define LOG_LEVEL_ERROR 10 23289c28a8SDan Handley #define LOG_LEVEL_NOTICE 20 24289c28a8SDan Handley #define LOG_LEVEL_WARNING 30 25289c28a8SDan Handley #define LOG_LEVEL_INFO 40 26289c28a8SDan Handley #define LOG_LEVEL_VERBOSE 50 27289c28a8SDan Handley 281319e7b1SSoby Mathew #ifndef __ASSEMBLY__ 292d7e8282SSoby Mathew #include <stdarg.h> 301319e7b1SSoby Mathew #include <stdio.h> 31289c28a8SDan Handley 327f56e9a3SSoby Mathew /* 337f56e9a3SSoby Mathew * Define Log Markers corresponding to each log level which will 347f56e9a3SSoby Mathew * be embedded in the format string and is expected by tf_log() to determine 357f56e9a3SSoby Mathew * the log level. 367f56e9a3SSoby Mathew */ 377f56e9a3SSoby Mathew #define LOG_MARKER_ERROR "\xa" /* 10 */ 387f56e9a3SSoby Mathew #define LOG_MARKER_NOTICE "\x14" /* 20 */ 397f56e9a3SSoby Mathew #define LOG_MARKER_WARNING "\x1e" /* 30 */ 407f56e9a3SSoby Mathew #define LOG_MARKER_INFO "\x28" /* 40 */ 417f56e9a3SSoby Mathew #define LOG_MARKER_VERBOSE "\x32" /* 50 */ 427f56e9a3SSoby Mathew 43*cf24229eSSandrine Bailleux /* 44*cf24229eSSandrine Bailleux * If the log output is too low then this macro is used in place of tf_log() 45*cf24229eSSandrine Bailleux * below. The intent is to get the compiler to evaluate the function call for 46*cf24229eSSandrine Bailleux * type checking and format specifier correctness but let it optimize it out. 47*cf24229eSSandrine Bailleux */ 48*cf24229eSSandrine Bailleux #define no_tf_log(fmt, ...) \ 49*cf24229eSSandrine Bailleux do { \ 50*cf24229eSSandrine Bailleux if (0) { \ 51*cf24229eSSandrine Bailleux tf_log(fmt, ##__VA_ARGS__); \ 52*cf24229eSSandrine Bailleux } \ 53*cf24229eSSandrine Bailleux } while (0) 54*cf24229eSSandrine Bailleux 55289c28a8SDan Handley #if LOG_LEVEL >= LOG_LEVEL_NOTICE 567f56e9a3SSoby Mathew # define NOTICE(...) tf_log(LOG_MARKER_NOTICE __VA_ARGS__) 574ecca339SDan Handley #else 58*cf24229eSSandrine Bailleux # define NOTICE(...) no_tf_log(LOG_MARKER_NOTICE __VA_ARGS__) 59289c28a8SDan Handley #endif 60289c28a8SDan Handley 61289c28a8SDan Handley #if LOG_LEVEL >= LOG_LEVEL_ERROR 627f56e9a3SSoby Mathew # define ERROR(...) tf_log(LOG_MARKER_ERROR __VA_ARGS__) 63289c28a8SDan Handley #else 64*cf24229eSSandrine Bailleux # define ERROR(...) no_tf_log(LOG_MARKER_ERROR __VA_ARGS__) 65289c28a8SDan Handley #endif 66289c28a8SDan Handley 67289c28a8SDan Handley #if LOG_LEVEL >= LOG_LEVEL_WARNING 687f56e9a3SSoby Mathew # define WARN(...) tf_log(LOG_MARKER_WARNING __VA_ARGS__) 69289c28a8SDan Handley #else 70*cf24229eSSandrine Bailleux # define WARN(...) no_tf_log(LOG_MARKER_WARNING __VA_ARGS__) 714ecca339SDan Handley #endif 724ecca339SDan Handley 73289c28a8SDan Handley #if LOG_LEVEL >= LOG_LEVEL_INFO 747f56e9a3SSoby Mathew # define INFO(...) tf_log(LOG_MARKER_INFO __VA_ARGS__) 75289c28a8SDan Handley #else 76*cf24229eSSandrine Bailleux # define INFO(...) no_tf_log(LOG_MARKER_INFO __VA_ARGS__) 77289c28a8SDan Handley #endif 78289c28a8SDan Handley 79289c28a8SDan Handley #if LOG_LEVEL >= LOG_LEVEL_VERBOSE 807f56e9a3SSoby Mathew # define VERBOSE(...) tf_log(LOG_MARKER_VERBOSE __VA_ARGS__) 81289c28a8SDan Handley #else 82*cf24229eSSandrine Bailleux # define VERBOSE(...) no_tf_log(LOG_MARKER_VERBOSE __VA_ARGS__) 83289c28a8SDan Handley #endif 84289c28a8SDan Handley 85c6bc0710SDan Handley void __dead2 do_panic(void); 86a43d431bSSoby Mathew #define panic() do_panic() 87a43d431bSSoby Mathew 8851faada7SDouglas Raillard /* Function called when stack protection check code detects a corrupted stack */ 8951faada7SDouglas Raillard void __dead2 __stack_chk_fail(void); 9051faada7SDouglas Raillard 917f56e9a3SSoby Mathew void tf_log(const char *fmt, ...) __printflike(1, 2); 92dad25049SSandrine Bailleux void tf_printf(const char *fmt, ...) __printflike(1, 2); 93da5241cbSAntonio Nino Diaz int tf_snprintf(char *s, size_t n, const char *fmt, ...) __printflike(3, 4); 942d7e8282SSoby Mathew void tf_vprintf(const char *fmt, va_list args); 952d7e8282SSoby Mathew void tf_string_print(const char *str); 967f56e9a3SSoby Mathew void tf_log_set_max_level(unsigned int log_level); 97b79af934SSoby Mathew 981319e7b1SSoby Mathew #endif /* __ASSEMBLY__ */ 994ecca339SDan Handley #endif /* __DEBUG_H__ */ 100