编写mcause时使用了一个代码,指示导致陷阱的原因。CSR mcause的格式和功能与RISC-V标准基本相同,更多详细信息请参阅RISC-V规范特权体系结构规范。但在核处理器核心的CLIC模式中,添加了一些额外的字段来支持CLIC模式中断处理。
mcause寄存器的格式如下表所示:
•ECLIC中断目标
•ECLIC中断源
•ECLIC中断源ID
•ECLIC寄存器
•ECLIC中断使能位
•ECLIC中断挂起位
•ECLIC中断级别或边缘触发属性
•ECLIC中断级别和优先级
•ECLIC中断矢量化或非矢量化处理模式
•ECLIC中断阈值电平
•ECLIC中断仲裁机制
•ECLIC中断响应、抢占、尾链机制
ECLIC中断目标
ECLIC单元通过如图中所示的线路将中断源仲裁到处理器核心(作为中断目标)。
ECLIC中断源
如ECLIC连接(启用ECLIC时)(第53页)所示,ECLIC单元最多可支持4096次中断
来源。ECLIC单元为每个中断源定义了以下概念:
•ID
•IE
•IP
•电平或边缘触发
•级别和优先级
•向量或非向量模式
ECLIC Interrupt Source ID
ECLIC单元为每个中断源分配了一个唯一的ID。例如,如果ECLIC单元的硬件实现真的被配置为支持4096个中断,那么ID应该是0到4095。注:
•在Nuclei处理器内核中,为内核指定的内部中断保留范围从0到18的中断ID。3和7在所有Nuclei处理器内核中都针对软件中断和定时器中断进行了修复。
•用户可以使用大于18的中断源ID来连接外部中断源。
ECLIC Registers
ECLIC是一个内存映射单元。
•ECLIC单元的基本地址,请参阅Nuclei处理器核心的具体数据表。
•寄存器和ECLIC单元中的相应偏移量如ECLIC单元寄存器的地址偏移量所示
注:
•上面的“i”表示中断ID,一个中断i有自己相应的clicintip[i]、clicintie[i]、Clicinttattr[i]和clicinctl[i]寄存器。
•ECLIC寄存器仅支持字节、半字或字大小的对齐访问。
•上面的“R”表示只读,对该只读寄存器的任何写入都将被忽略,而不会产生总线错误。
•ECLIC单元可能未配置为支持4096个中断源。如果索引i不存在于硬件中,则相应的clicintip[i]、clicintie[i]和clicintctl[i]内存位置显示为硬连线为零。
•ECLIC寄存器的地址空间范围为0x0000到0xFFFF。上表中列出的地址以外的地址中的值为常量0。
cliccfg
这个cliccfg寄存器是一个全局配置寄存器。软件可以通过写入此寄存器来设置全局配置。
cliccfg位字段描述了该寄存器的位字段
clicinfo
clicinfo寄存器是一个全局信息寄存器。软件可以通过读取该寄存器来查询全局参数。
clicinfo位字段描述了该寄存器的位字段。
mth
第m个寄存器用于设置目标中断阈值电平。软件可以通过写入该寄存器来设置目标中断阈值级别。第m个位字段描述了该寄存器的位字段。
clicintip[i]
clicintip[i]寄存器是中断源的挂起标志寄存器。clicintip[i]位字段描述了该寄存器的位字段。
clicintie[i]
clicintie[i]寄存器是中断源的启用位寄存器。clicintie[i]位字段描述了这个寄存器的位字段。
clicintrattr[i]
clicintrattr[i]寄存器用于指示中断源的属性。软件可以通过写入此寄存器来设置中断源的属性ref:table clicintrattr[i]_bit_fields描述了这个寄存器的位字段。
clicintctl[i]
clicinctl[i]寄存器是中断源的控制寄存器。软件可以通过以下方式设置级别和优先级
写入此寄存器。级别和优先级字段是根据cliccfg.nlbits的值动态分配的。
ECLIC中断使能位(IE)
如ECLIC单元的逻辑结构(第52页)所示,ECLIC单元为每个中断源分配了一个中断使能位(IE),即字段clicintie[i]。IE的功能如下:
•每个中断源的clicintie[i]寄存器是可读取和可写入的内存映射寄存器。因此,软件可以对其进行编程。
•如果clicintie[i]寄存器编程为0,则表示该中断源被屏蔽。
•如果clicintie[i]寄存器编程为1,则表示该中断已启用。
ECLIC中断挂起位(IP)
如ECLIC单元的逻辑结构(第52页)所示,ECLIC单元为每个中断源分配了一个中断挂起位(IP),即字段clicintip[i].IP,其功能如下:
•如果一个中断源的IP位为1,则表示该中断被触发。中断源的触发条件取决于该中断是电平触发还是边缘触发,如ECLIC中断源电平或边缘触发属性所述。
•中断源的IP位是可读写的。软件写入IP位的行为取决于中断源是电平触发还是边缘触发。
•对于边缘触发的中断源,IP位可以由硬件本身清除。
ECLIC中断源电平或边缘触发属性
如ECLIC单元的逻辑结构(第52页)所示,通过设置clicintrattr[i].trig的值,可以将每个ECLIC中断源设置为电平触发或边缘触发。关键点如下:
•当clicintrattr[i].trig[0]==0时,该中断源被设置为级别触发中断。
–如果中断源设置为电平触发,则中断源的IP位将实时反映中断源的电平。
–如果中断源设置为级别触发,则IP位实时反映中断的级别,因此软件对该IP位的写入被忽略,即软件无法通过写入操作设置或清除IP位。如果软件需要清除中断挂起位,则只能通过清除中断的原始源来完成。
•当clicinttr[i].trig[0]==1且clicinttr[i].trig[1]==0时,此中断源设置为上升沿触发中断:
–如果中断源设置为上升沿触发,当ECLIC检测到中断源的上升沿时,中断源在ECLIC中被触发,并且中断源的IP位被断言。
–如果中断源设置为上升沿触发,则软件的IP位是可写的,这意味着软件可以通过写入操作设置或清除IP位。
–注意:对于上升沿触发的中断,为了提高中断处理的效率,当中断被占用并且核心跳到ISR(中断服务例程)时,ECLIC的硬件会自动清除IP位,而软件不需要清除ISR中的IP位。
•当包含attr[i].trig[0]==1和clicinttattr[i].trig[1]==1时,此中断源将成为触发中断的原因:
–如果中断源被设置为下降沿触发,当ECLIC检测到中断源的下降沿时,中断源在ECLIC中被触发,并且中断源的IP位被断言。
–如果中断源配置为下降沿触发,则IP位可写入软件,这意味着软件可以通过写入操作设置或清除IP位
–注意:对于上升沿触发的中断,为了提高中断处理的效率,当中断被占用并且核心跳到ISR(中断服务例程)时,ECLIC的硬件会自动清除IP位,而软件不需要清除ISR中的IP位。