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 */
|