29#ifndef KERNEL_LOGGER_H
30#define KERNEL_LOGGER_H
32#include <kernel/cpu.h>
34#include <utils/compiler.h>
35#include <utils/stringify.h>
38#define LOG_DOMAIN NULL
44#define FMT64 "%#016llx"
46#include <kernel/printk.h>
62#define ANSI_RESET "\033[0m"
76void
log(enum
log_level, const
char *domain, const
char *msg, ...);
78void log_vlog(enum
log_level, const
char *domain, const
char *msg,
93void panic(u32 esp, const
char *msg, ...) __attribute__((__noreturn__));
104 u32 esp = read_esp(); \
105 panic(esp, __VA_ARGS__); \
109#define PANIC_ON(cond, ...) \
112 PANIC(__VA_ARGS__); \
115#define ASSERT(cond) \
117 PANIC_ON(!(cond), "assertion failed: %s: line %d: %s", __FUNCTION__, \
118 __LINE__, stringify(cond)); \
121#define WARN(_msg, ...) \
123 printk("%s:%d: " _msg "\n", __FUNCTION__, \
124 __LINE__ __VA_OPT__(, ) __VA_ARGS__); \
128#define WARN_ON_MSG(_cond, _msg, ...) \
130 bool __cond = !!(_cond); \
131 if (unlikely(__cond)) { \
132 WARN(_msg, __VA_ARGS__); \
137#define WARN_ON(_cond) WARN_ON_MSG((_cond), stringify(_cond))
143#define log_err(format, ...) \
144 log(LOG_LEVEL_ERR, LOG_DOMAIN, format __VA_OPT__(, ) __VA_ARGS__)
145#define log_warn(format, ...) \
146 log(LOG_LEVEL_WARN, LOG_DOMAIN, format __VA_OPT__(, ) __VA_ARGS__)
147#define log_info(format, ...) \
148 log(LOG_LEVEL_INFO, LOG_DOMAIN, format __VA_OPT__(, ) __VA_ARGS__)
149#define log_dbg(format, ...) \
150 log(LOG_LEVEL_DEBUG, LOG_DOMAIN, format __VA_OPT__(, ) __VA_ARGS__)
163#define log_variable(_var) \
164 log(LOG_LEVEL_DEBUG, "variable", "%s=" FMT32, stringify(_var), _var)
165#define log_variable_8(_var) \
166 log(LOG_LEVEL_DEBUG, "variable", "%s=" FMT8, stringify(_var), _var)
167#define log_variable_16(_var) \
168 log(LOG_LEVEL_DEBUG, "variable", "%s=" FMT16, stringify(_var), _var)
169#define log_variable_64(_var) \
170 log(LOG_LEVEL_DEBUG, "variable", "%s=" FMT64, stringify(_var), _var)
171#define log_variable_str(_var) \
172 log(LOG_LEVEL_DEBUG, "variable", "%s=%s", stringify(_var), _var)
182#define log_array_fmt(_arr, _len, _fmt) \
184 log_dbg(stringify(_arr)); \
186 for (size_t i = 0; i < (_len); ++i) \
187 printk("" _fmt ", ", (_arr)[i]); \
200#define log_array(_arr, _len) log_array_fmt(_arr, _len, FMT32)
201#define log_array_8(_arr, _len) log_array_fmt(_arr, _len, FMT8)
202#define log_array_16(_arr, _len) log_array_fmt(_arr, _len, FMT16)
203#define log_array_64(_arr, _len) log_array_fmt(_arr, _len, FMT64)
204#define log_array_str(_arr, _len) log_array_fmt(_arr, _len, "%s")
207#define not_implemented(...) log_warn("not implemented: " __VA_ARGS__)
void log_set_level(enum log_level)
Change the maximum log level to display.
Definition: logger.c:25
void stack_trace(void)
Print the callstack to the kernel's console.
Definition: panic.c:49
log_level
The different available logging levels.
Definition: logger.h:51
void log(enum log_level, const char *domain, const char *msg,...)
Print a log message onto the terminal.
Definition: logger.c:30
void panic(u32 esp, const char *msg,...) __attribute__((__noreturn__))
Completely stop the kernel's execution.
Definition: panic.c:109
@ LOG_LEVEL_DEBUG
standard messages
Definition: logger.h:55
@ LOG_LEVEL_WARN
error messages
Definition: logger.h:53
@ LOG_LEVEL_COUNT
debug messages
Definition: logger.h:58
@ LOG_LEVEL_INFO
warning messages
Definition: logger.h:54