SPSR_EL1用于存储,当在发生系统调用、异常、中断时,当前程序的PSTATE(无论是用户态还是内核态)。 2、当发生中断、异常、系统调用时,硬件会自动: 1)把当前程序的pc值放入ELR_EL1中 2)把当前状态PSTATE存入SPSR_EL1中 3)根据发生在内核态还是用户态,中断还是异常,会自动跳转到el1_sync,el1_irq,el0_sync,...
arm64 中断分类 sync exception; irq ; fiq ; serror; arm64 中断处理相关寄存器: SP_EL0,SP_EL1,SPSR_EL1,ELR_EL1,ESR_EL1,VBAR_EL1 硬件处理过程: a:保存PSTATE到SPSR_EL1; b:PSTATE中 DAIF 置位; c:返回地址保存到ELR_EL1; d:异常原因保存ESR_EL1; e:异常处理地址到PC; f:使用SP_EL1...
从SPSR_ELx中恢复PSTATE寄存器的状态 四、异常处理的路由 SCR_EL3 HCR_EL2 栈的选择 我们可以通过SPSel寄存器来配置SP。SPSel寄存器中的SP字段设置为0表示所有的EL中使用SP_EL0作为栈指针寄存器,设置为1表示使用SP_ELx作为栈指针寄存器 ARMV8异常向量表 ARMV8向量表有如下特点 除EL0之后,每个EL都有自己的异...
设置SPSR_EL2寄存器,记录返回(切换后)的异常等级和运行状态,设置模式 M 域为EL1h, 另外需要关闭所有的DAIF。 设置异常返回寄存器ELR_EL2, 让其返回到el1_entry汇编函数里。 执行eret 3. 异常向量表(Exception vectors) 3.1. 异常向量表 除了EL0 之外,每个异常等级都有自己的异常向量表 异常向量表的基地址需要...
(1) PSTATE保存到SPSR_ELx; (2) 返回地址保存到ELR_ELx; (3) PSTATE寄存器里的DAIF域都设置为1,相当于把调试异常、系统错误关闭; (4)更新ESR_ELx寄存器,该寄存器包含同步异常发生的原因; (5)切换到对应的EL, 然后跳转到异常向量表里执行;
1.查看BCM2711手册可知,ARM_LOCAL基地址为0x4c000000或0xff800000 对于IRQ_SOURCE寄存器,可以读取对应中断源状态; TIMER_CNTRL寄存器用来使能中断响应 3.3 EL1的Nonsecure generic timer中断处理流程 初始化 1.初始化timer,设置cntp_ctl_el0寄存器的enable域使能; ...
SP_EL1: EL1 下的栈指针寄存器 SP_EL2: EL2 下的栈指针寄存器 SP_EL3: EL3 下的栈指针寄存器 3.4 SPSR(Saved Program Status Register)备份程序状态寄存器 当我们运行一个异常处理程序时,处理器会把PSTATE寄存器的值暂时保存在备份程序状态寄存器(SPSR)里,当异常处理完成并返回时,再把SPSR的值恢复到PSTATE寄...
SP_EL1: EL1 下的栈指针寄存器 SP_EL2: EL2 下的栈指针寄存器 SP_EL3: EL3 下的栈指针寄存器 3.4 SPSR(Saved Program Status Register)备份程序状态寄存器 当我们运行一个异常处理程序时,处理器会把PSTATE寄存器的值暂时保存在备份程序状态寄存器(SPSR)里,当异常处理完成并返回时,再把SPSR的值恢复到PSTATE寄...
获取异常的PSTATE位置存储在 System registerSPSR_ELx中,其中 <x> 是获取异常的异常级别的编号。异常返回地址存储在 中ELR_ELx,其中 <x> 是异常被处理到的异常级别。 软件可以通过从 AArch64 执行 ERET 指令来启动异常返回。这将根据SPSR_ELx的值配置返回的异常级别,其中 <x> 是返回的级别。SPSR_ELx包含要...
¦*/mrs x16,spsr_el3//spsr_el3保存在x16mrs x17,elr_el3//elr_el3保存在x17mrs x18,scr_el3//scr_el3保存在x18stp x16,x17,[x6,#CTX_EL3STATE_OFFSET+CTX_SPSR_EL3]/x16,x17/保存在栈 str x18,[x6,#CTX_EL3STATE_OFFSET+CTX_SCR_EL3]//x18保存到栈/* Copy SCR_EL3.NS bit to the flag ...