| /* |
| * Copyright (c) 2010-2018 ARM Limited |
| * All rights reserved |
| * |
| * The license below extends only to copyright in the software and shall |
| * not be construed as granting a license to any other intellectual |
| * property including but not limited to intellectual property relating |
| * to a hardware implementation of the functionality of the software |
| * licensed hereunder. You may use the software subject to the license |
| * terms below provided that you ensure that this notice is replicated |
| * unmodified and in its entirety in all distributions of the software, |
| * modified or unmodified, in source code or in binary form. |
| * |
| * Copyright (c) 2009 The Regents of The University of Michigan |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are |
| * met: redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer; |
| * redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution; |
| * neither the name of the copyright holders nor the names of its |
| * contributors may be used to endorse or promote products derived from |
| * this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| * |
| * Authors: Gabe Black |
| * Giacomo Gabrielli |
| */ |
| #ifndef __ARCH_ARM_MISCREGS_HH__ |
| #define __ARCH_ARM_MISCREGS_HH__ |
| |
| #include <bitset> |
| #include <tuple> |
| |
| #include "arch/arm/miscregs_types.hh" |
| #include "base/compiler.hh" |
| |
| class ThreadContext; |
| |
| |
| namespace ArmISA |
| { |
| enum MiscRegIndex { |
| MISCREG_CPSR = 0, // 0 |
| MISCREG_SPSR, // 1 |
| MISCREG_SPSR_FIQ, // 2 |
| MISCREG_SPSR_IRQ, // 3 |
| MISCREG_SPSR_SVC, // 4 |
| MISCREG_SPSR_MON, // 5 |
| MISCREG_SPSR_ABT, // 6 |
| MISCREG_SPSR_HYP, // 7 |
| MISCREG_SPSR_UND, // 8 |
| MISCREG_ELR_HYP, // 9 |
| MISCREG_FPSID, // 10 |
| MISCREG_FPSCR, // 11 |
| MISCREG_MVFR1, // 12 |
| MISCREG_MVFR0, // 13 |
| MISCREG_FPEXC, // 14 |
| |
| // Helper registers |
| MISCREG_CPSR_MODE, // 15 |
| MISCREG_CPSR_Q, // 16 |
| MISCREG_FPSCR_EXC, // 17 |
| MISCREG_FPSCR_QC, // 18 |
| MISCREG_LOCKADDR, // 19 |
| MISCREG_LOCKFLAG, // 20 |
| MISCREG_PRRR_MAIR0, // 21 |
| MISCREG_PRRR_MAIR0_NS, // 22 |
| MISCREG_PRRR_MAIR0_S, // 23 |
| MISCREG_NMRR_MAIR1, // 24 |
| MISCREG_NMRR_MAIR1_NS, // 25 |
| MISCREG_NMRR_MAIR1_S, // 26 |
| MISCREG_PMXEVTYPER_PMCCFILTR, // 27 |
| MISCREG_SCTLR_RST, // 28 |
| MISCREG_SEV_MAILBOX, // 29 |
| |
| // AArch32 CP14 registers (debug/trace/ThumbEE/Jazelle control) |
| MISCREG_DBGDIDR, // 30 |
| MISCREG_DBGDSCRint, // 31 |
| MISCREG_DBGDCCINT, // 32 |
| MISCREG_DBGDTRTXint, // 33 |
| MISCREG_DBGDTRRXint, // 34 |
| MISCREG_DBGWFAR, // 35 |
| MISCREG_DBGVCR, // 36 |
| MISCREG_DBGDTRRXext, // 37 |
| MISCREG_DBGDSCRext, // 38 |
| MISCREG_DBGDTRTXext, // 39 |
| MISCREG_DBGOSECCR, // 40 |
| MISCREG_DBGBVR0, // 41 |
| MISCREG_DBGBVR1, // 42 |
| MISCREG_DBGBVR2, // 43 |
| MISCREG_DBGBVR3, // 44 |
| MISCREG_DBGBVR4, // 45 |
| MISCREG_DBGBVR5, // 46 |
| MISCREG_DBGBCR0, // 47 |
| MISCREG_DBGBCR1, // 48 |
| MISCREG_DBGBCR2, // 49 |
| MISCREG_DBGBCR3, // 50 |
| MISCREG_DBGBCR4, // 51 |
| MISCREG_DBGBCR5, // 52 |
| MISCREG_DBGWVR0, // 53 |
| MISCREG_DBGWVR1, // 54 |
| MISCREG_DBGWVR2, // 55 |
| MISCREG_DBGWVR3, // 56 |
| MISCREG_DBGWCR0, // 57 |
| MISCREG_DBGWCR1, // 58 |
| MISCREG_DBGWCR2, // 59 |
| MISCREG_DBGWCR3, // 60 |
| MISCREG_DBGDRAR, // 61 |
| MISCREG_DBGBXVR4, // 62 |
| MISCREG_DBGBXVR5, // 63 |
| MISCREG_DBGOSLAR, // 64 |
| MISCREG_DBGOSLSR, // 65 |
| MISCREG_DBGOSDLR, // 66 |
| MISCREG_DBGPRCR, // 67 |
| MISCREG_DBGDSAR, // 68 |
| MISCREG_DBGCLAIMSET, // 69 |
| MISCREG_DBGCLAIMCLR, // 70 |
| MISCREG_DBGAUTHSTATUS, // 71 |
| MISCREG_DBGDEVID2, // 72 |
| MISCREG_DBGDEVID1, // 73 |
| MISCREG_DBGDEVID0, // 74 |
| MISCREG_TEECR, // 75, not in ARM DDI 0487A.b+ |
| MISCREG_JIDR, // 76 |
| MISCREG_TEEHBR, // 77, not in ARM DDI 0487A.b+ |
| MISCREG_JOSCR, // 78 |
| MISCREG_JMCR, // 79 |
| |
| // AArch32 CP15 registers (system control) |
| MISCREG_MIDR, // 80 |
| MISCREG_CTR, // 81 |
| MISCREG_TCMTR, // 82 |
| MISCREG_TLBTR, // 83 |
| MISCREG_MPIDR, // 84 |
| MISCREG_REVIDR, // 85 |
| MISCREG_ID_PFR0, // 86 |
| MISCREG_ID_PFR1, // 87 |
| MISCREG_ID_DFR0, // 88 |
| MISCREG_ID_AFR0, // 89 |
| MISCREG_ID_MMFR0, // 90 |
| MISCREG_ID_MMFR1, // 91 |
| MISCREG_ID_MMFR2, // 92 |
| MISCREG_ID_MMFR3, // 93 |
| MISCREG_ID_ISAR0, // 94 |
| MISCREG_ID_ISAR1, // 95 |
| MISCREG_ID_ISAR2, // 96 |
| MISCREG_ID_ISAR3, // 97 |
| MISCREG_ID_ISAR4, // 98 |
| MISCREG_ID_ISAR5, // 99 |
| MISCREG_CCSIDR, // 100 |
| MISCREG_CLIDR, // 101 |
| MISCREG_AIDR, // 102 |
| MISCREG_CSSELR, // 103 |
| MISCREG_CSSELR_NS, // 104 |
| MISCREG_CSSELR_S, // 105 |
| MISCREG_VPIDR, // 106 |
| MISCREG_VMPIDR, // 107 |
| MISCREG_SCTLR, // 108 |
| MISCREG_SCTLR_NS, // 109 |
| MISCREG_SCTLR_S, // 110 |
| MISCREG_ACTLR, // 111 |
| MISCREG_ACTLR_NS, // 112 |
| MISCREG_ACTLR_S, // 113 |
| MISCREG_CPACR, // 114 |
| MISCREG_SCR, // 115 |
| MISCREG_SDER, // 116 |
| MISCREG_NSACR, // 117 |
| MISCREG_HSCTLR, // 118 |
| MISCREG_HACTLR, // 119 |
| MISCREG_HCR, // 120 |
| MISCREG_HDCR, // 121 |
| MISCREG_HCPTR, // 122 |
| MISCREG_HSTR, // 123 |
| MISCREG_HACR, // 124 |
| MISCREG_TTBR0, // 125 |
| MISCREG_TTBR0_NS, // 126 |
| MISCREG_TTBR0_S, // 127 |
| MISCREG_TTBR1, // 128 |
| MISCREG_TTBR1_NS, // 129 |
| MISCREG_TTBR1_S, // 130 |
| MISCREG_TTBCR, // 131 |
| MISCREG_TTBCR_NS, // 132 |
| MISCREG_TTBCR_S, // 133 |
| MISCREG_HTCR, // 134 |
| MISCREG_VTCR, // 135 |
| MISCREG_DACR, // 136 |
| MISCREG_DACR_NS, // 137 |
| MISCREG_DACR_S, // 138 |
| MISCREG_DFSR, // 139 |
| MISCREG_DFSR_NS, // 140 |
| MISCREG_DFSR_S, // 141 |
| MISCREG_IFSR, // 142 |
| MISCREG_IFSR_NS, // 143 |
| MISCREG_IFSR_S, // 144 |
| MISCREG_ADFSR, // 145 |
| MISCREG_ADFSR_NS, // 146 |
| MISCREG_ADFSR_S, // 147 |
| MISCREG_AIFSR, // 148 |
| MISCREG_AIFSR_NS, // 149 |
| MISCREG_AIFSR_S, // 150 |
| MISCREG_HADFSR, // 151 |
| MISCREG_HAIFSR, // 152 |
| MISCREG_HSR, // 153 |
| MISCREG_DFAR, // 154 |
| MISCREG_DFAR_NS, // 155 |
| MISCREG_DFAR_S, // 156 |
| MISCREG_IFAR, // 157 |
| MISCREG_IFAR_NS, // 158 |
| MISCREG_IFAR_S, // 159 |
| MISCREG_HDFAR, // 160 |
| MISCREG_HIFAR, // 161 |
| MISCREG_HPFAR, // 162 |
| MISCREG_ICIALLUIS, // 163 |
| MISCREG_BPIALLIS, // 164 |
| MISCREG_PAR, // 165 |
| MISCREG_PAR_NS, // 166 |
| MISCREG_PAR_S, // 167 |
| MISCREG_ICIALLU, // 168 |
| MISCREG_ICIMVAU, // 169 |
| MISCREG_CP15ISB, // 170 |
| MISCREG_BPIALL, // 171 |
| MISCREG_BPIMVA, // 172 |
| MISCREG_DCIMVAC, // 173 |
| MISCREG_DCISW, // 174 |
| MISCREG_ATS1CPR, // 175 |
| MISCREG_ATS1CPW, // 176 |
| MISCREG_ATS1CUR, // 177 |
| MISCREG_ATS1CUW, // 178 |
| MISCREG_ATS12NSOPR, // 179 |
| MISCREG_ATS12NSOPW, // 180 |
| MISCREG_ATS12NSOUR, // 181 |
| MISCREG_ATS12NSOUW, // 182 |
| MISCREG_DCCMVAC, // 183 |
| MISCREG_DCCSW, // 184 |
| MISCREG_CP15DSB, // 185 |
| MISCREG_CP15DMB, // 186 |
| MISCREG_DCCMVAU, // 187 |
| MISCREG_DCCIMVAC, // 188 |
| MISCREG_DCCISW, // 189 |
| MISCREG_ATS1HR, // 190 |
| MISCREG_ATS1HW, // 191 |
| MISCREG_TLBIALLIS, // 192 |
| MISCREG_TLBIMVAIS, // 193 |
| MISCREG_TLBIASIDIS, // 194 |
| MISCREG_TLBIMVAAIS, // 195 |
| MISCREG_TLBIMVALIS, // 196 |
| MISCREG_TLBIMVAALIS, // 197 |
| MISCREG_ITLBIALL, // 198 |
| MISCREG_ITLBIMVA, // 199 |
| MISCREG_ITLBIASID, // 200 |
| MISCREG_DTLBIALL, // 201 |
| MISCREG_DTLBIMVA, // 202 |
| MISCREG_DTLBIASID, // 203 |
| MISCREG_TLBIALL, // 204 |
| MISCREG_TLBIMVA, // 205 |
| MISCREG_TLBIASID, // 206 |
| MISCREG_TLBIMVAA, // 207 |
| MISCREG_TLBIMVAL, // 208 |
| MISCREG_TLBIMVAAL, // 209 |
| MISCREG_TLBIIPAS2IS, // 210 |
| MISCREG_TLBIIPAS2LIS, // 211 |
| MISCREG_TLBIALLHIS, // 212 |
| MISCREG_TLBIMVAHIS, // 213 |
| MISCREG_TLBIALLNSNHIS, // 214 |
| MISCREG_TLBIMVALHIS, // 215 |
| MISCREG_TLBIIPAS2, // 216 |
| MISCREG_TLBIIPAS2L, // 217 |
| MISCREG_TLBIALLH, // 218 |
| MISCREG_TLBIMVAH, // 219 |
| MISCREG_TLBIALLNSNH, // 220 |
| MISCREG_TLBIMVALH, // 221 |
| MISCREG_PMCR, // 222 |
| MISCREG_PMCNTENSET, // 223 |
| MISCREG_PMCNTENCLR, // 224 |
| MISCREG_PMOVSR, // 225 |
| MISCREG_PMSWINC, // 226 |
| MISCREG_PMSELR, // 227 |
| MISCREG_PMCEID0, // 228 |
| MISCREG_PMCEID1, // 229 |
| MISCREG_PMCCNTR, // 230 |
| MISCREG_PMXEVTYPER, // 231 |
| MISCREG_PMCCFILTR, // 232 |
| MISCREG_PMXEVCNTR, // 233 |
| MISCREG_PMUSERENR, // 234 |
| MISCREG_PMINTENSET, // 235 |
| MISCREG_PMINTENCLR, // 236 |
| MISCREG_PMOVSSET, // 237 |
| MISCREG_L2CTLR, // 238 |
| MISCREG_L2ECTLR, // 239 |
| MISCREG_PRRR, // 240 |
| MISCREG_PRRR_NS, // 241 |
| MISCREG_PRRR_S, // 242 |
| MISCREG_MAIR0, // 243 |
| MISCREG_MAIR0_NS, // 244 |
| MISCREG_MAIR0_S, // 245 |
| MISCREG_NMRR, // 246 |
| MISCREG_NMRR_NS, // 247 |
| MISCREG_NMRR_S, // 248 |
| MISCREG_MAIR1, // 249 |
| MISCREG_MAIR1_NS, // 250 |
| MISCREG_MAIR1_S, // 251 |
| MISCREG_AMAIR0, // 252 |
| MISCREG_AMAIR0_NS, // 253 |
| MISCREG_AMAIR0_S, // 254 |
| MISCREG_AMAIR1, // 255 |
| MISCREG_AMAIR1_NS, // 256 |
| MISCREG_AMAIR1_S, // 257 |
| MISCREG_HMAIR0, // 258 |
| MISCREG_HMAIR1, // 259 |
| MISCREG_HAMAIR0, // 260 |
| MISCREG_HAMAIR1, // 261 |
| MISCREG_VBAR, // 262 |
| MISCREG_VBAR_NS, // 263 |
| MISCREG_VBAR_S, // 264 |
| MISCREG_MVBAR, // 265 |
| MISCREG_RMR, // 266 |
| MISCREG_ISR, // 267 |
| MISCREG_HVBAR, // 268 |
| MISCREG_FCSEIDR, // 269 |
| MISCREG_CONTEXTIDR, // 270 |
| MISCREG_CONTEXTIDR_NS, // 271 |
| MISCREG_CONTEXTIDR_S, // 272 |
| MISCREG_TPIDRURW, // 273 |
| MISCREG_TPIDRURW_NS, // 274 |
| MISCREG_TPIDRURW_S, // 275 |
| MISCREG_TPIDRURO, // 276 |
| MISCREG_TPIDRURO_NS, // 277 |
| MISCREG_TPIDRURO_S, // 278 |
| MISCREG_TPIDRPRW, // 279 |
| MISCREG_TPIDRPRW_NS, // 280 |
| MISCREG_TPIDRPRW_S, // 281 |
| MISCREG_HTPIDR, // 282 |
| MISCREG_CNTFRQ, // 283 |
| MISCREG_CNTKCTL, // 284 |
| MISCREG_CNTP_TVAL, // 285 |
| MISCREG_CNTP_TVAL_NS, // 286 |
| MISCREG_CNTP_TVAL_S, // 287 |
| MISCREG_CNTP_CTL, // 288 |
| MISCREG_CNTP_CTL_NS, // 289 |
| MISCREG_CNTP_CTL_S, // 290 |
| MISCREG_CNTV_TVAL, // 291 |
| MISCREG_CNTV_CTL, // 292 |
| MISCREG_CNTHCTL, // 293 |
| MISCREG_CNTHP_TVAL, // 294 |
| MISCREG_CNTHP_CTL, // 295 |
| MISCREG_IL1DATA0, // 296 |
| MISCREG_IL1DATA1, // 297 |
| MISCREG_IL1DATA2, // 298 |
| MISCREG_IL1DATA3, // 299 |
| MISCREG_DL1DATA0, // 300 |
| MISCREG_DL1DATA1, // 301 |
| MISCREG_DL1DATA2, // 302 |
| MISCREG_DL1DATA3, // 303 |
| MISCREG_DL1DATA4, // 304 |
| MISCREG_RAMINDEX, // 305 |
| MISCREG_L2ACTLR, // 306 |
| MISCREG_CBAR, // 307 |
| MISCREG_HTTBR, // 308 |
| MISCREG_VTTBR, // 309 |
| MISCREG_CNTPCT, // 310 |
| MISCREG_CNTVCT, // 311 |
| MISCREG_CNTP_CVAL, // 312 |
| MISCREG_CNTP_CVAL_NS, // 313 |
| MISCREG_CNTP_CVAL_S, // 314 |
| MISCREG_CNTV_CVAL, // 315 |
| MISCREG_CNTVOFF, // 316 |
| MISCREG_CNTHP_CVAL, // 317 |
| MISCREG_CPUMERRSR, // 318 |
| MISCREG_L2MERRSR, // 319 |
| |
| // AArch64 registers (Op0=2) |
| MISCREG_MDCCINT_EL1, // 320 |
| MISCREG_OSDTRRX_EL1, // 321 |
| MISCREG_MDSCR_EL1, // 322 |
| MISCREG_OSDTRTX_EL1, // 323 |
| MISCREG_OSECCR_EL1, // 324 |
| MISCREG_DBGBVR0_EL1, // 325 |
| MISCREG_DBGBVR1_EL1, // 326 |
| MISCREG_DBGBVR2_EL1, // 327 |
| MISCREG_DBGBVR3_EL1, // 328 |
| MISCREG_DBGBVR4_EL1, // 329 |
| MISCREG_DBGBVR5_EL1, // 330 |
| MISCREG_DBGBCR0_EL1, // 331 |
| MISCREG_DBGBCR1_EL1, // 332 |
| MISCREG_DBGBCR2_EL1, // 333 |
| MISCREG_DBGBCR3_EL1, // 334 |
| MISCREG_DBGBCR4_EL1, // 335 |
| MISCREG_DBGBCR5_EL1, // 336 |
| MISCREG_DBGWVR0_EL1, // 337 |
| MISCREG_DBGWVR1_EL1, // 338 |
| MISCREG_DBGWVR2_EL1, // 339 |
| MISCREG_DBGWVR3_EL1, // 340 |
| MISCREG_DBGWCR0_EL1, // 341 |
| MISCREG_DBGWCR1_EL1, // 342 |
| MISCREG_DBGWCR2_EL1, // 343 |
| MISCREG_DBGWCR3_EL1, // 344 |
| MISCREG_MDCCSR_EL0, // 345 |
| MISCREG_MDDTR_EL0, // 346 |
| MISCREG_MDDTRTX_EL0, // 347 |
| MISCREG_MDDTRRX_EL0, // 348 |
| MISCREG_DBGVCR32_EL2, // 349 |
| MISCREG_MDRAR_EL1, // 350 |
| MISCREG_OSLAR_EL1, // 351 |
| MISCREG_OSLSR_EL1, // 352 |
| MISCREG_OSDLR_EL1, // 353 |
| MISCREG_DBGPRCR_EL1, // 354 |
| MISCREG_DBGCLAIMSET_EL1, // 355 |
| MISCREG_DBGCLAIMCLR_EL1, // 356 |
| MISCREG_DBGAUTHSTATUS_EL1, // 357 |
| MISCREG_TEECR32_EL1, // 358, not in ARM DDI 0487A.b+ |
| MISCREG_TEEHBR32_EL1, // 359, not in ARM DDI 0487A.b+ |
| |
| // AArch64 registers (Op0=1,3) |
| MISCREG_MIDR_EL1, // 360 |
| MISCREG_MPIDR_EL1, // 361 |
| MISCREG_REVIDR_EL1, // 362 |
| MISCREG_ID_PFR0_EL1, // 363 |
| MISCREG_ID_PFR1_EL1, // 364 |
| MISCREG_ID_DFR0_EL1, // 365 |
| MISCREG_ID_AFR0_EL1, // 366 |
| MISCREG_ID_MMFR0_EL1, // 367 |
| MISCREG_ID_MMFR1_EL1, // 368 |
| MISCREG_ID_MMFR2_EL1, // 369 |
| MISCREG_ID_MMFR3_EL1, // 370 |
| MISCREG_ID_ISAR0_EL1, // 371 |
| MISCREG_ID_ISAR1_EL1, // 372 |
| MISCREG_ID_ISAR2_EL1, // 373 |
| MISCREG_ID_ISAR3_EL1, // 374 |
| MISCREG_ID_ISAR4_EL1, // 375 |
| MISCREG_ID_ISAR5_EL1, // 376 |
| MISCREG_MVFR0_EL1, // 377 |
| MISCREG_MVFR1_EL1, // 378 |
| MISCREG_MVFR2_EL1, // 379 |
| MISCREG_ID_AA64PFR0_EL1, // 380 |
| MISCREG_ID_AA64PFR1_EL1, // 381 |
| MISCREG_ID_AA64DFR0_EL1, // 382 |
| MISCREG_ID_AA64DFR1_EL1, // 383 |
| MISCREG_ID_AA64AFR0_EL1, // 384 |
| MISCREG_ID_AA64AFR1_EL1, // 385 |
| MISCREG_ID_AA64ISAR0_EL1, // 386 |
| MISCREG_ID_AA64ISAR1_EL1, // 387 |
| MISCREG_ID_AA64MMFR0_EL1, // 388 |
| MISCREG_ID_AA64MMFR1_EL1, // 389 |
| MISCREG_CCSIDR_EL1, // 390 |
| MISCREG_CLIDR_EL1, // 391 |
| MISCREG_AIDR_EL1, // 392 |
| MISCREG_CSSELR_EL1, // 393 |
| MISCREG_CTR_EL0, // 394 |
| MISCREG_DCZID_EL0, // 395 |
| MISCREG_VPIDR_EL2, // 396 |
| MISCREG_VMPIDR_EL2, // 397 |
| MISCREG_SCTLR_EL1, // 398 |
| MISCREG_ACTLR_EL1, // 399 |
| MISCREG_CPACR_EL1, // 400 |
| MISCREG_SCTLR_EL2, // 401 |
| MISCREG_ACTLR_EL2, // 402 |
| MISCREG_HCR_EL2, // 403 |
| MISCREG_MDCR_EL2, // 404 |
| MISCREG_CPTR_EL2, // 405 |
| MISCREG_HSTR_EL2, // 406 |
| MISCREG_HACR_EL2, // 407 |
| MISCREG_SCTLR_EL3, // 408 |
| MISCREG_ACTLR_EL3, // 409 |
| MISCREG_SCR_EL3, // 410 |
| MISCREG_SDER32_EL3, // 411 |
| MISCREG_CPTR_EL3, // 412 |
| MISCREG_MDCR_EL3, // 413 |
| MISCREG_TTBR0_EL1, // 414 |
| MISCREG_TTBR1_EL1, // 415 |
| MISCREG_TCR_EL1, // 416 |
| MISCREG_TTBR0_EL2, // 417 |
| MISCREG_TCR_EL2, // 418 |
| MISCREG_VTTBR_EL2, // 419 |
| MISCREG_VTCR_EL2, // 420 |
| MISCREG_TTBR0_EL3, // 421 |
| MISCREG_TCR_EL3, // 422 |
| MISCREG_DACR32_EL2, // 423 |
| MISCREG_SPSR_EL1, // 424 |
| MISCREG_ELR_EL1, // 425 |
| MISCREG_SP_EL0, // 426 |
| MISCREG_SPSEL, // 427 |
| MISCREG_CURRENTEL, // 428 |
| MISCREG_NZCV, // 429 |
| MISCREG_DAIF, // 430 |
| MISCREG_FPCR, // 431 |
| MISCREG_FPSR, // 432 |
| MISCREG_DSPSR_EL0, // 433 |
| MISCREG_DLR_EL0, // 434 |
| MISCREG_SPSR_EL2, // 435 |
| MISCREG_ELR_EL2, // 436 |
| MISCREG_SP_EL1, // 437 |
| MISCREG_SPSR_IRQ_AA64, // 438 |
| MISCREG_SPSR_ABT_AA64, // 439 |
| MISCREG_SPSR_UND_AA64, // 440 |
| MISCREG_SPSR_FIQ_AA64, // 441 |
| MISCREG_SPSR_EL3, // 442 |
| MISCREG_ELR_EL3, // 443 |
| MISCREG_SP_EL2, // 444 |
| MISCREG_AFSR0_EL1, // 445 |
| MISCREG_AFSR1_EL1, // 446 |
| MISCREG_ESR_EL1, // 447 |
| MISCREG_IFSR32_EL2, // 448 |
| MISCREG_AFSR0_EL2, // 449 |
| MISCREG_AFSR1_EL2, // 450 |
| MISCREG_ESR_EL2, // 451 |
| MISCREG_FPEXC32_EL2, // 452 |
| MISCREG_AFSR0_EL3, // 453 |
| MISCREG_AFSR1_EL3, // 454 |
| MISCREG_ESR_EL3, // 455 |
| MISCREG_FAR_EL1, // 456 |
| MISCREG_FAR_EL2, // 457 |
| MISCREG_HPFAR_EL2, // 458 |
| MISCREG_FAR_EL3, // 459 |
| MISCREG_IC_IALLUIS, // 460 |
| MISCREG_PAR_EL1, // 461 |
| MISCREG_IC_IALLU, // 462 |
| MISCREG_DC_IVAC_Xt, // 463 |
| MISCREG_DC_ISW_Xt, // 464 |
| MISCREG_AT_S1E1R_Xt, // 465 |
| MISCREG_AT_S1E1W_Xt, // 466 |
| MISCREG_AT_S1E0R_Xt, // 467 |
| MISCREG_AT_S1E0W_Xt, // 468 |
| MISCREG_DC_CSW_Xt, // 469 |
| MISCREG_DC_CISW_Xt, // 470 |
| MISCREG_DC_ZVA_Xt, // 471 |
| MISCREG_IC_IVAU_Xt, // 472 |
| MISCREG_DC_CVAC_Xt, // 473 |
| MISCREG_DC_CVAU_Xt, // 474 |
| MISCREG_DC_CIVAC_Xt, // 475 |
| MISCREG_AT_S1E2R_Xt, // 476 |
| MISCREG_AT_S1E2W_Xt, // 477 |
| MISCREG_AT_S12E1R_Xt, // 478 |
| MISCREG_AT_S12E1W_Xt, // 479 |
| MISCREG_AT_S12E0R_Xt, // 480 |
| MISCREG_AT_S12E0W_Xt, // 481 |
| MISCREG_AT_S1E3R_Xt, // 482 |
| MISCREG_AT_S1E3W_Xt, // 483 |
| MISCREG_TLBI_VMALLE1IS, // 484 |
| MISCREG_TLBI_VAE1IS_Xt, // 485 |
| MISCREG_TLBI_ASIDE1IS_Xt, // 486 |
| MISCREG_TLBI_VAAE1IS_Xt, // 487 |
| MISCREG_TLBI_VALE1IS_Xt, // 488 |
| MISCREG_TLBI_VAALE1IS_Xt, // 489 |
| MISCREG_TLBI_VMALLE1, // 490 |
| MISCREG_TLBI_VAE1_Xt, // 491 |
| MISCREG_TLBI_ASIDE1_Xt, // 492 |
| MISCREG_TLBI_VAAE1_Xt, // 493 |
| MISCREG_TLBI_VALE1_Xt, // 494 |
| MISCREG_TLBI_VAALE1_Xt, // 495 |
| MISCREG_TLBI_IPAS2E1IS_Xt, // 496 |
| MISCREG_TLBI_IPAS2LE1IS_Xt, // 497 |
| MISCREG_TLBI_ALLE2IS, // 498 |
| MISCREG_TLBI_VAE2IS_Xt, // 499 |
| MISCREG_TLBI_ALLE1IS, // 500 |
| MISCREG_TLBI_VALE2IS_Xt, // 501 |
| MISCREG_TLBI_VMALLS12E1IS, // 502 |
| MISCREG_TLBI_IPAS2E1_Xt, // 503 |
| MISCREG_TLBI_IPAS2LE1_Xt, // 504 |
| MISCREG_TLBI_ALLE2, // 505 |
| MISCREG_TLBI_VAE2_Xt, // 506 |
| MISCREG_TLBI_ALLE1, // 507 |
| MISCREG_TLBI_VALE2_Xt, // 508 |
| MISCREG_TLBI_VMALLS12E1, // 509 |
| MISCREG_TLBI_ALLE3IS, // 510 |
| MISCREG_TLBI_VAE3IS_Xt, // 511 |
| MISCREG_TLBI_VALE3IS_Xt, // 512 |
| MISCREG_TLBI_ALLE3, // 513 |
| MISCREG_TLBI_VAE3_Xt, // 514 |
| MISCREG_TLBI_VALE3_Xt, // 515 |
| MISCREG_PMINTENSET_EL1, // 516 |
| MISCREG_PMINTENCLR_EL1, // 517 |
| MISCREG_PMCR_EL0, // 518 |
| MISCREG_PMCNTENSET_EL0, // 519 |
| MISCREG_PMCNTENCLR_EL0, // 520 |
| MISCREG_PMOVSCLR_EL0, // 521 |
| MISCREG_PMSWINC_EL0, // 522 |
| MISCREG_PMSELR_EL0, // 523 |
| MISCREG_PMCEID0_EL0, // 524 |
| MISCREG_PMCEID1_EL0, // 525 |
| MISCREG_PMCCNTR_EL0, // 526 |
| MISCREG_PMXEVTYPER_EL0, // 527 |
| MISCREG_PMCCFILTR_EL0, // 528 |
| MISCREG_PMXEVCNTR_EL0, // 529 |
| MISCREG_PMUSERENR_EL0, // 530 |
| MISCREG_PMOVSSET_EL0, // 531 |
| MISCREG_MAIR_EL1, // 532 |
| MISCREG_AMAIR_EL1, // 533 |
| MISCREG_MAIR_EL2, // 534 |
| MISCREG_AMAIR_EL2, // 535 |
| MISCREG_MAIR_EL3, // 536 |
| MISCREG_AMAIR_EL3, // 537 |
| MISCREG_L2CTLR_EL1, // 538 |
| MISCREG_L2ECTLR_EL1, // 539 |
| MISCREG_VBAR_EL1, // 540 |
| MISCREG_RVBAR_EL1, // 541 |
| MISCREG_ISR_EL1, // 542 |
| MISCREG_VBAR_EL2, // 543 |
| MISCREG_RVBAR_EL2, // 544 |
| MISCREG_VBAR_EL3, // 545 |
| MISCREG_RVBAR_EL3, // 546 |
| MISCREG_RMR_EL3, // 547 |
| MISCREG_CONTEXTIDR_EL1, // 548 |
| MISCREG_TPIDR_EL1, // 549 |
| MISCREG_TPIDR_EL0, // 550 |
| MISCREG_TPIDRRO_EL0, // 551 |
| MISCREG_TPIDR_EL2, // 552 |
| MISCREG_TPIDR_EL3, // 553 |
| MISCREG_CNTKCTL_EL1, // 554 |
| MISCREG_CNTFRQ_EL0, // 555 |
| MISCREG_CNTPCT_EL0, // 556 |
| MISCREG_CNTVCT_EL0, // 557 |
| MISCREG_CNTP_TVAL_EL0, // 558 |
| MISCREG_CNTP_CTL_EL0, // 559 |
| MISCREG_CNTP_CVAL_EL0, // 560 |
| MISCREG_CNTV_TVAL_EL0, // 561 |
| MISCREG_CNTV_CTL_EL0, // 562 |
| MISCREG_CNTV_CVAL_EL0, // 563 |
| MISCREG_PMEVCNTR0_EL0, // 564 |
| MISCREG_PMEVCNTR1_EL0, // 565 |
| MISCREG_PMEVCNTR2_EL0, // 566 |
| MISCREG_PMEVCNTR3_EL0, // 567 |
| MISCREG_PMEVCNTR4_EL0, // 568 |
| MISCREG_PMEVCNTR5_EL0, // 569 |
| MISCREG_PMEVTYPER0_EL0, // 570 |
| MISCREG_PMEVTYPER1_EL0, // 571 |
| MISCREG_PMEVTYPER2_EL0, // 572 |
| MISCREG_PMEVTYPER3_EL0, // 573 |
| MISCREG_PMEVTYPER4_EL0, // 574 |
| MISCREG_PMEVTYPER5_EL0, // 575 |
| MISCREG_CNTVOFF_EL2, // 576 |
| MISCREG_CNTHCTL_EL2, // 577 |
| MISCREG_CNTHP_TVAL_EL2, // 578 |
| MISCREG_CNTHP_CTL_EL2, // 579 |
| MISCREG_CNTHP_CVAL_EL2, // 580 |
| MISCREG_CNTPS_TVAL_EL1, // 581 |
| MISCREG_CNTPS_CTL_EL1, // 582 |
| MISCREG_CNTPS_CVAL_EL1, // 583 |
| MISCREG_IL1DATA0_EL1, // 584 |
| MISCREG_IL1DATA1_EL1, // 585 |
| MISCREG_IL1DATA2_EL1, // 586 |
| MISCREG_IL1DATA3_EL1, // 587 |
| MISCREG_DL1DATA0_EL1, // 588 |
| MISCREG_DL1DATA1_EL1, // 589 |
| MISCREG_DL1DATA2_EL1, // 590 |
| MISCREG_DL1DATA3_EL1, // 591 |
| MISCREG_DL1DATA4_EL1, // 592 |
| MISCREG_L2ACTLR_EL1, // 593 |
| MISCREG_CPUACTLR_EL1, // 594 |
| MISCREG_CPUECTLR_EL1, // 595 |
| MISCREG_CPUMERRSR_EL1, // 596 |
| MISCREG_L2MERRSR_EL1, // 597 |
| MISCREG_CBAR_EL1, // 598 |
| MISCREG_CONTEXTIDR_EL2, // 599 |
| |
| // Introduced in ARMv8.1 |
| MISCREG_TTBR1_EL2, // 600 |
| MISCREG_CNTHV_CTL_EL2, // 601 |
| MISCREG_CNTHV_CVAL_EL2, // 602 |
| MISCREG_CNTHV_TVAL_EL2, // 603 |
| |
| MISCREG_ID_AA64MMFR2_EL1, // 604 |
| // These MISCREG_FREESLOT are available Misc Register |
| // slots for future registers to be implemented. |
| MISCREG_FREESLOT_1, // 605 |
| |
| // NUM_PHYS_MISCREGS specifies the number of actual physical |
| // registers, not considering the following pseudo-registers |
| // (dummy registers), like UNKNOWN, CP15_UNIMPL, MISCREG_IMPDEF_UNIMPL. |
| // Checkpointing should use this physical index when |
| // saving/restoring register values. |
| NUM_PHYS_MISCREGS = 606, // 606 |
| |
| // Dummy registers |
| MISCREG_NOP, |
| MISCREG_RAZ, |
| MISCREG_CP14_UNIMPL, |
| MISCREG_CP15_UNIMPL, |
| MISCREG_UNKNOWN, |
| |
| // Implementation defined register: this represent |
| // a pool of unimplemented registers whose access can throw |
| // either UNDEFINED or hypervisor trap exception. |
| MISCREG_IMPDEF_UNIMPL, |
| |
| // RAS extension (unimplemented) |
| MISCREG_ERRIDR_EL1, |
| MISCREG_ERRSELR_EL1, |
| MISCREG_ERXFR_EL1, |
| MISCREG_ERXCTLR_EL1, |
| MISCREG_ERXSTATUS_EL1, |
| MISCREG_ERXADDR_EL1, |
| MISCREG_ERXMISC0_EL1, |
| MISCREG_ERXMISC1_EL1, |
| MISCREG_DISR_EL1, |
| MISCREG_VSESR_EL2, |
| MISCREG_VDISR_EL2, |
| |
| // Total number of Misc Registers: Physical + Dummy |
| NUM_MISCREGS |
| }; |
| |
| enum MiscRegInfo { |
| MISCREG_IMPLEMENTED, |
| MISCREG_UNVERIFIABLE, // Does the value change on every read (e.g. a |
| // arch generic counter) |
| MISCREG_WARN_NOT_FAIL, // If MISCREG_IMPLEMENTED is deasserted, it |
| // tells whether the instruction should raise a |
| // warning or fail |
| MISCREG_MUTEX, // True if the register corresponds to a pair of |
| // mutually exclusive registers |
| MISCREG_BANKED, // True if the register is banked between the two |
| // security states, and this is the parent node of the |
| // two banked registers |
| MISCREG_BANKED_CHILD, // The entry is one of the child registers that |
| // forms a banked set of regs (along with the |
| // other child regs) |
| |
| // Access permissions |
| // User mode |
| MISCREG_USR_NS_RD, |
| MISCREG_USR_NS_WR, |
| MISCREG_USR_S_RD, |
| MISCREG_USR_S_WR, |
| // Privileged modes other than hypervisor or monitor |
| MISCREG_PRI_NS_RD, |
| MISCREG_PRI_NS_WR, |
| MISCREG_PRI_S_RD, |
| MISCREG_PRI_S_WR, |
| // Hypervisor mode |
| MISCREG_HYP_RD, |
| MISCREG_HYP_WR, |
| // Monitor mode, SCR.NS == 0 |
| MISCREG_MON_NS0_RD, |
| MISCREG_MON_NS0_WR, |
| // Monitor mode, SCR.NS == 1 |
| MISCREG_MON_NS1_RD, |
| MISCREG_MON_NS1_WR, |
| |
| NUM_MISCREG_INFOS |
| }; |
| |
| extern std::bitset<NUM_MISCREG_INFOS> miscRegInfo[NUM_MISCREGS]; |
| |
| // Decodes 32-bit CP14 registers accessible through MCR/MRC instructions |
| MiscRegIndex decodeCP14Reg(unsigned crn, unsigned opc1, |
| unsigned crm, unsigned opc2); |
| MiscRegIndex decodeAArch64SysReg(unsigned op0, unsigned op1, |
| unsigned crn, unsigned crm, |
| unsigned op2); |
| // Whether a particular AArch64 system register is -always- read only. |
| bool aarch64SysRegReadOnly(MiscRegIndex miscReg); |
| |
| // Decodes 32-bit CP15 registers accessible through MCR/MRC instructions |
| MiscRegIndex decodeCP15Reg(unsigned crn, unsigned opc1, |
| unsigned crm, unsigned opc2); |
| |
| // Decodes 64-bit CP15 registers accessible through MCRR/MRRC instructions |
| MiscRegIndex decodeCP15Reg64(unsigned crm, unsigned opc1); |
| |
| |
| const char * const miscRegName[] = { |
| "cpsr", |
| "spsr", |
| "spsr_fiq", |
| "spsr_irq", |
| "spsr_svc", |
| "spsr_mon", |
| "spsr_abt", |
| "spsr_hyp", |
| "spsr_und", |
| "elr_hyp", |
| "fpsid", |
| "fpscr", |
| "mvfr1", |
| "mvfr0", |
| "fpexc", |
| |
| // Helper registers |
| "cpsr_mode", |
| "cpsr_q", |
| "fpscr_exc", |
| "fpscr_qc", |
| "lockaddr", |
| "lockflag", |
| "prrr_mair0", |
| "prrr_mair0_ns", |
| "prrr_mair0_s", |
| "nmrr_mair1", |
| "nmrr_mair1_ns", |
| "nmrr_mair1_s", |
| "pmxevtyper_pmccfiltr", |
| "sctlr_rst", |
| "sev_mailbox", |
| |
| // AArch32 CP14 registers |
| "dbgdidr", |
| "dbgdscrint", |
| "dbgdccint", |
| "dbgdtrtxint", |
| "dbgdtrrxint", |
| "dbgwfar", |
| "dbgvcr", |
| "dbgdtrrxext", |
| "dbgdscrext", |
| "dbgdtrtxext", |
| "dbgoseccr", |
| "dbgbvr0", |
| "dbgbvr1", |
| "dbgbvr2", |
| "dbgbvr3", |
| "dbgbvr4", |
| "dbgbvr5", |
| "dbgbcr0", |
| "dbgbcr1", |
| "dbgbcr2", |
| "dbgbcr3", |
| "dbgbcr4", |
| "dbgbcr5", |
| "dbgwvr0", |
| "dbgwvr1", |
| "dbgwvr2", |
| "dbgwvr3", |
| "dbgwcr0", |
| "dbgwcr1", |
| "dbgwcr2", |
| "dbgwcr3", |
| "dbgdrar", |
| "dbgbxvr4", |
| "dbgbxvr5", |
| "dbgoslar", |
| "dbgoslsr", |
| "dbgosdlr", |
| "dbgprcr", |
| "dbgdsar", |
| "dbgclaimset", |
| "dbgclaimclr", |
| "dbgauthstatus", |
| "dbgdevid2", |
| "dbgdevid1", |
| "dbgdevid0", |
| "teecr", |
| "jidr", |
| "teehbr", |
| "joscr", |
| "jmcr", |
| |
| // AArch32 CP15 registers |
| "midr", |
| "ctr", |
| "tcmtr", |
| "tlbtr", |
| "mpidr", |
| "revidr", |
| "id_pfr0", |
| "id_pfr1", |
| "id_dfr0", |
| "id_afr0", |
| "id_mmfr0", |
| "id_mmfr1", |
| "id_mmfr2", |
| "id_mmfr3", |
| "id_isar0", |
| "id_isar1", |
| "id_isar2", |
| "id_isar3", |
| "id_isar4", |
| "id_isar5", |
| "ccsidr", |
| "clidr", |
| "aidr", |
| "csselr", |
| "csselr_ns", |
| "csselr_s", |
| "vpidr", |
| "vmpidr", |
| "sctlr", |
| "sctlr_ns", |
| "sctlr_s", |
| "actlr", |
| "actlr_ns", |
| "actlr_s", |
| "cpacr", |
| "scr", |
| "sder", |
| "nsacr", |
| "hsctlr", |
| "hactlr", |
| "hcr", |
| "hdcr", |
| "hcptr", |
| "hstr", |
| "hacr", |
| "ttbr0", |
| "ttbr0_ns", |
| "ttbr0_s", |
| "ttbr1", |
| "ttbr1_ns", |
| "ttbr1_s", |
| "ttbcr", |
| "ttbcr_ns", |
| "ttbcr_s", |
| "htcr", |
| "vtcr", |
| "dacr", |
| "dacr_ns", |
| "dacr_s", |
| "dfsr", |
| "dfsr_ns", |
| "dfsr_s", |
| "ifsr", |
| "ifsr_ns", |
| "ifsr_s", |
| "adfsr", |
| "adfsr_ns", |
| "adfsr_s", |
| "aifsr", |
| "aifsr_ns", |
| "aifsr_s", |
| "hadfsr", |
| "haifsr", |
| "hsr", |
| "dfar", |
| "dfar_ns", |
| "dfar_s", |
| "ifar", |
| "ifar_ns", |
| "ifar_s", |
| "hdfar", |
| "hifar", |
| "hpfar", |
| "icialluis", |
| "bpiallis", |
| "par", |
| "par_ns", |
| "par_s", |
| "iciallu", |
| "icimvau", |
| "cp15isb", |
| "bpiall", |
| "bpimva", |
| "dcimvac", |
| "dcisw", |
| "ats1cpr", |
| "ats1cpw", |
| "ats1cur", |
| "ats1cuw", |
| "ats12nsopr", |
| "ats12nsopw", |
| "ats12nsour", |
| "ats12nsouw", |
| "dccmvac", |
| "dccsw", |
| "cp15dsb", |
| "cp15dmb", |
| "dccmvau", |
| "dccimvac", |
| "dccisw", |
| "ats1hr", |
| "ats1hw", |
| "tlbiallis", |
| "tlbimvais", |
| "tlbiasidis", |
| "tlbimvaais", |
| "tlbimvalis", |
| "tlbimvaalis", |
| "itlbiall", |
| "itlbimva", |
| "itlbiasid", |
| "dtlbiall", |
| "dtlbimva", |
| "dtlbiasid", |
| "tlbiall", |
| "tlbimva", |
| "tlbiasid", |
| "tlbimvaa", |
| "tlbimval", |
| "tlbimvaal", |
| "tlbiipas2is", |
| "tlbiipas2lis", |
| "tlbiallhis", |
| "tlbimvahis", |
| "tlbiallnsnhis", |
| "tlbimvalhis", |
| "tlbiipas2", |
| "tlbiipas2l", |
| "tlbiallh", |
| "tlbimvah", |
| "tlbiallnsnh", |
| "tlbimvalh", |
| "pmcr", |
| "pmcntenset", |
| "pmcntenclr", |
| "pmovsr", |
| "pmswinc", |
| "pmselr", |
| "pmceid0", |
| "pmceid1", |
| "pmccntr", |
| "pmxevtyper", |
| "pmccfiltr", |
| "pmxevcntr", |
| "pmuserenr", |
| "pmintenset", |
| "pmintenclr", |
| "pmovsset", |
| "l2ctlr", |
| "l2ectlr", |
| "prrr", |
| "prrr_ns", |
| "prrr_s", |
| "mair0", |
| "mair0_ns", |
| "mair0_s", |
| "nmrr", |
| "nmrr_ns", |
| "nmrr_s", |
| "mair1", |
| "mair1_ns", |
| "mair1_s", |
| "amair0", |
| "amair0_ns", |
| "amair0_s", |
| "amair1", |
| "amair1_ns", |
| "amair1_s", |
| "hmair0", |
| "hmair1", |
| "hamair0", |
| "hamair1", |
| "vbar", |
| "vbar_ns", |
| "vbar_s", |
| "mvbar", |
| "rmr", |
| "isr", |
| "hvbar", |
| "fcseidr", |
| "contextidr", |
| "contextidr_ns", |
| "contextidr_s", |
| "tpidrurw", |
| "tpidrurw_ns", |
| "tpidrurw_s", |
| "tpidruro", |
| "tpidruro_ns", |
| "tpidruro_s", |
| "tpidrprw", |
| "tpidrprw_ns", |
| "tpidrprw_s", |
| "htpidr", |
| "cntfrq", |
| "cntkctl", |
| "cntp_tval", |
| "cntp_tval_ns", |
| "cntp_tval_s", |
| "cntp_ctl", |
| "cntp_ctl_ns", |
| "cntp_ctl_s", |
| "cntv_tval", |
| "cntv_ctl", |
| "cnthctl", |
| "cnthp_tval", |
| "cnthp_ctl", |
| "il1data0", |
| "il1data1", |
| "il1data2", |
| "il1data3", |
| "dl1data0", |
| "dl1data1", |
| "dl1data2", |
| "dl1data3", |
| "dl1data4", |
| "ramindex", |
| "l2actlr", |
| "cbar", |
| "httbr", |
| "vttbr", |
| "cntpct", |
| "cntvct", |
| "cntp_cval", |
| "cntp_cval_ns", |
| "cntp_cval_s", |
| "cntv_cval", |
| "cntvoff", |
| "cnthp_cval", |
| "cpumerrsr", |
| "l2merrsr", |
| |
| // AArch64 registers (Op0=2) |
| "mdccint_el1", |
| "osdtrrx_el1", |
| "mdscr_el1", |
| "osdtrtx_el1", |
| "oseccr_el1", |
| "dbgbvr0_el1", |
| "dbgbvr1_el1", |
| "dbgbvr2_el1", |
| "dbgbvr3_el1", |
| "dbgbvr4_el1", |
| "dbgbvr5_el1", |
| "dbgbcr0_el1", |
| "dbgbcr1_el1", |
| "dbgbcr2_el1", |
| "dbgbcr3_el1", |
| "dbgbcr4_el1", |
| "dbgbcr5_el1", |
| "dbgwvr0_el1", |
| "dbgwvr1_el1", |
| "dbgwvr2_el1", |
| "dbgwvr3_el1", |
| "dbgwcr0_el1", |
| "dbgwcr1_el1", |
| "dbgwcr2_el1", |
| "dbgwcr3_el1", |
| "mdccsr_el0", |
| "mddtr_el0", |
| "mddtrtx_el0", |
| "mddtrrx_el0", |
| "dbgvcr32_el2", |
| "mdrar_el1", |
| "oslar_el1", |
| "oslsr_el1", |
| "osdlr_el1", |
| "dbgprcr_el1", |
| "dbgclaimset_el1", |
| "dbgclaimclr_el1", |
| "dbgauthstatus_el1", |
| "teecr32_el1", |
| "teehbr32_el1", |
| |
| // AArch64 registers (Op0=1,3) |
| "midr_el1", |
| "mpidr_el1", |
| "revidr_el1", |
| "id_pfr0_el1", |
| "id_pfr1_el1", |
| "id_dfr0_el1", |
| "id_afr0_el1", |
| "id_mmfr0_el1", |
| "id_mmfr1_el1", |
| "id_mmfr2_el1", |
| "id_mmfr3_el1", |
| "id_isar0_el1", |
| "id_isar1_el1", |
| "id_isar2_el1", |
| "id_isar3_el1", |
| "id_isar4_el1", |
| "id_isar5_el1", |
| "mvfr0_el1", |
| "mvfr1_el1", |
| "mvfr2_el1", |
| "id_aa64pfr0_el1", |
| "id_aa64pfr1_el1", |
| "id_aa64dfr0_el1", |
| "id_aa64dfr1_el1", |
| "id_aa64afr0_el1", |
| "id_aa64afr1_el1", |
| "id_aa64isar0_el1", |
| "id_aa64isar1_el1", |
| "id_aa64mmfr0_el1", |
| "id_aa64mmfr1_el1", |
| "ccsidr_el1", |
| "clidr_el1", |
| "aidr_el1", |
| "csselr_el1", |
| "ctr_el0", |
| "dczid_el0", |
| "vpidr_el2", |
| "vmpidr_el2", |
| "sctlr_el1", |
| "actlr_el1", |
| "cpacr_el1", |
| "sctlr_el2", |
| "actlr_el2", |
| "hcr_el2", |
| "mdcr_el2", |
| "cptr_el2", |
| "hstr_el2", |
| "hacr_el2", |
| "sctlr_el3", |
| "actlr_el3", |
| "scr_el3", |
| "sder32_el3", |
| "cptr_el3", |
| "mdcr_el3", |
| "ttbr0_el1", |
| "ttbr1_el1", |
| "tcr_el1", |
| "ttbr0_el2", |
| "tcr_el2", |
| "vttbr_el2", |
| "vtcr_el2", |
| "ttbr0_el3", |
| "tcr_el3", |
| "dacr32_el2", |
| "spsr_el1", |
| "elr_el1", |
| "sp_el0", |
| "spsel", |
| "currentel", |
| "nzcv", |
| "daif", |
| "fpcr", |
| "fpsr", |
| "dspsr_el0", |
| "dlr_el0", |
| "spsr_el2", |
| "elr_el2", |
| "sp_el1", |
| "spsr_irq_aa64", |
| "spsr_abt_aa64", |
| "spsr_und_aa64", |
| "spsr_fiq_aa64", |
| "spsr_el3", |
| "elr_el3", |
| "sp_el2", |
| "afsr0_el1", |
| "afsr1_el1", |
| "esr_el1", |
| "ifsr32_el2", |
| "afsr0_el2", |
| "afsr1_el2", |
| "esr_el2", |
| "fpexc32_el2", |
| "afsr0_el3", |
| "afsr1_el3", |
| "esr_el3", |
| "far_el1", |
| "far_el2", |
| "hpfar_el2", |
| "far_el3", |
| "ic_ialluis", |
| "par_el1", |
| "ic_iallu", |
| "dc_ivac_xt", |
| "dc_isw_xt", |
| "at_s1e1r_xt", |
| "at_s1e1w_xt", |
| "at_s1e0r_xt", |
| "at_s1e0w_xt", |
| "dc_csw_xt", |
| "dc_cisw_xt", |
| "dc_zva_xt", |
| "ic_ivau_xt", |
| "dc_cvac_xt", |
| "dc_cvau_xt", |
| "dc_civac_xt", |
| "at_s1e2r_xt", |
| "at_s1e2w_xt", |
| "at_s12e1r_xt", |
| "at_s12e1w_xt", |
| "at_s12e0r_xt", |
| "at_s12e0w_xt", |
| "at_s1e3r_xt", |
| "at_s1e3w_xt", |
| "tlbi_vmalle1is", |
| "tlbi_vae1is_xt", |
| "tlbi_aside1is_xt", |
| "tlbi_vaae1is_xt", |
| "tlbi_vale1is_xt", |
| "tlbi_vaale1is_xt", |
| "tlbi_vmalle1", |
| "tlbi_vae1_xt", |
| "tlbi_aside1_xt", |
| "tlbi_vaae1_xt", |
| "tlbi_vale1_xt", |
| "tlbi_vaale1_xt", |
| "tlbi_ipas2e1is_xt", |
| "tlbi_ipas2le1is_xt", |
| "tlbi_alle2is", |
| "tlbi_vae2is_xt", |
| "tlbi_alle1is", |
| "tlbi_vale2is_xt", |
| "tlbi_vmalls12e1is", |
| "tlbi_ipas2e1_xt", |
| "tlbi_ipas2le1_xt", |
| "tlbi_alle2", |
| "tlbi_vae2_xt", |
| "tlbi_alle1", |
| "tlbi_vale2_xt", |
| "tlbi_vmalls12e1", |
| "tlbi_alle3is", |
| "tlbi_vae3is_xt", |
| "tlbi_vale3is_xt", |
| "tlbi_alle3", |
| "tlbi_vae3_xt", |
| "tlbi_vale3_xt", |
| "pmintenset_el1", |
| "pmintenclr_el1", |
| "pmcr_el0", |
| "pmcntenset_el0", |
| "pmcntenclr_el0", |
| "pmovsclr_el0", |
| "pmswinc_el0", |
| "pmselr_el0", |
| "pmceid0_el0", |
| "pmceid1_el0", |
| "pmccntr_el0", |
| "pmxevtyper_el0", |
| "pmccfiltr_el0", |
| "pmxevcntr_el0", |
| "pmuserenr_el0", |
| "pmovsset_el0", |
| "mair_el1", |
| "amair_el1", |
| "mair_el2", |
| "amair_el2", |
| "mair_el3", |
| "amair_el3", |
| "l2ctlr_el1", |
| "l2ectlr_el1", |
| "vbar_el1", |
| "rvbar_el1", |
| "isr_el1", |
| "vbar_el2", |
| "rvbar_el2", |
| "vbar_el3", |
| "rvbar_el3", |
| "rmr_el3", |
| "contextidr_el1", |
| "tpidr_el1", |
| "tpidr_el0", |
| "tpidrro_el0", |
| "tpidr_el2", |
| "tpidr_el3", |
| "cntkctl_el1", |
| "cntfrq_el0", |
| "cntpct_el0", |
| "cntvct_el0", |
| "cntp_tval_el0", |
| "cntp_ctl_el0", |
| "cntp_cval_el0", |
| "cntv_tval_el0", |
| "cntv_ctl_el0", |
| "cntv_cval_el0", |
| "pmevcntr0_el0", |
| "pmevcntr1_el0", |
| "pmevcntr2_el0", |
| "pmevcntr3_el0", |
| "pmevcntr4_el0", |
| "pmevcntr5_el0", |
| "pmevtyper0_el0", |
| "pmevtyper1_el0", |
| "pmevtyper2_el0", |
| "pmevtyper3_el0", |
| "pmevtyper4_el0", |
| "pmevtyper5_el0", |
| "cntvoff_el2", |
| "cnthctl_el2", |
| "cnthp_tval_el2", |
| "cnthp_ctl_el2", |
| "cnthp_cval_el2", |
| "cntps_tval_el1", |
| "cntps_ctl_el1", |
| "cntps_cval_el1", |
| "il1data0_el1", |
| "il1data1_el1", |
| "il1data2_el1", |
| "il1data3_el1", |
| "dl1data0_el1", |
| "dl1data1_el1", |
| "dl1data2_el1", |
| "dl1data3_el1", |
| "dl1data4_el1", |
| "l2actlr_el1", |
| "cpuactlr_el1", |
| "cpuectlr_el1", |
| "cpumerrsr_el1", |
| "l2merrsr_el1", |
| "cbar_el1", |
| "contextidr_el2", |
| |
| "ttbr1_el2", |
| "cnthv_ctl_el2", |
| "cnthv_cval_el2", |
| "cnthv_tval_el2", |
| "id_aa64mmfr2_el1", |
| "freeslot2", |
| |
| "num_phys_regs", |
| |
| // Dummy registers |
| "nop", |
| "raz", |
| "cp14_unimpl", |
| "cp15_unimpl", |
| "unknown", |
| "impl_defined", |
| "erridr_el1", |
| "errselr_el1", |
| "erxfr_el1", |
| "erxctlr_el1", |
| "erxstatus_el1", |
| "erxaddr_el1", |
| "erxmisc0_el1", |
| "erxmisc1_el1", |
| "disr_el1", |
| "vsesr_el2", |
| "vdisr_el2", |
| }; |
| |
| static_assert(sizeof(miscRegName) / sizeof(*miscRegName) == NUM_MISCREGS, |
| "The miscRegName array and NUM_MISCREGS are inconsistent."); |
| |
| // This mask selects bits of the CPSR that actually go in the CondCodes |
| // integer register to allow renaming. |
| static const uint32_t CondCodesMask = 0xF00F0000; |
| static const uint32_t CpsrMaskQ = 0x08000000; |
| |
| // APSR (Application Program Status Register Mask). It is the user level |
| // alias for the CPSR. The APSR is a subset of the CPSR. Although |
| // bits[15:0] are UNKNOWN on reads, it is permitted that, on a read of |
| // APSR: |
| // Bit[9] returns the value of CPSR.E. |
| // Bits[8:6] return the value of CPSR.{A,I, F}, the mask bits. |
| static const uint32_t ApsrMask = CpsrMaskQ | CondCodesMask | 0x000001D0; |
| |
| // CPSR (Current Program Status Register Mask). |
| static const uint32_t CpsrMask = ApsrMask | 0x00F003DF; |
| |
| // This mask selects bits of the FPSCR that actually go in the FpCondCodes |
| // integer register to allow renaming. |
| static const uint32_t FpCondCodesMask = 0xF0000000; |
| // This mask selects the cumulative FP exception flags of the FPSCR. |
| static const uint32_t FpscrExcMask = 0x0000009F; |
| // This mask selects the cumulative saturation flag of the FPSCR. |
| static const uint32_t FpscrQcMask = 0x08000000; |
| |
| /** |
| * Check for permission to read coprocessor registers. |
| * |
| * Checks whether an instruction at the current program mode has |
| * permissions to read the coprocessor registers. This function |
| * returns whether the check is undefined and if not whether the |
| * read access is permitted. |
| * |
| * @param the misc reg indicating the coprocessor |
| * @param the SCR |
| * @param the CPSR |
| * @return a tuple of booleans: can_read, undefined |
| */ |
| std::tuple<bool, bool> canReadCoprocReg(MiscRegIndex reg, SCR scr, |
| CPSR cpsr); |
| |
| /** |
| * Check for permission to write coprocessor registers. |
| * |
| * Checks whether an instruction at the current program mode has |
| * permissions to write the coprocessor registers. This function |
| * returns whether the check is undefined and if not whether the |
| * write access is permitted. |
| * |
| * @param the misc reg indicating the coprocessor |
| * @param the SCR |
| * @param the CPSR |
| * @return a tuple of booleans: can_write, undefined |
| */ |
| std::tuple<bool, bool> canWriteCoprocReg(MiscRegIndex reg, SCR scr, |
| CPSR cpsr); |
| |
| // Checks read access permissions to AArch64 system registers |
| bool canReadAArch64SysReg(MiscRegIndex reg, SCR scr, CPSR cpsr, |
| ThreadContext *tc); |
| |
| // Checks write access permissions to AArch64 system registers |
| bool canWriteAArch64SysReg(MiscRegIndex reg, SCR scr, CPSR cpsr, |
| ThreadContext *tc); |
| |
| // Uses just the scr.ns bit to pre flatten the misc regs. This is useful |
| // for MCR/MRC instructions |
| int |
| snsBankedIndex(MiscRegIndex reg, ThreadContext *tc); |
| |
| // Flattens a misc reg index using the specified security state. This is |
| // used for opperations (eg address translations) where the security |
| // state of the register access may differ from the current state of the |
| // processor |
| int |
| snsBankedIndex(MiscRegIndex reg, ThreadContext *tc, bool ns); |
| |
| // Takes a misc reg index and returns the root reg if its one of a set of |
| // banked registers |
| void |
| preUnflattenMiscReg(); |
| |
| int |
| unflattenMiscReg(int reg); |
| |
| } |
| |
| #endif // __ARCH_ARM_MISCREGS_HH__ |