image.png

用rust 实现规范的定义

// 定义 SbiRet 结构体,用于存储 SBI 调用的返回值
struct SbiRet {
    error: i64,
    value: i64,
}

/// 实现一个封装SBI调用的函数
#[inline(always)]
fn sbi_call(extension: usize, function: usize, arg0: usize, arg1: usize) -> SbiRet {
    let (error, value);
    unsafe {
        asm!(
            "ecall",                       // 执行ECALL指令
            in("a0") arg0,                 // 设置参数寄存器
            in("a1") arg1,
            in("a6") function,             // 设置功能ID
            in("a7") extension,            // 设置扩展ID
            lateout("a0") error,           // 获取错误代码
            lateout("a1") value,           // 获取返回值
        );
    }
    SbiRet { error, value }
}

怎么使用呢?

/// 启动性能监控计数器的函数
#[inline]
fn pmu_start(counter_id: usize, event_id: usize) -> SbiRet {
    const EXTENSION_PMU: usize = 0x504D55; // 假设PMU扩展ID
    const FUNCTION_PMU_START: usize = 0;  // pmu_start 功能ID
    sbi_call(EXTENSION_PMU, FUNCTION_PMU_START, counter_id, event_id)
}

调用返回值:0是成功, 失败都是负的,很多系统调用也是这样玩的
截屏2024-07-10 21.27.29.png


putao
8 声望1 粉丝

推动世界向前发展,改善民生。