| .. | .. |
|---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-only */ |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Copyright (C) 2013 - ARM Ltd |
|---|
| 3 | 4 | * Author: Marc Zyngier <marc.zyngier@arm.com> |
|---|
| 4 | | - * |
|---|
| 5 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 6 | | - * it under the terms of the GNU General Public License version 2 as |
|---|
| 7 | | - * published by the Free Software Foundation. |
|---|
| 8 | | - * |
|---|
| 9 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 10 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 11 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 12 | | - * GNU General Public License for more details. |
|---|
| 13 | | - * |
|---|
| 14 | | - * You should have received a copy of the GNU General Public License |
|---|
| 15 | | - * along with this program. If not, see <http://www.gnu.org/licenses/>. |
|---|
| 16 | 5 | */ |
|---|
| 17 | 6 | |
|---|
| 18 | 7 | #ifndef __ASM_ESR_H |
|---|
| .. | .. |
|---|
| 29 | 18 | #define ESR_ELx_EC_CP14_MR (0x05) |
|---|
| 30 | 19 | #define ESR_ELx_EC_CP14_LS (0x06) |
|---|
| 31 | 20 | #define ESR_ELx_EC_FP_ASIMD (0x07) |
|---|
| 32 | | -#define ESR_ELx_EC_CP10_ID (0x08) |
|---|
| 33 | | -/* Unallocated EC: 0x09 - 0x0B */ |
|---|
| 21 | +#define ESR_ELx_EC_CP10_ID (0x08) /* EL2 only */ |
|---|
| 22 | +#define ESR_ELx_EC_PAC (0x09) /* EL2 and above */ |
|---|
| 23 | +/* Unallocated EC: 0x0A - 0x0B */ |
|---|
| 34 | 24 | #define ESR_ELx_EC_CP14_64 (0x0C) |
|---|
| 35 | | -/* Unallocated EC: 0x0d */ |
|---|
| 25 | +#define ESR_ELx_EC_BTI (0x0D) |
|---|
| 36 | 26 | #define ESR_ELx_EC_ILL (0x0E) |
|---|
| 37 | 27 | /* Unallocated EC: 0x0F - 0x10 */ |
|---|
| 38 | 28 | #define ESR_ELx_EC_SVC32 (0x11) |
|---|
| 39 | | -#define ESR_ELx_EC_HVC32 (0x12) |
|---|
| 40 | | -#define ESR_ELx_EC_SMC32 (0x13) |
|---|
| 29 | +#define ESR_ELx_EC_HVC32 (0x12) /* EL2 only */ |
|---|
| 30 | +#define ESR_ELx_EC_SMC32 (0x13) /* EL2 and above */ |
|---|
| 41 | 31 | /* Unallocated EC: 0x14 */ |
|---|
| 42 | 32 | #define ESR_ELx_EC_SVC64 (0x15) |
|---|
| 43 | | -#define ESR_ELx_EC_HVC64 (0x16) |
|---|
| 44 | | -#define ESR_ELx_EC_SMC64 (0x17) |
|---|
| 33 | +#define ESR_ELx_EC_HVC64 (0x16) /* EL2 and above */ |
|---|
| 34 | +#define ESR_ELx_EC_SMC64 (0x17) /* EL2 and above */ |
|---|
| 45 | 35 | #define ESR_ELx_EC_SYS64 (0x18) |
|---|
| 46 | 36 | #define ESR_ELx_EC_SVE (0x19) |
|---|
| 47 | | -/* Unallocated EC: 0x1A - 0x1E */ |
|---|
| 48 | | -#define ESR_ELx_EC_IMP_DEF (0x1f) |
|---|
| 37 | +#define ESR_ELx_EC_ERET (0x1a) /* EL2 only */ |
|---|
| 38 | +/* Unallocated EC: 0x1B */ |
|---|
| 39 | +#define ESR_ELx_EC_FPAC (0x1C) /* EL1 and above */ |
|---|
| 40 | +/* Unallocated EC: 0x1D - 0x1E */ |
|---|
| 41 | +#define ESR_ELx_EC_IMP_DEF (0x1f) /* EL3 only */ |
|---|
| 49 | 42 | #define ESR_ELx_EC_IABT_LOW (0x20) |
|---|
| 50 | 43 | #define ESR_ELx_EC_IABT_CUR (0x21) |
|---|
| 51 | 44 | #define ESR_ELx_EC_PC_ALIGN (0x22) |
|---|
| .. | .. |
|---|
| 68 | 61 | /* Unallocated EC: 0x36 - 0x37 */ |
|---|
| 69 | 62 | #define ESR_ELx_EC_BKPT32 (0x38) |
|---|
| 70 | 63 | /* Unallocated EC: 0x39 */ |
|---|
| 71 | | -#define ESR_ELx_EC_VECTOR32 (0x3A) |
|---|
| 72 | | -/* Unallocted EC: 0x3B */ |
|---|
| 64 | +#define ESR_ELx_EC_VECTOR32 (0x3A) /* EL2 only */ |
|---|
| 65 | +/* Unallocated EC: 0x3B */ |
|---|
| 73 | 66 | #define ESR_ELx_EC_BRK64 (0x3C) |
|---|
| 74 | 67 | /* Unallocated EC: 0x3D - 0x3F */ |
|---|
| 75 | 68 | #define ESR_ELx_EC_MAX (0x3F) |
|---|
| 76 | 69 | |
|---|
| 77 | 70 | #define ESR_ELx_EC_SHIFT (26) |
|---|
| 71 | +#define ESR_ELx_EC_WIDTH (6) |
|---|
| 78 | 72 | #define ESR_ELx_EC_MASK (UL(0x3F) << ESR_ELx_EC_SHIFT) |
|---|
| 79 | 73 | #define ESR_ELx_EC(esr) (((esr) & ESR_ELx_EC_MASK) >> ESR_ELx_EC_SHIFT) |
|---|
| 80 | 74 | |
|---|
| .. | .. |
|---|
| 111 | 105 | /* Shared ISS fault status code(IFSC/DFSC) for Data/Instruction aborts */ |
|---|
| 112 | 106 | #define ESR_ELx_FSC (0x3F) |
|---|
| 113 | 107 | #define ESR_ELx_FSC_TYPE (0x3C) |
|---|
| 108 | +#define ESR_ELx_FSC_LEVEL (0x03) |
|---|
| 114 | 109 | #define ESR_ELx_FSC_EXTABT (0x10) |
|---|
| 110 | +#define ESR_ELx_FSC_MTE (0x11) |
|---|
| 115 | 111 | #define ESR_ELx_FSC_SERROR (0x11) |
|---|
| 116 | 112 | #define ESR_ELx_FSC_ACCESS (0x08) |
|---|
| 117 | 113 | #define ESR_ELx_FSC_FAULT (0x04) |
|---|
| 118 | 114 | #define ESR_ELx_FSC_PERM (0x0C) |
|---|
| 115 | +#define ESR_ELx_FSC_TLBCONF (0x30) |
|---|
| 119 | 116 | |
|---|
| 120 | 117 | /* ISS field definitions for Data Aborts */ |
|---|
| 121 | 118 | #define ESR_ELx_ISV_SHIFT (24) |
|---|
| .. | .. |
|---|
| 137 | 134 | #define ESR_ELx_CV (UL(1) << 24) |
|---|
| 138 | 135 | #define ESR_ELx_COND_SHIFT (20) |
|---|
| 139 | 136 | #define ESR_ELx_COND_MASK (UL(0xF) << ESR_ELx_COND_SHIFT) |
|---|
| 137 | +#define ESR_ELx_WFx_ISS_TI (UL(1) << 0) |
|---|
| 138 | +#define ESR_ELx_WFx_ISS_WFI (UL(0) << 0) |
|---|
| 140 | 139 | #define ESR_ELx_WFx_ISS_WFE (UL(1) << 0) |
|---|
| 141 | 140 | #define ESR_ELx_xVC_IMM_MASK ((1UL << 16) - 1) |
|---|
| 142 | 141 | |
|---|
| .. | .. |
|---|
| 148 | 147 | #define DISR_EL1_ESR_MASK (ESR_ELx_AET | ESR_ELx_EA | ESR_ELx_FSC) |
|---|
| 149 | 148 | |
|---|
| 150 | 149 | /* ESR value templates for specific events */ |
|---|
| 150 | +#define ESR_ELx_WFx_MASK (ESR_ELx_EC_MASK | ESR_ELx_WFx_ISS_TI) |
|---|
| 151 | +#define ESR_ELx_WFx_WFI_VAL ((ESR_ELx_EC_WFx << ESR_ELx_EC_SHIFT) | \ |
|---|
| 152 | + ESR_ELx_WFx_ISS_WFI) |
|---|
| 151 | 153 | |
|---|
| 152 | 154 | /* BRK instruction trap from AArch64 state */ |
|---|
| 153 | | -#define ESR_ELx_VAL_BRK64(imm) \ |
|---|
| 154 | | - ((ESR_ELx_EC_BRK64 << ESR_ELx_EC_SHIFT) | ESR_ELx_IL | \ |
|---|
| 155 | | - ((imm) & 0xffff)) |
|---|
| 155 | +#define ESR_ELx_BRK64_ISS_COMMENT_MASK 0xffff |
|---|
| 156 | 156 | |
|---|
| 157 | 157 | /* ISS field definitions for System instruction traps */ |
|---|
| 158 | 158 | #define ESR_ELx_SYS64_ISS_RES0_SHIFT 22 |
|---|
| .. | .. |
|---|
| 187 | 187 | |
|---|
| 188 | 188 | #define ESR_ELx_SYS64_ISS_SYS_OP_MASK (ESR_ELx_SYS64_ISS_SYS_MASK | \ |
|---|
| 189 | 189 | ESR_ELx_SYS64_ISS_DIR_MASK) |
|---|
| 190 | +#define ESR_ELx_SYS64_ISS_RT(esr) \ |
|---|
| 191 | + (((esr) & ESR_ELx_SYS64_ISS_RT_MASK) >> ESR_ELx_SYS64_ISS_RT_SHIFT) |
|---|
| 190 | 192 | /* |
|---|
| 191 | 193 | * User space cache operations have the following sysreg encoding |
|---|
| 192 | 194 | * in System instructions. |
|---|
| 193 | | - * op0=1, op1=3, op2=1, crn=7, crm={ 5, 10, 11, 12, 14 }, WRITE (L=0) |
|---|
| 195 | + * op0=1, op1=3, op2=1, crn=7, crm={ 5, 10, 11, 12, 13, 14 }, WRITE (L=0) |
|---|
| 194 | 196 | */ |
|---|
| 195 | 197 | #define ESR_ELx_SYS64_ISS_CRM_DC_CIVAC 14 |
|---|
| 198 | +#define ESR_ELx_SYS64_ISS_CRM_DC_CVADP 13 |
|---|
| 196 | 199 | #define ESR_ELx_SYS64_ISS_CRM_DC_CVAP 12 |
|---|
| 197 | 200 | #define ESR_ELx_SYS64_ISS_CRM_DC_CVAU 11 |
|---|
| 198 | 201 | #define ESR_ELx_SYS64_ISS_CRM_DC_CVAC 10 |
|---|
| .. | .. |
|---|
| 206 | 209 | #define ESR_ELx_SYS64_ISS_EL0_CACHE_OP_VAL \ |
|---|
| 207 | 210 | (ESR_ELx_SYS64_ISS_SYS_VAL(1, 3, 1, 7, 0) | \ |
|---|
| 208 | 211 | ESR_ELx_SYS64_ISS_DIR_WRITE) |
|---|
| 212 | +/* |
|---|
| 213 | + * User space MRS operations which are supported for emulation |
|---|
| 214 | + * have the following sysreg encoding in System instructions. |
|---|
| 215 | + * op0 = 3, op1= 0, crn = 0, {crm = 0, 4-7}, READ (L = 1) |
|---|
| 216 | + */ |
|---|
| 217 | +#define ESR_ELx_SYS64_ISS_SYS_MRS_OP_MASK (ESR_ELx_SYS64_ISS_OP0_MASK | \ |
|---|
| 218 | + ESR_ELx_SYS64_ISS_OP1_MASK | \ |
|---|
| 219 | + ESR_ELx_SYS64_ISS_CRN_MASK | \ |
|---|
| 220 | + ESR_ELx_SYS64_ISS_DIR_MASK) |
|---|
| 221 | +#define ESR_ELx_SYS64_ISS_SYS_MRS_OP_VAL \ |
|---|
| 222 | + (ESR_ELx_SYS64_ISS_SYS_VAL(3, 0, 0, 0, 0) | \ |
|---|
| 223 | + ESR_ELx_SYS64_ISS_DIR_READ) |
|---|
| 209 | 224 | |
|---|
| 210 | 225 | #define ESR_ELx_SYS64_ISS_SYS_CTR ESR_ELx_SYS64_ISS_SYS_VAL(3, 3, 1, 0, 0) |
|---|
| 211 | 226 | #define ESR_ELx_SYS64_ISS_SYS_CTR_READ (ESR_ELx_SYS64_ISS_SYS_CTR | \ |
|---|
| .. | .. |
|---|
| 249 | 264 | |
|---|
| 250 | 265 | #define ESR_ELx_FP_EXC_TFV (UL(1) << 23) |
|---|
| 251 | 266 | |
|---|
| 267 | +/* |
|---|
| 268 | + * ISS field definitions for CP15 accesses |
|---|
| 269 | + */ |
|---|
| 270 | +#define ESR_ELx_CP15_32_ISS_DIR_MASK 0x1 |
|---|
| 271 | +#define ESR_ELx_CP15_32_ISS_DIR_READ 0x1 |
|---|
| 272 | +#define ESR_ELx_CP15_32_ISS_DIR_WRITE 0x0 |
|---|
| 273 | + |
|---|
| 274 | +#define ESR_ELx_CP15_32_ISS_RT_SHIFT 5 |
|---|
| 275 | +#define ESR_ELx_CP15_32_ISS_RT_MASK (UL(0x1f) << ESR_ELx_CP15_32_ISS_RT_SHIFT) |
|---|
| 276 | +#define ESR_ELx_CP15_32_ISS_CRM_SHIFT 1 |
|---|
| 277 | +#define ESR_ELx_CP15_32_ISS_CRM_MASK (UL(0xf) << ESR_ELx_CP15_32_ISS_CRM_SHIFT) |
|---|
| 278 | +#define ESR_ELx_CP15_32_ISS_CRN_SHIFT 10 |
|---|
| 279 | +#define ESR_ELx_CP15_32_ISS_CRN_MASK (UL(0xf) << ESR_ELx_CP15_32_ISS_CRN_SHIFT) |
|---|
| 280 | +#define ESR_ELx_CP15_32_ISS_OP1_SHIFT 14 |
|---|
| 281 | +#define ESR_ELx_CP15_32_ISS_OP1_MASK (UL(0x7) << ESR_ELx_CP15_32_ISS_OP1_SHIFT) |
|---|
| 282 | +#define ESR_ELx_CP15_32_ISS_OP2_SHIFT 17 |
|---|
| 283 | +#define ESR_ELx_CP15_32_ISS_OP2_MASK (UL(0x7) << ESR_ELx_CP15_32_ISS_OP2_SHIFT) |
|---|
| 284 | + |
|---|
| 285 | +#define ESR_ELx_CP15_32_ISS_SYS_MASK (ESR_ELx_CP15_32_ISS_OP1_MASK | \ |
|---|
| 286 | + ESR_ELx_CP15_32_ISS_OP2_MASK | \ |
|---|
| 287 | + ESR_ELx_CP15_32_ISS_CRN_MASK | \ |
|---|
| 288 | + ESR_ELx_CP15_32_ISS_CRM_MASK | \ |
|---|
| 289 | + ESR_ELx_CP15_32_ISS_DIR_MASK) |
|---|
| 290 | +#define ESR_ELx_CP15_32_ISS_SYS_VAL(op1, op2, crn, crm) \ |
|---|
| 291 | + (((op1) << ESR_ELx_CP15_32_ISS_OP1_SHIFT) | \ |
|---|
| 292 | + ((op2) << ESR_ELx_CP15_32_ISS_OP2_SHIFT) | \ |
|---|
| 293 | + ((crn) << ESR_ELx_CP15_32_ISS_CRN_SHIFT) | \ |
|---|
| 294 | + ((crm) << ESR_ELx_CP15_32_ISS_CRM_SHIFT)) |
|---|
| 295 | + |
|---|
| 296 | +#define ESR_ELx_CP15_64_ISS_DIR_MASK 0x1 |
|---|
| 297 | +#define ESR_ELx_CP15_64_ISS_DIR_READ 0x1 |
|---|
| 298 | +#define ESR_ELx_CP15_64_ISS_DIR_WRITE 0x0 |
|---|
| 299 | + |
|---|
| 300 | +#define ESR_ELx_CP15_64_ISS_RT_SHIFT 5 |
|---|
| 301 | +#define ESR_ELx_CP15_64_ISS_RT_MASK (UL(0x1f) << ESR_ELx_CP15_64_ISS_RT_SHIFT) |
|---|
| 302 | + |
|---|
| 303 | +#define ESR_ELx_CP15_64_ISS_RT2_SHIFT 10 |
|---|
| 304 | +#define ESR_ELx_CP15_64_ISS_RT2_MASK (UL(0x1f) << ESR_ELx_CP15_64_ISS_RT2_SHIFT) |
|---|
| 305 | + |
|---|
| 306 | +#define ESR_ELx_CP15_64_ISS_OP1_SHIFT 16 |
|---|
| 307 | +#define ESR_ELx_CP15_64_ISS_OP1_MASK (UL(0xf) << ESR_ELx_CP15_64_ISS_OP1_SHIFT) |
|---|
| 308 | +#define ESR_ELx_CP15_64_ISS_CRM_SHIFT 1 |
|---|
| 309 | +#define ESR_ELx_CP15_64_ISS_CRM_MASK (UL(0xf) << ESR_ELx_CP15_64_ISS_CRM_SHIFT) |
|---|
| 310 | + |
|---|
| 311 | +#define ESR_ELx_CP15_64_ISS_SYS_VAL(op1, crm) \ |
|---|
| 312 | + (((op1) << ESR_ELx_CP15_64_ISS_OP1_SHIFT) | \ |
|---|
| 313 | + ((crm) << ESR_ELx_CP15_64_ISS_CRM_SHIFT)) |
|---|
| 314 | + |
|---|
| 315 | +#define ESR_ELx_CP15_64_ISS_SYS_MASK (ESR_ELx_CP15_64_ISS_OP1_MASK | \ |
|---|
| 316 | + ESR_ELx_CP15_64_ISS_CRM_MASK | \ |
|---|
| 317 | + ESR_ELx_CP15_64_ISS_DIR_MASK) |
|---|
| 318 | + |
|---|
| 319 | +#define ESR_ELx_CP15_64_ISS_SYS_CNTVCT (ESR_ELx_CP15_64_ISS_SYS_VAL(1, 14) | \ |
|---|
| 320 | + ESR_ELx_CP15_64_ISS_DIR_READ) |
|---|
| 321 | + |
|---|
| 322 | +#define ESR_ELx_CP15_32_ISS_SYS_CNTFRQ (ESR_ELx_CP15_32_ISS_SYS_VAL(0, 0, 14, 0) |\ |
|---|
| 323 | + ESR_ELx_CP15_32_ISS_DIR_READ) |
|---|
| 324 | + |
|---|
| 252 | 325 | #ifndef __ASSEMBLY__ |
|---|
| 253 | 326 | #include <asm/types.h> |
|---|
| 254 | 327 | |
|---|