文章目录
- GICD_CTRL
- GICD_CTLR 寄存器结构
- RWP(Register Write Pending)
- E1NWF(Enable 1 of N Wakeup Functionality)
- DS(Disable Security)
- 亲和性路由(Affinity Routing)
- ARE_NS
- ARE_S
- 中断组使能
- EnableGrp1S
- EnableGrp1NS)
- EnableGrp0
GICD_CTRL
GICv3(通用中断控制器版本3)是ARM架构下用于管理和处理中断的关键组件之一。它包含了多个寄存器,用于配置和控制中断的行为。其中,GICD_CTLR
(Distributor Control Register)是一个非常重要的寄存器,它用于启用中断和亲和性路由设置。
下面是对GICD_CTLR
寄存器中一些关键位的详细介绍:
GICD_CTLR 寄存器结构
GICD_CTLR
的格式取决于访问的安全状态以及系统支持的安全状态数量,这由GICD_CTLR.DS
指定。当访问为安全状态,在支持两种安全状态的系统中,其结构如下:
RWP(Register Write Pending)
仅读。指示是否有寄存器写入操作正在进行。
0b0
:没有寄存器写入操作正在进行。之前对受影响寄存器字段的写入操作的效果对GIC架构的所有逻辑组件(包括CPU接口)都是可见的。0b1
:寄存器写入操作正在进行。之前对受影响寄存器字段的写入操作的效果不能保证对所有GIC架构的逻辑组件(包括CPU接口)都是可见的,因为更改的效果仍在传播中。
RWP
字段跟踪以下内容的写操作:
GICD_CTLR[2:0]
(组启用位,仅限从1
到0
的转变)GICD_CTLR[7:4]
(ARE
位,E1NWF
位和DS
位)GICD_ICENABLER<n>
E1NWF(Enable 1 of N Wakeup Functionality)
如果硬件实现该bit,它将有以下行为:
0b0
:处于睡眠状态的PE(处理元素)不能被选为 1 of N中断。0b1
:处于睡眠状态的PE可以根据实现定义的控制被选为 1 of N中断。
DS(Disable Security)
禁用安全性。
0b0
:不允许非安全访问访问和修改控制组0中断的寄存器。0b1
:允许非安全访问访问和修改控制组0中断的寄存器。
如果当GICD_CTLR.ARE_S == 1
时将DS从0写为1,则对于单一安全状态的GICD_CTLR.ARE
是RAO/WI。
如果分配器只支持单一安全状态,此位是RAO/WI。
如果分配器支持两种安全状态,此位是否可编程或实现为RAZ/WI是由实现定义的。设置此字段为1时,所有对GICD_CTLR
的访问都访问单一安全状态视图,且所有位都是可访问的。
设置为1后,只能通过硬件重置清除此字段。
如果在以下任何情况为真时将此位从0写为1,则行为是不可预测的:
GICD_CTLR.ENABLEGRP0==1
。GICD_CTLR.ENABLEGRP1S==1
。GICD_CTLR.ENABLEGRP1NS==1
。- 一个或多个INTID处于激活或激活和挂起状态。
亲和性路由(Affinity Routing)
亲和性路由(Affinity Routing)允许中断被路由到特定的处理器上,从而提高系统的性能和效率。ARE_NS
和ARE_S
位分别控制非安全和安全状态下的亲和性路由功能。在修改这些设置之前,需要确保系统处于正确的状态,否则可能会导致不可预测的行为。
以下是对这两个位的详细介绍:
ARE_NS
- 0b0:非安全状态下禁用亲和性路由。
- 0b1:非安全状态下启用亲和性路由。
当安全状态下的亲和性路由被启用时,这个字段是只读/写入忽略(RAO/WI)。从0变为1的ARE_NS
设置变化是不可预测的,除非GICD_CTLR.ENABLEGRP1_NON-SECURE == 0
。从1变为0的ARE_NS
设置变化也是不可预测的。如果没有实现针对非安全状态的GICv2向后兼容性,那么这个字段是只读/写入忽略(RAO/WI)。
ARE_S
- 0b0:安全状态下禁用亲和性路由。
- 0b1:安全状态下启用亲和性路由。
从0变为1的ARE_S
设置变化是不可预测的,除非全部满足以下条件:
GICD_CTLR.ENABLEGRP0 == 0
。GICD_CTLR.ENABLEGRP1S == 0
。GICD_CTLR.ENABLEGRP1NS == 0
。
从1变为0的ARE_S
设置变化也是不可预测的。
中断组使能
在GICD_CTLR
(Distributor Control Register)寄存器中,有几个位专门用来控制不同安全状态下的中断组的使能状态。这些位包括EnableGrp1S
、EnableGrp1NS
和EnableGrp0
,它们分别控制安全组1、非安全组1和组0中断的使能状态。
以下是这些控制位的详细介绍:
EnableGrp1S
Enable Secure Group 1 Interrupts
- 0b0:安全组1中断被禁用。
- 0b1:安全组1中断被启用。
这个位允许控制器启用或禁用安全组1的中断。
当设置为1时,安全组1中的中断可以被发送到处理器;
当设置为0时,这些中断被阻止。
EnableGrp1NS)
Enable Non-Secure Group 1 Interrupts
- 0b0:非安全组1中断被禁用。
- 0b1:非安全组1中断被启用。
这个位的功能与EnableGrp1S
相似,但它专门控制非安全状态下的组1中断。启用这些中断允许非安全环境的中断传递给处理器。
EnableGrp0
Enable Group 0 Interrupts
- 0b0:组0中断被禁用。
- 0b1:组0中断被启用。
组0中断通常被用于处理安全相关的中断。通过设置这个位,可以控制这类中断是否能够被分发和处理。