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:
@@ -100,6 +100,17 @@ typedef struct dkm_kernel_api {
|
||||
/* —— 新增字段只允许追加在末尾(DSK 以 api+0xA8 硬偏移读取 block) —— */
|
||||
void *(*mm_map_mmio)(u64 phys, u64 size); /* MMIO 独立窗口映射(PCD|PWT),返回虚拟地址,失败返回 0 */
|
||||
void (*mm_unmap_mmio)(void *virt, u64 size); /* 解除 MMIO 独立窗口映射 */
|
||||
/* B7 阶段2: 驱动向 UTSM 注册 LAPIC EOI 钩子(写 LAPIC EOI 寄存器的函数指针)。
|
||||
* apic.drv 在 LAPIC 接管时注册;idt_handler 的 IRQ 分发末尾调用该钩子,
|
||||
* 使 vector 0x20-0x2F 的 legacy 线在 IOAPIC 路由下可持续投递。
|
||||
* 未注册(PIC 路由)时钩子为 NULL,idt_handler 跳过,行为与旧版一致。 */
|
||||
void (*register_apic_eoi)(void (*eoi_fn)(void));
|
||||
/* B7 阶段3: 动态 IDT 向量分配器(MSI/MSI-X 用),尾部追加保持 ABI。
|
||||
* 池范围 0x40-0xDF;alloc 返回向量号、失败 -1;free 幂等越界忽略。
|
||||
* 驱动拿到向量后经 irq_register(vector, handler) 直接注册(现有
|
||||
* 接口已接受向量命名空间,无需新注册 ABI)。 */
|
||||
int (*irq_vector_alloc)(void);
|
||||
void (*irq_vector_free)(int vector);
|
||||
} dkm_kernel_api;
|
||||
|
||||
typedef enum dkm_driver_state {
|
||||
|
||||
@@ -10,11 +10,39 @@ void idt_init(void);
|
||||
* 被 spurious IRQ / 异常触发导致三重故障重启。 */
|
||||
void idt_halt_all(void);
|
||||
|
||||
/* IRQ handler: return 1 to suppress default ACK (PIC), 0 for normal EOI.
|
||||
* 参数为 IDT vector 号 (0x20-0xFF)。
|
||||
* PIC IRQ (0x20-0x2F): 返回 1 抑制 PIC EOI; 返回 0 自动发送 PIC EOI。
|
||||
* APIC/IOAPIC/MSI (0x30-0xFF): 返回值当前忽略, EOI 需手动处理 (TODO)。 */
|
||||
/* DSK 诊断 IDT:vector 0-31 恢复原 isr_stub(异常走 idt_handler
|
||||
* 打完整日志后停机),vector 32-255 保持 halt stub。
|
||||
* BUG-20260801-005:UTSM→DSK 交接处以本函数替代 idt_halt_all,
|
||||
* 恢复 DSK 阶段 CPU 异常可见性(原静默 halt 零诊断)。
|
||||
* 不做 pic_remap / sti,DSK 上下文 IF=0 不变式保持不变。 */
|
||||
void idt_install_dsk_diag(void);
|
||||
|
||||
/* PE 诊断 IDT:idt_install_dsk_diag 的别名(幂等重装)。
|
||||
* 用于 PE 兼容层原生执行 PE32+ 前恢复异常可见性。 */
|
||||
void idt_install_pe_diag(void);
|
||||
|
||||
/* IRQ handler: return 1 to suppress default ACK (EOI), 0 for normal EOI.
|
||||
* 注册参数兼容两种命名空间(二者不重叠,自动判别):
|
||||
* - ISA IRQ 号 0-15 -> 自动换算为 vector 0x20+IRQ (兼容 ps2kbd/e1000/mouseInit)
|
||||
* - IDT vector 0x20+ -> 直接按 vector 注册 (apic 0xE0 / virtio_net 0x20+n 现状)
|
||||
* vector 0-15 是 CPU 异常向量,idt_handler 从不作为 IRQ 分发目标,故无歧义。
|
||||
* EOI 语义:
|
||||
* - PIC IRQ (0x20-0x2F): 返回 0 -> 先调 APIC EOI 钩子(若已注册)再发 8259 EOI;
|
||||
* 返回 1 -> 两者都抑制, handler 自负 EOI 全责。
|
||||
* - APIC/IOAPIC/MSI (0x30-0xFF): 返回 0 -> 调 APIC EOI 钩子(若已注册);
|
||||
* 返回 1 -> 抑制(如 handler 内已自行 LAPIC EOI)。未注册钩子时不做任何 EOI。 */
|
||||
typedef int (*irq_handler_t)(u8 vector);
|
||||
int irq_register(u8 vector, irq_handler_t handler);
|
||||
|
||||
/* B7 阶段2: 注册 LAPIC EOI 钩子(由 apic.drv 在 LAPIC 接管后调用)。
|
||||
* 钩子语义: 向 LAPIC EOI 寄存器 (MMIO base+0xB0) 写 0,清除当前 in-service
|
||||
* 最高优先级 ISR 位。重复注册以最后一次为准;传 NULL 可注销。 */
|
||||
void idt_register_apic_eoi(void (*eoi_fn)(void));
|
||||
|
||||
/* B7 阶段3: 动态 IDT 向量分配器 (MSI/MSI-X 用)。
|
||||
* 池范围 0x40-0xDF (160 个), 位图 O(1); 分配返回向量号, 池耗尽返回 -1。
|
||||
* free 幂等, 越界/静态向量输入忽略。主上下文调用, 无锁。 */
|
||||
int irq_vector_alloc(void);
|
||||
void irq_vector_free(int vector);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user