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