VMPIDR_EL2 的特性:
**用途**
保存虚拟化多处理器 ID 的值。这是 EL1 读取 MPIDR_EL1 时返回的值。
**配置**
AArch64 系统寄存器 VMPIDR_EL2 的位 [31:0] 在架构上映射到 AArch32 系统寄存器 VMPIDR[31:0]。
如果未实现 EL2,则读取该寄存器返回 MPIDR_EL1 的值,并且忽略对该寄存器的写入。
如果在当前安全状态下 EL2 未被使能,则该寄存器无效。
该寄存器中的 RW 字段复位为架构上未知的值。
**属性**
VMPIDR_EL2 是一个 64 位寄存器。
**字段描述**
VMPIDR_EL2 的位分配如下:
63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32
| RES0 | Aff3 |
| RES1 | U | RES0 | MT | Aff2 | Aff1 | Aff0 |
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
**位 [63:40]**
保留,RES0。
**Aff3,位 [39:32]**
亲和性等级 3。更多信息请参见 Aff0 的描述。
Aff3 在 AArch32 状态下不支持。
该字段复位为架构上未知的值。
**位 [31]**
保留,RES1。
**U,位 [30]**
指示单处理器系统,以区别于多处理器系统中的 PE 0。该位的可能值为:
| U | 含义 |
|----|------|
| 0b0 | 处理器是多处理器系统的一部分。 |
| 0b1 | 处理器是单处理器系统的一部分。 |
该字段复位为架构上未知的值。
**位 [29:25]**
保留,RES0。
**MT,位 [24]**
指示最低亲和性等级是否由使用多线程类型方法实现的逻辑 PE 组成。关于亲和性等级的更多信息,请参见 Aff0 的描述。该位的可能值为:
| MT | 含义 |
|----|------|
| 0b0 | 最低亲和性等级的 PE 的性能在很大程度上是独立的。 |
| 0b1 | 最低亲和性等级的 PE 的性能是非常相互依赖的。 |
该字段复位为架构上未知的值。
**Aff2,位 [23:16]**
亲和性等级 2。更多信息请参见 Aff0 的描述。
该字段复位为架构上未知的值。
**Aff1,位 [15:8]**
亲和性等级 1。更多信息请参见 Aff0 的描述。
该字段复位为架构上未知的值。
**Aff0,位 [7:0]**
亲和性等级 0。这是对确定 PE 行为最重要的亲和性等级。更高的亲和性等级在确定 PE 行为时的重要性逐渐降低。每个 PE 的 MPIDR.{Aff2, Aff1, Aff0} 或 MPIDR_EL1.{Aff3, Aff2, Aff1, Aff0} 字段集的分配值在整个系统中必须是唯一的。
该字段复位为架构上未知的值。
**访问 VMPIDR_EL2**
对此寄存器的访问使用以下编码:
MRS <Xt>, VMPIDR_EL2
| op0 | op1 | CRn | CRm | op2 |
|-----|-----|-----|-----|-----|
| 0b11 | 0b100 | 0b0000 | 0b0000 | 0b101 |
如果 PSTATE.EL == EL0,则
未定义;
否则如果 PSTATE.EL == EL1,则
如果 EL2Enabled() && HCR_EL2.<NV2,NV> == '11',则
返回 NVMem[0x050];
否则如果 EL2Enabled() && HCR_EL2.NV == '1',则
AArch64.SystemAccessTrap(EL2, 0x18);
否则
未定义;
否则如果 PSTATE.EL == EL2,则
返回 VMPIDR_EL2;
否则如果 PSTATE.EL == EL3,则
如果 !HaveEL(EL2),则
返回 MPIDR_EL1;
否则
返回 VMPIDR_EL2;
MSR VMPIDR_EL2, <Xt>
| op0 | op1 | CRn | CRm | op2 |
|-----|-----|-----|-----|-----|
| 0b11 | 0b100 | 0b0000 | 0b0000 | 0b101 |
如果 PSTATE.EL == EL0,则
未定义;
否则如果 PSTATE.EL == EL1,则
如果 EL2Enabled() && HCR_EL2.<NV2,NV> == '11',则
NVMem[0x050] = X[t];
否则如果 EL2Enabled() && HCR_EL2.NV == '1',则
AArch64.SystemAccessTrap(EL2, 0x18);
否则
未定义;
否则如果 PSTATE.EL == EL2,则
VMPIDR_EL2 = X[t];
否则如果 PSTATE.EL == EL3,则
如果 !HaveEL(EL2),则
// 无操作
否则
VMPIDR_EL2 = X[t];
MRS <Xt>, MPIDR_EL1
| op0 | op1 | CRn | CRm | op2 |
|-----|-----|-----|-----|-----|
| 0b11 | 0b000 | 0b0000 | 0b0000 | 0b101 |
如果 PSTATE.EL == EL0,则
如果 IsFeatureImplemented("ARMv8.4-IDST"),则
如果 EL2Enabled() && !ELUsingAArch32(EL2) && HCR_EL2.TGE == '1',则
AArch64.SystemAccessTrap(EL2, 0x18);
否则
AArch64.SystemAccessTrap(EL1, 0x18);
否则
未定义;
否则如果 PSTATE.EL == EL1,则
如果 EL2Enabled() && !ELUsingAArch32(EL2) && (!HaveEL(EL3) || SCR_EL3.FGTEn == '1') && HFGRTR_EL2.MPIDR_EL1 == '1',则
AArch64.SystemAccessTrap(EL2, 0x18);
否则如果 EL2Enabled() && !ELUsingAArch32(EL2),则
返回 VMPIDR_EL2;
否则
返回 MPIDR_EL1;
否则如果 PSTATE.EL == EL2,则
返回 MPIDR_EL1;
否则如果 PSTATE.EL == EL3,则
返回 MPIDR_EL1;
MRC{<c>}{<q>} <coproc>, {#}<opc1>, <Rt>, <CRn>, <CRm>{, {#}<opc2>}
| coproc | opc1 | CRn | CRm | opc2 |
|--------|------|-----|-----|------|
| 0b1111 | 0b000 | 0b0000 | 0b0000 | 0b101 |
如果 PSTATE.EL == EL0,则
未定义;
否则如果 PSTATE.EL == EL1,则
如果 EL2Enabled() && !ELUsingAArch32(EL2) && HSTR_EL2.T0 == '1',则
AArch64.AArch32SystemAccessTrap(EL2, 0x03);
否则如果 EL2Enabled() && ELUsingAArch32(EL2) && HSTR.T0 == '1',则
AArch32.TakeHypTrapException(0x03);
否则如果 EL2Enabled() && !ELUsingAArch32(EL2),则
返回 VMPIDR_EL2<31:0>;
否则如果 EL2Enabled() && ELUsingAArch32(EL2),则
返回 VMPIDR<31:0>;
否则
返回 MPIDR<31:0>;
否则如果 PSTATE.EL == EL2,则
返回 MPIDR<31:0>;
否则如果 PSTATE.EL == EL3,则
返回 MPIDR<31:0>;