diff options
Diffstat (limited to 'src/registers/tcr_el1.rs')
-rw-r--r-- | src/registers/tcr_el1.rs | 347 |
1 files changed, 347 insertions, 0 deletions
diff --git a/src/registers/tcr_el1.rs b/src/registers/tcr_el1.rs new file mode 100644 index 0000000..8ab1308 --- /dev/null +++ b/src/registers/tcr_el1.rs @@ -0,0 +1,347 @@ +// 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> + +//! Translation Control Register - EL1 +//! +//! The control register for stage 1 of the EL1&0 translation regime. + +use tock_registers::{ + interfaces::{Readable, Writeable}, + register_bitfields, +}; + +register_bitfields! {u64, + pub TCR_EL1 [ + /// When ARMv8.3-PAuth is implemented: + /// Controls the use of the top byte of instruction addresses for address matching. + /// 0 TCR_EL1.TBI1 applies to Instruction and Data accesses. + /// 1 TCR_EL1.TBI1 applies to Data accesses only. + /// This affects addresses where the address would be translated by tables pointed + /// to by TTBR1_EL1. This field resets to an architecturally UNKNOWN value. + /// Otherwise: + /// Reserved, RES0. + TBID1 OFFSET(52) NUMBITS(1) [], + + /// When ARMv8.3-PAuth is implemented: + /// Controls the use of the top byte of instruction addresses for address matching. + /// 0 TCR_EL1.TBI0 applies to Instruction and Data accesses. + /// 1 TCR_EL1.TBI0 applies to Data accesses only. + /// This affects addresses where the address would be translated by tables pointed + /// to by TTBR0_EL1. This field resets to an architecturally UNKNOWN value. + /// Otherwise: + /// Reserved, RES0. + TBID0 OFFSET(51) NUMBITS(1) [], + + /// Top Byte ignored - indicates whether the top byte of an address is used for address + /// match for the TTBR1_EL1 region, or ignored and used for tagged addresses. Defined values + /// are: + /// + /// 0 Top Byte used in the address calculation. + /// + /// 1 Top Byte ignored in the address calculation. + /// + /// This affects addresses generated in EL0 and EL1 using AArch64 where the address would be + /// translated by tables pointed to by TTBR1_EL1. It has an effect whether the EL1&0 + /// translation regime is enabled or not. + /// + /// If ARMv8.3-PAuth is implemented and TCR_EL1.TBID1 is 1, then this field only applies to + /// Data accesses. + /// Otherwise, if the value of TBI1 is 1 and bit [55] of the target address to be stored to + /// the PC is 0, then bits[63:56] of that target address are also set to 0 before the + /// address is stored in the PC, in the following cases: + /// + /// • A branch or procedure return within EL0 or EL1. + /// • An exception taken to EL1. + /// • An exception return to EL0 or EL1. + TBI1 OFFSET(38) NUMBITS(1) [ + Used = 0, + Ignored = 1 + ], + + /// Top Byte ignored - indicates whether the top byte of an address is used for address + /// match for the TTBR0_EL1 region, or ignored and used for tagged addresses. Defined values + /// are: + /// + /// 0 Top Byte used in the address calculation. + /// + /// 1 Top Byte ignored in the address calculation. + /// + /// This affects addresses generated in EL0 and EL1 using AArch64 where the address would be + /// translated by tables pointed to by TTBR0_EL1. It has an effect whether the EL1&0 + /// translation regime is enabled or not. + /// + /// If ARMv8.3-PAuth is implemented and TCR_EL1.TBID0 is 1, then this field only applies to + /// Data accesses. + /// Otherwise, if the value of TBI0 is 1 and bit [55] of the target address to be stored to + /// the PC is 0, then bits[63:56] of that target address are also set to 0 before the + /// address is stored in the PC, in the following cases: + /// + /// • A branch or procedure return within EL0 or EL1. + /// • An exception taken to EL1. + /// • An exception return to EL0 or EL1. + TBI0 OFFSET(37) NUMBITS(1) [ + Used = 0, + Ignored = 1 + ], + + /// ASID Size. Defined values are: + /// + /// 0 8 bit - the upper 8 bits of TTBR0_EL1 and TTBR1_EL1 are ignored by hardware for every + /// purpose except reading back the register, and are treated as if they are all + /// zeros for when used for allocation and matching entries in the TLB. + /// + /// 1 16 bit - the upper 16 bits of TTBR0_EL1 and TTBR1_EL1 are used for allocation and + /// matching in the TLB. + /// + /// If the implementation has only 8 bits of ASID, this field is RES0. + AS OFFSET(36) NUMBITS(1) [ + ASID8Bits = 0, + ASID16Bits = 1 + ], + + /// Intermediate Physical Address Size. + /// + /// 000 32 bits, 4GiB. + /// 001 36 bits, 64GiB. + /// 010 40 bits, 1TiB. + /// 011 42 bits, 4TiB. + /// 100 44 bits, 16TiB. + /// 101 48 bits, 256TiB. + /// 110 52 bits, 4PiB + /// + /// Other values are reserved. + /// + /// The reserved values behave in the same way as the 101 or 110 encoding, but software must + /// not rely on this property as the behavior of the reserved values might change in a + /// future revision of the architecture. + /// + /// The value 110 is permitted only if ARMv8.2-LPA is implemented and the translation + /// granule size is 64KiB. + /// + /// In an implementation that supports 52-bit PAs, if the value of this field is not 110 , + /// then bits[51:48] of every translation table base address for the stage of translation + /// controlled by TCR_EL1 are 0000. + IPS OFFSET(32) NUMBITS(3) [ + Bits_32 = 0b000, + Bits_36 = 0b001, + Bits_40 = 0b010, + Bits_42 = 0b011, + Bits_44 = 0b100, + Bits_48 = 0b101, + Bits_52 = 0b110 + ], + + /// Granule size for the TTBR1_EL1. + /// + /// 10 4KiB + /// 01 16KiB + /// 11 64KiB + /// + /// Other values are reserved. + /// + /// If the value is programmed to either a reserved value, or a size that has not been + /// implemented, then the hardware will treat the field as if it has been programmed to an + /// IMPLEMENTATION DEFINED choice of the sizes that has been implemented for all purposes + /// other than the value read back from this register. + /// + /// It is IMPLEMENTATION DEFINED whether the value read back is the value programmed or the + /// value that corresponds to the size chosen. + TG1 OFFSET(30) NUMBITS(2) [ + KiB_4 = 0b10, + KiB_16 = 0b01, + KiB_64 = 0b11 + ], + + /// Shareability attribute for memory associated with translation table walks using + /// TTBR1_EL1. + /// + /// 00 Non-shareable + /// 10 Outer Shareable + /// 11 Inner Shareable + /// + /// Other values are reserved. + SH1 OFFSET(28) NUMBITS(2) [ + None = 0b00, + Outer = 0b10, + Inner = 0b11 + ], + + /// Outer cacheability attribute for memory associated with translation table walks using + /// TTBR1_EL1. + /// + /// 00 Normal memory, Outer Non-cacheable + /// + /// 01 Normal memory, Outer Write-Back Read-Allocate Write-Allocate Cacheable + /// + /// 10 Normal memory, Outer Write-Through Read-Allocate No Write-Allocate Cacheable + /// + /// 11 Normal memory, Outer Write-Back Read-Allocate No Write-Allocate Cacheable + ORGN1 OFFSET(26) NUMBITS(2) [ + NonCacheable = 0b00, + WriteBack_ReadAlloc_WriteAlloc_Cacheable = 0b01, + WriteThrough_ReadAlloc_NoWriteAlloc_Cacheable = 0b10, + WriteBack_ReadAlloc_NoWriteAlloc_Cacheable = 0b11 + ], + + /// Inner cacheability attribute for memory associated with translation + /// table walks using TTBR1_EL1. + /// + /// 00 Normal memory, Inner Non-cacheable + /// + /// 01 Normal memory, Inner Write-Back Read-Allocate Write-Allocate Cacheable + /// + /// 10 Normal memory, Inner Write-Through Read-Allocate No Write-Allocate Cacheable + /// + /// 11 Normal memory, Inner Write-Back Read-Allocate No Write-Allocate Cacheable + IRGN1 OFFSET(24) NUMBITS(2) [ + NonCacheable = 0b00, + WriteBack_ReadAlloc_WriteAlloc_Cacheable = 0b01, + WriteThrough_ReadAlloc_NoWriteAlloc_Cacheable = 0b10, + WriteBack_ReadAlloc_NoWriteAlloc_Cacheable = 0b11 + ], + + /// Translation table walk disable for translations using TTBR1_EL1. This bit controls + /// whether a translation table walk is performed on a TLB miss, for an address that is + /// translated using TTBR1_EL1. The encoding of this bit is: + /// + /// 0 Perform translation table walks using TTBR1_EL1. + /// + /// 1 A TLB miss on an address that is translated using TTBR1_EL1 generates a Translation + /// fault. No translation table walk is performed. + EPD1 OFFSET(23) NUMBITS(1) [ + EnableTTBR1Walks = 0, + DisableTTBR1Walks = 1 + ], + + /// Selects whether TTBR0_EL1 or TTBR1_EL1 defines the ASID. The encoding of this bit is: + /// + /// 0 TTBR0_EL1.ASID defines the ASID. + /// 1 TTBR1_EL1.ASID defines the ASID. + A1 OFFSET(22) NUMBITS(1) [ + TTBR0 = 0, + TTBR1 = 1 + ], + + /// The size offset of the memory region addressed by TTBR1_EL1. The region size is + /// 2^(64-T1SZ) bytes. + /// + /// The maximum and minimum possible values for T1SZ depend on the level of translation + /// table and the memory translation granule size, as described in the AArch64 Virtual + /// Memory System Architecture chapter. + /// + /// This field resets to an architecturally UNKNOWN value. + T1SZ OFFSET(16) NUMBITS(6) [], + + /// Granule size for the TTBR0_EL1. + /// + /// 00 4KiB + /// 01 64KiB + /// 10 16KiB + /// + /// Other values are reserved. + /// + /// If the value is programmed to either a reserved value, or a size that has not been + /// implemented, then the hardware will treat the field as if it has been programmed to an + /// IMPLEMENTATION DEFINED choice of the sizes that has been implemented for all purposes + /// other than the value read back from this register. + /// + /// It is IMPLEMENTATION DEFINED whether the value read back is the value programmed or the + /// value that corresponds to the size chosen. + TG0 OFFSET(14) NUMBITS(2) [ + KiB_4 = 0b00, + KiB_16 = 0b10, + KiB_64 = 0b01 + ], + + /// Shareability attribute for memory associated with translation table walks using + /// TTBR0_EL1. + /// + /// 00 Non-shareable + /// 10 Outer Shareable + /// 11 Inner Shareable + /// + /// Other values are reserved. + SH0 OFFSET(12) NUMBITS(2) [ + None = 0b00, + Outer = 0b10, + Inner = 0b11 + ], + + /// Outer cacheability attribute for memory associated with translation table walks using + /// TTBR0_EL1. + /// + /// 00 Normal memory, Outer Non-cacheable + /// + /// 01 Normal memory, Outer Write-Back Read-Allocate Write-Allocate Cacheable + /// + /// 10 Normal memory, Outer Write-Through Read-Allocate No Write-Allocate Cacheable + /// + /// 11 Normal memory, Outer Write-Back Read-Allocate No Write-Allocate Cacheable + ORGN0 OFFSET(10) NUMBITS(2) [ + NonCacheable = 0b00, + WriteBack_ReadAlloc_WriteAlloc_Cacheable = 0b01, + WriteThrough_ReadAlloc_NoWriteAlloc_Cacheable = 0b10, + WriteBack_ReadAlloc_NoWriteAlloc_Cacheable = 0b11 + ], + + /// Inner cacheability attribute for memory associated with translation table walks using + /// TTBR0_EL1. + /// + /// 00 Normal memory, Inner Non-cacheable + /// + /// 01 Normal memory, Inner Write-Back Read-Allocate Write-Allocate Cacheable + /// + /// 10 Normal memory, Inner Write-Through Read-Allocate No Write-Allocate Cacheable + /// + /// 11 Normal memory, Inner Write-Back Read-Allocate No Write-Allocate Cacheable + IRGN0 OFFSET(8) NUMBITS(2) [ + NonCacheable = 0b00, + WriteBack_ReadAlloc_WriteAlloc_Cacheable = 0b01, + WriteThrough_ReadAlloc_NoWriteAlloc_Cacheable = 0b10, + WriteBack_ReadAlloc_NoWriteAlloc_Cacheable = 0b11 + ], + + /// Translation table walk disable for translations using TTBR0_EL1. This bit controls + /// whether a translation table walk is performed on a TLB miss, for an address that is + /// translated using TTBR0_EL1. The encoding of this bit is: + /// + /// 0 Perform translation table walks using TTBR0_EL1. + /// + /// 1 A TLB miss on an address that is translated using TTBR0_EL1 generates a Translation + /// fault. No translation table walk is performed. + EPD0 OFFSET(7) NUMBITS(1) [ + EnableTTBR0Walks = 0, + DisableTTBR0Walks = 1 + ], + + /// The size offset of the memory region addressed by TTBR0_EL1. The region size is + /// 2^(64-T0SZ) bytes. + /// + /// The maximum and minimum possible values for T0SZ depend on the level of translation + /// table and the memory translation granule size, as described in the AArch64 Virtual + /// Memory System Architecture chapter. + T0SZ OFFSET(0) NUMBITS(6) [] + ] +} + +pub struct Reg; + +impl Readable for Reg { + type T = u64; + type R = TCR_EL1::Register; + + sys_coproc_read_raw!(u64, "TCR_EL1", "x"); +} + +impl Writeable for Reg { + type T = u64; + type R = TCR_EL1::Register; + + sys_coproc_write_raw!(u64, "TCR_EL1", "x"); +} + +pub const TCR_EL1: Reg = Reg {}; |