慢慢欣赏arm64内核启动3 primary_entry之el2_setup代码第一部分

代码分析

分析完el2_setup的注释和代码段的位置之后,我们正式开始学习el2_setup的实现

SYM_FUNC_START(el2_setup)
	msr	SPsel, #1			// We want to use SP_EL{1,2}
	mrs	x0, CurrentEL
	cmp	x0, #CurrentEL_EL2
	b.eq	1f
	mov_q	x0, (SCTLR_EL1_RES1 | ENDIAN_SET_EL1)
	msr	sctlr_el1, x0
	mov	w0, #BOOT_CPU_MODE_EL1		// This cpu booted in EL1
	isb
	ret

1:	mov_q	x0, (SCTLR_EL2_RES1 | ENDIAN_SET_EL2)
	msr	sctlr_el2, x0

异常等级

第二行需要参考ARM64的芯片手册,SPsel的值为0表示在任何异常等级下,都选择SP_EL0作为堆栈寄存器;
值为1表示选择异常等级对应的SP_ELX作为堆栈寄存器,X表示当前的异常等级。举例如下:

如果在 EL2 执行 msr SPsel, #1,则后续的 SP 会指向 SP_EL2(而不是 SP_EL0)。
如果在 EL1 执行 msr SPsel, #1,则 SP 会指向 SP_EL1(而不是 SP_EL0)。


第三行表示将当前的异常等级存入到x0寄存器。

CurrentEL_EL2 是个宏定义,定义如下

/* Current Exception Level values, as contained in CurrentEL */
#define CurrentEL_EL1		(1 << 2)
#define CurrentEL_EL2		(2 << 2)

第四行表示将当前的异常等级与EL2比较。
第五行表示如果当前的等级就是EL2则跳转到标签为1的代码去执行;
否则如果不相等,也就是说,如果当前的

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值