The CPACR_EL1 characteristics are:
Controls access to trace, SVE, Advanced SIMD and floating-point functionality.
AArch64 System register CPACR_EL1 bits [31:0] are architecturally mapped to AArch32 System register CPACR[31:0] .
When HCR_EL2.{E2H, TGE} == {1, 1}, the fields in this register have no effect on execution at EL0 and EL1. In this case, the controls provided by CPTR_EL2 are used.
RW fields in this register reset to architecturally UNKNOWN values.
CPACR_EL1 is a 64-bit register.
The CPACR_EL1 bit assignments are:
63 | 62 | 61 | 60 | 59 | 58 | 57 | 56 | 55 | 54 | 53 | 52 | 51 | 50 | 49 | 48 | 47 | 46 | 45 | 44 | 43 | 42 | 41 | 40 | 39 | 38 | 37 | 36 | 35 | 34 | 33 | 32 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | TTA | 0 | 0 | 0 | 0 | 0 | 0 | FPEN | 0 | 0 | ZEN | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Reserved, RES0.
Traps EL0 and EL1 System register accesses to all implemented trace registers to EL1, or to EL2 when it is implemented and enabled for the current Security state and HCR_EL2.TGE is 1, from both Execution states.
TTA | Meaning |
---|---|
0b0 |
This control does not cause any instructions to be trapped. |
0b1 |
This control causes EL0 and EL1 System register accesses to all implemented trace registers to be trapped. |
System register accesses to the trace registers can have side-effects. When a System register access is trapped, any side-effects that are normally associated with the access do not occur before the exception is taken.
If System register access to the trace functionality is not implemented, this bit is RES0.
This field resets to an architecturally UNKNOWN value.
Reserved, RES0.
Traps EL0 and EL1 accesses to the SVE, Advanced SIMD, and floating-point registers to EL1, or to EL2 when it is implemented and enabled for the current Security state and HCR_EL2.TGE is 1, from both Execution states.
FPEN | Meaning |
---|---|
0b00 |
This control causes any instructions at EL0 or EL1 that use the registers associated with SVE, Advanced SIMD and floating-point execution to be trapped, unless they are trapped by CPACR_EL1.ZEN. |
0b01 |
This control causes any instructions at EL0 that use the registers associated with SVE, Advanced SIMD and floating-point execution to be trapped, unless they are trapped by CPACR_EL1.ZEN, but does not cause any instruction at EL1 to be trapped. |
0b10 |
This control causes any instructions at EL0 or EL1 that use the registers associated with SVE, Advanced SIMD and floating-point execution to be trapped, unless they are trapped by CPACR_EL1.ZEN. |
0b11 |
This control does not cause any instructions to be trapped. |
Writes to MVFR0, MVFR1 and MVFR2 from EL1 or higher are CONSTRAINED UNPREDICTABLE and whether these accesses can be trapped by this control depends on implemented CONSTRAINED UNPREDICTABLE behavior.
This field resets to an architecturally UNKNOWN value.
Reserved, RES0.
Traps SVE instructions and instructions that access SVE System registers at EL0 and EL1 to EL1, or to EL2 when it is implemented and enabled for the current Security state and HCR_EL2.TGE is 1.
ZEN | Meaning |
---|---|
0b00 |
This control causes these instructions executed at EL0 or EL1 to be trapped. |
0b01 |
This control causes these instructions executed at EL0 to be trapped, but does not cause any instruction at EL1 to be trapped. |
0b10 |
This control causes these instructions executed at EL0 or EL1 to be trapped. |
0b11 |
This control does not cause any instruction to be trapped. |
If SVE is not implemented, this field is RES0.
This field resets to an architecturally UNKNOWN value.
Reserved, RES0.
Reserved, RES0.
This register can be written using MSR (register) with the following syntax:
MSR <systemreg>, <Xt>
This register can be read using MRS with the following syntax:
MRS <Xt>, <systemreg>
This syntax uses the following encoding in the System instruction encoding space:
<systemreg> | op0 | CRn | op1 | op2 | CRm |
---|---|---|---|---|---|
CPACR_EL1 | 11 | 0001 | 000 | 010 | 0000 |
CPACR_EL12 | 11 | 0001 | 101 | 010 | 0000 |
The register is accessible as follows:
<systemreg> | Configuration | Accessibility | |||
---|---|---|---|---|---|
EL0 | EL1 | EL2 | EL3 | ||
CPACR_EL1 | SCR_EL3.NS == 0 && SCR_EL3.EEL2 == 0 | - | RW | n/a | RW |
CPACR_EL1 | (HCR_EL2.NV == 0 || HCR_EL2.NV1 == 0 || HCR_EL2.NV2 == 0) && HCR_EL2.TGE == 0 && HCR_EL2.E2H == 0 && (SCR_EL3.NS == 1 || SCR_EL3.EEL2 == 1) | - | RW | RW | RW |
CPACR_EL1 | HCR_EL2.NV == 1 && HCR_EL2.NV1 == 1 && HCR_EL2.NV2 == 1 && HCR_EL2.TGE == 0 && HCR_EL2.E2H == 0 && (SCR_EL3.NS == 1 || SCR_EL3.EEL2 == 1) | - | [VNCR_EL2.BADDR << 12 + 0x100] | RW | RW |
CPACR_EL1 | HCR_EL2.TGE == 1 && HCR_EL2.E2H == 0 && (SCR_EL3.NS == 1 || SCR_EL3.EEL2 == 1) | - | n/a | RW | RW |
CPACR_EL1 | (HCR_EL2.NV == 0 || HCR_EL2.NV1 == 0 || HCR_EL2.NV2 == 0) && HCR_EL2.TGE == 0 && HCR_EL2.E2H == 1 && (SCR_EL3.NS == 1 || SCR_EL3.EEL2 == 1) | - | RW | CPTR_EL2 | RW |
CPACR_EL1 | HCR_EL2.NV == 1 && HCR_EL2.NV1 == 1 && HCR_EL2.NV2 == 1 && HCR_EL2.TGE == 0 && HCR_EL2.E2H == 1 && (SCR_EL3.NS == 1 || SCR_EL3.EEL2 == 1) | - | [VNCR_EL2.BADDR << 12 + 0x100] | CPTR_EL2 | RW |
CPACR_EL1 | HCR_EL2.TGE == 1 && HCR_EL2.E2H == 1 && (SCR_EL3.NS == 1 || SCR_EL3.EEL2 == 1) | - | n/a | CPTR_EL2 | RW |
CPACR_EL12 | SCR_EL3.NS == 0 && SCR_EL3.EEL2 == 0 | - | - | n/a | - |
CPACR_EL12 | (HCR_EL2.NV == 0 || HCR_EL2.NV1 == 1 || HCR_EL2.NV2 == 0) && HCR_EL2.TGE == 0 && HCR_EL2.E2H == 0 && (SCR_EL3.NS == 1 || SCR_EL3.EEL2 == 1) | - | - | - | - |
CPACR_EL12 | HCR_EL2.NV == 1 && HCR_EL2.NV1 == 0 && HCR_EL2.NV2 == 1 && HCR_EL2.TGE == 0 && HCR_EL2.E2H == 0 && (SCR_EL3.NS == 1 || SCR_EL3.EEL2 == 1) | - | [VNCR_EL2.BADDR << 12 + 0x100] | - | - |
CPACR_EL12 | HCR_EL2.TGE == 1 && HCR_EL2.E2H == 0 && (SCR_EL3.NS == 1 || SCR_EL3.EEL2 == 1) | - | n/a | - | - |
CPACR_EL12 | (HCR_EL2.NV == 0 || HCR_EL2.NV1 == 1 || HCR_EL2.NV2 == 0) && HCR_EL2.TGE == 0 && HCR_EL2.E2H == 1 && (SCR_EL3.NS == 1 || SCR_EL3.EEL2 == 1) | - | - | RW | RW |
CPACR_EL12 | HCR_EL2.NV == 1 && HCR_EL2.NV1 == 0 && HCR_EL2.NV2 == 1 && HCR_EL2.TGE == 0 && HCR_EL2.E2H == 1 && (SCR_EL3.NS == 1 || SCR_EL3.EEL2 == 1) | - | [VNCR_EL2.BADDR << 12 + 0x100] | RW | RW |
CPACR_EL12 | HCR_EL2.TGE == 1 && HCR_EL2.E2H == 1 && (SCR_EL3.NS == 1 || SCR_EL3.EEL2 == 1) | - | n/a | RW | RW |
When HCR_EL2.E2H is 1, without explicit synchronization, access from EL3 using the mnemonic CPACR_EL1 or CPACR_EL12 are not guaranteed to be ordered with respect to accesses using the other mnemonic.
For a description of the prioritization of any generated exceptions, see section D1.13.2 (Synchronous exception prioritization) in the ARM® Architecture Reference Manual, ARMv8, for ARMv8-A architecture profile. Subject to the prioritization rules, the following traps and enables are applicable when accessing this register.
If IsUsingAccessor(CPACR_EL1) && (SCR_EL3.NS == 1 || SCR_EL3.EEL2 == 1) && IsUsingAArch64(EL2) && HCR_EL2.E2H == 0 && CPTR_EL2.TCPAC == 1, then accesses at EL1 are trapped to EL2.
If (HCR_EL2.NV2 == 0 || HCR_EL2.NV1 == 1 || HCR_EL2.NV == 0) && IsUsingAccessor(CPACR_EL12) && (SCR_EL3.NS == 1 || SCR_EL3.EEL2 == 1) && IsUsingAArch64(EL2) && HCR_EL2.E2H == 0 && CPTR_EL2.TCPAC == 1, then accesses at EL1 are trapped to EL2.
If (HCR_EL2.NV2 == 0 || HCR_EL2.NV1 == 1) && (SCR_EL3.NS == 1 || SCR_EL3.EEL2 == 1) && IsUsingAArch64(EL2) && HCR_EL2.E2H == 0 && IsUsingAccessor(CPACR_EL12) && HCR_EL2.NV == 1, then accesses at EL1 are trapped to EL2.
If IsUsingAccessor(CPACR_EL1) && (SCR_EL3.NS == 1 || SCR_EL3.EEL2 == 1) && IsUsingAArch64(EL2) && HCR_EL2.E2H == 1 && HCR_EL2.TGE == 0 && CPTR_EL2.TCPAC == 1, then accesses at EL1 are trapped to EL2.
If (HCR_EL2.NV2 == 0 || HCR_EL2.NV1 == 1 || HCR_EL2.NV == 0) && IsUsingAccessor(CPACR_EL12) && (SCR_EL3.NS == 1 || SCR_EL3.EEL2 == 1) && IsUsingAArch64(EL2) && HCR_EL2.E2H == 1 && HCR_EL2.TGE == 0 && CPTR_EL2.TCPAC == 1, then accesses at EL1 are trapped to EL2.
If (HCR_EL2.NV2 == 0 || HCR_EL2.NV1 == 1) && (SCR_EL3.NS == 1 || SCR_EL3.EEL2 == 1) && IsUsingAArch64(EL2) && HCR_EL2.E2H == 1 && HCR_EL2.TGE == 0 && IsUsingAccessor(CPACR_EL12) && HCR_EL2.NV == 1, then accesses at EL1 are trapped to EL2.
If IsUsingAArch64(EL3) && CPTR_EL3.TCPAC == 1, then accesses at EL2 are trapped to EL3.
If IsUsingAccessor(CPACR_EL1) && IsUsingAArch64(EL3) && CPTR_EL3.TCPAC == 1, then accesses at EL1 are trapped to EL3.
15/10/2018 19:26; 79a37e9f651257790ccdbbdd2c8c3713837d12fb
Copyright © 2010-2018 ARM Limited or its affiliates. All rights reserved. This document is Non-Confidential.