中断路由 (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进度列
158 lines
4.9 KiB
C
158 lines
4.9 KiB
C
#ifndef UTSM_DKM_H
|
||
#define UTSM_DKM_H
|
||
|
||
#include <utsm/types.h>
|
||
#include <utsm/dma.h>
|
||
#include <utsm/block.h>
|
||
#include <utsm/net.h>
|
||
#include <utsm/paging.h>
|
||
|
||
#define DKM_DRIVER_MAGIC 0x444B4D31u
|
||
#define DKM_ABI_VERSION 1u
|
||
#define DKM_KERNEL_API_VERSION 1u
|
||
|
||
#define DKM_CLASS_PLATFORM 1u
|
||
#define DKM_CLASS_BUS 2u
|
||
#define DKM_CLASS_INTERRUPT 3u
|
||
#define DKM_CLASS_TIMER 4u
|
||
#define DKM_CLASS_CONSOLE 5u
|
||
#define DKM_CLASS_STORAGE 6u
|
||
#define DKM_CLASS_FS 7u
|
||
#define DKM_CLASS_NET 8u
|
||
#define DKM_CLASS_INPUT 9u
|
||
#define DKM_CLASS_GPU 10u
|
||
#define DKM_CLASS_MISC 11u
|
||
|
||
#define DKM_F_REQUIRED (1u << 0)
|
||
#define DKM_F_BOOT_MODULE (1u << 1)
|
||
#define DKM_F_NO_UNLOAD (1u << 2)
|
||
#define DKM_F_STRONG_RECOVERY (1u << 3)
|
||
#define DKM_F_DMA_REQUIRED (1u << 4)
|
||
#define DKM_F_EARLY_LOG (1u << 5)
|
||
|
||
struct dkm_kernel_api;
|
||
struct dkm_driver_handle;
|
||
|
||
typedef struct dkm_driver_desc {
|
||
u32 magic;
|
||
u16 abi_version;
|
||
u16 desc_size;
|
||
|
||
const char *name;
|
||
const char *version;
|
||
const char *vendor;
|
||
|
||
u32 driver_class;
|
||
u32 stage;
|
||
u32 flags;
|
||
u32 priority;
|
||
|
||
const char *const *depends;
|
||
u32 depends_count;
|
||
|
||
const char *const *provides;
|
||
u32 provides_count;
|
||
|
||
u64 min_kernel_abi;
|
||
u64 feature_bits;
|
||
|
||
u64 reserved0;
|
||
u64 reserved1;
|
||
} dkm_driver_desc;
|
||
|
||
typedef int (*dkm_driver_init_fn)(const struct dkm_kernel_api *api, struct dkm_driver_handle *handle);
|
||
typedef int (*dkm_driver_exit_fn)(struct dkm_driver_handle *handle);
|
||
|
||
typedef struct dkm_log_api {
|
||
void (*info)(const char *msg);
|
||
void (*warn)(const char *msg);
|
||
void (*error)(const char *msg);
|
||
void (*panic)(const char *msg);
|
||
} dkm_log_api;
|
||
|
||
typedef struct dkm_kernel_api {
|
||
u32 version;
|
||
u32 size;
|
||
u64 feature_bits;
|
||
|
||
const dkm_log_api *log;
|
||
const void *mem;
|
||
const void *utsm;
|
||
const void *irq;
|
||
const void *pci;
|
||
const dkm_dma_api *dma;
|
||
const void *vfs;
|
||
const dkm_net_api *net;
|
||
const void *timer;
|
||
const void *drr;
|
||
|
||
const void *rsdp_address; /* ACPI RSDP physical address */
|
||
const void *fb_address; /* framebuffer base */
|
||
u64 fb_width;
|
||
u64 fb_height;
|
||
u64 fb_pitch;
|
||
u16 fb_bpp;
|
||
const void *boot_modules_response; /* limine_module_response* */
|
||
int (*irq_register)(u8 irq, void *handler); /* kernel irq_register */
|
||
u64 hhdm_offset; /* physical → virtual */
|
||
const dkm_block_api *block; /* block provider registry */
|
||
const dkm_mmio_api *mmio; /* 页表/高位 MMIO 映射服务(尾部追加,ABI 兼容) */
|
||
/* —— 新增字段只允许追加在末尾(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 {
|
||
DKM_STATE_DISCOVERED = 0,
|
||
DKM_STATE_ABI_CHECKED,
|
||
DKM_STATE_INITING,
|
||
DKM_STATE_ACTIVE,
|
||
DKM_STATE_FAILED
|
||
} dkm_driver_state;
|
||
|
||
typedef struct dkm_driver_handle {
|
||
const dkm_driver_desc *desc;
|
||
dkm_driver_state state;
|
||
i32 init_status;
|
||
u32 load_stage;
|
||
u32 flags;
|
||
} dkm_driver_handle;
|
||
|
||
typedef struct dkm_builtin_driver {
|
||
const dkm_driver_desc *desc;
|
||
dkm_driver_init_fn init;
|
||
dkm_driver_exit_fn exit;
|
||
} dkm_builtin_driver;
|
||
|
||
void dkm_init(void);
|
||
int dkm_load_builtin(const dkm_builtin_driver *driver);
|
||
void dkm_scan_boot_modules(void);
|
||
void dsm_load_by_manifest(void);
|
||
void dkm_fill_platform_info(void);
|
||
const dkm_kernel_api *dkm_get_kernel_api(void);
|
||
|
||
/* exposed for manifest parser */
|
||
struct dkm_symbol_scan {
|
||
const void *driver_desc;
|
||
const void *driver_init;
|
||
const void *driver_exit;
|
||
};
|
||
int dkm_check_elf64(const void *address, u64 size);
|
||
int dkm_scan_symbols(const void *address, u64 size, struct dkm_symbol_scan *out);
|
||
int dkm_load_elf_rel(const void *address, u64 size, const struct dkm_symbol_scan *symbols);
|
||
|
||
extern const dkm_builtin_driver dkm_builtin_console_early;
|
||
|
||
#endif
|