177 lines
6.3 KiB
C
177 lines
6.3 KiB
C
/* deshab/kernel_api.h - dkm_kernel_api ABI 单一定义来源
|
||||
|
|
*
|
|||
|
|
* 整合 CODE/UTSM/include/utsm/dkm.h 与 CODE/DKM/dkm_shared.h 的 ABI 结构体,
|
|||
|
|
* 消除驱动本地重复定义 dkm_kernel_api 的隐患(CONTRIBUTING.md 硬约束)。
|
|||
|
|
*
|
|||
|
|
* 约定:
|
|||
|
|
* - 字段顺序/类型不可调整,UTSM 端按固定偏移填充。
|
|||
|
|
* - 新增字段只允许追加在结构末尾(尾部追加保持 ABI 兼容)。
|
|||
|
|
* - 结构体同时提供 typedef 名与 struct 标签,兼容两种引用方式。
|
|||
|
|
*
|
|||
|
|
* 偏移常量(供不便解引用 kernel_api 指针的场景使用,消除硬编码):
|
|||
|
|
* DSB_KAPI_OFF_NET 0x48 net API 指针
|
|||
|
|
* DSB_KAPI_OFF_BLOCK 0xA8 block API 指针
|
|||
|
|
*/
|
|||
|
|
#ifndef DESHAB_KERNEL_API_H
|
|||
|
|
#define DESHAB_KERNEL_API_H
|
|||
|
|
|
|||
|
|
#include "types.h"
|
|||
|
|
|
|||
|
|
#define DKM_KERNEL_API_VERSION 1u
|
|||
|
|
|
|||
|
|
/* ---- 网卡链路/能力标志 ---- */
|
|||
|
|
#define DKM_NET_F_LINK_UP (1u << 0)
|
|||
|
|
#define DKM_NET_F_TX_READY (1u << 1)
|
|||
|
|
#define DKM_NET_F_RX_READY (1u << 2)
|
|||
|
|
#define DKM_NET_F_WIRELESS (1u << 3)
|
|||
|
|
|
|||
|
|
/* ---- WiFi 扫描加密类型 ---- */
|
|||
|
|
#define DKM_NET_SEC_OPEN 0u
|
|||
|
|
#define DKM_NET_SEC_WEP 1u
|
|||
|
|
#define DKM_NET_SEC_WPA 2u
|
|||
|
|
#define DKM_NET_SEC_WPA2 3u
|
|||
|
|
#define DKM_NET_SEC_WPA3 4u
|
|||
|
|
|
|||
|
|
/* ---- log API ---- */
|
|||
|
|
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;
|
|||
|
|
|
|||
|
|
/* ---- DMA API ---- */
|
|||
|
|
typedef struct dkm_dma_buffer {
|
|||
|
|
void *virt;
|
|||
|
|
u64 phys;
|
|||
|
|
u64 size;
|
|||
|
|
} dkm_dma_buffer;
|
|||
|
|
|
|||
|
|
typedef struct dkm_dma_api {
|
|||
|
|
int (*alloc_pages)(u64 page_count, u64 alignment, u64 max_phys, dkm_dma_buffer *out);
|
|||
|
|
} dkm_dma_api;
|
|||
|
|
|
|||
|
|
/* ---- net API ---- */
|
|||
|
|
typedef struct dkm_net_scan_result {
|
|||
|
|
char ssid[33];
|
|||
|
|
u8 bssid[6];
|
|||
|
|
u8 channel;
|
|||
|
|
i8 rssi;
|
|||
|
|
u8 security;
|
|||
|
|
} dkm_net_scan_result;
|
|||
|
|
|
|||
|
|
typedef struct dkm_net_device_desc {
|
|||
|
|
const char *name;
|
|||
|
|
u8 mac[6];
|
|||
|
|
u32 flags;
|
|||
|
|
void *ctx;
|
|||
|
|
int (*tx)(void *ctx, const void *packet, u32 length);
|
|||
|
|
int (*rx_poll)(void *ctx, void *buffer, u32 capacity, u32 *out_length);
|
|||
|
|
/* 无线扩展回调(有线驱动置 NULL,向后兼容)。 */
|
|||
|
|
int (*scan_start)(void *ctx);
|
|||
|
|
int (*scan_count)(void *ctx);
|
|||
|
|
int (*scan_result)(void *ctx, u32 n, dkm_net_scan_result *out);
|
|||
|
|
int (*is_wireless)(void *ctx);
|
|||
|
|
} dkm_net_device_desc;
|
|||
|
|
|
|||
|
|
typedef struct dkm_net_stats {
|
|||
|
|
u64 tx_ok;
|
|||
|
|
u64 tx_err;
|
|||
|
|
u64 rx_ok;
|
|||
|
|
u64 rx_err;
|
|||
|
|
u64 rx_overflow;
|
|||
|
|
u64 link_changes;
|
|||
|
|
} dkm_net_stats;
|
|||
|
|
|
|||
|
|
typedef struct dkm_net_api {
|
|||
|
|
int (*register_device)(const dkm_net_device_desc *desc);
|
|||
|
|
u32 (*device_count)(void);
|
|||
|
|
int (*device_info)(u32 index, void *out);
|
|||
|
|
int (*tx)(u32 index, const void *packet, u32 length);
|
|||
|
|
int (*rx_poll)(u32 index, void *buffer, u32 capacity, u32 *out_length);
|
|||
|
|
int (*scan_start)(u32 index);
|
|||
|
|
int (*scan_count)(u32 index);
|
|||
|
|
int (*scan_result)(u32 index, u32 n, dkm_net_scan_result *out);
|
|||
|
|
int (*is_wireless)(u32 index);
|
|||
|
|
int (*device_stats)(u32 index, dkm_net_stats *out);
|
|||
|
|
} dkm_net_api;
|
|||
|
|
|
|||
|
|
/* ---- block API ---- */
|
|||
|
|
typedef int (*dkm_block_read_fn)(void *ctx, u64 lba, u32 count, void *buffer);
|
|||
|
|
typedef int (*dkm_block_write_fn)(void *ctx, u64 lba, u32 count, const void *buffer);
|
|||
|
|
|
|||
|
|
typedef struct dkm_block_device_desc {
|
|||
|
|
const char *name;
|
|||
|
|
u64 sector_size;
|
|||
|
|
u64 sector_count;
|
|||
|
|
void *ctx;
|
|||
|
|
int (*read)(void *ctx, u64 lba, u32 count, void *buffer);
|
|||
|
|
int (*write)(void *ctx, u64 lba, u32 count, const void *buffer);
|
|||
|
|
} dkm_block_device_desc;
|
|||
|
|
|
|||
|
|
typedef struct dkm_block_api {
|
|||
|
|
int (*register_device)(const dkm_block_device_desc *desc);
|
|||
|
|
u32 (*device_count)(void);
|
|||
|
|
int (*read)(u32 index, u64 lba, u32 count, void *buffer);
|
|||
|
|
int (*write)(u32 index, u64 lba, u32 count, const void *buffer);
|
|||
|
|
u64 (*sector_size)(u32 index);
|
|||
|
|
const char *(*device_name)(u32 index);
|
|||
|
|
int (*set_write_fn)(u32 index, dkm_block_write_fn fn);
|
|||
|
|
} dkm_block_api;
|
|||
|
|
|
|||
|
|
/* ---- MMIO / 页表 API ----
|
|||
|
|
* 与 UTSM/include/utsm/paging.h 布局一致。 */
|
|||
|
|
typedef struct dkm_mmio_api {
|
|||
|
|
int (*is_mapped)(u64 vaddr); /* 返回 0=未映射;1=4K PTE;2=2M PDE;3=1G PDPTE */
|
|||
|
|
int (*map_mmio)(u64 phys, u64 size); /* 映射到 hhdm_offset + phys,返回 0 成功 */
|
|||
|
|
u64 (*cr3)(void); /* 当前 CR3 物理地址(诊断用) */
|
|||
|
|
} dkm_mmio_api;
|
|||
|
|
|
|||
|
|
/* ---- kernel_api 主结构 ----
|
|||
|
|
* 字段顺序/类型不可调整 - UTSM 端按固定偏移填充。
|
|||
|
|
* DSK 以 api+0xA8 硬偏移读取 block,net_stack 以 api+0x48 读取 net。 */
|
|||
|
|
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 映射服务 */
|
|||
|
|
/* -- 新增字段只允许追加在末尾 -- */
|
|||
|
|
void *(*mm_map_mmio)(u64 phys, u64 size); /* MMIO 独立窗口映射(PCD|PWT),失败返回 0 */
|
|||
|
|
void (*mm_unmap_mmio)(void *virt, u64 size); /* 解除 MMIO 独立窗口映射 */
|
|||
|
|
/* B7 阶段2: LAPIC EOI 钩子注册(apic.drv LAPIC 接管时调用)。 */
|
|||
|
|
void (*register_apic_eoi)(void (*eoi_fn)(void));
|
|||
|
|
/* B7 阶段3: 动态 IDT 向量分配器(MSI/MSI-X 用),池 0x40-0xDF。 */
|
|||
|
|
int (*irq_vector_alloc)(void);
|
|||
|
|
void (*irq_vector_free)(int vector);
|
|||
|
|
} dkm_kernel_api;
|
|||
|
|
|
|||
|
|
/* ---- kernel_api 字段偏移常量(消除散落的硬编码偏移) ----
|
|||
|
|
* 供不便通过结构体解引用的场景(如早期 boot context 解析)使用。
|
|||
|
|
* 常规代码应直接通过 api->net / api->block 访问。 */
|
|||
|
|
#define DSB_KAPI_OFF_NET 0x48u /* const dkm_net_api *net */
|
|||
|
|
#define DSB_KAPI_OFF_BLOCK 0xA8u /* const dkm_block_api *block */
|
|||
|
|
|
|||
|
|
#endif /* DESHAB_KERNEL_API_H */
|