内存复制/设置指令 (MOPS)¶
MOPS 内存复制/设置操作由三个连续的 CPY* 或 SET* 指令组成:一个序言、主体和一个尾声(例如:CPYP、CPYM、CPYE)。
主体或尾声指令可能会由于各种原因而发生 MOPS 异常,例如,当任务迁移到具有不同 MOPS 实现的 CPU 时,或者当指令的对齐和大小要求未得到满足时。 然后,软件异常处理程序应重置寄存器并从序言指令重新开始执行。 通常,这由内核处理。
有关更多详细信息,请参阅 Arm 架构参考手册 DDI 0487K.a (Arm ARM) 中的“D1.3.5.7 内存复制和内存设置异常”。
Hypervisor 要求¶
运行 Linux 客户机的 Hypervisor 必须处理来自客户机内核的所有 MOPS 异常,因为 Linux 可能无法随时处理该异常。 例如,当 Hypervisor 将 vCPU 迁移到具有不同 MOPS 实现的另一个物理 CPU 时,可能会发生 MOPS 异常。
为此,Hypervisor 必须
将 HCRX_EL2.MCE2 设置为 1,以便将异常传递给 Hypervisor。
有一个异常处理程序,该处理程序实现来自 Arm ARM 规则 CNTMJ 和 MWFQH 的算法。
在异常处理程序中将客户机的 PSTATE.SS 设置为 0,以处理当前指令的潜在步骤。
注意:需要清除 PSTATE.SS,以便在下一条指令(序言指令)上进行单步异常。 否则,序言将被静默跳过,并在主指令上发生单步异常。 请注意,如果未对客户机指令进行单步调试,则清除 PSTATE.SS 无效。