記憶體複製/設定指令 (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 無效。