news 2026/2/12 1:18:01

全文 -- Chapter 5. “Smcsrind/Sscsrind“ Indirect CSR Access, Version 1.0 -- The RISC-V Inst Set Vol II

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
全文 -- Chapter 5. “Smcsrind/Sscsrind“ Indirect CSR Access, Version 1.0 -- The RISC-V Inst Set Vol II

第5章 "Smcsrind/Sscsrind" 间接CSR访问,版本1.0

5.1. 引言

Smcsrind/Sscsrind是一个ISA扩展,它扩展了最初作为Smaia/Ssaia扩展一部分定义的间接CSR访问机制,旨在使其可供其他扩展使用,而不必对Smaia/Ssaia产生不必要的依赖。

此扩展带来两个好处:

  1. 提供了一种通过CSR访问寄存器数组的方式,无需在有限的CSR地址空间中分配大块区域。

  2. 使软件能够通过索引访问寄存器数组中的每一个寄存器,而无需为每个寄存器编写switch-case语句。

通过此扩展间接访问CSR时使用"选择值"(select values),这与使用标准CSR编号直接访问的方式不同。可通过一种方法访问的CSR,不一定能通过另一种方法访问。选择值构成一个独立的地址空间,与CSR编号不同,也与Sdtrig扩展中的tselect值不同。如果一个CSR既可直接访问又可间接访问,则该CSR的选择值与其CSR编号无关。

此外,机器级( Machine-level )和监管级( Supervisor-level )的选择值彼此是独立的地址空间;但是,一个扩展可以定义具有相同选择值的机器级和监管级CSR彼此为部分或完全别名关系。这通常用于可以被从机器级委托到监管级的CSR。

机器级扩展Smcsrind包含了Hart在所有特权级别下新增的所有CSR以及所有行为修改。对于监管级环境,扩展Sscsrind本质上与Smcsrind相同,只是不包括机器级CSR以及监管级无法直接看到的行为。

5.2. 机器级CSR

编号特权级宽度名称描述
0x350MRWXLENmiselect机器间接寄存器选择器
0x351MRWXLENmireg机器间接寄存器别名
0x352MRWXLENmireg2机器间接寄存器别名2
0x353MRWXLENmireg3机器间接寄存器别名3
0x355MRWXLENmireg4机器间接寄存器别名4
0x356MRWXLENmireg5机器间接寄存器别名5
0x357MRWXLENmireg6机器间接寄存器别名6

注:miregCSR编号不连续,因为miph是CSR编号0x354。*

上表中列出的CSR提供了一个间接访问寄存器状态的窗口。miselect的值决定了在读取或写入每个机器间接别名CSR(mireg*)时访问哪个寄存器。miselect值的范围被分配给相关的扩展,这些扩展针对每个miselect值,规定可通过每个miregi寄存器访问的寄存器状态。miselect是一个WARL寄存器。

miselect寄存器实现的位数至少足以支持所有已实现的miselect值(对应已实现的使用miselect/mireg*间接访问寄存器状态的扩展)。如果没有已实现的扩展使用miselect,该寄存器可能为只读零。

最高有效位(第XLEN-1位)为1的miselect值仅用于自定义用途,可能是为了通过别名CSR访问自定义寄存器。最高有效位为0的miselect值仅用于标准用途,并在被分配给标准架构扩展之前处于保留状态。如果XLEN改变,miselect的最高有效位将移动到新的位置,并保留其之前的值。

实现不需要支持任何自定义的miselect值。

miselect保存一个值,而该值在机器模式下未实现时(从M模式访问mireg*),其行为是未指定的(UNSPECIFIED)。

预计实现通常会对此类访问引发非法指令异常,以便将其识别为软件错误。平台规范、配置文件规范和/或特权ISA规范可能对此类访问的行为施加更多限制。

miselect保存一个在已分配且已实现范围内的数字时,尝试访问mireg*会导致特定行为,该行为对于每个miselectmiregi的组合,由分配了该miselect值的扩展定义。

通常,每个miregi将访问寄存器状态、访问只读0状态或引发非法指令异常。

对于RV32,如果一个扩展将一个间接访问的寄存器定义为64位宽,建议通过miregmireg2mireg3之一访问寄存器的低32位,同时分别通过mireg4mireg5mireg6访问高32位。

定义了六个*ireg*寄存器,以确保涵盖开发中扩展的需求,并留有一定的增长空间。例如,对于与计数器X相关联的siselect值,sireg/sireg2可用于访问mhpmcounterX/mhpmeventX,而sireg4/sireg5可访问mhpmcounterXh/mhpmeventXh。六个*ireg*寄存器允许每个索引值(*iselect)最多访问3个仅用于RV32的CSR数组,或者在不限于RV32的CSR时最多访问6个CSR数组。

5.3. 监管级CSR

编号特权级宽度名称描述
0x150SRWXLENsiselect监管间接寄存器选择器
0x151SRWXLENsireg监管间接寄存器别名
0x152SRWXLENsireg2监管间接寄存器别名2
0x153SRWXLENsireg3监管间接寄存器别名3
0x155SRWXLENsireg4监管间接寄存器别名4
0x156SRWXLENsireg5监管间接寄存器别名5
0x157SRWXLENsireg6监管间接寄存器别名6

如果实现了S模式,则需要上表中的CSR。

siselect寄存器至少支持0..0xFFF的值范围。未来的扩展可能定义超出此最小范围的值范围。只有当实现了这样的扩展时,才要求siselect支持更大的值。

要求siselect具有0–0xFFF的范围,即使该空间的大部分或全部可能被保留或不可访问,这允许M模式在此已实现范围内模拟间接访问的寄存器,包括未来可能标准化的寄存器。

最高有效位(第XLEN-1位)为1的siselect值仅用于自定义用途,可能是为了通过别名CSR访问自定义寄存器。最高有效位为0的siselect值仅用于标准用途,并在被分配给标准架构扩展之前处于保留状态。如果XLEN改变,siselect的最高有效位将移动到新的位置,并保留其之前的值。

siselect保存一个在监管级未实现的值时,从M模式或S模式访问sireg*的行为是未指定的

建议实现对此类访问引发非法指令异常,以便于(由M模式)对这些访问进行可能的模拟。

如果机器级已为S模式禁用了某个扩展,例如通过CSRmenvcfg中某些字段的设置,则认为该扩展在监管级未实现。

否则,当siselect保存一个在标准定义且已实现的范围内的数字时,从M模式或S模式尝试访问sireg*会导致特定行为,该行为对于每个siselectsiregi的组合,由分配了该siselect值的扩展定义。

通常,每个siregi将访问寄存器状态、访问只读0状态,或者(除非在虚拟机中执行,下一节将介绍)引发非法指令异常。

请注意,siselectsireg*的宽度始终是当前的XLEN,而不是SXLEN。因此,例如,如果MXLEN = 64 且 SXLEN = 32,则这些寄存器在当前特权模式为M(运行RV64代码)时是64位,但在特权模式为S(RV32代码)时是32位。

5.4. 虚拟监管级CSR

编号特权级宽度名称描述
0x250HRWXLENvsiselect虚拟监管间接寄存器选择器
0x251HRWXLENvsireg虚拟监管间接寄存器别名
0x252HRWXLENvsireg2虚拟监管间接寄存器别名2
0x253HRWXLENvsireg3虚拟监管间接寄存器别名3
0x255HRWXLENvsireg4虚拟监管间接寄存器别名4
0x256HRWXLENvsireg5虚拟监管间接寄存器别名5
0x257HRWXLENvsireg6虚拟监管间接寄存器别名6

如果实现了hypervisor扩展,则需要上表中的CSR。这些VS CSR都与监管级CSR相对应,并在虚拟机中(在VS模式或VU模式下)执行时替代那些监管级CSR。

vsiselect寄存器至少支持0..0xFFF的值范围。未来的扩展可能定义超出此最小范围的值范围。只有当实现了这样的扩展时,才要求vsiselect支持更大的值。

要求vsiselect具有0–0xFFF的范围,即使该空间的大部分或全部可能被保留或不可访问,这允许hypervisor在此已实现范围内模拟间接访问的寄存器,包括未来可能标准化的寄存器。

更一般地,建议vsiselectsiselect以相同的位数实现。这也避免了因vsiselectsiselect宽度之间的可观察差异而产生虚拟化漏洞。

最高有效位(第XLEN-1位)为1的vsiselect值仅用于自定义用途,可能是为了通过别名CSR访问自定义寄存器。最高有效位为0的vsiselect值仅用于标准用途,并在被分配给标准架构扩展之前处于保留状态。如果XLEN改变,vsiselect的最高有效位将移动到新的位置,并保留其之前的值。

对于别名CSRsireg*vsireg*,hypervisor扩展中关于何时引发虚拟指令异常的常规规则(基于指令是否是HS限定的)不适用。取而代之的是本节中为siregvsireg给出的规则,除非被下一节中指定的要求所覆盖。当也实现了扩展Smstateen时,下一节的要求优先于本节。

对于从VS模式或VU模式尝试直接访问vsiselectvsireg*,或从VU模式尝试访问siselectsireg*,会引发虚拟指令异常。

vsiselect保存一个在HS级未实现的值时,从M模式或HS模式访问vsireg*,或从VS模式访问sireg*(实际上是vsireg*),其行为是未指定的

建议实现对此类访问引发非法指令异常,以便于(由M模式)对这些访问进行可能的模拟。

否则,当vsiselect保存一个在标准定义且已实现范围内的数字时,尝试从一个足够特权的模式访问vsireg*,或从VS模式访问sireg*(实际上是vsireg*),会导致特定行为,该行为对于每个vsiselectvsiregi的组合,由分配了该vsiselect值的扩展定义。

通常,每个vsiregi将访问寄存器状态、访问只读0状态,或引发异常(非法指令异常,或者对于来自VS模式的特定访问,引发虚拟指令异常)。当vsiselect保存一个在HS级已实现但在VS级未实现的值时,从VS模式尝试访问sireg*(实际上是vsireg*)通常会引发虚拟指令异常。但可能存在特定于扩展的情况,不同的行为更合适。

siselectsireg*类似,vsiselectvsireg*的宽度始终是当前的XLEN,而不是VSXLEN。因此,例如,如果HSXLEN = 64 且 VSXLEN = 32,则这些寄存器在HS模式下的hypervisor访问时(运行RV64代码)是64位,但对于VS模式下的客户操作系统(RV32代码)是32位。

5.5. 通过状态启用CSR进行访问控制

如果扩展Smstateen与Smcsrind一起实现,状态启用寄存器mstateen0的第60位控制对siselectsireg*vsiselectvsireg*的访问。当mstateen0[60] = 0时,尝试从比特权低于M模式的模式访问这些CSR之一会导致非法指令异常。与往常一样,状态启用CSR不影响在M模式下对任何状态的访问性,只影响更低特权的模式。更多解释请参阅扩展Smstateen的文档。

其他扩展可能规定某些mstateen位控制通过siselect + sireg*和/或vsiselect + vsireg*间接访问的寄存器的访问。但是,无论任何其他mstateen位如何,如果mstateen0[60] = 1,则如上节所述,对于所有来自VS模式或VU模式直接访问vsiselectvsireg*的尝试,以及所有来自VU模式访问siselectsireg*的尝试,都会引发虚拟指令异常。

如果实现了hypervisor扩展,相同的位也在hypervisor CSRhstateen0中定义,但只控制对siselectsireg*(实际上是vsiselectvsireg*)的访问,这些是可能在VS或VU模式下执行的虚拟机可以访问的状态。当hstateen0[60]=0mstateen0[60]=1时,无论vsiselect的值或任何其他mstateen位的值如何,所有来自VS或VU模式访问siselectsireg*的尝试都会引发虚拟指令异常,而不是非法指令异常。

扩展Ssstateen被定义为Smstateen的监管级视图。因此,Sscsrind和Ssstateen的组合包含了上面为hstateen0定义的位,但不包括为mstateen0定义的位,因为机器级CSR对监管级不可见。

为未来可能的"Uscsrind"扩展保留了CSR地址空间,该扩展将间接CSR访问扩展到用户模式。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/5 17:04:41

高性能计算异构编程

1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_if find(begin, end, value):查找第一个等于 value 的元素,返回迭代器(未找到返回 end)。find_if(begin, end, predicate):查找第…

作者头像 李华
网站建设 2026/2/11 3:33:46

自定义内存检测工具

1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_if find(begin, end, value):查找第一个等于 value 的元素,返回迭代器(未找到返回 end)。find_if(begin, end, predicate):查找第…

作者头像 李华
网站建设 2026/2/5 22:54:51

Python性能优化技巧:让你的代码飞起来

SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式。本文将介绍如何使用SQLAlchemy ORM进行数据库操作。目录安装SQLAlchemy核心概念连接数据库定义数据模型创建数据库表基本CRUD操作查询数据关系操…

作者头像 李华
网站建设 2026/2/11 19:28:25

分布式计算C++库

1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_if find(begin, end, value):查找第一个等于 value 的元素,返回迭代器(未找到返回 end)。find_if(begin, end, predicate):查找第…

作者头像 李华
网站建设 2026/2/8 17:11:43

定时任务专家:Python Schedule库使用指南

SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式。本文将介绍如何使用SQLAlchemy ORM进行数据库操作。目录安装SQLAlchemy核心概念连接数据库定义数据模型创建数据库表基本CRUD操作查询数据关系操…

作者头像 李华
网站建设 2026/2/6 22:25:10

内存泄漏检测与防范

1、非修改序列算法这些算法不会改变它们所操作的容器中的元素。1.1 find 和 find_iffind(begin, end, value):查找第一个等于 value 的元素,返回迭代器(未找到返回 end)。find_if(begin, end, predicate):查找第一个满…

作者头像 李华