feat(panic): FUCK [panic] mode=strict|fallback + realtest image variant
- UTSM panic_full returns in fallback mode (logs [PANIC:FALLBACK] + code + hit count); panic_halt keeps always-halt sites (CPU exception, VMM-E11 LA57, VMM-E15 DSK jump, UTSM-E42 test hook). Call sites given safe continuations. - Mode passed to DSK/FirstInit/login/desktop via DSK_BOOT_FLAG_PANIC_FALLBACK; DKM kernel_api.panic / kern.log.panic return to driver; ext4 fatal aborts the op via setjmp/longjmp and DSK falls back to FAT32 ESP. - build.ps1/Makefile: dev=strict, release=fallback, new realtest (release options + strict); default -Variant all; serialized iso packing under -j. - Fix '*/' inside comments (dkm.h, kernel_api.h, bus.c) that broke the build. - Includes pending work: dkm_bus service bus, mt7920/wlan drivers, desktop files/startmenu/prank, pe-tools, diskinfo, docs. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -57,6 +57,52 @@ typedef struct {
|
||||
#define DKM_KAPI_MAGIC 0x4b415049u /* "KAPI" */
|
||||
#define DKM_KAPI_VERSION 1u
|
||||
|
||||
/* ===================================================================
|
||||
* D6 万物互联:dkm_bus 双向服务总线
|
||||
*
|
||||
* kapi 是内核→模块的单向只读导出表;bus 把它双向化:
|
||||
* 任何模块在 driver_init 里注册 srv.* 服务,任何模块按名消费。
|
||||
* 命名空间:kern.* 仅内核可注册,srv.* 仅模块可注册(BUS-E01)。
|
||||
* 失败策略:lookup miss = BUS-E04 panic(硬依赖未满足=编程错误);
|
||||
* probe miss = 返回 -1(能力缺席=设计内双路径,白名单登记)。
|
||||
* 生命周期:driver_init = 注册服务;"运行"也是服务(srv.<mod>.run)。
|
||||
* 设计定稿:docs/RE/万物互联与服务总线设计.md §1。
|
||||
* =================================================================== */
|
||||
#define DKM_BUS_MAGIC 0x53425553u /* "SBUS" */
|
||||
#define DKM_BUS_VERSION 1u
|
||||
#define DKM_BUS_MAX_SERVICES 128
|
||||
#define DKM_BUS_MAX_NAME 48
|
||||
|
||||
#define DKM_BUS_F_KERNEL 1u /* 内核注册,不可注销 */
|
||||
#define DKM_BUS_F_NO_UNLOAD 2u /* provider 声明 NO_UNLOAD,注销即 BUS-E05 */
|
||||
|
||||
typedef struct dkm_bus_service {
|
||||
char name[DKM_BUS_MAX_NAME]; /* NUL 终止;必须带命名空间前缀 */
|
||||
u32 version; /* 服务契约版本,消费方校验 */
|
||||
u32 flags; /* DKM_BUS_F_* */
|
||||
void *fn; /* 服务入口,签名由各服务契约定义 */
|
||||
const struct dkm_driver_desc *provider; /* NULL = 内核;存 desc 而非
|
||||
* handle——loader 的 handle 是栈
|
||||
* 局部变量会悬垂,desc 在驱动
|
||||
* 镜像内存里持久且每驱动唯一 */
|
||||
} dkm_bus_service;
|
||||
|
||||
typedef struct dkm_bus_api {
|
||||
u32 magic;
|
||||
u32 version;
|
||||
/* 注册:name 必须带命名空间前缀且与调用方身份匹配(BUS-E01)、
|
||||
* 重名 BUS-E02、表满 BUS-E03——全部 panic,成功返回 0。 */
|
||||
int (*register_service)(const char *name, u32 version, void *fn);
|
||||
/* 注销:仅 provider 本人可注销;F_KERNEL/F_NO_UNLOAD 或不存在 → BUS-E05。 */
|
||||
int (*unregister_service)(const char *name);
|
||||
/* 必存在查找:未命中 → BUS-E04 panic,绝不返回 NULL 伪装成功。 */
|
||||
int (*lookup)(const char *name, void **out_fn, u32 *out_version);
|
||||
/* 可选探测:未命中返回 -1;调用方必须显式处理缺席(白名单登记)。 */
|
||||
int (*probe)(const char *name, void **out_fn, u32 *out_version);
|
||||
u32 (*count)(void); /* 诊断 / /dev/services */
|
||||
const dkm_bus_service *(*at)(u32 index); /* 按 index 枚举 */
|
||||
} dkm_bus_api;
|
||||
|
||||
typedef struct dkm_driver_desc {
|
||||
u32 magic;
|
||||
u16 abi_version;
|
||||
@@ -160,6 +206,9 @@ typedef struct dkm_kernel_api {
|
||||
/* D3: 按名导出表(尾部追加,ABI 兼容)。驱动/用户态枚举内核服务并
|
||||
* 按名取函数指针;固定偏移 struct 字段不受影响。 */
|
||||
const dkm_kapi_table *kapi;
|
||||
/* D6 万物互联:双向服务总线(尾部追加,ABI 兼容)。kern.* 与 srv.* 按名
|
||||
* 注册-消费;driver_init = 注册服务的地方。 */
|
||||
const dkm_bus_api *bus;
|
||||
} dkm_kernel_api;
|
||||
|
||||
typedef enum dkm_driver_state {
|
||||
@@ -191,6 +240,15 @@ 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);
|
||||
/* P0(万物互联):按名加载。dsm_load_named 严格版(depends 校验强制,供
|
||||
* kern.dkm.load_by_name 等常规路径);dsm_load_named_boot 顺序豁免版
|
||||
* (唯一合法调用方 = kernel/main.c VMM 路径 pci+ahci 预加载,先于 apic,
|
||||
* 否则 guest 陷入 IDTR=0 VM-exit 风暴——设计内豁免,见
|
||||
* docs/RE/万物互联与服务总线设计.md §6)。
|
||||
* 签名(ini_config 定义在 kernel/ini_parser.h,此处避免头依赖):
|
||||
* void dsm_load_named(const ini_config *cfg, const char *name);
|
||||
* void dsm_load_named_boot(const ini_config *cfg, const char *name);
|
||||
* 调用方自行前向声明(同 kernel/main.c 既有模式)。 */
|
||||
void dkm_fill_platform_info(void);
|
||||
const dkm_kernel_api *dkm_get_kernel_api(void);
|
||||
|
||||
@@ -198,6 +256,17 @@ const dkm_kernel_api *dkm_get_kernel_api(void);
|
||||
const struct drr_recovery_api *drr_get_recovery_api(void);
|
||||
const struct utsm_sched_api *utsm_sched_get_api(void);
|
||||
|
||||
/* D6 万物互联:服务总线(dkm/bus.c 提供)。dkm_bus_init 播种 kern.*
|
||||
* 并挂入 kernel_api(dkm_fill_platform_info 内调用,先于一切驱动加载);
|
||||
* loader 在 driver_init 前后 set/clear provider 上下文(仿 D4 颜色上下文),
|
||||
* kern.* 只能在 provider==NULL 时注册。 */
|
||||
void dkm_bus_init(void);
|
||||
const dkm_bus_api *dkm_bus_get_api(void);
|
||||
void dkm_bus_set_current_provider(struct dkm_driver_handle *h);
|
||||
/* loader 专用:token T 是否已有 "prefix" 或 "prefix.*" 服务注册
|
||||
* (stage>=4 provides 校验用,DKM-E45)。命中返回 1。 */
|
||||
int dkm_bus_prefix_registered(const char *prefix);
|
||||
|
||||
/* exposed for manifest parser */
|
||||
struct dkm_symbol_scan {
|
||||
const void *driver_desc;
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
#define DSK_BOOT_FLAG_DKM_READY (1ULL << 1)
|
||||
#define DSK_BOOT_FLAG_FAT32_PATH (1ULL << 2)
|
||||
#define DSK_BOOT_FLAG_PROBE_INFO (1ULL << 3)
|
||||
/* FUCK [panic] mode=fallback:DSK/desktop/login/FirstInit 的 *_fatal 记录后返回,
|
||||
* 调用点走备用路径(见 utsm/panic.h)。未置位 = strict。 */
|
||||
#define DSK_BOOT_FLAG_PANIC_FALLBACK (1ULL << 4)
|
||||
|
||||
/* ---- Probe 信息结构(通过 reserved[6] 传递给 shell/desktop) ---- */
|
||||
#define PROBE_INFO_MAGIC 0x50524F42u /* "PRFB" — Probe inFo Buffer */
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
* L1 wf_theme 主题令牌(色板 + 圆角),g_wf_light / g_wf_dark 预设
|
||||
* L2 原语 du_wf_acrylic(读背景 alpha 混合圆角面板)、du_wf_shadow、
|
||||
* du_wf_line(Bresenham 带宽线)、du_wf_ring(圆环/半弧)
|
||||
* L3 组件 按钮/图标钮/开关/滑块/列表项/卡片/文本框/滚动条/提示
|
||||
* L3 组件 按钮/图标钮/开关/滑块/列表项/卡片/文本框/滚动条/提示 +
|
||||
* 复选框/进度条/标签页/分隔线/应用瓦片/菜单行/徽标(M3 开始菜单批次)
|
||||
* L4 图标 du_wf_icon 矢量线性图标(24 网格设计,2px 笔触)
|
||||
*
|
||||
* 约定(与 deshab_ui.h 相同):包含本头前,编译单元须已定义 g_ascii
|
||||
@@ -315,6 +316,92 @@ static inline void du_wf_tooltip(du_context *ctx, du_i64 x, du_i64 y,
|
||||
t->text_primary, t->acrylic_solid, DU_ASCII_STEP);
|
||||
}
|
||||
|
||||
/* ============ M3 新增组件(开始菜单/快速设置批次)============ */
|
||||
|
||||
/* 复选框:20×20 圆角 4 方框,选中画 accent 对勾 + accent 底 */
|
||||
static inline void du_wf_checkbox(du_context *ctx, du_i64 x, du_i64 y,
|
||||
int checked, const wf_theme *t) {
|
||||
du_fill_rounded_rect(ctx, x, y, 20, 20,
|
||||
checked ? t->accent : t->acrylic_solid, 4);
|
||||
du_rect_outline(ctx, x, y, 20, 20,
|
||||
checked ? t->accent : t->control_stroke, 4);
|
||||
if (checked) {
|
||||
du_wf_line(ctx, x + 4, y + 10, x + 8, y + 15, 2, t->on_accent);
|
||||
du_wf_line(ctx, x + 8, y + 15, x + 16, y + 4, 2, t->on_accent);
|
||||
}
|
||||
}
|
||||
|
||||
/* 进度条:6px 圆角轨道 + accent 填充(val 0..100) */
|
||||
static inline void du_wf_progress(du_context *ctx, du_i64 x, du_i64 y,
|
||||
du_i64 w, int val, const wf_theme *t) {
|
||||
if (val < 0) val = 0;
|
||||
if (val > 100) val = 100;
|
||||
du_fill_rounded_rect(ctx, x, y, w, 6, t->control_stroke, 3);
|
||||
du_i64 fw = w * val / 100;
|
||||
if (fw < 4) fw = 4;
|
||||
if (fw > w) fw = w;
|
||||
du_fill_rounded_rect(ctx, x, y, fw, 6, t->accent, 3);
|
||||
}
|
||||
|
||||
/* 标签页(pill):圆角 full,active 填 accent_secondary 底 */
|
||||
static inline void du_wf_pill(du_context *ctx, du_i64 x, du_i64 y,
|
||||
const char *label, const wf_theme *t, int active) {
|
||||
du_i64 len = 0;
|
||||
while (label[len]) len++;
|
||||
du_i64 w = len * (du_i64)DU_ASCII_STEP + 20;
|
||||
du_fill_rounded_rect(ctx, x, y, w, 26,
|
||||
active ? t->accent : t->acrylic_solid, 13);
|
||||
du_draw_string(ctx, label, x + 10, y + (26 - (du_i64)DU_ASCII_CELL_H) / 2,
|
||||
active ? t->on_accent : t->text_secondary,
|
||||
active ? t->accent : t->acrylic_solid, DU_ASCII_STEP);
|
||||
}
|
||||
|
||||
/* 分隔线:1px divider */
|
||||
static inline void du_wf_separator(du_context *ctx, du_i64 x, du_i64 y,
|
||||
du_i64 w, const wf_theme *t) {
|
||||
du_fill_rect(ctx, x, y, w, 1, t->divider);
|
||||
}
|
||||
|
||||
/* 应用瓦片:圆角 8 悬浮底 + 居中图标 + 底部标签区(中文标签由调用方
|
||||
* zh_draw_string 绘制,ASCII 图标由本组件画)。hover/selected 蒙层。 */
|
||||
static inline void du_wf_app_tile(du_context *ctx, du_i64 x, du_i64 y,
|
||||
du_i64 w, du_i64 h, wf_icon_id icon,
|
||||
const wf_theme *t, wf_btn_state st,
|
||||
int selected) {
|
||||
if (st == WF_BTN_HOVER)
|
||||
du_wf_overlay(ctx, x, y, w, h, 0x14000000u);
|
||||
if (selected)
|
||||
du_wf_overlay(ctx, x, y, w, h, 0x1E000000u);
|
||||
du_i64 isz = h / 3;
|
||||
if (isz < 24) isz = 24;
|
||||
if (isz > 36) isz = 36;
|
||||
du_wf_icon(ctx, icon, x + (w - isz) / 2, y + (h - isz) / 2 - 8, isz,
|
||||
selected ? t->accent : t->text_primary);
|
||||
/* 选中态:底部 3px accent 指示条 */
|
||||
if (selected)
|
||||
du_fill_rounded_rect(ctx, x + w / 2 - 8, y + h - 6, 16, 3, t->accent, 1);
|
||||
}
|
||||
|
||||
/* 菜单行:36px 行高 + 左侧图标 + ASCII 标签(右箭头区由调用方补充) */
|
||||
static inline void du_wf_menu_item(du_context *ctx, du_i64 x, du_i64 y,
|
||||
du_i64 w, wf_icon_id icon, const char *label,
|
||||
const wf_theme *t, wf_btn_state st) {
|
||||
if (st == WF_BTN_HOVER)
|
||||
du_wf_overlay(ctx, x, y, w, 36, 0x14000000u);
|
||||
du_wf_icon(ctx, icon, x + 10, y + 6, 22, t->text_primary);
|
||||
du_draw_string(ctx, label, x + 44, y + (36 - (du_i64)DU_ASCII_CELL_H) / 2,
|
||||
t->text_primary, 0, DU_ASCII_STEP);
|
||||
}
|
||||
|
||||
/* 徽标:8px 圆点(通知/在线状态角标) */
|
||||
static inline void du_wf_badge(du_context *ctx, du_i64 cx, du_i64 cy,
|
||||
du_u32 color) {
|
||||
for (du_i64 dy = -4; dy <= 4; dy++)
|
||||
for (du_i64 dx = -4; dx <= 4; dx++)
|
||||
if (dx * dx + dy * dy <= 16)
|
||||
du_pixel(ctx, cx + dx, cy + dy, color);
|
||||
}
|
||||
|
||||
/* ===================================================================
|
||||
* L4 — 矢量图标(24 网格设计,线性 2px 笔触,Win11 Segoe 风格)
|
||||
*
|
||||
@@ -343,6 +430,18 @@ typedef enum {
|
||||
WF_ICON_MAX, /* □ */
|
||||
WF_ICON_RESTORE, /* 双层 □ */
|
||||
WF_ICON_USER, /* 人形 */
|
||||
/* M3 开始菜单/系统工具批次 */
|
||||
WF_ICON_APPS, /* 3×3 点阵(应用列表) */
|
||||
WF_ICON_CLOCK, /* 圆 + 指针 */
|
||||
WF_ICON_INFO, /* 圆 + i */
|
||||
WF_ICON_DISK, /* 圆柱(磁盘) */
|
||||
WF_ICON_PICTURE, /* 山 + 太阳(画板/图片) */
|
||||
WF_ICON_MUSIC, /* 音符 */
|
||||
WF_ICON_GAME, /* 手柄 */
|
||||
WF_ICON_CHIP, /* CPU 芯片 */
|
||||
WF_ICON_REFRESH, /* 环形箭头 */
|
||||
WF_ICON_LOCK, /* 挂锁 */
|
||||
WF_ICON_TRASH, /* 垃圾桶 */
|
||||
} wf_icon_id;
|
||||
|
||||
static inline void du_wf_icon(du_context *ctx, wf_icon_id id,
|
||||
@@ -466,6 +565,80 @@ static inline void du_wf_icon(du_context *ctx, wf_icon_id id,
|
||||
du_wf_ring(ctx, x + 12 * u, y + 8 * u, 4 * u, s, 0, color);
|
||||
du_wf_ring(ctx, x + 12 * u, y + 26 * u, 9 * u, s, 1, color);
|
||||
break;
|
||||
case WF_ICON_APPS:
|
||||
for (int gy = 0; gy < 3; gy++)
|
||||
for (int gx = 0; gx < 3; gx++)
|
||||
du_fill_rounded_rect(ctx, x + (3 + gx * 7) * u,
|
||||
y + (3 + gy * 7) * u, 4 * u, 4 * u,
|
||||
color, (du_u32)u);
|
||||
break;
|
||||
case WF_ICON_CLOCK:
|
||||
du_wf_ring(ctx, x + 12 * u, y + 12 * u, 9 * u, s, 0, color);
|
||||
du_wf_line(ctx, x + 12 * u, y + 12 * u, x + 12 * u, y + 6 * u, u + 1, color);
|
||||
du_wf_line(ctx, x + 12 * u, y + 12 * u, x + 17 * u, y + 14 * u, u + 1, color);
|
||||
break;
|
||||
case WF_ICON_INFO:
|
||||
du_wf_ring(ctx, x + 12 * u, y + 12 * u, 9 * u, s, 0, color);
|
||||
du_fill_rect(ctx, x + 11 * u, y + 7 * u, s, 5 * u, color);
|
||||
du_fill_rect(ctx, x + 11 * u, y + 14 * u, s, 4 * u, color);
|
||||
break;
|
||||
case WF_ICON_DISK:
|
||||
/* 圆柱:顶椭圆 + 两侧竖线 + 底弧 */
|
||||
du_wf_ring(ctx, x + 12 * u, y + 7 * u, 8 * u, s, -1, color);
|
||||
du_fill_rect(ctx, x + 4 * u, y + 7 * u, s, 10 * u, color);
|
||||
du_fill_rect(ctx, x + 18 * u, y + 7 * u, s, 10 * u, color);
|
||||
du_wf_ring(ctx, x + 12 * u, y + 17 * u, 8 * u, s, -1, color);
|
||||
break;
|
||||
case WF_ICON_PICTURE:
|
||||
du_rect_outline(ctx, x + 3 * u, y + 5 * u, 18 * u, 14 * u, color, (du_u32)u);
|
||||
du_wf_ring(ctx, x + 8 * u, y + 9 * u, u + 1, u + 1, 0, color);
|
||||
du_wf_line(ctx, x + 5 * u, y + 17 * u, x + 11 * u, y + 11 * u, u + 1, color);
|
||||
du_wf_line(ctx, x + 11 * u, y + 11 * u, x + 15 * u, y + 15 * u, u + 1, color);
|
||||
du_wf_line(ctx, x + 15 * u, y + 15 * u, x + 19 * u, y + 9 * u, u + 1, color);
|
||||
break;
|
||||
case WF_ICON_MUSIC:
|
||||
/* 八分音符:符头椭圆 + 符干 + 旗 */
|
||||
du_fill_rounded_rect(ctx, x + 5 * u, y + 15 * u, 6 * u, 4 * u, color, (du_u32)u);
|
||||
du_fill_rect(ctx, x + 10 * u, y + 4 * u, s, 12 * u, color);
|
||||
du_wf_line(ctx, x + 11 * u, y + 4 * u, x + 18 * u, y + 8 * u, s, color);
|
||||
break;
|
||||
case WF_ICON_GAME:
|
||||
du_rect_outline(ctx, x + 2 * u, y + 7 * u, 20 * u, 10 * u, color, (du_u32)(4 * u));
|
||||
/* 十字键 */
|
||||
du_fill_rect(ctx, x + 7 * u, y + 9 * u, 2 * u, 6 * u, color);
|
||||
du_fill_rect(ctx, x + 5 * u, y + 11 * u, 6 * u, 2 * u, color);
|
||||
/* AB 钮 */
|
||||
du_wf_ring(ctx, x + 16 * u, y + 12 * u, u + 1, u + 1, 0, color);
|
||||
du_wf_ring(ctx, x + 19 * u, y + 12 * u, u + 1, u + 1, 0, color);
|
||||
break;
|
||||
case WF_ICON_CHIP:
|
||||
du_rect_outline(ctx, x + 6 * u, y + 6 * u, 12 * u, 12 * u, color, (du_u32)u);
|
||||
du_rect_outline(ctx, x + 10 * u, y + 10 * u, 4 * u, 4 * u, color, (du_u32)u);
|
||||
for (int i = 0; i < 3; i++) {
|
||||
du_fill_rect(ctx, x + (8 + i * 4) * u, y + 2 * u, s, 4 * u, color);
|
||||
du_fill_rect(ctx, x + (8 + i * 4) * u, y + 18 * u, s, 4 * u, color);
|
||||
du_fill_rect(ctx, x + 2 * u, y + (8 + i * 4) * u, 4 * u, s, color);
|
||||
du_fill_rect(ctx, x + 18 * u, y + (8 + i * 4) * u, 4 * u, s, color);
|
||||
}
|
||||
break;
|
||||
case WF_ICON_REFRESH:
|
||||
du_wf_ring(ctx, x + 12 * u, y + 12 * u, 8 * u, s, 1, color);
|
||||
/* 箭头(右上端点) */
|
||||
du_wf_line(ctx, x + 16 * u, y + 2 * u, x + 20 * u, y + 7 * u, s, color);
|
||||
du_wf_line(ctx, x + 20 * u, y + 7 * u, x + 14 * u, y + 8 * u, s, color);
|
||||
break;
|
||||
case WF_ICON_LOCK:
|
||||
du_rect_outline(ctx, x + 5 * u, y + 10 * u, 14 * u, 10 * u, color, (du_u32)u);
|
||||
du_wf_ring(ctx, x + 12 * u, y + 10 * u, 5 * u, s, 1, color);
|
||||
du_fill_rect(ctx, x + 11 * u, y + 14 * u, s, 3 * u, color);
|
||||
break;
|
||||
case WF_ICON_TRASH:
|
||||
du_fill_rect(ctx, x + 9 * u, y + 3 * u, 6 * u, s, color);
|
||||
du_rect_outline(ctx, x + 5 * u, y + 6 * u, 14 * u, 15 * u, color, (du_u32)u);
|
||||
du_fill_rect(ctx, x + 8 * u, y + 9 * u, s, 9 * u, color);
|
||||
du_fill_rect(ctx, x + 12 * u, y + 9 * u, s, 9 * u, color);
|
||||
du_fill_rect(ctx, x + 16 * u, y + 9 * u, s, 9 * u, color);
|
||||
break;
|
||||
default:
|
||||
du_rect_outline(ctx, x + 4 * u, y + 4 * u, 16 * u, 16 * u, color, (du_u32)u);
|
||||
break;
|
||||
|
||||
@@ -58,4 +58,12 @@ void idt_irq_eoi(u8 vector);
|
||||
typedef int (*idt_exception_hook_t)(u64 vector, u64 error_code, u64 rip);
|
||||
void idt_set_exception_hook(idt_exception_hook_t hook);
|
||||
|
||||
/* P1(万物互联): PIC IMR 位操作 —— kern.irq.unmask/mask 总线服务后端。
|
||||
* 仅 ISA IRQ 0-15(越界 → IRQ-E01 panic 零降级);
|
||||
* unmask IRQ8-15 自动放开主片 IRQ2 级联。
|
||||
* apic_route=1 时 PIC 已全屏蔽(IOAPIC 接管),本操作无效果——该路径的
|
||||
* 解屏蔽随 P6 真 IRQ 输入走 IOAPIC 接线。 */
|
||||
void pic_irq_unmask(u8 irq);
|
||||
void pic_irq_mask(u8 irq);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -27,9 +27,32 @@ typedef struct panic_regs {
|
||||
u64 rax, rcx, rdx, rsi, rdi, r8, r9, r10, r11;
|
||||
} panic_regs;
|
||||
|
||||
/* 统一 panic 入口:画莲花崩溃屏 + 串口日志 + DRR 归档 + halt(不返回) */
|
||||
/* ===================================================================
|
||||
* panic 模式(FUCK [panic] mode=strict|fallback,默认 strict)
|
||||
*
|
||||
* strict :panic_full 画莲花屏 + DRR 归档 + halt,不返回(零降级铁律)。
|
||||
* fallback:panic_full 只留串口坐标 + 计数后返回,调用点必须紧跟一条
|
||||
* 可执行的备用路径(返回错误码 / 跳过该能力 / 回退实现)。
|
||||
* 寄存器帧非空(CPU 异常)时无论模式都 halt。
|
||||
*
|
||||
* panic_halt 无视模式恒 halt,仅用于"没有任何可继续的状态"的终点:
|
||||
* CPU 异常、LA57 激活(4 级页表 walk 会写坏内存)、DSK 交接失败、
|
||||
* panic_test 演示钩子。
|
||||
* =================================================================== */
|
||||
|
||||
/* 统一 panic 入口:strict 模式不返回;fallback 模式记录后返回 */
|
||||
void panic_full(const char *symbol, const char *msg, const panic_regs *regs);
|
||||
|
||||
/* 恒 halt 的 panic(不受 fallback 模式影响) */
|
||||
__attribute__((noreturn))
|
||||
void panic_halt(const char *symbol, const char *msg, const panic_regs *regs);
|
||||
|
||||
/* 设置/查询 fallback 模式(kernel/main.c 读 FUCK 后设置一次) */
|
||||
void panic_set_fallback(int enable);
|
||||
int panic_fallback_enabled(void);
|
||||
/* fallback 模式下被吞掉的 panic 次数 */
|
||||
u32 panic_fallback_hits(void);
|
||||
|
||||
/* 兼容旧接口:panic("msg") = panic_full("UTSM-PANIC", msg, 0) */
|
||||
void panic(const char *msg);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user