blob: 8ba4025d25a9cf9bec797696239645850939ff9e [file] [log] [blame]
// SPDX-License-Identifier: Apache-2.0 OR MIT
//
// Copyright (c) 2018-2022 by the author(s)
//
// Author(s):
// - Andre Richter <andre.o.richter@gmail.com>
//! System Control Register - EL1
//!
//! Provides top level control of the system, including its memory system, at EL1 and EL0.
use tock_registers::{
interfaces::{Readable, Writeable},
register_bitfields,
};
register_bitfields! {u64,
pub SCTLR_EL1 [
/// Traps EL0 execution of cache maintenance instructions to EL1, from AArch64 state only.
///
/// 0 Any attempt to execute a DC CVAU, DC CIVAC, DC CVAC, DC CVAP, or IC IVAU
/// instruction at EL0 using AArch64 is trapped to EL1.
/// 1 This control does not cause any instructions to be trapped.
///
/// When ARMv8.1-VHE is implemented, and the value of HCR_EL2.{E2H, TGE} is {1, 1}, this bit
/// has no effect on execution at EL0.
///
/// If the Point of Coherency is before any level of data cache, it is IMPLEMENTATION DEFINED whether
/// the execution of any data or unified cache clean, or clean and invalidate instruction that operates by
/// VA to the point of coherency can be trapped when the value of this control is 1.
///
/// If the Point of Unification is before any level of data cache, it is IMPLEMENTATION DEFINED whether
/// the execution of any data or unified cache clean by VA to the point of unification instruction can be
/// trapped when the value of this control is 1.
///
/// If the Point of Unification is before any level of instruction cache, it is IMPLEMENTATION DEFINED
/// whether the execution of any instruction cache invalidate by VA to the point of unification
/// instruction can be trapped when the value of this control is 1.
UCI OFFSET(26) NUMBITS(1) [
Trap = 0,
DontTrap = 1,
],
/// Endianness of data accesses at EL1, and stage 1 translation table walks in the EL1&0 translation regime.
///
/// 0 Explicit data accesses at EL1, and stage 1 translation table walks in the EL1&0
/// translation regime are little-endian.
/// 1 Explicit data accesses at EL1, and stage 1 translation table walks in the EL1&0
/// translation regime are big-endian.
///
/// If an implementation does not provide Big-endian support at Exception Levels higher than EL0, this
/// bit is RES 0.
///
/// If an implementation does not provide Little-endian support at Exception Levels higher than EL0,
/// this bit is RES 1.
///
/// The EE bit is permitted to be cached in a TLB.
///
/// When ARMv8.1-VHE is implemented, and the value of HCR_EL2.{E2H, TGE} is {1, 1}, this bit
/// has no effect on the PE.
EE OFFSET(25) NUMBITS(1) [
LittleEndian = 0,
BigEndian = 1,
],
/// Endianness of data accesses at EL0.
///
/// 0 Explicit data accesses at EL0 are little-endian.
///
/// 1 Explicit data accesses at EL0 are big-endian.
///
/// If an implementation only supports Little-endian accesses at EL0 then this bit is RES 0. This option
/// is not permitted when SCTLR_EL1.EE is RES 1.
///
/// If an implementation only supports Big-endian accesses at EL0 then this bit is RES 1. This option is
/// not permitted when SCTLR_EL1.EE is RES 0.
///
/// This bit has no effect on the endianness of LDTR , LDTRH , LDTRSH , LDTRSW , STTR , and STTRH instructions
/// executed at EL1.
///
/// When ARMv8.1-VHE is implemented, and the value of HCR_EL2.{E2H, TGE} is {1, 1}, this bit
/// has no effect on execution at EL0.
E0E OFFSET(24) NUMBITS(1) [
LittleEndian = 0,
BigEndian = 1,
],
/// Write permission implies XN (Execute-never). For the EL1&0 translation regime, this bit can force
/// all memory regions that are writable to be treated as XN.
///
/// 0 This control has no effect on memory access permissions.
///
/// 1 Any region that is writable in the EL1&0 translation regime is forced to XN for accesses
/// from software executing at EL1 or EL0.
///
/// The WXN bit is permitted to be cached in a TLB.
///
/// When ARMv8.1-VHE is implemented, and the value of HCR_EL2.{E2H, TGE} is {1, 1}, this bit
/// has no effect on the PE.
WXN OFFSET(19) NUMBITS(1) [
Disable = 0,
Enable = 1,
],
/// Traps EL0 execution of WFE instructions to EL1, from both Execution states.
///
/// 0 Any attempt to execute a WFE instruction at EL0 is trapped to EL1, if the instruction
/// would otherwise have caused the PE to enter a low-power state.
///
/// 1 This control does not cause any instructions to be trapped.
///
/// In AArch32 state, the attempted execution of a conditional WFE instruction is only trapped if the
/// instruction passes its condition code check.
///
/// **Note:**
///
/// Since a WFE or WFI can complete at any time, even without a Wakeup event, the traps on WFE of
/// WFI are not guaranteed to be taken, even if the WFE or WFI is executed when there is no Wakeup
/// event. The only guarantee is that if the instruction does not complete in finite time in the
/// absence of a Wakeup event, the trap will be taken.
///
/// When ARMv8.1-VHE is implemented, and the value of HCR_EL2.{E2H, TGE} is {1, 1}, this bit
/// has no effect on execution at EL0.
NTWE OFFSET(18) NUMBITS(1) [
Trap = 0,
DontTrap = 1,
],
/// Traps EL0 executions of WFI instructions to EL1, from both execution states:
///
/// 0 Any attempt to execute a WFI instruction at EL0 is trapped EL1, if the instruction would
/// otherwise have caused the PE to enter a low-power state.
///
/// 1 This control does not cause any instructions to be trapped.
///
/// In AArch32 state, the attempted execution of a conditional WFI instruction is only trapped if the
/// instruction passes its condition code check.
///
/// **Note:**
///
/// Since a WFE or WFI can complete at any time, even without a Wakeup event, the traps on WFE of
/// WFI are not guaranteed to be taken, even if the WFE or WFI is executed when there is no Wakeup
/// event. The only guarantee is that if the instruction does not complete in finite time in the
/// absence of a Wakeup event, the trap will be taken.
///
/// When ARMv8.1-VHE is implemented, and the value of HCR_EL2.{E2H, TGE} is {1, 1}, this bit
/// has no effect on execution at EL0.
NTWI OFFSET(16) NUMBITS(1) [
Trap = 0,
DontTrap = 1,
],
/// Traps EL0 accesses to the CTR_EL0 to EL1, from AArch64 state only.
///
/// 0 Accesses to the CTR_EL0 from EL0 using AArch64 are trapped to EL1.
///
/// 1 This control does not cause any instructions to be trapped.
///
/// When ARMv8.1-VHE is implemented, and the value of HCR_EL2.{E2H, TGE} is {1, 1}, this bit
/// has no effect on execution at EL0.
UCT OFFSET(15) NUMBITS(1) [
Trap = 0,
DontTrap = 1,
],
/// Traps EL0 execution of DC ZVA instructions to EL1, from AArch64 state only.
///
/// 0 Any attempt to execute a DC ZVA instruction at EL0 using AArch64 is trapped to EL1.
/// Reading DCZID_EL0.DZP from EL0 returns 1, indicating that DC ZVA instructions
/// are not supported.
///
/// 1 This control does not cause any instructions to be trapped.
///
/// When ARMv8.1-VHE is implemented, and the value of HCR_EL2.{E2H, TGE} is {1, 1}, this bit
/// has no effect on execution at EL0.
DZE OFFSET(14) NUMBITS(1) [
Trap = 0,
DontTrap = 1,
],
/// Instruction access Cacheability control, for accesses at EL0 and
/// EL1:
///
/// 0 All instruction access to Normal memory from EL0 and EL1 are Non-cacheable for all
/// levels of instruction and unified cache.
///
/// If the value of SCTLR_EL1.M is 0, instruction accesses from stage 1 of the EL1&0
/// translation regime are to Normal, Outer Shareable, Inner Non-cacheable, Outer
/// Non-cacheable memory.
///
/// 1 This control has no effect on the Cacheability of instruction access to Normal memory
/// from EL0 and EL1.
///
/// If the value of SCTLR_EL1.M is 0, instruction accesses from stage 1 of the EL1&0
/// translation regime are to Normal, Outer Shareable, Inner Write-Through, Outer
/// Write-Through memory.
///
/// When the value of the HCR_EL2.DC bit is 1, then instruction access to Normal memory from
/// EL0 and EL1 are Cacheable regardless of the value of the SCTLR_EL1.I bit.
///
/// When ARMv8.1-VHE is implemented, and the value of HCR_EL2.{E2H, TGE} is {1, 1}, this bit
/// has no effect on the PE.
///
/// When this register has an architecturally-defined reset value, this field resets to 0.
I OFFSET(12) NUMBITS(1) [
NonCacheable = 0,
Cacheable = 1
],
/// User Mask Access. Traps EL0 execution of MSR and MRS instructions that access the
/// PSTATE.{D, A, I, F} masks to EL1, from AArch64 state only.
///
/// 0 Any attempt at EL0 using AArch64 to execute an MRS , MSR(register) , or MSR(immediate)
/// instruction that accesses the [`DAIF`](module@super::super::DAIF) is trapped to EL1.
///
/// 1 This control does not cause any instructions to be trapped.
///
/// When ARMv8.1-VHE is implemented, and the value of HCR_EL2.{E2H, TGE} is {1, 1}, this bit
/// has no effect on execution at EL0.
UMA OFFSET(9) NUMBITS(1) [
Trap = 0,
DontTrap = 1,
],
/// Non-aligned access. This bit controls generation of Alignment faults at EL1 and EL0 under certain conditions.
///
/// LDAPR, LDAPRH, LDAPUR, LDAPURH, LDAPURSH, LDAPURSW, LDAR, LDARH, LDLAR, LDLARH,
/// STLLR, STLLRH, STLR, STLRH, STLUR, and STLURH will or will not generate an Alignment
/// fault if all bytes being accessed are not within a single 16-byte quantity,
/// aligned to 16 bytes for accesses.
NAA OFFSET(6) NUMBITS(1) [
Disable = 0,
Enable = 1
],
/// SP Alignment check enable for EL0.
///
/// When set to 1, if a load or store instruction executed at EL0 uses the SP
/// as the base address and the SP is not aligned to a 16-byte boundary,
/// then a SP alignment fault exception is generated.
SA0 OFFSET(4) NUMBITS(1) [
Disable = 0,
Enable = 1
],
/// SP Alignment check enable.
///
/// When set to 1, if a load or store instruction executed at EL1 uses the SP
/// as the base address and the SP is not aligned to a 16-byte boundary,
/// then a SP alignment fault exception is generated.
SA OFFSET(3) NUMBITS(1) [
Disable = 0,
Enable = 1
],
/// Cacheability control, for data accesses.
///
/// 0 All data access to Normal memory from EL0 and EL1, and all Normal memory accesses to
/// the EL1&0 stage 1 translation tables, are Non-cacheable for all levels of data and
/// unified cache.
///
/// 1 This control has no effect on the Cacheability of:
/// - Data access to Normal memory from EL0 and EL1.
/// - Normal memory accesses to the EL1&0 stage 1 translation tables.
///
/// When the value of the HCR_EL2.DC bit is 1, the PE ignores SCLTR.C. This means that
/// Non-secure EL0 and Non-secure EL1 data accesses to Normal memory are Cacheable.
///
/// When ARMv8.1-VHE is implemented, and the value of HCR_EL2.{E2H, TGE} is {1, 1}, this bit
/// has no effect on the PE.
///
/// When this register has an architecturally-defined reset value, this field resets to 0.
C OFFSET(2) NUMBITS(1) [
NonCacheable = 0,
Cacheable = 1
],
/// Alignment check enable. This is the enable bit for Alignment fault checking at EL1 and EL0.
///
/// Instructions that load or store one or more registers, other than load/store exclusive
/// and load-acquire/store-release, will or will not check that the address being accessed
/// is aligned to the size of the data element(s) being accessed depending on this flag.
///
/// Load/store exclusive and load-acquire/store-release instructions have an alignment check
/// regardless of the value of the A bit.
A OFFSET(1) NUMBITS(1) [
Disable = 0,
Enable = 1
],
/// MMU enable for EL1 and EL0 stage 1 address translation. Possible values of this bit are:
///
/// 0 EL1 and EL0 stage 1 address translation disabled.
/// - See the SCTLR_EL1.I field for the behavior of instruction accesses to Normal memory.
///
/// 1 EL1 and EL0 stage 1 address translation enabled.
M OFFSET(0) NUMBITS(1) [
Disable = 0,
Enable = 1
]
]
}
pub struct Reg;
impl Readable for Reg {
type T = u64;
type R = SCTLR_EL1::Register;
sys_coproc_read_raw!(u64, "SCTLR_EL1", "x");
}
impl Writeable for Reg {
type T = u64;
type R = SCTLR_EL1::Register;
sys_coproc_write_raw!(u64, "SCTLR_EL1", "x");
}
pub const SCTLR_EL1: Reg = Reg {};