45 lines
1.9 KiB
ReStructuredText
45 lines
1.9 KiB
ReStructuredText
|
.. SPDX-License-Identifier: GPL-2.0
|
||
|
|
||
|
===================================
|
||
|
Memory copy/set instructions (MOPS)
|
||
|
===================================
|
||
|
|
||
|
A MOPS memory copy/set operation consists of three consecutive CPY* or SET*
|
||
|
instructions: a prologue, main and epilogue (for example: CPYP, CPYM, CPYE).
|
||
|
|
||
|
A main or epilogue instruction can take a MOPS exception for various reasons,
|
||
|
for example when a task is migrated to a CPU with a different MOPS
|
||
|
implementation, or when the instruction's alignment and size requirements are
|
||
|
not met. The software exception handler is then expected to reset the registers
|
||
|
and restart execution from the prologue instruction. Normally this is handled
|
||
|
by the kernel.
|
||
|
|
||
|
For more details refer to "D1.3.5.7 Memory Copy and Memory Set exceptions" in
|
||
|
the Arm Architecture Reference Manual DDI 0487K.a (Arm ARM).
|
||
|
|
||
|
.. _arm64_mops_hyp:
|
||
|
|
||
|
Hypervisor requirements
|
||
|
-----------------------
|
||
|
|
||
|
A hypervisor running a Linux guest must handle all MOPS exceptions from the
|
||
|
guest kernel, as Linux may not be able to handle the exception at all times.
|
||
|
For example, a MOPS exception can be taken when the hypervisor migrates a vCPU
|
||
|
to another physical CPU with a different MOPS implementation.
|
||
|
|
||
|
To do this, the hypervisor must:
|
||
|
|
||
|
- Set HCRX_EL2.MCE2 to 1 so that the exception is taken to the hypervisor.
|
||
|
|
||
|
- Have an exception handler that implements the algorithm from the Arm ARM
|
||
|
rules CNTMJ and MWFQH.
|
||
|
|
||
|
- Set the guest's PSTATE.SS to 0 in the exception handler, to handle a
|
||
|
potential step of the current instruction.
|
||
|
|
||
|
Note: Clearing PSTATE.SS is needed so that a single step exception is taken
|
||
|
on the next instruction (the prologue instruction). Otherwise prologue
|
||
|
would get silently stepped over and the single step exception taken on the
|
||
|
main instruction. Note that if the guest instruction is not being stepped
|
||
|
then clearing PSTATE.SS has no effect.
|