> 文章列表 > 「RISC-V Arch」SBI 规范解读(下)

「RISC-V Arch」SBI 规范解读(下)

「RISC-V Arch」SBI 规范解读(下)

第六章 定时器扩展(EID #0x54494D45"TIME")


这个定时器扩展取代了遗留定时器扩展(EID #0x00),并遵循 v0.2 中定义的调用规约。

6.1 函数:设置定时器(FID #0)

struct sbiret sbi_set_timer(uint64_t stime_value)

描述和遗留扩展描述同。 

6.2 函数列表

表6 定时器函数列表

第七章 IPI 扩展(EID #0x735049)


取代了遗留的 IPI,不再赘述。

第八章 RFENCE 扩展(EID #0x52464E43)


取代了遗留的 RFENCE,不再赘述。

第九章 hart 状态管理扩展(EID #0x48534D)


hart 状态管理扩展 HSM 介绍了一系列的 hart 状态和一组函数给 S 模式软件来请求 hart 状态的改变。下表描述了一些可能的 HSM 状态以及每个状态的唯一 ID。

表7 HSM hart 状态

 任何时间,一个 hart 应该只能处于上述状态中的一种,SBI 实现的 hart 状态应该遵循图3中的状态机转换。

图3 SBI HSM 状态机

 一个平台可以有多个 hart,这些 hart 可以被分为分层拓扑组(比如 core,cluster,nodes 等),每个分组都具有独立的低功耗状态。分层拓扑组中的这些平台相关的低功耗状态可以表示 suspend 状态,一个 SBI 实现可以使用下面方法来利用更高层拓扑组的 suspend 状态:

  • 平台协调

      这种方法中,当一个 hart 空闲时,S 模式电源管理软件会请求这个 hart 和 更高一层组进入最深度 suspend 状态。一个 SBI 实现应该为高层组选择一个 suspend 状态:a. 不比指定 suspend 状态更深 b.唤醒延时不能比指定的 suspend 延时高                        

  • OS 发起

      这种方法中,S 模式中的电源管理软件会在最后一个 hart 空闲时,直接请求高拓扑组进入 suspend 状态。当一个 hart 空闲,S 模式电源管理软件总是为自己选择一个 suspend 状态,只有自己是组内最后一个 suspend 的 hart 时,会请求高层拓扑组进入 suspend 状态。一个 SBI 实现应该:a.永远给高层拓扑组选择一个和指定 suspend 状态相同的状态 b.总是倾向于选择最近请求高层拓扑组的 suspend 状态。

9.1 函数: HART 开始(FID #0)

struct sbiret sbi_hart_start(unsigned long hartid,                             unsigned long start_addr, unsigned long opaque)

请求 SBI 实现来在 S 模式下、指定地址、指定寄存器数值、开始执行目标 hart,描述如下:

表8 HSM Hart 开始寄存器状态

 这个调用是异步的,更具体的,这个函数会在目标 hart 开始执行前返回,SBI 实现能够保证返回码的准确性。如果 SBI 实现是一个执行在 M 模式下的平台运行时固件,那么它必须在将控制权交给 S 模式前,配置 PMP 以及其他 M 模式下的状态。

hartid 参数指定了待启动的目标 hart;

start_addr 参数指定了运行时的物理地址,目标 hart 能够在 S 模式下在该地址开始运行;

opaque 参数是一个 XLEN-bit 长度的数值,当 hart 开始执行时会设置到 S 模式的 a1 寄存器中;

sbiret.error 中可能的错误码如表9,

表9 HSM Hart Start 错误码

 9.2~9.5 略

第十章 系统复位扩展(EID #0x53525354 “SRST”)


系统复位扩展给 S 模式软件提供了一种系统级的重启或关闭的函数。这里的系统指的是 S 模式视角,SBI 实现可以是机器模式固件或者 hypervisor。

10.1 函数:系统复位(FID #0)

struct sbiret sbi_system_reset(uint32_t reset_type, uint32_t reset_reason)

根据复位类型和原因来给系统复位,这个调用是同步,一旦成功将不再返回。

reset_type 参数是一个 32 位宽的数值,可选的数值如下:

表10 SRST 系统复位类型

 reset_reason 是一个可选的参数,代表了复位的原因。这个参数也是 32 位宽,可选的值如下:

表11 SRST 系统复位原因

 当 S 模式软件在本地运行时,SBI 实现是机器模式固件。在这种情况下了,关机就相当于整个系统的关机,即冷启动。另外,热重启相当于处理器核心和系统部分重启,不是整个系统。比如,一个拥有 BMC 的服务器系统,热重启并不会给 BMC 下电,但是冷重启会。

当 S 模式软件运行在虚拟机中时,SBI 实现是 hypervisor。关机、冷重启、热重启其实效果上和本地时相同,但是不会导致任何的物理电源变化。

sbiret.error 可能的返回错误码如表 12:

表12 SRST 系统复位错误码

 第十一章 性能监视器单元扩展(EID #0x505D55"PMU")


RISC-V 硬件性能计数器,如mcycle、minstret 和 mhpmcounterX CSR,可在 S 模式下使用cycle、instret和hpmccounterX CSR以只读方式访问。SBI 性能监控单元( PMU )扩展是一个为S 模式提供的接口,在机器模式(或hyper模式)协助下,配置和使用 RISC-V 硬件性能计数器。这些硬件性能计数器只能通过 mcountinhibit 和 mhpmeventX CSR 寄存器在机器模式下启动、停止或配置。因此,如果 RISC-V 平台未实现 mcountinhibit CSR,机器模式中的 SBI 实现可能会选择不允许SBI PMU扩展。

RISC-V 系统通常支持使用有限数量的硬件性能计数器(最多 64 位宽)监控各种硬件事件。此外,SBI 实现还可以提供固件性能计数器,这些计数器可以监视固件事件,例如未对齐的加载/存储指令的数量、RFENCE 的数量、IPI 的数量等,固件计数器总是 64 位宽。

SBI PMU 扩展提供:

  1. 为 S 模式提供接口,以访问(发现/配置) hart /固件的计数器
  2. 提供硬件/固件的新能计数器和事件接口,接口与 Linux perf 兼容
  3. 微架构原始事件编码的完全访问

为了定义 SBI PMU 的扩展调用,我们定义了一些重要的实体:counter_idx,event_idx 以及 event_data。counter_idx 是为每个硬件/固件分配的计数器逻辑号,event_idx 代表硬件/固件事件,event_data 是 64 位宽的代表硬件/固件事件的额外配置/参数。

event_idx 是一个 20 位宽的值,编码如下:

   event_idx[19:16] = type    event_idx[15:0] = code

11.1 事件:硬件普通事件(类型 #0)

 event_idx.type 为 0x0 表示所有的硬件普通事件,通过event_idx.code 来识别是什么事件

表13 PMU 硬件事件

 To Be Contined~

11.2 事件:硬件 cache 事件(类型 #1)

11.3 事件:硬件原始事件(类型 #2)

11.4 事件:固件事件(类型 #15)

11.5 函数:获取计数器值(FID #0)

11.6 函数:获取计数器详细信息(FID #1)
11.7 函数:发现并配置匹配计数器(FID #2)

11.8 函数:开启计数器(FID #3)

11.9 函数:停止计数器(FID #4)

11.10 函数:读取固件计数器(FID #5)

11.11 函数列表

第十二章 实验中的 SBI 扩展空间(EIDs #0x08000000-#0x08FFFFFF)


第十三章 供应商特定的扩展空间(EIDs #0x09000000-#0x09FFFFFF)


第十四章 固件提供商特定的扩展空间(EIDs #0x0A000000-#0x0AFFFFFF)


皮格马利翁效应心理学指出,赞美、赞同能够产生奇迹,越具体,效果越好~

“收藏夹吃灰”是学“器”练“术”非常聪明的方法,帮助我们避免日常低效的勤奋~