目录
1.前言
kernel版本:5.10
平台:arm64
本专题主要基于《arm64_linux head.S的执行流程》系列文章,前者是基于3.18,本专题针对的是内核5.10。主要分析head.S的执行过程。本文主要记录head.S的el2_setup执行过程。
2. el2_setup
选择栈
msr SPsel, #1
由于当前异常级别可能是EL1也可能是EL2,因此msr SPsel, #1切换到当前异常级别的SP,如果当前为EL1,则切换到SPEL1,如果当前为EL2,则切换到SPEL2
判断当前的异常级别
mrs x0, CurrentEL
cmp x0, #CurrentEL_EL2
b.eq 1f
从CurrentEL获取当前的异常级别,保存到x0中,并判断是否处于EL2, 如果处于EL2则直接跳转到1f设置EL2的端模式
设置EL2端模式
1: mov_q x0, (SCTLR_EL2_RES1 | ENDIAN_SET_EL2)
msr sctlr_el2, x0
设置EL2下为大端存储
设置EL0/EL1的端模式
mov_q x0, (SCTLR_EL1_RES1 | ENDIAN_SET_EL1)
msr sctlr_el1, x0
mov w0, #BOOT_CPU_MODE_EL1
isb
ret
如果处于EL1级别,设置EL0和EL1下为大端存储,将启动时的异常级别EL1保存到w0
VHE支持
#ifdef CONFIG_ARM64_VHE
/*
* Check for VHE being present. For the rest of the EL2 setup,
* x2 being non-zero indicates that we do have VHE, and that the
* kernel is intended to run at EL2.
*/
mrs x2, id_aa64mmfr1_el1
ubfx x2, x2, #ID_AA64MMFR1_VHE_SHIFT, #4
#else
mov x2, xzr
#endif
通过读取id_aa64mmfr1_el1,存入X2, 判断CPU是支持虚拟主机扩展VHE模式,还是传统的分离Hyp模式。
vhe的全称是Virtualization Host Extension support。是armv8.1的新特性,其最终要就是支持type-2的hypervisors 这种扩展让kernel直接跑在el2上,这样可以减少host和guest之间share的寄存器,并减少overhead of virtualization 具体实现如下面的patch:https://lwn.net/Articles/650524/
Hyp configuration
/* Hyp configuration. */
mov_q x0, HCR_HOST_NVHE_FLAGS
cbz x2, set_hcr
mov_q x0, HCR_HOST_VHE_FLAGS
set_hcr:
msr hcr_el2, x0
isb
当寄存器x2,零表示Hyp模式;非零表示VHE模式
HCR_HOST_NVHE_FLAGS宏定义如下:
#define HCR_HOST_NVHE_FLAGS (HCR_RW | HCR_API | HCR_APK | HCR_ATA)
HCR_HOST_NVHE_FLAGS宏定义如下
#define HCR_HOST_NVHE_FLAGS (HCR_RW | HCR_API | HCR_APK | HCR_ATA)
access physical timer and counter
/*
* Allow Non-secure EL1 and EL0 to access physical timer and counter.
* This is not necessary for VHE, since the host kernel runs in EL2,
* and EL0 accesses are configured in the later stage

本文基于《arm64_linux head.S的执行流程》系列文章,针对内核5.10,分析head.S的el2_setup执行过程。包括选择栈、判断异常级别、设置端模式、支持VHE或Hyp模式、启动定时器、GIC设置等工作,最后总结了el2_setup的主要工作内容。
最低0.47元/天 解锁文章
1万+





