ARMv8 defines four exception levels, EL0 to EL3, where EL3 is the highest exception level with the most execution privilege. When taking an exception, the exception level can either increase or remain the same, and when returning from an exception, it can either decrease or remain the same.
The following is a common usage model for the exception levels:
- OS kernels and associated functions that are typically described as privileged.
- Secure monitor.
When taking an exception to a higher exception level, the execution state can either remain the same, or change from AArch32 to AArch64.
When returning to a lower exception level, the execution state can either remain the same or change from AArch64 to AArch32.
The only way the execution state can change is by taking or returning from an exception. It is not possible to change between execution states in the same way as changing between A32 and T32 code in AArch32 state.
On powerup and on reset, the processor enters the highest implemented exception level. The execution state for this exception level is a property of the implementation, and might be determined by a configuration input signal.
For exception levels other than EL0, the execution state is determined by one or more control register configuration bits. These bits can be set only in a higher exception level.
For EL0, the execution state is determined as part of the exception return to EL0, under the control of the exception level that the execution is returning from.