我无法理解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;
}发布于 2021-08-07 16:55:27
PRV_HS仅用作模拟器中用于CSR权限检查的虚拟特权级别。
在H-扩展规范中,HS-模式取代了S-模式(级别1).
整数值2用于PRV_HS,以区别于PRV_S,但这是RISC特权体系结构(ISA手册第2卷§1.2特权级别)中的保留值,H-扩展不使用该值。
因此,实际设置此模式是非法的。若要设置HS或S模式,请始终使用PRV_S。
在同样的情况下,您还可以看到,如果S扩展不受支持,则设置S模式是非法的。
这两种情况都是非法的,因此特权级别被强制到最低级别,即PRV_U。
PRV_HS的唯一用途是在processor_t::get_csr (这里)的权限检查段(这里)中,如果处理器没有处于虚拟状态(如processor_t::set_virt设置),则使用它来代替PRV_S来允许对Hypervisor CSR的访问。
这是因为CSR地址编码了BIT9:8中访问所需的最低特权级别,BIT9:8定义为Hypervisor CSR的10b = 2,尽管没有这样不同的特权级别(ISA手册第2卷§2.1CSR地址映射约定)。
https://stackoverflow.com/questions/68434777
复制相似问题