feat: exhaustive STUB instrumentation - 241 panic sites across VMM/kernel + whitelist alignment
- VMM cluster: XJ3-E/LIN-E/VMM-E/VMX-E/EPT-E/IPC-E/VVB-E (124 sites) - kernel cluster: TST-E/MM-E/UTRW-E/LAPIC-E/IDT-E/SAS-E/PRB-E/NETST-E/DKM-E (117 sites) - whitelist fixes: vmm_init env probes E10-E14 fallback, disk_log read-only block path, DSL-E05 non-FAT32 device 0 probe - QEMU smoke: wizard -> USER.CONF -> login -> desktop ready, zero spurious panic
This commit is contained in:
@@ -1,7 +1,8 @@
|
||||
#include <utsm/dkm.h>
|
||||
#include <utsm/dkm.h>
|
||||
#include <utsm/log.h>
|
||||
#include <utsm/types.h>
|
||||
#include <utsm/arena.h>
|
||||
#include <utsm/panic.h>
|
||||
#include "../arch/x86_64/limine.h"
|
||||
|
||||
#define ELF_MAGIC0 0x7f
|
||||
@@ -178,10 +179,14 @@ int dkm_scan_symbols(const void *address, u64 size, struct dkm_symbol_scan *out)
|
||||
|
||||
if (ehdr->shoff == 0 || ehdr->shnum == 0 || ehdr->shentsize < sizeof(elf64_shdr)) {
|
||||
log_error("[DKM] ELF has no section table");
|
||||
panic_full("DKM-E30 ELF NO SECTION TABLE",
|
||||
"dkm_scan_symbols: driver ELF has no section table", 0);
|
||||
return -1;
|
||||
}
|
||||
if (!range_ok(ehdr->shoff, (u64)ehdr->shnum * ehdr->shentsize, size)) {
|
||||
log_error("[DKM] ELF section table out of range");
|
||||
panic_full("DKM-E31 ELF SECTION TABLE OUT OF RANGE",
|
||||
"dkm_scan_symbols: section table out of file range", 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -202,10 +207,14 @@ int dkm_scan_symbols(const void *address, u64 size, struct dkm_symbol_scan *out)
|
||||
|
||||
if (!symtab || !strtab || strtab->type != SHT_STRTAB) {
|
||||
log_error("[DKM] missing symtab/strtab");
|
||||
panic_full("DKM-E32 ELF MISSING SYMTAB",
|
||||
"dkm_scan_symbols: symtab/strtab missing or invalid", 0);
|
||||
return -1;
|
||||
}
|
||||
if (symtab->entsize < sizeof(elf64_sym) || !range_ok(symtab->offset, symtab->size, size) || !range_ok(strtab->offset, strtab->size, size)) {
|
||||
log_error("[DKM] invalid symtab/strtab range");
|
||||
panic_full("DKM-E33 ELF SYMTAB RANGE INVALID",
|
||||
"dkm_scan_symbols: symtab/strtab out of file range", 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -241,6 +250,8 @@ int dkm_scan_symbols(const void *address, u64 size, struct dkm_symbol_scan *out)
|
||||
return 0;
|
||||
}
|
||||
log_error("[DKM] required driver symbols missing");
|
||||
panic_full("DKM-E34 REQUIRED DRIVER SYMBOLS MISSING",
|
||||
"dkm_scan_symbols: driver_desc/init/exit symbol missing", 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -271,12 +282,16 @@ int dkm_load_elf_rel(const void *address, u64 size, const struct dkm_symbol_scan
|
||||
|
||||
if (total_size == 0) {
|
||||
log_error("[DKM] no allocatable sections");
|
||||
panic_full("DKM-E35 ELF NO ALLOC SECTIONS",
|
||||
"dkm_load_elf_rel: no allocatable sections", 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
u8 *image = (u8 *)kmem_alloc_aligned(total_size, max_align);
|
||||
if (!image) {
|
||||
log_error("[DKM] failed to allocate module memory");
|
||||
panic_full("DKM-E36 MODULE MEM ALLOC FAILED",
|
||||
"dkm_load_elf_rel: module memory allocation failed", 0);
|
||||
return -1;
|
||||
}
|
||||
memset(image, 0, total_size);
|
||||
@@ -353,6 +368,8 @@ int dkm_load_elf_rel(const void *address, u64 size, const struct dkm_symbol_scan
|
||||
} else {
|
||||
log_error("[DKM] unsupported relocation type");
|
||||
log_hex64("[DKM] reloc type=", (u64)reloc_type);
|
||||
panic_full("DKM-E37 UNSUPPORTED RELOCATION",
|
||||
"dkm_load_elf_rel: unsupported relocation type", 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -373,6 +390,8 @@ int dkm_load_elf_rel(const void *address, u64 size, const struct dkm_symbol_scan
|
||||
const dkm_driver_desc *desc = (const dkm_driver_desc *)(image + image_offset[desc_sym->shndx] + desc_sym->value);
|
||||
if (desc->magic != DKM_DRIVER_MAGIC) {
|
||||
log_error("[DKM] external driver_desc magic mismatch");
|
||||
panic_full("DKM-E38 DRIVER DESC MAGIC MISMATCH",
|
||||
"dkm_load_elf_rel: external driver_desc magic mismatch", 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -397,6 +416,8 @@ int dkm_load_elf_rel(const void *address, u64 size, const struct dkm_symbol_scan
|
||||
if (result != 0) {
|
||||
handle.state = DKM_STATE_FAILED;
|
||||
log_error("[DKM] external driver init failed");
|
||||
panic_full("DKM-E39 EXTERNAL DRIVER INIT FAILED",
|
||||
"dkm_load_elf_rel: external driver_init returned non-zero", 0);
|
||||
return result;
|
||||
}
|
||||
handle.state = DKM_STATE_ACTIVE;
|
||||
@@ -408,6 +429,8 @@ void dkm_scan_boot_modules(void) {
|
||||
struct limine_module_response *response = g_module_request.response;
|
||||
if (!response) {
|
||||
log_warn("[DKM] no Limine module response");
|
||||
panic_full("DKM-E40 NO LIMINE MODULE RESPONSE",
|
||||
"dkm_scan_boot_modules: no Limine module response", 0);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -418,6 +441,8 @@ void dkm_scan_boot_modules(void) {
|
||||
struct limine_file *file = response->modules[i];
|
||||
if (!file) {
|
||||
log_warn("[DKM] null module entry");
|
||||
panic_full("DKM-E41 NULL MODULE ENTRY",
|
||||
"dkm_scan_boot_modules: null boot module entry", 0);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -439,11 +464,15 @@ void dkm_scan_boot_modules(void) {
|
||||
int load_result = dkm_load_elf_rel(file->address, file->size, &symbols);
|
||||
if (load_result != 0) {
|
||||
log_error("[DKM] external driver load failed");
|
||||
panic_full("DKM-E42 EXTERNAL DRIVER LOAD FAILED",
|
||||
"dkm_scan_boot_modules: external driver load failed", 0);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
log_error("[DKM] module ELF64 rejected");
|
||||
log_hex64("[DKM] elf status=", (u64)(i64)status);
|
||||
panic_full("DKM-E43 MODULE ELF64 REJECTED",
|
||||
"dkm_scan_boot_modules: boot module ELF64 check rejected", 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
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\arena.h include\utsm\panic.h dkm\..\arch\x86_64\limine.h
|
||||
include\utsm\dkm.h:
|
||||
include\utsm\types.h:
|
||||
include\utsm\dma.h:
|
||||
@@ -10,4 +10,5 @@ include\utsm\net.h:
|
||||
include\utsm\paging.h:
|
||||
include\utsm\log.h:
|
||||
include\utsm\arena.h:
|
||||
include\utsm\panic.h:
|
||||
dkm\..\arch\x86_64\limine.h:
|
||||
|
||||
Binary file not shown.
@@ -1,5 +1,6 @@
|
||||
#include <utsm/dkm.h>
|
||||
#include <utsm/dkm.h>
|
||||
#include <utsm/log.h>
|
||||
#include <utsm/panic.h>
|
||||
|
||||
static int dkm_validate_desc(const dkm_driver_desc *desc) {
|
||||
if (!desc) {
|
||||
@@ -27,18 +28,24 @@ void dkm_init(void) {
|
||||
log_info("[DKM] init ok");
|
||||
} else {
|
||||
log_error("[DKM] init failed");
|
||||
panic_full("DKM-E50 BUILTIN INIT FAILED",
|
||||
"dkm_init: builtin console_early load failed", 0);
|
||||
}
|
||||
}
|
||||
|
||||
int dkm_load_builtin(const dkm_builtin_driver *driver) {
|
||||
if (!driver || !driver->desc || !driver->init) {
|
||||
log_error("[DKM] invalid builtin driver");
|
||||
panic_full("DKM-E51 INVALID BUILTIN DRIVER",
|
||||
"dkm_load_builtin: builtin driver descriptor invalid", 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int status = dkm_validate_desc(driver->desc);
|
||||
if (status != 0) {
|
||||
log_error("[DKM] driver_desc rejected");
|
||||
panic_full("DKM-E52 DRIVER DESC REJECTED",
|
||||
"dkm_load_builtin: builtin driver_desc validation failed", 0);
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -60,6 +67,8 @@ int dkm_load_builtin(const dkm_builtin_driver *driver) {
|
||||
if (status != 0) {
|
||||
handle.state = DKM_STATE_FAILED;
|
||||
log_error("[DKM] builtin driver init failed");
|
||||
panic_full("DKM-E53 BUILTIN DRIVER INIT FAILED",
|
||||
"dkm_load_builtin: builtin driver_init returned non-zero", 0);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
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\paging.h include\utsm\log.h include\utsm\panic.h
|
||||
include\utsm\dkm.h:
|
||||
include\utsm\types.h:
|
||||
include\utsm\dma.h:
|
||||
@@ -8,3 +8,4 @@ include\utsm\block.h:
|
||||
include\utsm\net.h:
|
||||
include\utsm\paging.h:
|
||||
include\utsm\log.h:
|
||||
include\utsm\panic.h:
|
||||
|
||||
Binary file not shown.
@@ -267,7 +267,12 @@ static int dsm_parse_manifest(const char *text, u64 size) {
|
||||
dsm_expect(&p, ':');
|
||||
|
||||
if (streq_static(key, "stages")) {
|
||||
if (dsm_expect(&p, '[') != 0) return -1;
|
||||
if (dsm_expect(&p, '[') != 0) {
|
||||
/* 严格错误策略插桩:stage 解析失败零降级(DKM-E08) */
|
||||
panic_full("DKM-E08 MANIFEST STAGES PARSE FAILED",
|
||||
"dsm_parse_manifest: stages array malformed", 0);
|
||||
return -1;
|
||||
}
|
||||
while (p < end && *p) {
|
||||
dsm_skip_ws(&p);
|
||||
if (*p == ']') { p++; break; }
|
||||
@@ -300,6 +305,9 @@ static int dsm_ensure_manifest(void) {
|
||||
rsp = g_module_request.response;
|
||||
if (!rsp) {
|
||||
log_warn("[DSM] no Limine module response");
|
||||
/* 严格错误策略插桩:manifest 缺失零降级(DKM-E09) */
|
||||
panic_full("DKM-E09 NO LIMINE MODULE RESPONSE",
|
||||
"dsm_ensure_manifest: no Limine module response", 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -314,6 +322,9 @@ static int dsm_ensure_manifest(void) {
|
||||
|
||||
if (!manifest_file) {
|
||||
log_warn("[DSM] manifest not found in boot modules");
|
||||
/* 严格错误策略插桩:manifest 缺失零降级(DKM-E10) */
|
||||
panic_full("DKM-E10 MANIFEST NOT FOUND",
|
||||
"dsm_ensure_manifest: dkm:manifest boot module missing", 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -409,7 +420,12 @@ void dsm_load_by_manifest_upto(const ini_config *cfg, u32 max_stage_id) {
|
||||
}
|
||||
|
||||
void dsm_load_named(const ini_config *cfg, const char *name) {
|
||||
if (!name || dsm_ensure_manifest() != 0) return;
|
||||
if (!name || dsm_ensure_manifest() != 0) {
|
||||
/* 严格错误策略插桩:按名加载 manifest 缺失零降级(DKM-E11) */
|
||||
panic_full("DKM-E11 NAMED LOAD MANIFEST MISSING",
|
||||
"dsm_load_named: null name or manifest unavailable", 0);
|
||||
return;
|
||||
}
|
||||
|
||||
for (u32 si = 0; si < g_stage_count; si++) {
|
||||
dsm_stage_entry *stage = &g_stages[si];
|
||||
@@ -430,6 +446,9 @@ void dsm_load_named(const ini_config *cfg, const char *name) {
|
||||
if (!drv->boot_module) {
|
||||
log_warn("[DSM] named module not found");
|
||||
log_info(name);
|
||||
/* 严格错误策略插桩:named 驱动缺模块零降级(DKM-E12) */
|
||||
panic_full("DKM-E12 NAMED DRIVER MODULE MISSING",
|
||||
"dsm_load_named: named driver boot module not found", 0);
|
||||
return;
|
||||
}
|
||||
f = drv->boot_module;
|
||||
@@ -437,15 +456,24 @@ void dsm_load_named(const ini_config *cfg, const char *name) {
|
||||
log_info(drv->name);
|
||||
if (dkm_check_elf64(f->address, f->size) != 0) {
|
||||
log_error("[DSM] ELF check failed");
|
||||
/* 严格错误策略插桩:named 驱动 ELF 校验失败零降级(DKM-E13) */
|
||||
panic_full("DKM-E13 NAMED DRIVER ELF INVALID",
|
||||
"dsm_load_named: named driver failed ELF64 check", 0);
|
||||
return;
|
||||
}
|
||||
if (dkm_scan_symbols(f->address, f->size, &symbols) != 0) {
|
||||
log_error("[DSM] symbol scan failed");
|
||||
/* 严格错误策略插桩:named 驱动符号扫描失败零降级(DKM-E14) */
|
||||
panic_full("DKM-E14 NAMED DRIVER SYMBOL SCAN FAILED",
|
||||
"dsm_load_named: named driver symbol scan failed", 0);
|
||||
return;
|
||||
}
|
||||
result = dkm_load_elf_rel(f->address, f->size, &symbols);
|
||||
if (result != 0) {
|
||||
log_error("[DSM] load failed");
|
||||
/* 严格错误策略插桩:named 驱动加载失败零降级(DKM-E15) */
|
||||
panic_full("DKM-E15 NAMED DRIVER LOAD FAILED",
|
||||
"dsm_load_named: named driver relocation/load failed", 0);
|
||||
return;
|
||||
}
|
||||
drv->loaded = 1;
|
||||
@@ -454,6 +482,9 @@ void dsm_load_named(const ini_config *cfg, const char *name) {
|
||||
}
|
||||
log_warn("[DSM] named driver not in manifest");
|
||||
log_info(name);
|
||||
/* 严格错误策略插桩:named 驱动不在 manifest 零降级(DKM-E16) */
|
||||
panic_full("DKM-E16 NAMED DRIVER NOT IN MANIFEST",
|
||||
"dsm_load_named: named driver not found in manifest", 0);
|
||||
}
|
||||
|
||||
void dsm_load_by_manifest_ex(const ini_config *cfg) {
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user