飞腾CPU相关寄存器描述(持续更新)

飞腾CPU相关寄存器描述(持续更新)

  1. SPSel堆栈寄存器选择寄存器
  1. EL1/2/3都可以读写
  2. 32位长度。
  3. SP, bit[0], 控制堆栈寄存器的选择。
    0——>CPU无论处于什么权限级,堆栈寄存器都共用SP_EL0,因此在权限级切换时,需要保存和恢复堆栈寄存器。
    1——>应用程序使用SP_EL0,内核使用SP_EL1,虚拟机监控机Hypervisor使用SP_EL2。(Linux选择这种模式)
  1. CurrentEL当前权限级寄存器
  1. EL1/2/3都可以读。
  2. 32位长度
  3. EL, bits[3:2],当前CPU权限级
    00——>EL0
    01——>EL1
    10——>EL2
    11——>EL3
  1. SCTLR_EL1 系统控制寄存器(EL1)
  1. EL1/2/3都可以读写。
  2. 32位长度。
  3. UCI, bit[26], 控制在AArch64的应用程序是否可以执行DC数据缓存和IC指令缓存的操作指令 。
    0——>禁止。
  4. EE, bit[25], 控制内核直接访存的大小端设置,也控制内核和应用程序运行时进行Stage1页表查询的大小端设置。
    0——>小端
  5. E0E, bit[24], 控制应用程序访存的大小端设置。
    0——>小端
  6. WXN, bit[19], 当内存映射属性为“写允许”,是否强制为“不可执行”XN。
    0——>“写允许”不强制为“不可执行”
  7. nTWE, bit[18], 控制应用程序在执行无条件WFE指令后,当CPU被挂起时,是否要触发到内核的同步异常。
    0——>触发。(但是条件WFE指令,但是条件不成立时,不会触发异常)
  8. nTWI, bit[16], 与nTWE,bit[18]类似,这里是说无条件WFI指令。
    0——>触发。(但是条件WFI指令,但是条件不成立时,不会触发异常)
  9. UCT, bit[15],控制AArch64的应用程序是否可以访问寄存器CTR_EL0。
    0——>不可访问。
  10. DZE, bit[14], 控制应用程序是否可以执行DC ZVA指令。
    0——>不可执行
  11. I, bit[12], 控制L1指令缓存。
    0——>应用程序和内核在运行时,指令缓禁用。
  12. UMA, bit[9], 控制AArch64应用程序访问中断掩码。
    0——>禁止访问。
  13. SED, bit[8], 控制SETEND指令功能是否生效。
    0——>不生效。
  14. ITD, bit[7], 控制IT指令功能是否生效。
    0——>不生效。
  15. THEE, bit[6], 控制ThumbEE是否生效。
    0——>不生效。
  16. CP15BEN, bit[5], 控制关于DMB,DSB和ISB的CP15屏障功能是否生效。
    0——>不生效。
  17. SA0, bit[4], 控制对应用程序的堆栈对齐检查功能。
    0——>不检查。
  18. SA, bit[3], 控制对内核的堆栈对齐检查功能。
    0——>不检查。
  19. C, bit[2], 控制L1数据缓存和L2缓存。
    0——>应用程序和内核在运行时,禁用L1数据缓存和L2缓存。
  20. A, bit[1], 控制访存是否对齐检查。
    0——>不检查。(有两类访存指令,独占型和内存强顺序型,必须要求地址和长度对齐检查)
  21. M, bit[0], 控制应用程序和内核是否开启stage1地址翻译功能。
    0——>默认方式,关闭MMU的stage1地址翻译功能
    1——>开启MMU的stage1地址翻译功能,操作系统内核应该需要
  1. SCTLR_EL2 系统控制寄存器(EL2)
  1. EL2/3都可以读写。
  2. 32位长度。
  3. 请参看SCTLR_EL1系统控制寄存器说明,两者之间的区别主要是在权限级方面。
  1. ID_AA64MMFR1_EL1内存模型
  1. EL1/2/3只读
  2. 64位长度
  3. 手册上没有详细描述,代码分析说id_aa64mmfrl_el1的[8…11]如果不为零,即x2不为零,表示CPU支持VHE模式。
    mrs x2, id_aa64mmfr1_el1
    ubfx x2, x2, #8, #4
  1. Hypervisor配置寄存器hcr_el2
  1. EL2/3可以读写
  2. 64位长度
  3. ID,bit[33],stage 2指令缓存关闭。
    0——>开启stage 2 指令缓存
  4. CD,bit[32],stage 2数据缓存关闭。
    0——>开启stage2数据缓存
  5. RW,bit[31],低权限级的寄存器位宽控制。
    1——>EL1为AArch64的64位。EL0级的寄存器位宽由运行EL0时的当前处理器状态决定。
  6. TRVM,bit[30],控制EL1级虚拟内存相关读操作是否产生陷入EL2的异常,例如读SCTLR_EL1,TTBR0_EL1等寄存器。
    0——>不产生陷入。
  7. HCD,bit[29],控制HVC指令关闭。
    0——>允许在EL1或EL2使用HVC指令。
  8. TDZ,bit[28],控制DC ZVA指令是否产生异常。
    0——>不产生异常。
  9. TGE,bit[27], 控制常规异常。
    0——>Hype模式。
    1——>VHE模式,在非安全态,原本陷入EL1的所有常规异常全部陷入到EL2,所有中断全部触发EL2异常,stage1阶段的地址翻译关闭,所有虚拟中断全部关闭。
  10. TVM,bit[26], 控制EL1级虚拟内存相关写操作是否产生陷入EL2的异常,例如写SCTLR_EL1,TTBR0_EL1等寄存器。
    0——>不产生陷入。
  11. TTLB, bit[25],控制在EL1级的TLB相关操作是否陷入EL2。原本在EL1级的TLB操作是未定义的。
    0——>不产生陷入。
  12. TPU, bit[24],控制在EL0/1级的对L2缓存的操作是否陷入EL2。
    0——>不产生陷入。
  13. TPC,bit[23],控制在EL1级的对L1缓存的操作是否陷入EL2。
    0——>不产生陷入。
  14. TSW, bit[22],控制在EL1级的对组/路相关缓存的操作是否陷入EL2。
    0——>不产生陷入。
  15. TACR, bit[21],控制在EL1级辅助寄存器访问的操作是否陷入EL2,例如ACTLR_EL1。
    0——>不产生陷入。
  16. TIDCP,bit[20],控制其他在EL1级的功能是否陷入EL2。
    0——>不产生陷入。
  17. TSC, bit[19],控制在EL1执行SMC是否陷入EL2。
    0——>不产生陷入。这说明,KVM虚拟机的客户OS内核可以直接调用SMC指令和安全监控软件通信。
  18. TID3,bit[18],控制在EL1级读ID组3的寄存器,是否陷入EL2。
    0——>默认方式, 不产生陷入。
    1——>产生陷入。这说明,KVM虚拟机可以设置为和宿主机不一样的CPU类型配置。
  19. TID2,bit[17],类似ID组3的寄存器
  20. TID1, bit[16],类似ID组3的寄存器
  21. TID0, bit[15],类似ID组3的寄存器
  22. TWE, bit[14],控制在EL0/1级执行WFE指令是否陷入EL2。
    0——>不产生陷入。
  23. TWI, bit[13],控制在EL0/1级执行WFI指令是否陷入EL2。
    0——>不产生陷入。
  24. DC,bit[12],控制内存的缓存属性。
    0——>默认方式,当EL0/1的stage1关闭后,内存属性定义为nGnRnE。
    1——>EL0/1的stage1的内存属性定义Normal的WB类型。
  25. BSU,bit[11:10],EL0/1的屏障指令的影响范围
    0——>无影响(??)
  26. FB, bit[9],控制非安全态EL1的指令是否在Inner共享范围内广播
    0——>不强制广播。
  27. VSE, bit[8], 判断当前CPU是否有虚拟系统错误/异步终止。
    0——>没有。
  28. VI, bit[7],判断当前CPU是否有虚拟IRQ中断。
    0——>没有。
  29. VF, bit[6],判断当前CPU是否有虚拟FIQ中断。
    0——>没有。
  30. AMO, bit[5], 判断当前CPU是否有物理系统错误/异步终止。
    0——>没有。
  31. IMO, bit[7],判断当前CPU是否有物理IRQ中断。
    0——>没有。
  32. FMO, bit[6],判断当前CPU是否有物理FIQ中断。
    0——>没有。
  33. SWIO, bit[1],控制EL1对数据缓存的组/路invalidation操作是否实现为clean and invalidation。
    0——>不是。
  34. VM, bit[0],控制应用程序和内核是否开启stage2地址翻译功能。
    0——>不开启。
  1. 计数器定时器Hypervisor控制寄存器cnthctl_el2
  1. EL2/3可读写
  2. 32位长度
  3. 描述:控制物理计数器事件流,控制非安全态EL1对物理计数器和定时器的访问。
  4. 相关寄存器:
    计数器寄存器 CNTPCT_EL0或CNTVCT_EL0
    定时器寄存器 CNTP_CVAL_EL0、CNTP_TVAL_EL0和CNTP_CTL_EL0
  5. EVNTI, bit[7:4],从计数器寄存器的0~15位当中定义触发位。
  6. EVNTDIR, bit[3],控制计数器触发位的变化方式
    0——>触发位从0到1,触发事件;
    1——>触发位从1到0,触发事件;
  7. EVNTEN, bit[2],计数器触发事件的使能位
    0——>关闭事件流;
    1——>启动事件流。(设置该位为1)
  8. EL1PCEN, bit[1],控制EL0/1是否可以访问物理定时器寄存器。
    0——>不可访问;
  9. EL1PCTEN, bit[0],控制EL0/1是否可以访问物理计数器。
    0——>不可访问。
  1. 计数器定时器虚拟偏移量寄存器cntvoff_el2
  1. EL2/3可读写
  2. 64位长度
  3. 描述:该寄存器用于保存64位的虚拟偏移量,这属于通用定时器寄存器组。
  1. 处理器特征寄存器id_aa64pfr0_el1
  1. EL1/2/3只读
  2. 64位长度
  3. 描述:所实现的CPU在AArch64下的附加信息
  4. GIC, bits[27:24],GIC系统寄存器接口
    0000——>不支持GIC系统寄存器
    0001——>支持GICv3系统寄存器
  5. AdvSIMD, bits[23:20],ASIMD支持情况
    0000——>实现了ASIMD
    1111——>没实现ASIMD
  6. FP, bits[19:16],浮点支持情况
    0000——>实现浮点单元
    1111——>没有实现浮点单元
  7. EL3, bits[15:12],EL3权限级支持情况
    0000——>没有实现EL3权限级
    0001——>仅仅实现了AArch64的EL3
    0010——>实现了AArch64和AArch32的EL3
  8. EL2, bits[11:8],EL2权限级支持情况,类似EL3。
  9. EL1, bits[11:8],EL1权限级支持情况,类似EL3。
  10. EL0, bits[11:8],EL0权限级支持情况,类似EL3。
  1. 中断控制器系统寄存器使能寄存器ICC_SRE_EL2
  1. EL2/3读写
  2. 32位长度
  3. Enable, bit[3] 控制低权限级对ICC_SRE_EL1的访问
    0——>在非安全态EL1下访问该寄存器ICC_SRE_EL1就会陷入到EL2;
    1——>在非安全态EL1下访问该寄存器ICC_SRE_EL1就会陷入到EL3;
  4. DIB, bit[2], IRQ旁路去能
  5. DFB, bit[1], FIQ旁路去能
  6. SRE, bit[0], 系统寄存器使能
    0——>必须采用内存映射接口,对于ICH_*和ICC_*这两类寄存器不能用MSR/MRS方式访问,除了ICC_SRE寄存器之外。
    1——>对于ICH_*和ICC_*这两类寄存器可以采用MSR/MRS方式访问。
  1. 中断控制器Hyp控制寄存器ICH_HCR_EL2
  1. EL2/3可读写
  2. 32位长度
  3. EOIcount, bits[31:27], 接收到的EOI计数。当接收到一个匹配的EOI,vCPU接口就自动增加该域值。
  4. TALL1, bit[12]和TALL0, bit[11],控制非安全态EL1访问第1/0组ICC_*系统寄存器是否陷入到EL2。
    0——>正常访问,不陷入。
  5. TC, bit[10],控制非安全态EL1访问第1/0组系统寄存器是否陷入到EL2。
    0——>正常访问,不陷入。
    VARE,bit[9], 虚拟ARE。
    0——>客户操作系统不使用亲和路由,希望SGI中断提供源CPU ID号。
    VSEIE,bit[8],虚拟SEI使能。对系统寄存器进行虚拟化访问时,或者对系统寄存器进行物理访问导致SEI条件发生时,维护中断会不会触发一个信号。
    0——>VSEIE维护中断关闭。
    VGrp1D1E, bit[7],虚拟机关闭第一组中断使能功能。从vCPU接口到连接的虚拟机的第一组中断信号被关闭时,使能维护中断信号。
    0——>关闭维护中断关闭。
    VGrp1E1E, bit[6],虚拟机打开第一组中断关闭功能。从vCPU接口到连接的虚拟机的第一组中断信号被使能时,使能维护中断信号。
    0——>关闭维护中断关闭。
    VGrp0DIE, bit[5],这是关于第0组中断,类似VGrp1D1E, bit[7]。
    VGrp0EIE, bit[4],这是关于第0组中断,类似VGrp1E1E, bit[6]。
    NPIE,bit[3],无挂起中断使能。当列表寄存器没有挂起中断时,使能维护中断信号。
    0——>关闭维护中断关闭。
    LRENPIE,bit[2],针对一个EOI请求,vCPU接口并没有对应有效的列表寄存器入口项时,使能维护中断信号。
    0——>关闭维护中断关闭。
    UIE, bit[1],当列表寄存器为空或者只有一个有效入口项时,使能维护中断信号。
    0——>关闭维护中断关闭。
    En,bit[0],使能。vCPU接口的全局使能位。
    0——>vCPU接口操作关闭,即维护中断和虚拟中断全部关闭。
  1. 主ID寄存器 MIDR_EL1
  1. EL1/2/3只读
  2. 32位长度
  3. Implementer, bits[31:24], CPU厂商编码。
  4. Variant, bits[23:20],CPU主版本号
  5. Architecture, bits[19:16],体系结构序号
  6. PartNum, bits[15:4],CPU型号
  7. Revision, bits[3:0],CPU修订号
  1. 虚拟处理器ID寄存器,参见上面的寄存器MIDR_EL1。
  2. 多处理器亲合寄存器MPIDR_EL1
  1. EL0/1/2/3只读
  2. 64位长度
  3. Aff3, bits[39:32] 亲合级3,最高亲合域
  4. U, bit[30],指示是否是单处理器系统
    0——>处理器是属于多处理器系统。
  5. MT, bit[24],指示逻辑处理器的最低级亲合的组合,类似硬件超线。
    0——>最低级亲合的处理器性能具有最大无关性,即不存在硬件超线。
  6. Aff2, bits[23:16]亲合级2
  7. Aff1, bits[15:8]亲合级1
  8. Aff0, bits[7:0]亲合级0,最低级亲合。
  1. 虚拟多处理器亲合寄存器VMPIDR_EL2,参见上面的寄存器MPIDR_EL1。
  2. Hypervisor系统陷入寄存器HSTR_EL2
  1. EL2/3可读写
  2. 32位长度
  3. TTEE, bit[16],控制ThumbEE是否陷入EL2。
    0——>访存ThumbEE配置寄存器没有任何作用。
  4. T, bit[n], for n=0 to 15, 对于每一个T域而言控制协处理器寄存器的访问是否会产生陷入EL2。
    0——>访问CP15协处理器寄存器没有任何作用。
  1. AArch64调试特征寄存器0,id_aa64dfr0_el1
  1. EL1/2/3只读
  2. 64位长度
  3. PMSVer, bits[35:32],PMSVer
    0——>不支持PMSver
  4. CTX_CMPs, bits[31:28], 感知上下文的断点数量
  5. WRP, bits[23:20],观察点数量
  6. BRPs, bits[15:12],断点数量
  7. PMUVer, bits[11:8],性能监控扩展版本。
    0001——>支持PMUv3
  8. TraceVer, bits[7:4],跟踪扩展
    0001——>支持跟踪扩展
  9. DebugVer, bits[3:0],调试体系结构版本
    0110——>支持v8-A调试体系结构
  1. 性能监控器控制寄存器pmcr_el0
  1. EL0可配置是否可访问, EL1/2/3可读写
  2. 32位长度
  3. IMP, bits[31:24],只读,CPU厂商编码,参见MIDR的[31:24]位。
  4. IDCODE, bits[23:16],只读。
  5. N, bits[15:11],只读,事件计数器数量。
  6. LC,bit[6],长周期计数器使能。
    0——>PMCCNTR的第31位发生1到0的翻转时,就表明周期计数器溢出;
    1——>PMCCNTR的第64位发生1到0的翻转时,就表明周期计数器溢出。
  7. DP, bit[5],当事件计数被禁止时,关闭周期计数器。
    1——>当事件计数被禁止时,关闭周期计数器。
  8. X, bit[4],控制CPU自定义的事件流是否做事件输出。
    1——>只要不禁止,就输出事件
  9. D,bit[3],时钟分频
    0——>每个时钟周期PMCCNTR计数增一;
    1——>每64个时钟周期PMCCNTR计数增一。
  10. C, bits[2],只写,周期计数器复位。
    写1——>将PMCCNTR复位为零。
  11. P, bit[1],只写,事件计数器复位。
    写1——>将当前权限级的所有事件计数器复位为零,不包括PMCCNTR。
  12. E, bit[0],使能位
    0——>所有计数器全部关闭
  1. 监控器调试配置寄存器 mdcr_el2
  1. EL2/3可读写
  2. 32位长度
  3. TDRA, bit[11],控制在EL0/1下访问调试ROM地址寄存器是否陷入到EL2
  4. TDOSA,bit[10],控制调用OS相关寄存器访问是否陷入到EL2
  5. TDA, bit[9],控制非安全态下访问调试寄存器时是否陷入到EL2
  6. TDE, bit[8],将来在非安全态EL0/1的软件调试异常陷入到EL2
  7. HPME,bit[7],Hypervisor性能监控器使能。
  8. TPM,bit[6],控制在非安全态EL0/1下访问性能监控器寄存器是否陷入到EL2
  9. TPMCR,bit[5],控制非安全态访问PMCR_EL0是否陷入到EL2
  10. HPMN, bits[4:0],定义非安全态EL0/1可访问的性能监控器的数量。
  1. AArch64内存模式特征寄存器id_aa64mmfr1_el1
  1. EL1/2/3只读
  2. 64位长度
  3. ID_AA64MMFRI_LOR_SHIFT[16…19]
  1. 体系结构特征陷入寄存器cptr_el2
  1. EL2/3读写
  2. 32位长度
  3. TCPAC, bit[31], 控制CPACR或CPACR_EL1的访问是否陷入到EL2
    0——>不陷入
  4. TTA, bit[20],控制跟踪功能的系统寄存器访问是否陷入EL2。
    0——>不陷入
  5. TFP, bit[10],控制与浮点和ASIMD相关寄存器的访问是否陷入EL2
    0——>不陷入。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页