1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/***********************************************************************************************************************
 * Copyright (c) 2020 by the authors
 *
 * Author: André Borrmann <pspwizard@gmx.de>
 * License: Apache License 2.0 / MIT
 **********************************************************************************************************************/

//! # HCR_EL2 - Hypervisor Configuration Register
//!
//! Provides configuration control for virtualization, including whether various Non-secure
//! operations are trapped to EL2.
//!
//! ## Usage Constraints
//! EL0 | EL1 (NS) | EL1(S) | EL2 | EL3(NS) | EL3(S)
//! ----|----------|--------|-----|---------|-------
//!  -  | -        | -      | R/W | R/W     | R/W
//!

use crate::register::*;
use crate::{define_aarch64_register, impl_system_register_rw};

define_aarch64_register! {
    @hcr_el2<u64> {
        /// enable second stage of translation
        VM      OFFSET(0) [
            DISABLE =    0b0,
            ENABLE =     0b1
        ],
        PTW     OFFSET(2),
        /// physical FIQ routing to EL2
        FMO     OFFSET(3) [
            DISABLE =   0b0,
            ENABLE =    0b1
        ],
        /// phyiscal IRQ routing to EL2
        IMO     OFFSET(4) [
            DISABLE =   0b0,
            ENABLE =    0b1
        ],
        /// Async Abort and Error exception routing to EL2
        AMO     OFFSET(5) [
            DISABLE =   0b0,
            ENABLE =    0b1
        ],
        /// virtual FIQ pending
        VF      OFFSET(6),
        /// virtual IRQ pending
        VI      OFFSET(7),
        /// virtual system error/async abort pending
        VSE     OFFSET(8),
        /// Forces broadcast
        FB      OFFSET(9),
        /// Barrier sharability upgrade
        BSU     OFFSET(10) BITS(2),
        /// default cacheable
        DC      OFFSET(12) [
            DISABLE =  0b0,
            ENABLE =   0b1
        ],
        /// trap WFI if there is no pending WFI event
        TWI     OFFSET(13) [
            NO_TRAP = 0b0,
            TRAP =    0b1
        ],
        /// trap WFE if there is no pending WFE event
        TWE     OFFSET(14) [
            NO_TRAP = 0b0,
            TRAP =    0b1
        ],
        /// trap ID group 0 registers
        TID0     OFFSET(15) [
            NO_TRAP = 0b0,
            TRAP =    0b1
        ],
        /// trap ID group 1 registers
        TID1     OFFSET(16) [
            NO_TRAP = 0b0,
            TRAP =    0b1
        ],
        /// trap ID group 2 registers
        TID2     OFFSET(17) [
            NO_TRAP = 0b0,
            TRAP =    0b1
        ],
        /// trap ID group 3 registers
        TID3     OFFSET(18) [
            NO_TRAP = 0b0,
            TRAP =    0b1
        ],
        /// trap SMC instruction
        TSC     OFFSET(19) [
            NO_TRAP = 0b0,
            TRAP =    0b1
        ],
        /// trap implementation depended instructions
        TIDCP   OFFSET(20) [
            NO_TRAP = 0b0,
            TRAP =    0b1
        ],
        /// trap auxiliry control registers
        TACR    OFFSET(21) [
            NO_TRAP = 0b0,
            TRAP =    0b1
        ],
        /// trap data or unified cache maintenenace instructions by set or way
        TSW     OFFSET(22) [
            NO_TRAP = 0b0,
            TRAP =    0b1
        ],
        /// trap data or unified cache maintenance instructions to Point of Coherency
        TPC     OFFSET(23) [
            NO_TRAP = 0b0,
            TRAP =    0b1
        ],
        /// trap data or nuified cache maintenance instructions to Point of Unification
        TPU     OFFSET(24) [
            NO_TRAP = 0b0,
            TRAP =    0b1
        ],
        /// trap ttlb maintenance instructions
        TTLB    OFFSET(25) [
            NO_TRAP = 0b0,
            TRAP =    0b1
        ],
        /// trap virtual memory control
        TVM     OFFSET(26) [
            NO_TRAP = 0b0,
            TRAP =    0b1
        ],
        /// trap generel exceptions
        TGE     OFFSET(27) [
            NO_TRAP = 0b0,
            TRAP =    0b1
        ],
        /// trap dc zva instruction
        TDZ     OFFSET(28) [
            NO_TRAP = 0b0,
            TRAP =    0b1
        ],
        /// trap reads of virtual memory controls
        TRVM    OFFSET(30) [
            NO_TRAP = 0b0,
            TRAP =    0b1
        ],
        /// register width control for lower exception levels
        RW      OFFSET(31) [
            ALL_A32 = 0b0,
            EL1_A64 = 0b1
        ],
        /// disable stage 2 data cache
        CD      OFFSET(32) [
            INACTIVE = 0b0,
            DISABLE_CACHE = 0b1
        ],
        /// disable stage 2 instruction cache
        ID      OFFSET(33) [
            INACTIVE = 0b0,
            DISABLE_CACHE = 0b1
        ]
    }
}