1*f396aec8SArvind Ram Prakash /* 2*f396aec8SArvind Ram Prakash * Copyright (c) 2025, Arm Limited. All rights reserved. 3*f396aec8SArvind Ram Prakash * 4*f396aec8SArvind Ram Prakash * SPDX-License-Identifier: BSD-3-Clause 5*f396aec8SArvind Ram Prakash */ 6*f396aec8SArvind Ram Prakash 7*f396aec8SArvind Ram Prakash #ifndef IDTE3_H 8*f396aec8SArvind Ram Prakash #define IDTE3_H 9*f396aec8SArvind Ram Prakash 10*f396aec8SArvind Ram Prakash #ifdef IMAGE_BL31 11*f396aec8SArvind Ram Prakash #include <bl31/sync_handle.h> 12*f396aec8SArvind Ram Prakash #include <context.h> 13*f396aec8SArvind Ram Prakash #include <lib/el3_runtime/cpu_data.h> 14*f396aec8SArvind Ram Prakash #define ESR_ELx_ISS(esr) ((esr) & 0x01ffffff) 15*f396aec8SArvind Ram Prakash 16*f396aec8SArvind Ram Prakash /* ISS layout for trapped AArch64 system-register access (ESR_EL3.ISS) 17*f396aec8SArvind Ram Prakash * 18*f396aec8SArvind Ram Prakash * [21:20] Op0 19*f396aec8SArvind Ram Prakash * [19:17] Op2 20*f396aec8SArvind Ram Prakash * [16:14] Op1 21*f396aec8SArvind Ram Prakash * [13:10] CRn 22*f396aec8SArvind Ram Prakash * [9:5] Rt 23*f396aec8SArvind Ram Prakash * [4:1] CRm 24*f396aec8SArvind Ram Prakash * [0] DIR 25*f396aec8SArvind Ram Prakash */ 26*f396aec8SArvind Ram Prakash #define ISS_SYS64_OP0_SHIFT U(20) 27*f396aec8SArvind Ram Prakash #define ISS_SYS64_OP2_SHIFT U(17) 28*f396aec8SArvind Ram Prakash #define ISS_SYS64_OP1_SHIFT U(14) 29*f396aec8SArvind Ram Prakash #define ISS_SYS64_CRN_SHIFT U(10) 30*f396aec8SArvind Ram Prakash #define ISS_SYS64_RT_SHIFT U(5) 31*f396aec8SArvind Ram Prakash #define ISS_SYS64_CRM_SHIFT U(1) 32*f396aec8SArvind Ram Prakash #define ISS_SYS64_DIR_SHIFT U(0) 33*f396aec8SArvind Ram Prakash 34*f396aec8SArvind Ram Prakash #define ISS_SYS64_OP0_MASK U(0x3) 35*f396aec8SArvind Ram Prakash #define ISS_SYS64_OP1_MASK U(0x7) 36*f396aec8SArvind Ram Prakash #define ISS_SYS64_OP2_MASK U(0x7) 37*f396aec8SArvind Ram Prakash #define ISS_SYS64_CRN_MASK U(0xf) 38*f396aec8SArvind Ram Prakash #define ISS_SYS64_RT_MASK ULL(0x1f) 39*f396aec8SArvind Ram Prakash #define ISS_SYS64_CRM_MASK U(0xf) 40*f396aec8SArvind Ram Prakash #define ISS_SYS64_DIR_MASK U(0x1) 41*f396aec8SArvind Ram Prakash 42*f396aec8SArvind Ram Prakash /* Field extractors */ 43*f396aec8SArvind Ram Prakash #define ISS_SYS64_OP0(iss) (((iss) >> ISS_SYS64_OP0_SHIFT) & \ 44*f396aec8SArvind Ram Prakash ISS_SYS64_OP0_MASK) 45*f396aec8SArvind Ram Prakash 46*f396aec8SArvind Ram Prakash #define ISS_SYS64_OP1(iss) (((iss) >> ISS_SYS64_OP1_SHIFT) & \ 47*f396aec8SArvind Ram Prakash ISS_SYS64_OP1_MASK) 48*f396aec8SArvind Ram Prakash 49*f396aec8SArvind Ram Prakash #define ISS_SYS64_OP2(iss) (((iss) >> ISS_SYS64_OP2_SHIFT) & \ 50*f396aec8SArvind Ram Prakash ISS_SYS64_OP2_MASK) 51*f396aec8SArvind Ram Prakash 52*f396aec8SArvind Ram Prakash #define ISS_SYS64_CRN(iss) (((iss) >> ISS_SYS64_CRN_SHIFT) & \ 53*f396aec8SArvind Ram Prakash ISS_SYS64_CRN_MASK) 54*f396aec8SArvind Ram Prakash 55*f396aec8SArvind Ram Prakash #define ISS_SYS64_RT(iss) (((iss) >> ISS_SYS64_RT_SHIFT) & \ 56*f396aec8SArvind Ram Prakash ISS_SYS64_RT_MASK) 57*f396aec8SArvind Ram Prakash 58*f396aec8SArvind Ram Prakash #define ISS_SYS64_CRM(iss) (((iss) >> ISS_SYS64_CRM_SHIFT) & \ 59*f396aec8SArvind Ram Prakash ISS_SYS64_CRM_MASK) 60*f396aec8SArvind Ram Prakash 61*f396aec8SArvind Ram Prakash #define ISS_SYS64_DIR(iss) (((iss) >> ISS_SYS64_DIR_SHIFT) & \ 62*f396aec8SArvind Ram Prakash ISS_SYS64_DIR_MASK) 63*f396aec8SArvind Ram Prakash 64*f396aec8SArvind Ram Prakash #define SYSREG_ESR(op0, op1, crn, crm, op2) \ 65*f396aec8SArvind Ram Prakash ((UL(op0) << ISS_SYS64_OP0_SHIFT) | \ 66*f396aec8SArvind Ram Prakash (UL(op1) << ISS_SYS64_OP1_SHIFT) | \ 67*f396aec8SArvind Ram Prakash (UL(crn) << ISS_SYS64_CRN_SHIFT) | \ 68*f396aec8SArvind Ram Prakash (UL(crm) << ISS_SYS64_CRM_SHIFT) | \ 69*f396aec8SArvind Ram Prakash (UL(op2) << ISS_SYS64_OP2_SHIFT)) 70*f396aec8SArvind Ram Prakash 71*f396aec8SArvind Ram Prakash #define ESR_EL3_SYSREG_MASK SYSREG_ESR(3, 7, 15, 15, 7) 72*f396aec8SArvind Ram Prakash 73*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_PFR0_EL1 SYSREG_ESR(3, 0, 0, 1, 0) 74*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_PFR1_EL1 SYSREG_ESR(3, 0, 0, 1, 1) 75*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_DFR0_EL1 SYSREG_ESR(3, 0, 0, 1, 2) 76*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AFR0_EL1 SYSREG_ESR(3, 0, 0, 1, 3) 77*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_MMFR0_EL1 SYSREG_ESR(3, 0, 0, 1, 4) 78*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_MMFR1_EL1 SYSREG_ESR(3, 0, 0, 1, 5) 79*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_MMFR2_EL1 SYSREG_ESR(3, 0, 0, 1, 6) 80*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_MMFR3_EL1 SYSREG_ESR(3, 0, 0, 1, 7) 81*f396aec8SArvind Ram Prakash 82*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_ISAR0_EL1 SYSREG_ESR(3, 0, 0, 2, 0) 83*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_ISAR1_EL1 SYSREG_ESR(3, 0, 0, 2, 1) 84*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_ISAR2_EL1 SYSREG_ESR(3, 0, 0, 2, 2) 85*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_ISAR3_EL1 SYSREG_ESR(3, 0, 0, 2, 3) 86*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_ISAR4_EL1 SYSREG_ESR(3, 0, 0, 2, 4) 87*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_ISAR5_EL1 SYSREG_ESR(3, 0, 0, 2, 5) 88*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_MMFR4_EL1 SYSREG_ESR(3, 0, 0, 2, 6) 89*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_ISAR6_EL1 SYSREG_ESR(3, 0, 0, 2, 7) 90*f396aec8SArvind Ram Prakash 91*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_MVFR0_EL1 SYSREG_ESR(3, 0, 0, 3, 0) 92*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_MVFR1_EL1 SYSREG_ESR(3, 0, 0, 3, 1) 93*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_MVFR2_EL1 SYSREG_ESR(3, 0, 0, 3, 2) 94*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_PFR2_EL1 SYSREG_ESR(3, 0, 0, 3, 4) 95*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_DFR1_EL1 SYSREG_ESR(3, 0, 0, 3, 5) 96*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_MMFR5_EL1 SYSREG_ESR(3, 0, 0, 3, 6) 97*f396aec8SArvind Ram Prakash 98*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64PFR0_EL1 SYSREG_ESR(3, 0, 0, 4, 0) 99*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64PFR1_EL1 SYSREG_ESR(3, 0, 0, 4, 1) 100*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64PFR2_EL1 SYSREG_ESR(3, 0, 0, 4, 2) 101*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64ZFR0_EL1 SYSREG_ESR(3, 0, 0, 4, 4) 102*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64SMFR0_EL1 SYSREG_ESR(3, 0, 0, 4, 5) 103*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64FPFR0_EL1 SYSREG_ESR(3, 0, 0, 4, 7) 104*f396aec8SArvind Ram Prakash 105*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64DFR0_EL1 SYSREG_ESR(3, 0, 0, 5, 0) 106*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64DFR1_EL1 SYSREG_ESR(3, 0, 0, 5, 1) 107*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64DFR2_EL1 SYSREG_ESR(3, 0, 0, 5, 2) 108*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64AFR0_EL1 SYSREG_ESR(3, 0, 0, 5, 4) 109*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64AFR1_EL1 SYSREG_ESR(3, 0, 0, 5, 5) 110*f396aec8SArvind Ram Prakash 111*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64ISAR0_EL1 SYSREG_ESR(3, 0, 0, 6, 0) 112*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64ISAR1_EL1 SYSREG_ESR(3, 0, 0, 6, 1) 113*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64ISAR2_EL1 SYSREG_ESR(3, 0, 0, 6, 2) 114*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64ISAR3_EL1 SYSREG_ESR(3, 0, 0, 6, 3) 115*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64MMFR0_EL1 SYSREG_ESR(3, 0, 0, 7, 0) 116*f396aec8SArvind Ram Prakash 117*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64MMFR1_EL1 SYSREG_ESR(3, 0, 0, 7, 1) 118*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64MMFR2_EL1 SYSREG_ESR(3, 0, 0, 7, 2) 119*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64MMFR3_EL1 SYSREG_ESR(3, 0, 0, 7, 3) 120*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_ID_AA64MMFR4_EL1 SYSREG_ESR(3, 0, 0, 7, 4) 121*f396aec8SArvind Ram Prakash 122*f396aec8SArvind Ram Prakash /* Group 5 ID Registers trapped*/ 123*f396aec8SArvind Ram Prakash #define ESR_EL3_IDREG_GMID_EL1 SYSREG_ESR(3, 1, 0, 0, 4) 124*f396aec8SArvind Ram Prakash 125*f396aec8SArvind Ram Prakash #if ENABLE_FEAT_IDTE3 126*f396aec8SArvind Ram Prakash void idte3_enable(cpu_context_t *ctx); 127*f396aec8SArvind Ram Prakash int handle_idreg_trap(uint64_t esr_el3, cpu_context_t *ctx, 128*f396aec8SArvind Ram Prakash u_register_t flags); 129*f396aec8SArvind Ram Prakash void idte3_init_cached_idregs_per_world(size_t security_state); 130*f396aec8SArvind Ram Prakash void idte3_init_percpu_once_regs(size_t security_state); 131*f396aec8SArvind Ram Prakash #else 132*f396aec8SArvind Ram Prakash static inline void idte3_enable(cpu_context_t *ctx) 133*f396aec8SArvind Ram Prakash { 134*f396aec8SArvind Ram Prakash } 135*f396aec8SArvind Ram Prakash static inline int handle_idreg_trap(uint64_t esr_el3, cpu_context_t *ctx, 136*f396aec8SArvind Ram Prakash u_register_t flags) 137*f396aec8SArvind Ram Prakash { 138*f396aec8SArvind Ram Prakash return TRAP_RET_UNHANDLED; 139*f396aec8SArvind Ram Prakash } 140*f396aec8SArvind Ram Prakash static inline void idte3_init_percpu_once_regs(size_t security_state) 141*f396aec8SArvind Ram Prakash { 142*f396aec8SArvind Ram Prakash } 143*f396aec8SArvind Ram Prakash static inline void idte3_init_cached_idregs_per_world(size_t security_state) 144*f396aec8SArvind Ram Prakash { 145*f396aec8SArvind Ram Prakash } 146*f396aec8SArvind Ram Prakash #endif /* ENABLE_FEAT_IDTE3 */ 147*f396aec8SArvind Ram Prakash #endif /* IMAGE_BL31 */ 148*f396aec8SArvind Ram Prakash #endif /* IDTE3_H */ 149