blob: 6025590b495190819f37946fbb583c95c41eefab [file] [log] [blame]
/*
* Copyright (c) 2014-2022, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef __DEBUG_H__
#define __DEBUG_H__
#include <stdio.h>
#ifdef IMAGE_CACTUS_MM
/* Remove dependency on spinlocks for Cactus-MM */
#define mp_printf printf
#else
/*
* Print a formatted string on the UART.
*
* Does the same thing as the standard libc's printf() function but in a MP-safe
* manner, i.e. it can be called from several CPUs simultaneously without
* getting interleaved messages.
*/
__attribute__((format(printf, 1, 2)))
void mp_printf(const char *fmt, ...);
#endif /* IMAGE_CACTUS_MM */
#ifdef IMAGE_REALM
void realm_printf(const char *fmt, ...);
#define mp_printf realm_printf
#endif
/*
* 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 similar to printf(). For example:
* INFO("Info %s.\n", "message") -> INFO: Info message.
* WARN("Warning %s.\n", "message") -> WARNING: Warning message.
*/
#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(...) mp_printf("NOTICE: " __VA_ARGS__)
#else
# define NOTICE(...)
#endif
#if LOG_LEVEL >= LOG_LEVEL_ERROR
# define ERROR(...) mp_printf("ERROR: " __VA_ARGS__)
#else
# define ERROR(...)
#endif
#if LOG_LEVEL >= LOG_LEVEL_WARNING
# define WARN(...) mp_printf("WARNING: " __VA_ARGS__)
#else
# define WARN(...)
#endif
#if LOG_LEVEL >= LOG_LEVEL_INFO
# define INFO(...) mp_printf("INFO: " __VA_ARGS__)
#else
# define INFO(...)
#endif
#if LOG_LEVEL >= LOG_LEVEL_VERBOSE
# define VERBOSE(...) mp_printf("VERBOSE: " __VA_ARGS__)
#else
# define VERBOSE(...)
#endif
#if ENABLE_BACKTRACE
void backtrace(const char *cookie);
#else
#define backtrace(x)
#endif
/*
* For the moment this panic function is very basic: report an error and
* spin. This can be expanded in the future to provide more information.
*/
void __attribute__((__noreturn__)) do_panic(const char *file, int line);
#define panic() do_panic(__FILE__, __LINE__)
void __attribute__((__noreturn__)) do_bug_unreachable(const char *file, int line);
#define bug_unreachable() do_bug_unreachable(__FILE__, __LINE__)
#endif /* __DEBUG_H__ */