Each `LOG_X` call declared a rather huge variable on the stack, and using it to dump a whole structure often led to a page fault. Now the temporary variables are `static`, which is a bit wasteful on the kernel binary size, but easier to maintain. Additionally bootloader updated to load kernels bigger than 64K.
61 lines
3.1 KiB
C
61 lines
3.1 KiB
C
#pragma once
|
|
|
|
#include "src/kernel/stream.h"
|
|
#include "src/lib/string.h"
|
|
|
|
extern stream_t *kernel_log;
|
|
|
|
#ifndef LOG_LEVEL
|
|
#define LOG_LEVEL 1
|
|
#endif
|
|
|
|
#define LOG_LEVEL_INFO 1
|
|
#define LOG_LEVEL_STEP 2
|
|
#define LOG_LEVEL_DATA 3
|
|
#define LOG_LEVEL_TRACE 4
|
|
|
|
static uint64_t print_size;
|
|
static char print_buffer[512];
|
|
|
|
#define PRINT(stream, fmt, ...) \
|
|
print_size = string_format(fmt, sizeof(print_buffer) - 1, print_buffer, ##__VA_ARGS__); \
|
|
stream->write(stream, print_buffer, print_size);
|
|
|
|
#define PRINT_LN(stream, fmt, ...) \
|
|
print_size = string_format(fmt, sizeof(print_buffer) - 1, print_buffer, ##__VA_ARGS__); \
|
|
stream->write(stream, __func__, string_length(__func__)); \
|
|
stream->write(stream, ": ", 2); \
|
|
stream->write(stream, print_buffer, print_size); \
|
|
stream->write(stream, "\n", 1);
|
|
|
|
#define PRINT_VAL(stream, v, f) PRINT_LN(#v = f, v)
|
|
|
|
#define LOG(level, fmt, ...) \
|
|
if (LOG_LEVEL >= level) { \
|
|
PRINT(kernel_log, fmt, ##__VA_ARGS__) \
|
|
}
|
|
|
|
#define LOG_LN(level, fmt, ...) \
|
|
if (LOG_LEVEL >= level) { \
|
|
PRINT_LN(kernel_log, fmt, ##__VA_ARGS__) \
|
|
}
|
|
|
|
#define LOG_VAL(level, v, f) LOG_LN(level, #v "=" f, v)
|
|
|
|
#define LOG_INFO(fmt, ...) LOG(LOG_LEVEL_INFO, fmt, ##__VA_ARGS__)
|
|
#define LOG_STEP(fmt, ...) LOG(LOG_LEVEL_STEP, fmt, ##__VA_ARGS__)
|
|
#define LOG_DATA(fmt, ...) LOG(LOG_LEVEL_DATA, fmt, ##__VA_ARGS__)
|
|
#define LOG_TRACE(fmt, ...) LOG(LOG_LEVEL_TRACE, fmt, ##__VA_ARGS__)
|
|
|
|
#define LOG_LN_INFO(fmt, ...) LOG_LN(LOG_LEVEL_INFO, fmt, ##__VA_ARGS__)
|
|
#define LOG_LN_STEP(fmt, ...) LOG_LN(LOG_LEVEL_STEP, fmt, ##__VA_ARGS__)
|
|
#define LOG_LN_DATA(fmt, ...) LOG_LN(LOG_LEVEL_DATA, fmt, ##__VA_ARGS__)
|
|
#define LOG_LN_TRACE(fmt, ...) LOG_LN(LOG_LEVEL_TRACE, fmt, ##__VA_ARGS__)
|
|
|
|
#define LOG_VAL_INFO(v, f) LOG_VAL(LOG_LEVEL_INFO, v, f)
|
|
#define LOG_VAL_STEP(v, f) LOG_VAL(LOG_LEVEL_STEP, v, f)
|
|
#define LOG_VAL_DATA(v, f) LOG_VAL(LOG_LEVEL_DATA, v, f)
|
|
#define LOG_VAL_TRACE(v, f) LOG_VAL(LOG_LEVEL_TRACE, v, f)
|
|
|
|
void log_init(stream_t *log);
|