SPSR_EL1用于存储,当在发生系统调用、异常、中断时,当前程序的PSTATE(无论是用户态还是内核态)。 2、当发生中断、异常、系统调用时,硬件会自动: 1)把当前程序的pc值放入ELR_EL1中 2)把当前状态PSTATE存入SPSR_EL1中 3)根据发生在内核态还是用户态,中断还是异常,会自动跳转到el1_sync,el1_irq,el0_sync,...
ERET指令用于异常返回,返回地址和处理器状态是从当前EL(exception level)下的 ELR 和 SPSR 寄存器中恢复的。即 ELR 寄存器中的值就是BL1最后跳转的目的地址,SPSR寄存器的值就是跳转之后处理器的状态。 (1) 处理异常的流程 ARMv8的四个异常级别只能通过异常获取/返回的方式在异常等级之间跳转。 a. 将 PSTATE 寄...
共有32 位宽的四个堆栈指针寄存器 SP\_EL0、SP\_EL1、SP\_EL2、SP\_EL3(每个用于不同的执行级别)。除此之外,还有三个异常链接寄存器ELR\_EL1、ELR\_EL2、ELR\_EL3,三个保存的程序状态寄存器SPSR\_EL1、SPSR\_EL2、SPSR\_EL3,以及一个程序计数器寄存器(PC)。 Arm 还使用 PC 相对寻址 - 其中它指定...
Armv8体系结构支持4个异常等级,每个等级都有一个专门的SP寄存器SP_ELn. SP_EL0: EL0 下的栈指针寄存器 SP_EL1: EL1 下的栈指针寄存器 SP_EL2: EL2 下的栈指针寄存器 SP_EL3: EL3 下的栈指针寄存器 3.4 SPSR(Saved Program Status Register)备份程序状态寄存器 当我们运行一个异常处理程序时,处理器会把P...
endm .macro kernel_exit /* 从pt_regs->pc中恢复elr_el1, 从pt_regs->pstate中恢复spsr_el1 */ ldp x21, x22, [sp, #S_PC] // load ELR, SPSR msr elr_el1, x21 // set up the return data msr spsr_el1, x22 ldp x0, x1, [sp, #16 * 0] ldp x2, x3, [sp, #16 * 1] ...
(1) PSTATE保存到SPSR_ELx; (2) 返回地址保存到ELR_ELx; (3) PSTATE寄存器里的DAIF域都设置为1,相当于把调试异常、系统错误关闭; (4)更新ESR_ELx寄存器,该寄存器包含同步异常发生的原因; (5)切换到对应的EL, 然后跳转到异常向量表里执行;
1.初始化timer,设置cntp_ctl_el0寄存器的enable域使能; 2.给timer的TimeValue一个初值,设置cntp_tval_el0寄存器; 3.打开树莓派b4中断控制器中和timer相关的中断,设置TIMER_CNTRL0寄存器的CNT_PNS_IRQ为1; 4.打开PSTATE寄存器中的IRQ中断总开关; 异常中断处理 ...
SP_EL1: EL1 下的栈指针寄存器 SP_EL2: EL2 下的栈指针寄存器 SP_EL3: EL3 下的栈指针寄存器 3.4 SPSR(Saved Program Status Register)备份程序状态寄存器 当我们运行一个异常处理程序时,处理器会把PSTATE寄存器的值暂时保存在备份程序状态寄存器(SPSR)里,当异常处理完成并返回时,再把SPSR的值恢复到PSTATE寄...
SPSR备份程序状态寄存器,当我们运行一个异常处理程序时,处理器会把PSTATE寄存器的值暂时保存在备份程序状态寄存器(SPSR)里,当异常处理完成并返回时,再把SPSR的值恢复到PSTATE寄存器。 ELR异常链接寄存器,用于存放异常返回地址。 2.4 AArch64异常等级 ARMv8-A架构定义了一组异常级别(Exception Level,EL),从EL0到EL3,...
SPSR备份程序状态寄存器,当我们运行一个异常处理程序时,处理器会把PSTATE寄存器的值暂时保存在备份程序状态寄存器(SPSR)里,当异常处理完成并返回时,再把SPSR的值恢复到PSTATE寄存器。 ELR异常链接寄存器,用于存放异常返回地址。 2.4 AArch64异常等级 ARMv8-A架构定义了一组异常级别(Exception Level,EL),从EL0到EL3,...