分析代码
/* Populate ID registers. */
mrs x0, midr_el1
mrs x1, mpidr_el1
msr vpidr_el2, x0
msr vmpidr_el2, x1
#ifdef CONFIG_COMPAT
msr hstr_el2, xzr // Disable CP15 traps to EL2
#endif
ID寄存器
第一行注释的含义是:填充 ID 寄存器簇。
第二行的含义是把 midr_el1 寄存器的内容填充到x0寄存器里。其中,midr_el1 的含义如下:
MIDR_EL1, Main ID Register
Provides identification information for the PE, including an implementer code for the device and a device ID number.
提供PE的身份鉴别信息,包括设备的实现者代码和设备ID号。
该寄存器有很多域,有的域提供了ARM的厂家编码信息,有的域提供了ARM的版本信息,细节详见芯片手册。
第三行的含义是把 mpidr_el1 寄存器的内容填充到x1寄存器里,其中,mpidr_el1的含义如下:
MPIDR_EL1, Multiprocessor Affinity Register
In a multiprocessor system, provides an additional PE identification mechanism for scheduling purposes.
该寄存器是一个多核亲和性寄存器,为调度目的提供了额外的PE识别机制。
第四行的含义是将x0寄存器的值存放到 vpidr 寄存器里面,根据芯片手册的描述,
Holds the value of the Virtualization Processor ID. This is the value returned by EL1 reads of MIDR_EL1.
vpidr 寄存器是虚拟化芯片ID寄存器,与 midr_el1具有相同的字段分布
将x0的内容赋值到 vpidr_el2 寄存器;
第5行的含义是将x1的值赋值到 vmpidr_el2,根据芯片手册的描述
VMPIDR_EL2, Virtualization Multiprocessor ID Register
Holds the value of the Virtualization Multiprocessor ID. This is the value returned by EL1 reads of MPIDR_EL1.
该寄存器是虚拟化多核ID寄存器,该值是MPIDR_EL1的返回值。
CONFIG_COMPAT
第7行,CONFIG_COMPAT 在内核配置选项的含义如下:
│ Symbol: COMPAT [=y] │
│ Type : bool │
│ Defined at arch/arm64/Kconfig:1274 │
│ Prompt: Kernel support for 32-bit EL
CONFIG_COMPAT 是一个内核配置选项,用于控制内核是否支持32位应用程序在64位系统上运行。
当这个选项被启用时(通常在内核配置文件中设置为y或m),内核将包含必要的代码和机制来支持32位应用程序的兼容执行。
HSTR_EL2
第8行,根据芯片手册, HSTR_EL2 的描述如下:
HSTR_EL2, Hypervisor System Trap Register
Controls trapping to EL2 of EL1 or lower AArch32 accesses to the System register in the coproc == 0b1111 encoding space,
by the CRn value used to access the register using MCR or MRC instruction.
When the register is accessible using an MCRR or MRRC instruction,
this is the CRm value used to access the register.
含义如下:
HSTR_EL2 是ARM架构中的一个寄存器,全称是 Hypervisor System Trap Register EL2,属于异常级别2(EL2)的寄存器。
这个寄存器主要用于虚拟化环境中,特别是在hypervisor(宿主操作系统)层面,用于控制和管理虚拟机(guest OS)的异常和中断处理。
在ARM架构的虚拟化环境中,EL2是hypervisor运行的异常级别,而虚拟机操作系统(guest OS)则在更低的异常级别EL1运行。
HSTR_EL2 寄存器的作用是让hypervisor能够配置和控制哪些异常和中断应该被转交给虚拟机操作系统处理,哪些应该被hypervisor自己截获并处理。
在32位兼容模式下,希望访问CP15不会陷入到EL2,所以就将HSTR_EL2清零。
参考
参考1
arch/arm64/kernel/head.S文件——el2_setup函数分析