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
101#define PANIC(...) \
102 { \
103 do { \
104 u32 esp = read_esp(); \
105 panic(esp, __VA_ARGS__); \
106 } while (0); \
107 }
108
109#define PANIC_ON(cond, ...) \
110 { \
111 if (cond) \
112 PANIC(__VA_ARGS__); \
113 }
114
115#define ASSERT(cond) \
116 do { \
117 PANIC_ON(!(cond), "assertion failed: %s: line %d: %s", __FUNCTION__, \
118 __LINE__, stringify(cond)); \
119 } while (0)
120
121#define WARN(_msg, ...) \
122 do { \
123 printk("%s:%d: " _msg "\n", __FUNCTION__, \
124 __LINE__ __VA_OPT__(, ) __VA_ARGS__); \
125 stack_trace(); \
126 } while (0)
127
128#define WARN_ON_MSG(_cond, _msg, ...) \
129 ({ \
130 bool __cond = !!(_cond); \
131 if (unlikely(__cond)) { \
132 WARN(_msg, __VA_ARGS__); \
133 } \
134 unlikely(__cond); \
135 })
136
137#define WARN_ON(_cond) WARN_ON_MSG((_cond), stringify(_cond))
138
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) \
183 { \
184 log_dbg(stringify(_arr)); \
185 printk("{ "); \
186 for (size_t i = 0; i < (_len); ++i) \
187 printk("" _fmt ", ", (_arr)[i]); \
188 printk("}\n"); \
189 }
190
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__)
208
209#endif /* KERNEL_LOGGER_H */
210
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