My Kernel v0.1.0
logger.h
1
29#ifndef KERNEL_LOGGER_H
30#define KERNEL_LOGGER_H
31
32#include <kernel/cpu.h> // read_esp
33
34#include <utils/compiler.h>
35#include <utils/stringify.h>
36
37#ifndef LOG_DOMAIN
38#define LOG_DOMAIN NULL
39#endif
40
41#define FMT8 "%#02hhx"
42#define FMT16 "%#04hx"
43#define FMT32 "%#08x"
44#define FMT64 "%#016llx"
45
46#include <kernel/printk.h>
47
52 LOG_LEVEL_ERR,
57 /* Used for indexing purposes only */
59 LOG_LEVEL_ALL = LOG_LEVEL_COUNT,
60};
61
62#define ANSI_RESET "\033[0m"
63
75FORMAT(printf, 3, 4)
76void log(enum log_level, const char *domain, const char *msg, ...);
77
78void log_vlog(enum log_level, const char *domain, const char *msg,
79 va_list parameters);
80
93void panic(u32 esp, const char *msg, ...) __attribute__((__noreturn__));
94
96void stack_trace(void);
97
99void log_set_level(enum log_level);
100
102#define PANIC(...) \
103 { \
104 do { \
105 u32 esp = read_esp(); \
106 panic(esp, __VA_ARGS__); \
107 } while (0); \
108 }
109
110#define WARN(_msg, ...) \
111 do { \
112 printk("%s:%d: " _msg "\n", __FUNCTION__, \
113 __LINE__ __VA_OPT__(, ) __VA_ARGS__); \
114 stack_trace(); \
115 } while (0)
116
117#define WARN_ON_MSG(_cond, _msg, ...) \
118 ({ \
119 bool __cond = !!(_cond); \
120 if (unlikely(__cond)) { \
121 WARN(_msg, __VA_ARGS__); \
122 } \
123 unlikely(__cond); \
124 })
125
126#define WARN_ON(_cond) WARN_ON_MSG((_cond), stringify(_cond))
127
132#define log_err(format, ...) \
133 log(LOG_LEVEL_ERR, LOG_DOMAIN, format __VA_OPT__(, ) __VA_ARGS__)
134#define log_warn(format, ...) \
135 log(LOG_LEVEL_WARN, LOG_DOMAIN, format __VA_OPT__(, ) __VA_ARGS__)
136#define log_info(format, ...) \
137 log(LOG_LEVEL_INFO, LOG_DOMAIN, format __VA_OPT__(, ) __VA_ARGS__)
138#define log_dbg(format, ...) \
139 log(LOG_LEVEL_DEBUG, LOG_DOMAIN, format __VA_OPT__(, ) __VA_ARGS__)
152#define log_variable(_var) \
153 log(LOG_LEVEL_DEBUG, "variable", "%s=" FMT32, stringify(_var), _var)
154#define log_variable_8(_var) \
155 log(LOG_LEVEL_DEBUG, "variable", "%s=" FMT8, stringify(_var), _var)
156#define log_variable_16(_var) \
157 log(LOG_LEVEL_DEBUG, "variable", "%s=" FMT16, stringify(_var), _var)
158#define log_variable_64(_var) \
159 log(LOG_LEVEL_DEBUG, "variable", "%s=" FMT64, stringify(_var), _var)
160#define log_variable_str(_var) \
161 log(LOG_LEVEL_DEBUG, "variable", "%s=%s", stringify(_var), _var)
171#define log_array_fmt(_arr, _len, _fmt) \
172 { \
173 log_dbg(stringify(_arr)); \
174 printk("{ "); \
175 for (size_t i = 0; i < (_len); ++i) \
176 printk("" _fmt ", ", (_arr)[i]); \
177 printk("}\n"); \
178 }
179
189#define log_array(_arr, _len) log_array_fmt(_arr, _len, FMT32)
190#define log_array_8(_arr, _len) log_array_fmt(_arr, _len, FMT8)
191#define log_array_16(_arr, _len) log_array_fmt(_arr, _len, FMT16)
192#define log_array_64(_arr, _len) log_array_fmt(_arr, _len, FMT64)
193#define log_array_str(_arr, _len) log_array_fmt(_arr, _len, "%s")
196#define not_implemented(...) log_warn("not implemented: " __VA_ARGS__)
197
198#endif /* KERNEL_LOGGER_H */
199
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