feat: B7 APIC/IOAPIC接管 + NVMe写路径 + virtio_net virtqueue + PE兼容层修复 + QEMU测试套件全自动化
中断路由 (B7): - apic.drv: LAPIC enable + IOAPIC重定向表编程(MADT ISO感知) + apic_route/apic_route_legacy/apic_diag开关 - UTSM: LAPIC EOI钩子(register_apic_eoi, ABI尾部追加) + IDT 0-255全覆盖 + spurious 0xFF特判 - FUCK: apic_route=0默认PIC(零回归) / =1 IOAPIC->LAPIC接管(失败完整降级) / legacy放开IRQ1/12/11 存储: - nvme.drv: 写路径 + PRP list + 读回校验 + MSI/MSI-X中断驱动(nvme_msi开关, 回退纯轮询) - build.ps1: apic.drv纳入构建(原为预置二进制) 网络: - virtio_net: virtqueue RX/TX + netdev注册 + DHCP自测(slirp真实OFFER) PE兼容层: - pe_shim: guest->host指针转换(g_emu_mem_base + gp()) + shim fn32列补齐 - gen_pe.py: PE32+ RVA偏置修复(BUG-004) + cmd.exe生成 - desktop_app.h: da_mouse_poll先判AUX位 + da_mouse_init冲刷残留(BUG-003/008) - shell: Ctrl修饰键跟踪(BUG-001) + g_run_image扩至1MB(BUG-002) QEMU测试套件: - 9用例全自动化(Run-All.ps1): boot-regression/driver-matrix/linux-compat/pe-compat/deaicup-e2e/userapps-matrix/network-e2e/performance-baseline/x86emu32-coverage - QemuTest.ps1公共库: 串口断言/monitor sendkey/screendump/HTTP服务器/并发隔离 文档: - CLAUDE.md: APIC/IOAPIC能力 + kernel_api暴露 + IRQ后端升级状态 - LESSONS_LEARNED.md: B7 LAPIC/IOAPIC经验教训(2条) - Bug记录.txt: BUG-20260801-001~008 + BUG-20260803-009(9条) - test-cases/*.md: 全部补充自动化脚本小节 - 桌面设计.md: .lnk快捷方式 + LINUXAPP.CNF Linux应用图标 - 系统开发策划.md: NVMe/virtio_net标完成 + B2/B7标已解决 + M2进度列
This commit is contained in:
+23
-3
@@ -49,9 +49,22 @@ void pe_shim_init(const char *cmdline);
|
||||
* 64位和32位共用。exit_code = 进程退出码。 */
|
||||
void pe_shim_exit_process(u64 exit_code);
|
||||
|
||||
/* pe_run 调用:保存上下文(__builtin_setjmp)。
|
||||
* 返回 0 = 首次(继续执行 PE),1 = ExitProcess 触发(longjmp 回来)。 */
|
||||
int pe_shim_setup_exit(void);
|
||||
/* 获取 ExitProcess longjmp 目标 jmpbuf,并重置退出状态。
|
||||
*
|
||||
* BUG-20260801-006:__builtin_setjmp 必须出现在 PE 执行全程存活的
|
||||
* 栈帧内(pe_service_run 本体)。此前由 pe_shim_setup_exit() 包装
|
||||
* 调用——该函数调用 setjmp 后即返回,C 标准明确规定"含 setjmp 的
|
||||
* 函数已返回后再 longjmp"为未定义行为(实测 longjmp 尾声从脏栈
|
||||
* pop 出 log_hex64 缓冲区 ASCII 残片充当 R12-R15/RBP → 野指针
|
||||
* call → 三重故障)。
|
||||
*
|
||||
* 调用方标准写法(setjmp 直接出现在调用方函数本体内):
|
||||
* if (__builtin_setjmp(pe_shim_exit_jmpbuf()) == 0) {
|
||||
* ... 执行 PE ...
|
||||
* } else {
|
||||
* code = pe_shim_get_exit_code();
|
||||
* } */
|
||||
void **pe_shim_exit_jmpbuf(void);
|
||||
|
||||
/* 获取上次 ExitProcess 的退出码 */
|
||||
u64 pe_shim_get_exit_code(void);
|
||||
@@ -62,4 +75,11 @@ int pe_shim_is_exit_call(u64 target);
|
||||
/* 获取 cmdline(shim 内部用) */
|
||||
const char *pe_shim_get_cmdline(void);
|
||||
|
||||
/* BUG-20260801-007:设置 PE32 解释器内存基址(guest→host 指针转换)。
|
||||
* PE32 解释器路径下,fn64 回退 shim 收到的指针参数是 32 位 guest VA
|
||||
* (相对解释器 mem 基址的偏移),直接当 host 指针解引用 → 低地址 #PF
|
||||
* → 三重故障。执行 PE32 前设置 base=mem,shim 内部 gp() 在指针解引用点
|
||||
* 完成转换;base=0 表示非解释器上下文(原生 PE32+ 路径),gp() 恒等映射。 */
|
||||
void pe_shim_set_emu_base(u64 base);
|
||||
|
||||
#endif /* PE_SHIM_H */
|
||||
|
||||
Reference in New Issue
Block a user