ARM defines ACTLR_EL[321]
as implementation defined.
Apple adds an IMPDEF ACTLR_EL12
as s3_6_c15_c14_6
and effectively implements VHE semantics. This does not seem to violate the architecture, since the register contents are IMPDEF anyway so nothing says they can't alias ACTLR_EL1 and ACTLR_EL2 together in EL2.
ACTLR_EL1 is trapped by HCR_EL2.TACR
. It is also trapped by HACR_EL2<0>
(which has all the controls for fine-grained Apple IMPDEF stuff).
In addition, AIDR_EL1
contains feature bits for Apple IMPDEF functionality. It is identical in EL1 and EL2 and is trapped by HCR_EL2.TID1
and HACR_EL2<4>
.
ACTLR_ELx<1>
enables TSO mode. AIDR_EL1<9>
indicates that this is supported.
In EL2, ACTLR_EL1
redirects to ACTLR_EL2
and therefore this all works with EL2 host without special codepaths. ACTLR_EL2
is effective in EL2.
In EL1, ACTLR_EL1
is effective (which is a distinct register, accessed as ACTLR_EL12
from EL2).
So basically this all works "as you would expect" for a VHE style register implementation, it's just that the EL12
variant is IMPDEF because the architecture does not define this register as having those semantics officially.