当前位置: 首页 > article >正文

AIA - APLIC之三(附APLIC处理流程图)

本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。

1 APLIC复位

APLIC复位后,其所有状态都变得有效且一致,但以下情况除外:

  • 每个中断域的domaincfg寄存器(spec第 4.5.1 节);
  • 可能是machine-level interrupt domain的MSI地址配置寄存器(spec第4.5.3 和4.5.4 节);
  • 每个中断域的genmsi寄存器的Busy位(如果存在)(spec第 4.5.15 节)。

以上这几种情况,在APLIC复位后,需要根据这些寄存器的具体定义来确定。

2 对中断pending位的精确影响

尝试通过写入中断域控制区域中的寄存器,来设置或清除中断源的pending位可能会成功,也可能不会成功,具体取决于相应的中断源模式、中断域的中断投递模式,以及中断源校正输入的状态值(spec第4.5.2节中定义)。
下面列举了,针对给定的中断源源模式,设置或清除pending位时的所有情况。

如果源模式为Detached

  • 仅通过对setip或setipnum寄存器,执行相关写入操作,将pending位设置为1。
  • 当在APLIC处请求中断或由MSI转发中断,或者通过对in_clrip寄存器或clripnum进行相关写入时,将清除pending位。

如果源模式为Edge1Edge0

  • 通过校正输入值,从低到高的跳变,或者通过对setip或setipnum寄存器进行相应写入,将pending位设置为1。
  • 当在APLIC处请求中断或由MSI转发中断,或者通过对in_clrip寄存器或clripnum进行相关写入时,将清除pending位。

如果源模式为Level1Level0,并且中断域配置为直接投递模式(domaincfg.DM = 0):

  • 只要校正后的输入值为高电平,pending位就会设置为1。无法通过写入setip或setipnum寄存器来设置pending位。
  • 只要校正后的输入值为低电平,pending位就会被清除。pending位不能通过 APLIC 处的中断声明来清除,也不能通过写入in_clrip寄存器或clripnum来清除。

如果源模式为Level1Level0,并且中断域配置为MSI投递模式(domaincfg.DM = 1):

  • 通过校正输入值中从低到高的跳变,将pending位设置为1。当经校正的输入值为1时,也可以通过setip或setipnum寄存器的相应写入来设置pending位。
  • 只要校正后的输入值为低电平,或者通过对in_clrip寄存器或clripnum进行相关写入,就会清除pending位。

当中断域处于直接投递模式时,电平触发的中断源的pending位,始终只是整流输入值的副本。即使在MSI传送模式下,当校正输入值为0时,电平触发的中断源的pending位,也不会被设置 (= 1)。

除上述规则外,如spec第4.5.2节中所述,对sourcecfg寄存器的写入,还可导致源的中断挂起位设置为1。

3 直接传递模式

当中断域处于直接投递模式 (domaincfg.DM = 0) 时,中断通过每个hart的唯一信号(通常是专用中断线)从APLIC传递到hart。
在这种情况下,中断域的内存映射控制区域,在末尾包含一组中断传送控制 (IDC) 结构,每个hart都会对应一个IDC结构。
第一个IDC结构,是该中断域内索引为0的hart;第二个是该中断域索引为1的hart;依次类推。

3.1 IDC结构

每个IDC结构都是32字节(对齐到 32 字节地址边界),并具有以下定义的寄存器:
在这里插入图片描述
如果IDC结构,针对的特定hart,对于中断域中的任何实际hart都无效,则这些寄存器,可以选择全部为只读零。否则,寄存器将在下面单独描述。

特定的APLIC,可能被构建为支持最大数量的hartÿ


http://www.kler.cn/a/468302.html

相关文章:

  • 【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
  • SQL编程语言
  • [python3]Excel解析库-openpyxl
  • linux-centos-安装miniconda3
  • 深入理解Java面向对象:类与对象、匿名对象、成员变量与局部变量
  • 数据结构:树
  • [读书日志]8051软核处理器设计实战(基于FPGA)第四篇:verilog语法特性
  • 任务执行模式全解析:并发、并行、串行与同步、异步的对比
  • Sentinel-5P遥感数据下载及预处理教程【20250105】
  • 每天学一点强化学习(二)
  • 树莓派 Pico RP2040 多核心运行模式 多核编程
  • 圆周率π为何是无穷无尽的
  • Rust中的Option枚举快速入门
  • LookingGlass使用
  • [react+ts] useRef获取自定义组件dom或方法声明
  • Windows 11 上配置VSCode 使用 Git 和 SSH 完整步骤
  • Go语言的 的反射(Reflection)核心知识
  • springboot远程链接Hadoop
  • launch.json传递True值
  • CSS3 框大小
  • Python基于wordcloud库绘制词云图
  • 基于SpringBoot的旅游网站的设计与实现(源码+数据库+文档)
  • 深入探索:将 Elasticsearch 与 Ruby 工具结合使用
  • Postgresql源码(139)vim直接修改postgresql表文件的简单实例
  • 字玩FontPlayer开发笔记3 性能优化 大量canvas渲染卡顿问题
  • CSS——6. 导入样式