术语
SBI,Supervisor Binary Interface,管理二进制接口
U-Mode,User mode,用户模式
S-Mode,Supervisor mode,监督模式
VS-Mode,Virtualization Supervisor mode,虚拟机监督模式
M-Mode,Machine mode,机器模式,类似 ARM 的 EL3
HS-Mode,Hypervisor mode,管理模式,类似 ARM 的 EL2
SEE, Supervisor Execution Environment ,监督执行环境
规范修正历史
Version 1.0.0
•发布前更新版本
Version 1.0-rc3
•更新调用规约
•修正 PMU 一个类型
•增加缩写表
Version 1.0-rc2
•更新 RISC-V 格式
•提升指令
•删除 RV32 的参考
Version 1.0-rc1
•一个类型修改
Version 0.3.0
•一些类型修改
•更新 license 详细信息,取代超链接方式
Version 0.3-rc1
•改善文档风格和命名方式
•添加 SBI 系统复位支持
•改善 SBI 指令部分
•改善 SBI hart 状态管理的文档
•SBI hart 状态管理添加 suspend 功能
•增加性能监视器单元扩展
•澄清 SBI 不能是部分实现的
Version 0.2
•将 v0.1 放到 lagency 部分以达到向前兼容,比如 v0.1 不支持 probe。
第一章 介绍
这个规范描述了 RISC-V 超级二进制接口,即SBI,通过 SBI 接口, RISC-V 能够实现 S 模式、VS 模式代码能够在不同的平台之间的可移植性。SBI 遵循了 RISC-V 的设计哲学,由一个非常小的核心部分和一些可选的模块扩展组成。
SBI 整体来说是一个扩展,也就是说要不实现,要么就要完整实现。如果 sbi_probe_extention 指示出某个功能可用,那么所有版本要求的功能都需要实现,这个版本可以通过 sbi_get_spec_version 来获得。
高特权软件向管理模式提供 SBI 接口支持,这个软件可以叫做 SBI 实现或者 SEE。SEE 可以是图1中的 M 模式下运行时固件,也可以是图2 中的 HS 模式运行的虚拟机管理程序。


SBI 规范不会指定任何硬件发现的方法,S 模式软件必须通过其他工业标准来获取,比如 Device Tree 或者 ACPI。
第二章 规范中的术语和缩写
第三章 二进制编码
所有的 SBI 功能/函数都共享同样的二进制编码,混合了各种 SBI 扩展。SBI 规范遵循下面的调用规约:
- ECALL 用做 supervisor 和 SEE 之间的控制传输指令;
- a7 是编码的 SBI 扩展 ID (EID);
- a6 是编码的是 EID 中具体的 SBI 函数 ID (FID),由 SBI v0.2 定义;
- 除了 a0 和 a1寄存器以外,其他寄存器必须由被调用者保存
- SBI 函数必须在 a0 和 a1 中返回一对数值,a0 是返回的错误码,a1 是数据,和如下 C 结构体类似
struct sbiret {
long error;
long value;
};
为了命名的兼容性,SBI EID 和 FID 都采用 32 位的寄存器,在寄存器传输时,符合上面的调用规约。
表1 提供了标准的 SBI 错误码

使用 ECALL 时,如果 EID 或 FID 不支持,那么必须返回错误码 SBI_ERR_NOT_SUPPORTED。
每一个 SBI 函数应该首选 unsigned long 作为数据类型。这会使得规范简单并且容易被 RISC-V ISA 类型接受。这种情况下数据被定义为 32位宽,高特权软件必须保证其只使用 32位 数据。
如果 SBI 函数想要给高特权模式传递一个 harts 列表,那么必须使用下面的 hart 掩码。这个适用于 v0.2及以后的版本。
任何需要一个 hart 掩码的函数,不要传递下面两个参数:
- unsigned long hart_mask,一个包含了hart id的标量位向量
- unsigned long hart_mask_base,一个位向量中必须进行计算的 hart id 起始位置
在一个 SBI 函数调用中,最大的 hart 数通过 XLEN 设置,如果低特权级别想要传输更多关于 XLEN 的信息,那么就需要调用多个 SBI 函数调用实例,hart_mask_base 能够设置为 -1 来指示 可以忽略 hart_mask,需要考虑所有可用的 hart。
任何一个使用 hart 掩码的函数可能会返回下表中的错误码,这些错误码是函数特定的错误码。

第四章 基础扩展(EID #0x10)
基础扩展已经是尽可能的最小化了,因此基础扩展只包含了获得 SBI 扩展集及其版本的一些功能。SBI 实现必须实现所有基础扩展中的函数,也就是说不能返回任何错误码。
4.1 函数:获取 SBI 标准版本(FID #0)
4.2 函数:获取 SBI 实现 ID (FID #1)
4.3 函数:获取 SBI 实现版本 (FID #2)
4.4 函数:探测 SBI 扩展 (FID #3)
4.5 函数:获取机器供应商 ID (FID #4)
4.6 函数:获取机器架构 ID (FID #5)
4.7 函数:获取机器实现 ID (FID #6)
4.8 函数列表

4.9 SBI 实现 IDs

第五章 Legancy 扩展(EIDs #0x00 - 0x0F)
皮格马利翁效应心理学指出,赞美、赞同能够产生奇迹,越具体,效果越好~
“收藏夹吃灰”是学“器”练“术”非常聪明的方法,帮助我们避免日常低效的勤奋~