0

我无法理解下面显示的 legalize_privilege() 中的源代码:

reg_t processor_t::legalize_privilege(reg_t prv)
{
  if (!supports_extension('U'))
    return PRV_M;

  if (prv == PRV_HS || (prv == PRV_S && !supports_extension('S')))
    return PRV_U;
 //according to my understanding, HS mode actually works in Supervisor mode. So PRV_S should be returned here.
  return prv;
}
4

1 回答 1

0

PRV_HS仅在模拟器中用作 CSR 权限检查的虚拟特权级别。
在 H-extension 规范中,HS-mode 代替了 S-mode (level 1)。
整数值2用于PRV_HS将其与 区分开来PRV_S,但这是 RISC-V 特权架构(ISA 手册第 2 卷第 1.2 节特权级别)中的保留值,不被 H 扩展使用。

因此,实际设置此模式是非法的。要设置 HS 模式或 S 模式,请始终使用PRV_S.
在同样的情况下,你也可以看到如果不支持 S-extension 设置 S-mode 是非法的。
这两种情况都是非法的,因此特权级别改为强制为最低级别,即PRV_U.


的唯一用途是在(此处PRV_HS的权限检查段中,如果处理器不处于虚拟状态(由 设置),则使用它来允许访问 Hypervisor CSR。 这是因为 CSR 地址在位 [9:8] 中对访问所需的最低特权级别进行编码,这被定义为针对 Hypervisor CSR,即使没有这种不同的特权级别(ISA 手册第 2 卷第 2.1 节 CSR 地址映射公约)。processor_t::get_csrPRV_Sprocessor_t::set_virt
10b = 2

于 2021-08-07T16:55:27.750 回答