1 /* 2 * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <assert.h> 8 #include <debug.h> 9 #include <platform.h> 10 11 /* Set the default maximum log level to the `LOG_LEVEL` build flag */ 12 static unsigned int max_log_level = LOG_LEVEL; 13 14 /* 15 * The common log function which is invoked by ARM Trusted Firmware code. 16 * This function should not be directly invoked and is meant to be 17 * only used by the log macros defined in debug.h. The function 18 * expects the first character in the format string to be one of the 19 * LOG_MARKER_* macros defined in debug.h. 20 */ tf_log(const char * fmt,...)21void tf_log(const char *fmt, ...) 22 { 23 unsigned int log_level; 24 va_list args; 25 const char *prefix_str; 26 27 /* We expect the LOG_MARKER_* macro as the first character */ 28 log_level = fmt[0]; 29 30 /* Verify that log_level is one of LOG_MARKER_* macro defined in debug.h */ 31 assert(log_level && log_level <= LOG_LEVEL_VERBOSE); 32 assert(log_level % 10 == 0); 33 34 if (log_level > max_log_level) 35 return; 36 37 prefix_str = plat_log_get_prefix(log_level); 38 39 if (prefix_str != NULL) 40 tf_string_print(prefix_str); 41 42 va_start(args, fmt); 43 tf_vprintf(fmt+1, args); 44 va_end(args); 45 } 46 47 /* 48 * The helper function to set the log level dynamically by platform. The 49 * maximum log level is determined by `LOG_LEVEL` build flag at compile time 50 * and this helper can set a lower log level than the one at compile. 51 */ tf_log_set_max_level(unsigned int log_level)52void tf_log_set_max_level(unsigned int log_level) 53 { 54 assert(log_level <= LOG_LEVEL_VERBOSE); 55 assert((log_level % 10) == 0); 56 57 /* Cap log_level to the compile time maximum. */ 58 if (log_level < LOG_LEVEL) 59 max_log_level = log_level; 60 61 } 62