内存拷贝/设置指令 (MOPS)

MOPS 内存拷贝/设置操作由三个连续的 CPY* 或 SET* 指令组成:序言(prologue)、主体(main)和尾声(epilogue)(例如:CPYP、CPYM、CPYE)。

主体或尾声指令可能会由于各种原因引发 MOPS 异常,例如当任务迁移到具有不同 MOPS 实现的 CPU 上时,或者指令的对齐和大小要求未满足时。软件异常处理程序随后需要重置寄存器并从序言指令处重新开始执行。通常,这由内核处理。

更多详细信息,请参阅 Arm 架构参考手册 DDI 0487K.a (Arm ARM) 中的“D1.3.5.7 Memory Copy and Memory Set exceptions”。

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 不会产生任何影响。