[architecture]-同步异常svc/hyc/smc的产生和返回eret

1、同步异常的产生和返回的指令 : svc/hyc/smc/eret

在这里插入图片描述
这里重点强调一下ERET,以arm64为例,调用该指令后,PSTATE恢复SPSR_ELn的值,PC恢复ELR_ELn的值.

代码示例
在ATF中,exit_el3函数中,当一切寄存器准备好之后,调用ERET指令,恢复PC指针。跳转回Normal-EL1或secure-EL1

func restore_gp_registers_callee_eret
	ldp	x4, x5, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X4]
	ldp	x6, x7, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X6]
	ldp	x8, x9, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X8]
	ldp	x10, x11, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X10]
	ldp	x12, x13, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X12]
	ldp	x14, x15, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X14]
	ldp	x18, x19, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X18]
	ldp	x20, x21, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X20]
	ldp	x22, x23, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X22]
	ldp	x24, x25, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X24]
	ldp	x26, x27, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X26]
	ldp	x28, x29, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X28]
	ldp	 x30, x17, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR]
	msr	sp_el0, x17
	ldp	x16, x17, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X16]
	eret
endfunc	restore_gp_registers_callee_eret

2、armv8新增的ELR寄存器

  • AArch64 : Provides a 64-bit program counter (PC), stack pointers
    (SPs), and exception link registers (ELRs)
  • AArch32 : Provides 13 32-bit general-purpose registers, and a 32-bit
    PC, SP, and link register (LR). The LR is used as both an ELR and a
    procedure link register

也就是说,再aarch64中,ELR做为exception link registers,在异常返回时恢复PC的指针;在aarch32中,使用LR替代ELR

======================================
更多文章详细见博客学习笔记汇总
也欢迎加微信好友进行交流:添加好友点这里

猜你喜欢

转载自blog.csdn.net/weixin_42135087/article/details/107227624