// 加载函数switch_to_el1_from_el2的地址,设置从EL3返回时的地址,这样调用eret即可跳转至此函数继续执行 adr x3, switch_to_el1_from_el2 msr elr_el3, x3 eret switch_to_el1_from_el2: /* 使能el1与el0对el物理计数器reg,定时器reg的访问 */ mrs x0, cnthctl_el2 orr x0, x0, #3 msr ...
1: armv8_switch_to_el2_m x4, x5, x6 ENDPROC(armv8_switch_to_el2) ENTRY(armv8_switch_to_el1) switch_el x6, 0f, 1f, 0f 0: /* x4 is kernel entry point. When running in EL1 * now, jump to the address saved in x4. */ br x4 1: armv8_switch_to_el1_m x4, x5, x6...
(3)同样的使用switch_el来跳转到对应级别的路径上去执行,在进行系统寄存器设置时,因为在这之前已经由SYS_RESET_SCTRL或者board自己保证处理器处于小端,mmu关,i-cache和d-cache处于关闭状态了,所以这里直接进行对应级别系统寄存器设置,首先是跳转到对应表设置对应级别的异常向量表。接着会有如下三种情况: 当处于EL3时,...
有些系统寄存器经常访问,如果每次都trap会影响性能,所以arm提供了相应的virtual寄存器,比如VPIDR_EL2,是MIDR_EL1的virtual版;VMPIDR_EL2是VPIDR_EL1的virtual版。 HFGRTR_EL2, Hypervisor Fine-Grained Read Trap Register,这是一个非常重要的寄存器,负责控制guest在读系统寄存器的时候的行为,是否trap。 ARM DDI ...
其次进程切换时整个切换流程都位于os内核,而由于guest os与hypervisor运行在不同的异常等级,因此其切换流程还需要伴随着异常等级的改变。即进程切换前后都位于os内核所运行的异常等级下,如下图host os运行在EL2,则task 1和task 2在切换前后都位于EL2中。而guest os切换时,则其运行异常等级从EL2变为了EL1 ...
位置mrsx2, CurrentEL// 读取当前异常级别 在此寄存器中 我们需要的是[3:2]andx2, x2,#0b1100cmpx2,#0b1000beqswitch_to_el1_from_el2// branch on equalbgtswitch_to_el2_from_el3bhalt// 这种是未定义情况 让cpu halt住方便调试halt:wfe// wait for event 休眠CPUbhaltswitch_to_el2_from_...
.align7,INV_INSN el0_sync_a64:restore_mapping mrs x2,esr_el1 mrs x3,sp_el0 lsr x2,x2,#ESR_EC_SHIFT cmp x2,#ESR_EC_AARCH64_SVC b.eq el0_svc//---b.cond的应用 b el0_sync_abort check_vector_size el0_sync_a64 (cbz、cbnz的...
登录后复制switch(irqnr) { 登录后复制casePENDING_G1S_INTID: 登录后复制returnINTR_TYPE_S_EL1; 登录后复制casePENDING_G1NS_INTID: 登录后复制returnINTR_TYPE_NS; 登录后复制caseGIC_SPURIOUS_INTERRUPT: 登录后复制returnINTR_TYPE_INVAL; 登录后复制default: ...
.align7,INV_INSN el0_sync_a64:restore_mapping mrs x2,esr_el1 mrs x3,sp_el0 lsr x2,x2,#ESR_EC_SHIFT cmp x2,#ESR_EC_AARCH64_SVC b.eq el0_svc//---b.cond的应用 b el0_sync_abort check_vector_size el0_sync_a64 (cbz、cbnz的...
Linux内核中,异常处理主要由两个文件完毕,entry.S和traps.c。当然另一些其他异常处理函数分布于fault.c, memory.c等等。entry.S包括异常的入口、进入异常处理C函数前的压栈、退出C函数前的出栈、一些fork函数相关的处理代码(暂不分析)、任务切换汇编处理过程(cpu_switch_to函数,暂不分析)。