54 lines
2.0 KiB
C
54 lines
2.0 KiB
C
/* deshab/block.h - block provider 便捷访问层
|
||||
|
|
*
|
|||
|
|
* 封装从 dkm_kernel_api 获取 block API 并调用 read/write 的样板代码,
|
|||
|
|
* 消除散落在各应用的硬编码偏移(+0xA8 / +0x10 / +0x18)。
|
|||
|
|
*
|
|||
|
|
* 用法:
|
|||
|
|
* dsb_block blk;
|
|||
|
|
* if (dsb_block_init(&blk, ctx->dkm_kernel_api) == 0) {
|
|||
|
|
* dsb_block_read(&blk, 0, 256, buf);
|
|||
|
|
* dsb_block_write(&blk, 0, 1, buf);
|
|||
|
|
* }
|
|||
|
|
*/
|
|||
|
|
#ifndef DESHAB_BLOCK_H
|
|||
|
|
#define DESHAB_BLOCK_H
|
|||
|
|
|
|||
|
|
#include "types.h"
|
|||
|
|
#include "kernel_api.h"
|
|||
|
|
|
|||
|
|
typedef struct dsb_block {
|
|||
|
|
const dkm_block_api *api;
|
|||
|
|
/* 便捷函数指针(从 block_api 解析)。index 固定 0,与现有应用一致。 */
|
|||
|
|
int (*read)(u32 index, u64 lba, u32 count, void *buffer);
|
|||
|
|
int (*write)(u32 index, u64 lba, u32 count, const void *buffer);
|
|||
|
|
} dsb_block;
|
|||
|
|
|
|||
|
|
/* 从 kernel_api 指针初始化 block 便捷结构。
|
|||
|
|
* kernel_api_u64 为 dsk_boot_context.dkm_kernel_api 的值(u64 指针)。
|
|||
|
|
* 返回 0 成功,-1 无 block API。 */
|
|||
|
|
static inline int dsb_block_init(dsb_block *b, u64 kernel_api_u64) {
|
|||
|
|
b->api = 0;
|
|||
|
|
b->read = 0;
|
|||
|
|
b->write = 0;
|
|||
|
|
if (!kernel_api_u64) return -1;
|
|||
|
|
/* block API 指针位于 kernel_api + DSB_KAPI_OFF_BLOCK */
|
|||
|
|
const dkm_block_api *blk_api = *(const dkm_block_api **)(kernel_api_u64 + DSB_KAPI_OFF_BLOCK);
|
|||
|
|
if (!blk_api) return -1;
|
|||
|
|
b->api = blk_api;
|
|||
|
|
/* read @ +0x10, write @ +0x18(dkm_block_api 结构内偏移) */
|
|||
|
|
b->read = (int (*)(u32, u64, u32, void *))(*(u64 *)((u64)blk_api + 0x10));
|
|||
|
|
b->write = (int (*)(u32, u64, u32, const void *))(*(u64 *)((u64)blk_api + 0x18));
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* 便捷读写(index 固定 0,与现有应用一致)。返回 0 成功。 */
|
|||
|
|
static inline int dsb_block_read(dsb_block *b, u64 lba, u32 count, void *buf) {
|
|||
|
|
return b->read ? b->read(0, lba, count, buf) : -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static inline int dsb_block_write(dsb_block *b, u64 lba, u32 count, const void *buf) {
|
|||
|
|
return b->write ? b->write(0, lba, count, buf) : -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endif /* DESHAB_BLOCK_H */
|