feat: D4 DKM colored log prefixes - every driver has its own temper
- log.c: color context (log_set_color / log_color_enable); ANSI only goes to serial, BOOTLOG.TXT buffer stays clean plain text - kernel_api.c: dkm_log_set_driver() — driver-name FNV-1a hash into an 8-color bright ANSI palette, deterministic per driver - load sites (dkm_core builtin + boot_modules external) set color around driver_init and clear after - FUCK [debug] color_log gate (dev=1, release=0) - QEMU verified: 1150 colored lines, per-driver stable colors (.build_tmp/qemu_serial_d4color.log)
This commit is contained in:
@@ -390,7 +390,9 @@ int dkm_load_elf_rel(const void *address, u64 size, const struct dkm_symbol_scan
|
||||
handle.load_stage = desc->stage;
|
||||
handle.flags = desc->flags;
|
||||
|
||||
dkm_log_set_driver(desc->name); /* D4: 驱动自己的颜色 */
|
||||
int result = init(dkm_get_kernel_api(), &handle);
|
||||
dkm_log_set_driver(0);
|
||||
handle.init_status = result;
|
||||
if (result != 0) {
|
||||
handle.state = DKM_STATE_FAILED;
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
dkm/boot_modules.o: dkm\boot_modules.c include\utsm\dkm.h \
|
||||
include\utsm\types.h include\utsm\dma.h include\utsm\block.h \
|
||||
include\utsm\net.h include\utsm\paging.h include\utsm\log.h \
|
||||
include\utsm\arena.h dkm\..\arch\x86_64\limine.h
|
||||
include\utsm\dkm.h:
|
||||
include\utsm\types.h:
|
||||
include\utsm\dma.h:
|
||||
include\utsm\block.h:
|
||||
include\utsm\net.h:
|
||||
include\utsm\paging.h:
|
||||
include\utsm\log.h:
|
||||
include\utsm\arena.h:
|
||||
dkm\..\arch\x86_64\limine.h:
|
||||
Binary file not shown.
@@ -51,8 +51,10 @@ int dkm_load_builtin(const dkm_builtin_driver *driver) {
|
||||
|
||||
log_info("[DKM] builtin driver init begin");
|
||||
log_info(driver->desc->name);
|
||||
dkm_log_set_driver(driver->desc->name); /* D4: 驱动自己的颜色 */
|
||||
handle.state = DKM_STATE_INITING;
|
||||
status = driver->init(dkm_get_kernel_api(), &handle);
|
||||
dkm_log_set_driver(0);
|
||||
handle.init_status = status;
|
||||
|
||||
if (status != 0) {
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
dkm/dkm_core.o: dkm\dkm_core.c include\utsm\dkm.h include\utsm\types.h \
|
||||
include\utsm\dma.h include\utsm\block.h include\utsm\net.h \
|
||||
include\utsm\paging.h include\utsm\log.h
|
||||
include\utsm\dkm.h:
|
||||
include\utsm\types.h:
|
||||
include\utsm\dma.h:
|
||||
include\utsm\block.h:
|
||||
include\utsm\net.h:
|
||||
include\utsm\paging.h:
|
||||
include\utsm\log.h:
|
||||
Binary file not shown.
@@ -32,6 +32,27 @@ static const dkm_log_api g_log_api = {
|
||||
.panic = dkm_api_panic
|
||||
};
|
||||
|
||||
/* ---- D4: DKM 彩色日志——每个驱动有自己的脾气 ----
|
||||
* 加载器在 driver_init 前调用 dkm_log_set_driver(desc->name):
|
||||
* 驱动名 FNV-1a hash → 8 色调色板(明亮色系,串口可读),
|
||||
* 同名驱动颜色确定性可复现。init 返回后由调用方清上下文。 */
|
||||
void dkm_log_set_driver(const char *name) {
|
||||
static const char *palette[8] = {
|
||||
"\x1b[36m", "\x1b[32m", "\x1b[33m", "\x1b[35m",
|
||||
"\x1b[96m", "\x1b[92m", "\x1b[93m", "\x1b[95m"
|
||||
};
|
||||
if (!name || !*name) {
|
||||
log_set_color(0);
|
||||
return;
|
||||
}
|
||||
u32 h = 2166136261u;
|
||||
while (*name) {
|
||||
h ^= (u8)*name++;
|
||||
h *= 16777619u;
|
||||
}
|
||||
log_set_color(palette[h & 7]);
|
||||
}
|
||||
|
||||
static dkm_kernel_api g_kernel_api = {
|
||||
.version = DKM_KERNEL_API_VERSION,
|
||||
.size = sizeof(dkm_kernel_api),
|
||||
|
||||
Binary file not shown.
@@ -158,6 +158,8 @@ typedef struct dkm_builtin_driver {
|
||||
} dkm_builtin_driver;
|
||||
|
||||
void dkm_init(void);
|
||||
/* D4: 设置当前驱动日志颜色上下文(driver_init 前设置,返回后清 0) */
|
||||
void dkm_log_set_driver(const char *name);
|
||||
int dkm_load_builtin(const dkm_builtin_driver *driver);
|
||||
void dkm_scan_boot_modules(void);
|
||||
void dsm_load_by_manifest(void);
|
||||
|
||||
@@ -13,6 +13,13 @@ void log_error(const char *msg);
|
||||
void log_hex64(const char *prefix, u64 value);
|
||||
void panic(const char *msg);
|
||||
|
||||
/* D4: DKM 彩色日志——驱动 init 期间的颜色上下文。
|
||||
* log_set_color 传 ANSI CSI(如 "\x1b[36m"),0/"" 恢复默认;
|
||||
* 颜色只走串口,BOOTLOG 缓冲保持纯文本。log_color_enable 总开关
|
||||
* (FUCK [debug] color_log)。 */
|
||||
void log_set_color(const char *ansi);
|
||||
void log_color_enable(int enable);
|
||||
|
||||
/* ---- 内存日志缓冲区(实机启动日志持久化) ----
|
||||
* 由 disk_log_flush() 写入 FAT32 文件 SYSTEM/DESHAB64/DEV/BOOTLOG.TXT。 */
|
||||
void log_capture_enable(int enable);
|
||||
|
||||
@@ -44,7 +44,57 @@ static void log_emit(const char *s) {
|
||||
}
|
||||
}
|
||||
|
||||
/* ---- D4: DKM 彩色日志 ----
|
||||
* 驱动 init 期间由 dkm_log_set_driver() 设置 ANSI 颜色上下文;
|
||||
* 颜色只走串口(QEMU stdio 可见),BOOTLOG 缓冲保持纯文本。 */
|
||||
static const char *g_log_color = 0;
|
||||
static int g_log_color_on = 1;
|
||||
|
||||
void log_set_color(const char *ansi) {
|
||||
g_log_color = ansi;
|
||||
}
|
||||
|
||||
void log_color_enable(int enable) {
|
||||
g_log_color_on = enable;
|
||||
if (!enable) g_log_color = 0;
|
||||
}
|
||||
|
||||
/* 串口带色输出 + 缓冲纯文本(临界区内) */
|
||||
static void log_emit_colored(const char *color, const char *a,
|
||||
const char *b, const char *c) {
|
||||
u64 flags;
|
||||
__asm__ volatile("pushfq; popq %0; cli" : "=r"(flags) :: "memory");
|
||||
serial_write(color);
|
||||
serial_write(a);
|
||||
if (b) serial_write(b);
|
||||
if (c) serial_write(c);
|
||||
serial_write("\x1b[0m\n");
|
||||
if (g_log_capture_on) {
|
||||
const char *parts[3] = { a, b, c };
|
||||
for (int i = 0; i < 3; i++) {
|
||||
const char *s = parts[i];
|
||||
if (!s) continue;
|
||||
while (*s) {
|
||||
if (g_log_len < LOG_BUF_SIZE) {
|
||||
g_log_buf[g_log_len++] = *s;
|
||||
}
|
||||
s++;
|
||||
}
|
||||
}
|
||||
if (g_log_len < LOG_BUF_SIZE) {
|
||||
g_log_buf[g_log_len++] = '\n';
|
||||
}
|
||||
}
|
||||
if (flags & (1ULL << 9)) {
|
||||
__asm__ volatile("sti" ::: "memory");
|
||||
}
|
||||
}
|
||||
|
||||
static void log_line(const char *level, const char *msg) {
|
||||
if (g_log_color && g_log_color_on) {
|
||||
log_emit_colored(g_log_color, level, " ", msg);
|
||||
return;
|
||||
}
|
||||
log_emit(level);
|
||||
log_emit(" ");
|
||||
log_emit(msg);
|
||||
@@ -72,6 +122,10 @@ void log_hex64(const char *prefix, u64 value) {
|
||||
buf[2 + i] = hex[(value >> ((15 - i) * 4)) & 0xf];
|
||||
}
|
||||
buf[18] = 0;
|
||||
if (g_log_color && g_log_color_on) {
|
||||
log_emit_colored(g_log_color, prefix, buf, 0);
|
||||
return;
|
||||
}
|
||||
log_emit(prefix);
|
||||
log_emit(buf);
|
||||
log_emit("\n");
|
||||
|
||||
Binary file not shown.
@@ -299,6 +299,10 @@ void kernel_main(void) {
|
||||
g_boot_cfg_loaded = (utsm_load_fuck_config(&g_boot_cfg) == 0);
|
||||
ini_config *cfg = g_boot_cfg_loaded ? &g_boot_cfg : NULL;
|
||||
|
||||
/* D4: DKM 彩色日志总开关(FUCK [debug] color_log,默认开;
|
||||
* 颜色只走串口,BOOTLOG.TXT 保持纯文本) */
|
||||
log_color_enable(ini_get_bool(cfg, "debug", "color_log", 1));
|
||||
|
||||
/* ---- 插桩: FUCK 配置加载完成 ---- */
|
||||
INSTR_PROBE(BOOT, (u64)g_boot_cfg_loaded, 0, 0, 0);
|
||||
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user