GIC/ITS代码分析(5)exception处理流程

发布于:2022-10-28 ⋅ 阅读:(382) ⋅ 点赞:(0)

        中断为异步exception。在介绍中断处理之前,介绍exception通用处理过程。

1 exception分类

        ARM架构异常分为同步异常和异步异常。

        同步异常是指尝试执行指令时生成的异常,且返回的地址提供造成异常的详细信息。异步异常是指并不是由执行指令产生,且返回的地址不能提供造成异常的详细信息。

        通常异步异常源有IRQ,FIQ和SError。

        同步异常源有:

  1. 来自MMU的指令abort。比如,通过读取标记为Execute Never的内存位置的指令
  2. 来自MMU的数据abort。比如,权限失败或对齐检查
  3. SP和PC对齐检查
  4. Synchronous外部abort。比如,当读取转换表时产生abort
  5. 未分配指令
  6. 调试异常

2 exception处理

当一个异常产生时:

(1)处理器自动执行一些操作如下:

- 保存当前处理器状态PSTATE到SPSR_EL1中

- 将返回地址PC保存到ELR_EL1中

其中若是系统调用时,返回地址为系统调用指令后面的指令

若是除了系统调用外的其他同步异常,返回地址为生成异常的指令

若为异步异常,返回地址为没有执行的下一条指令

- 将DAIF异常屏蔽

- 若是同步异常,生成异常的原因存放在ESR_EL1,生成异常的地址存放在FAR_EL1

- 若当前处于EL0,陷入到EL1

(2)kernel_entry elx保存通用寄存器到进程栈下

(3)跳转至异常向量表中对应的entry,执行每个向量entry对应的handler

(4)执行完向量entry对应的handler,若要返回用户态,调用ret_to_user;若要返回内核态,调用ret_to_kernel

- 对于ret_to_user,恢复用户态栈指针sp_el0,恢复通用寄存器,eret返回

- 对于ret_to_kernel,恢复通用寄存器,eret返回

(5)当执行完ERET,处理器自动将保存的处理器状态SPSR_EL1返回到PSTATE,将ELR_EL1保存到PC中