60 lines
1.5 KiB
C
60 lines
1.5 KiB
C
/* boot_log.h — 跨 UTSM/DSK/应用 ELF 的启动日志环形缓冲(freestanding,无 libc)
|
||
*
|
||
* boot_log_info 由 UTSM 在静态内存中创建,经 dsk_boot_context.utsm_state 传递。
|
||
* DSK 注册 flush 回调,将缓冲写入 FAT32: SYSTEM/DESHAB64/DEV/BOOTLOG.TXT
|
||
* (DEV 目录不存在时回退 ESP 根目录 BOOTLOG.TXT)。
|
||
*/
|
||
#ifndef BOOT_LOG_H
|
||
#define BOOT_LOG_H
|
||
|
||
typedef unsigned int u32;
|
||
typedef unsigned long long u64;
|
||
|
||
#define BOOT_LOG_MAGIC 0x424C4746u /* "BLGF" */
|
||
#define BOOT_LOG_VERSION 1u
|
||
|
||
typedef struct boot_log_info boot_log_info;
|
||
|
||
typedef int (*boot_log_flush_fn)(void);
|
||
|
||
struct boot_log_info {
|
||
u32 magic;
|
||
u32 version;
|
||
char *buf;
|
||
u32 capacity;
|
||
u32 length;
|
||
u32 dropped;
|
||
boot_log_flush_fn flush;
|
||
};
|
||
|
||
static inline void boot_log_append(boot_log_info *bi, const char *s) {
|
||
if (!bi || bi->magic != BOOT_LOG_MAGIC || !s || !bi->buf)
|
||
return;
|
||
while (*s) {
|
||
if (bi->length < bi->capacity)
|
||
bi->buf[bi->length++] = *s;
|
||
else
|
||
bi->dropped++;
|
||
s++;
|
||
}
|
||
}
|
||
|
||
static inline void boot_log_bind(boot_log_info **slot, u64 utsm_state) {
|
||
if (!slot)
|
||
return;
|
||
*slot = 0;
|
||
if (!utsm_state)
|
||
return;
|
||
boot_log_info *bi = (boot_log_info *)(u64)utsm_state;
|
||
if (bi && bi->magic == BOOT_LOG_MAGIC && bi->buf && bi->capacity)
|
||
*slot = bi;
|
||
}
|
||
|
||
static inline int boot_log_try_flush(boot_log_info *bi) {
|
||
if (bi && bi->flush)
|
||
return bi->flush();
|
||
return -1;
|
||
}
|
||
|
||
#endif /* BOOT_LOG_H */
|