卢骏 · 2020年06月06日

ARM访问实现自定义系统寄存器

ARMv8中,取消了协处理器,之前协处理器实现的功能,全部由系统寄存器来是实现。对于系统寄存器的访问,使用mrs,msr指令来访问。

指令编码如下:
1.png

L: 1, mrs,读取系统寄存器值到通用寄存器中

L: 0, msr,将通用寄存器值写入到系统寄存器中

而系统寄存器的编码,由op1,CRn,CRm,op2来决定。如下图所示,更多的系统寄存器的编码,查看arm-spec。
2.png

比如,我要读取 OSDTRRX_EL1 系统寄存器,就可以使用 mrs 指令

            mrs x0, OSDTRRX_EL1

op1,CRn,CRm,op2的编码组合有很多,arm并没有将所有的组合,均定义系统寄存器。对于未使用的编码组合,arm允许实现自定义这些系统寄存器的功能,比如gic的寄存器。

如下图,是GIC寄存器的编码组合。
3.png

对于这些实现自定义的系统寄存器,在写汇编程序的时候,是不能通过系统寄存器的名字去访问的,否则编译会报错。比如要访问 ICH_HCR_EL2,是不能通过以下指令去访问的。

    mrs  x0,  ICH_HCR_EL2

为了解决访问自定义系统寄存器,arm定义了以下格式,来表示系统寄存器。

S<op0><op1>_C<CRn>_C<CRm0><op2>

访问实现自定义寄存器,使用上述格式,来表示系统寄存器。

比如,对于上图中的GIC的寄存器ICH_HCR_EL2,就可以

    mrs   x0,   S3_4_C12_C11_0    

为了写代码的方便,可以定义以下宏:

1  #define ICH_HCR_EL2      S3_4_C12_C11_0    
2   #define ICH_VTR_EL2      S3_4_C12_C11_1    
3   #define ICH_MISR_EL2     S3_4_C12_C11_2    
4   #define ICH_EISR_EL2     S3_4_C12_C11_3    
6   #define ICH_ELRSR_EL2    S3_4_C12_C11_5    
7   #define ICH_VMCR_EL2     S3_4_C12_C11_7 

这样,在写代码的时候,就可以直接用系统寄存器的名字。

1 msr ICH_HCR_EL2    , x0
2 mrs x1             , ICH_VTR_EL2
3 msr ICH_MISR_EL2   , x 

系列其他篇

原文首发于骏的世界博客
作者:卢骏.
更多Arm技术相关的文章请关注Arm技术博客极术专栏,每日更新。
推荐阅读
关注数
23582
内容数
1033
Arm相关的技术博客,提供最新Arm技术干货,欢迎关注
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息