11fe27859SRichard Henderson /* 21fe27859SRichard Henderson * QEMU ARM CPU -- syndrome functions and types 31fe27859SRichard Henderson * 41fe27859SRichard Henderson * Copyright (c) 2014 Linaro Ltd 51fe27859SRichard Henderson * 61fe27859SRichard Henderson * This program is free software; you can redistribute it and/or 71fe27859SRichard Henderson * modify it under the terms of the GNU General Public License 81fe27859SRichard Henderson * as published by the Free Software Foundation; either version 2 91fe27859SRichard Henderson * of the License, or (at your option) any later version. 101fe27859SRichard Henderson * 111fe27859SRichard Henderson * This program is distributed in the hope that it will be useful, 121fe27859SRichard Henderson * but WITHOUT ANY WARRANTY; without even the implied warranty of 131fe27859SRichard Henderson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 141fe27859SRichard Henderson * GNU General Public License for more details. 151fe27859SRichard Henderson * 161fe27859SRichard Henderson * You should have received a copy of the GNU General Public License 171fe27859SRichard Henderson * along with this program; if not, see 181fe27859SRichard Henderson * <http://www.gnu.org/licenses/gpl-2.0.html> 191fe27859SRichard Henderson * 201fe27859SRichard Henderson * This header defines functions, types, etc which need to be shared 211fe27859SRichard Henderson * between different source files within target/arm/ but which are 221fe27859SRichard Henderson * private to it and not required by the rest of QEMU. 231fe27859SRichard Henderson */ 241fe27859SRichard Henderson 251fe27859SRichard Henderson #ifndef TARGET_ARM_SYNDROME_H 261fe27859SRichard Henderson #define TARGET_ARM_SYNDROME_H 271fe27859SRichard Henderson 281fe27859SRichard Henderson /* Valid Syndrome Register EC field values */ 291fe27859SRichard Henderson enum arm_exception_class { 301fe27859SRichard Henderson EC_UNCATEGORIZED = 0x00, 311fe27859SRichard Henderson EC_WFX_TRAP = 0x01, 321fe27859SRichard Henderson EC_CP15RTTRAP = 0x03, 331fe27859SRichard Henderson EC_CP15RRTTRAP = 0x04, 341fe27859SRichard Henderson EC_CP14RTTRAP = 0x05, 351fe27859SRichard Henderson EC_CP14DTTRAP = 0x06, 361fe27859SRichard Henderson EC_ADVSIMDFPACCESSTRAP = 0x07, 371fe27859SRichard Henderson EC_FPIDTRAP = 0x08, 381fe27859SRichard Henderson EC_PACTRAP = 0x09, 398e228c9eSPeter Maydell EC_BXJTRAP = 0x0a, 401fe27859SRichard Henderson EC_CP14RRTTRAP = 0x0c, 411fe27859SRichard Henderson EC_BTITRAP = 0x0d, 421fe27859SRichard Henderson EC_ILLEGALSTATE = 0x0e, 431fe27859SRichard Henderson EC_AA32_SVC = 0x11, 441fe27859SRichard Henderson EC_AA32_HVC = 0x12, 451fe27859SRichard Henderson EC_AA32_SMC = 0x13, 461fe27859SRichard Henderson EC_AA64_SVC = 0x15, 471fe27859SRichard Henderson EC_AA64_HVC = 0x16, 481fe27859SRichard Henderson EC_AA64_SMC = 0x17, 491fe27859SRichard Henderson EC_SYSTEMREGISTERTRAP = 0x18, 501fe27859SRichard Henderson EC_SVEACCESSTRAP = 0x19, 51*58b2908eSRichard Henderson EC_SMETRAP = 0x1d, 521fe27859SRichard Henderson EC_INSNABORT = 0x20, 531fe27859SRichard Henderson EC_INSNABORT_SAME_EL = 0x21, 541fe27859SRichard Henderson EC_PCALIGNMENT = 0x22, 551fe27859SRichard Henderson EC_DATAABORT = 0x24, 561fe27859SRichard Henderson EC_DATAABORT_SAME_EL = 0x25, 571fe27859SRichard Henderson EC_SPALIGNMENT = 0x26, 581fe27859SRichard Henderson EC_AA32_FPTRAP = 0x28, 591fe27859SRichard Henderson EC_AA64_FPTRAP = 0x2c, 601fe27859SRichard Henderson EC_SERROR = 0x2f, 611fe27859SRichard Henderson EC_BREAKPOINT = 0x30, 621fe27859SRichard Henderson EC_BREAKPOINT_SAME_EL = 0x31, 631fe27859SRichard Henderson EC_SOFTWARESTEP = 0x32, 641fe27859SRichard Henderson EC_SOFTWARESTEP_SAME_EL = 0x33, 651fe27859SRichard Henderson EC_WATCHPOINT = 0x34, 661fe27859SRichard Henderson EC_WATCHPOINT_SAME_EL = 0x35, 671fe27859SRichard Henderson EC_AA32_BKPT = 0x38, 681fe27859SRichard Henderson EC_VECTORCATCH = 0x3a, 691fe27859SRichard Henderson EC_AA64_BKPT = 0x3c, 701fe27859SRichard Henderson }; 711fe27859SRichard Henderson 72*58b2908eSRichard Henderson typedef enum { 73*58b2908eSRichard Henderson SME_ET_AccessTrap, 74*58b2908eSRichard Henderson SME_ET_Streaming, 75*58b2908eSRichard Henderson SME_ET_NotStreaming, 76*58b2908eSRichard Henderson SME_ET_InactiveZA, 77*58b2908eSRichard Henderson } SMEExceptionType; 78*58b2908eSRichard Henderson 791fe27859SRichard Henderson #define ARM_EL_EC_SHIFT 26 801fe27859SRichard Henderson #define ARM_EL_IL_SHIFT 25 811fe27859SRichard Henderson #define ARM_EL_ISV_SHIFT 24 821fe27859SRichard Henderson #define ARM_EL_IL (1 << ARM_EL_IL_SHIFT) 831fe27859SRichard Henderson #define ARM_EL_ISV (1 << ARM_EL_ISV_SHIFT) 841fe27859SRichard Henderson 851fe27859SRichard Henderson static inline uint32_t syn_get_ec(uint32_t syn) 861fe27859SRichard Henderson { 871fe27859SRichard Henderson return syn >> ARM_EL_EC_SHIFT; 881fe27859SRichard Henderson } 891fe27859SRichard Henderson 901fe27859SRichard Henderson /* 911fe27859SRichard Henderson * Utility functions for constructing various kinds of syndrome value. 921fe27859SRichard Henderson * Note that in general we follow the AArch64 syndrome values; in a 931fe27859SRichard Henderson * few cases the value in HSR for exceptions taken to AArch32 Hyp 941fe27859SRichard Henderson * mode differs slightly, and we fix this up when populating HSR in 951fe27859SRichard Henderson * arm_cpu_do_interrupt_aarch32_hyp(). 961fe27859SRichard Henderson * The exception is FP/SIMD access traps -- these report extra information 971fe27859SRichard Henderson * when taking an exception to AArch32. For those we include the extra coproc 981fe27859SRichard Henderson * and TA fields, and mask them out when taking the exception to AArch64. 991fe27859SRichard Henderson */ 1001fe27859SRichard Henderson static inline uint32_t syn_uncategorized(void) 1011fe27859SRichard Henderson { 1021fe27859SRichard Henderson return (EC_UNCATEGORIZED << ARM_EL_EC_SHIFT) | ARM_EL_IL; 1031fe27859SRichard Henderson } 1041fe27859SRichard Henderson 1051fe27859SRichard Henderson static inline uint32_t syn_aa64_svc(uint32_t imm16) 1061fe27859SRichard Henderson { 1071fe27859SRichard Henderson return (EC_AA64_SVC << ARM_EL_EC_SHIFT) | ARM_EL_IL | (imm16 & 0xffff); 1081fe27859SRichard Henderson } 1091fe27859SRichard Henderson 1101fe27859SRichard Henderson static inline uint32_t syn_aa64_hvc(uint32_t imm16) 1111fe27859SRichard Henderson { 1121fe27859SRichard Henderson return (EC_AA64_HVC << ARM_EL_EC_SHIFT) | ARM_EL_IL | (imm16 & 0xffff); 1131fe27859SRichard Henderson } 1141fe27859SRichard Henderson 1151fe27859SRichard Henderson static inline uint32_t syn_aa64_smc(uint32_t imm16) 1161fe27859SRichard Henderson { 1171fe27859SRichard Henderson return (EC_AA64_SMC << ARM_EL_EC_SHIFT) | ARM_EL_IL | (imm16 & 0xffff); 1181fe27859SRichard Henderson } 1191fe27859SRichard Henderson 1201fe27859SRichard Henderson static inline uint32_t syn_aa32_svc(uint32_t imm16, bool is_16bit) 1211fe27859SRichard Henderson { 1221fe27859SRichard Henderson return (EC_AA32_SVC << ARM_EL_EC_SHIFT) | (imm16 & 0xffff) 1231fe27859SRichard Henderson | (is_16bit ? 0 : ARM_EL_IL); 1241fe27859SRichard Henderson } 1251fe27859SRichard Henderson 1261fe27859SRichard Henderson static inline uint32_t syn_aa32_hvc(uint32_t imm16) 1271fe27859SRichard Henderson { 1281fe27859SRichard Henderson return (EC_AA32_HVC << ARM_EL_EC_SHIFT) | ARM_EL_IL | (imm16 & 0xffff); 1291fe27859SRichard Henderson } 1301fe27859SRichard Henderson 1311fe27859SRichard Henderson static inline uint32_t syn_aa32_smc(void) 1321fe27859SRichard Henderson { 1331fe27859SRichard Henderson return (EC_AA32_SMC << ARM_EL_EC_SHIFT) | ARM_EL_IL; 1341fe27859SRichard Henderson } 1351fe27859SRichard Henderson 1361fe27859SRichard Henderson static inline uint32_t syn_aa64_bkpt(uint32_t imm16) 1371fe27859SRichard Henderson { 1381fe27859SRichard Henderson return (EC_AA64_BKPT << ARM_EL_EC_SHIFT) | ARM_EL_IL | (imm16 & 0xffff); 1391fe27859SRichard Henderson } 1401fe27859SRichard Henderson 1411fe27859SRichard Henderson static inline uint32_t syn_aa32_bkpt(uint32_t imm16, bool is_16bit) 1421fe27859SRichard Henderson { 1431fe27859SRichard Henderson return (EC_AA32_BKPT << ARM_EL_EC_SHIFT) | (imm16 & 0xffff) 1441fe27859SRichard Henderson | (is_16bit ? 0 : ARM_EL_IL); 1451fe27859SRichard Henderson } 1461fe27859SRichard Henderson 1471fe27859SRichard Henderson static inline uint32_t syn_aa64_sysregtrap(int op0, int op1, int op2, 1481fe27859SRichard Henderson int crn, int crm, int rt, 1491fe27859SRichard Henderson int isread) 1501fe27859SRichard Henderson { 1511fe27859SRichard Henderson return (EC_SYSTEMREGISTERTRAP << ARM_EL_EC_SHIFT) | ARM_EL_IL 1521fe27859SRichard Henderson | (op0 << 20) | (op2 << 17) | (op1 << 14) | (crn << 10) | (rt << 5) 1531fe27859SRichard Henderson | (crm << 1) | isread; 1541fe27859SRichard Henderson } 1551fe27859SRichard Henderson 1561fe27859SRichard Henderson static inline uint32_t syn_cp14_rt_trap(int cv, int cond, int opc1, int opc2, 1571fe27859SRichard Henderson int crn, int crm, int rt, int isread, 1581fe27859SRichard Henderson bool is_16bit) 1591fe27859SRichard Henderson { 1601fe27859SRichard Henderson return (EC_CP14RTTRAP << ARM_EL_EC_SHIFT) 1611fe27859SRichard Henderson | (is_16bit ? 0 : ARM_EL_IL) 1621fe27859SRichard Henderson | (cv << 24) | (cond << 20) | (opc2 << 17) | (opc1 << 14) 1631fe27859SRichard Henderson | (crn << 10) | (rt << 5) | (crm << 1) | isread; 1641fe27859SRichard Henderson } 1651fe27859SRichard Henderson 1661fe27859SRichard Henderson static inline uint32_t syn_cp15_rt_trap(int cv, int cond, int opc1, int opc2, 1671fe27859SRichard Henderson int crn, int crm, int rt, int isread, 1681fe27859SRichard Henderson bool is_16bit) 1691fe27859SRichard Henderson { 1701fe27859SRichard Henderson return (EC_CP15RTTRAP << ARM_EL_EC_SHIFT) 1711fe27859SRichard Henderson | (is_16bit ? 0 : ARM_EL_IL) 1721fe27859SRichard Henderson | (cv << 24) | (cond << 20) | (opc2 << 17) | (opc1 << 14) 1731fe27859SRichard Henderson | (crn << 10) | (rt << 5) | (crm << 1) | isread; 1741fe27859SRichard Henderson } 1751fe27859SRichard Henderson 1761fe27859SRichard Henderson static inline uint32_t syn_cp14_rrt_trap(int cv, int cond, int opc1, int crm, 1771fe27859SRichard Henderson int rt, int rt2, int isread, 1781fe27859SRichard Henderson bool is_16bit) 1791fe27859SRichard Henderson { 1801fe27859SRichard Henderson return (EC_CP14RRTTRAP << ARM_EL_EC_SHIFT) 1811fe27859SRichard Henderson | (is_16bit ? 0 : ARM_EL_IL) 1821fe27859SRichard Henderson | (cv << 24) | (cond << 20) | (opc1 << 16) 1831fe27859SRichard Henderson | (rt2 << 10) | (rt << 5) | (crm << 1) | isread; 1841fe27859SRichard Henderson } 1851fe27859SRichard Henderson 1861fe27859SRichard Henderson static inline uint32_t syn_cp15_rrt_trap(int cv, int cond, int opc1, int crm, 1871fe27859SRichard Henderson int rt, int rt2, int isread, 1881fe27859SRichard Henderson bool is_16bit) 1891fe27859SRichard Henderson { 1901fe27859SRichard Henderson return (EC_CP15RRTTRAP << ARM_EL_EC_SHIFT) 1911fe27859SRichard Henderson | (is_16bit ? 0 : ARM_EL_IL) 1921fe27859SRichard Henderson | (cv << 24) | (cond << 20) | (opc1 << 16) 1931fe27859SRichard Henderson | (rt2 << 10) | (rt << 5) | (crm << 1) | isread; 1941fe27859SRichard Henderson } 1951fe27859SRichard Henderson 196fa33eeadSRichard Henderson static inline uint32_t syn_fp_access_trap(int cv, int cond, bool is_16bit, 197fa33eeadSRichard Henderson int coproc) 1981fe27859SRichard Henderson { 199fa33eeadSRichard Henderson /* AArch32 FP trap or any AArch64 FP/SIMD trap: TA == 0 */ 2001fe27859SRichard Henderson return (EC_ADVSIMDFPACCESSTRAP << ARM_EL_EC_SHIFT) 2011fe27859SRichard Henderson | (is_16bit ? 0 : ARM_EL_IL) 202fa33eeadSRichard Henderson | (cv << 24) | (cond << 20) | coproc; 2031fe27859SRichard Henderson } 2041fe27859SRichard Henderson 2051fe27859SRichard Henderson static inline uint32_t syn_simd_access_trap(int cv, int cond, bool is_16bit) 2061fe27859SRichard Henderson { 2071fe27859SRichard Henderson /* AArch32 SIMD trap: TA == 1 coproc == 0 */ 2081fe27859SRichard Henderson return (EC_ADVSIMDFPACCESSTRAP << ARM_EL_EC_SHIFT) 2091fe27859SRichard Henderson | (is_16bit ? 0 : ARM_EL_IL) 2101fe27859SRichard Henderson | (cv << 24) | (cond << 20) | (1 << 5); 2111fe27859SRichard Henderson } 2121fe27859SRichard Henderson 2131fe27859SRichard Henderson static inline uint32_t syn_sve_access_trap(void) 2141fe27859SRichard Henderson { 2151fe27859SRichard Henderson return EC_SVEACCESSTRAP << ARM_EL_EC_SHIFT; 2161fe27859SRichard Henderson } 2171fe27859SRichard Henderson 218*58b2908eSRichard Henderson static inline uint32_t syn_smetrap(SMEExceptionType etype, bool is_16bit) 219*58b2908eSRichard Henderson { 220*58b2908eSRichard Henderson return (EC_SMETRAP << ARM_EL_EC_SHIFT) 221*58b2908eSRichard Henderson | (is_16bit ? 0 : ARM_EL_IL) | etype; 222*58b2908eSRichard Henderson } 223*58b2908eSRichard Henderson 2241fe27859SRichard Henderson static inline uint32_t syn_pactrap(void) 2251fe27859SRichard Henderson { 2261fe27859SRichard Henderson return EC_PACTRAP << ARM_EL_EC_SHIFT; 2271fe27859SRichard Henderson } 2281fe27859SRichard Henderson 2291fe27859SRichard Henderson static inline uint32_t syn_btitrap(int btype) 2301fe27859SRichard Henderson { 2311fe27859SRichard Henderson return (EC_BTITRAP << ARM_EL_EC_SHIFT) | btype; 2321fe27859SRichard Henderson } 2331fe27859SRichard Henderson 2348e228c9eSPeter Maydell static inline uint32_t syn_bxjtrap(int cv, int cond, int rm) 2358e228c9eSPeter Maydell { 2368e228c9eSPeter Maydell return (EC_BXJTRAP << ARM_EL_EC_SHIFT) | ARM_EL_IL | 2378e228c9eSPeter Maydell (cv << 24) | (cond << 20) | rm; 2388e228c9eSPeter Maydell } 2398e228c9eSPeter Maydell 2401fe27859SRichard Henderson static inline uint32_t syn_insn_abort(int same_el, int ea, int s1ptw, int fsc) 2411fe27859SRichard Henderson { 2421fe27859SRichard Henderson return (EC_INSNABORT << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT) 2431fe27859SRichard Henderson | ARM_EL_IL | (ea << 9) | (s1ptw << 7) | fsc; 2441fe27859SRichard Henderson } 2451fe27859SRichard Henderson 2461fe27859SRichard Henderson static inline uint32_t syn_data_abort_no_iss(int same_el, int fnv, 2471fe27859SRichard Henderson int ea, int cm, int s1ptw, 2481fe27859SRichard Henderson int wnr, int fsc) 2491fe27859SRichard Henderson { 2501fe27859SRichard Henderson return (EC_DATAABORT << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT) 2511fe27859SRichard Henderson | ARM_EL_IL 2521fe27859SRichard Henderson | (fnv << 10) | (ea << 9) | (cm << 8) | (s1ptw << 7) 2531fe27859SRichard Henderson | (wnr << 6) | fsc; 2541fe27859SRichard Henderson } 2551fe27859SRichard Henderson 2561fe27859SRichard Henderson static inline uint32_t syn_data_abort_with_iss(int same_el, 2571fe27859SRichard Henderson int sas, int sse, int srt, 2581fe27859SRichard Henderson int sf, int ar, 2591fe27859SRichard Henderson int ea, int cm, int s1ptw, 2601fe27859SRichard Henderson int wnr, int fsc, 2611fe27859SRichard Henderson bool is_16bit) 2621fe27859SRichard Henderson { 2631fe27859SRichard Henderson return (EC_DATAABORT << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT) 2641fe27859SRichard Henderson | (is_16bit ? 0 : ARM_EL_IL) 2651fe27859SRichard Henderson | ARM_EL_ISV | (sas << 22) | (sse << 21) | (srt << 16) 2661fe27859SRichard Henderson | (sf << 15) | (ar << 14) 2671fe27859SRichard Henderson | (ea << 9) | (cm << 8) | (s1ptw << 7) | (wnr << 6) | fsc; 2681fe27859SRichard Henderson } 2691fe27859SRichard Henderson 2701fe27859SRichard Henderson static inline uint32_t syn_swstep(int same_el, int isv, int ex) 2711fe27859SRichard Henderson { 2721fe27859SRichard Henderson return (EC_SOFTWARESTEP << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT) 2731fe27859SRichard Henderson | ARM_EL_IL | (isv << 24) | (ex << 6) | 0x22; 2741fe27859SRichard Henderson } 2751fe27859SRichard Henderson 2761fe27859SRichard Henderson static inline uint32_t syn_watchpoint(int same_el, int cm, int wnr) 2771fe27859SRichard Henderson { 2781fe27859SRichard Henderson return (EC_WATCHPOINT << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT) 2791fe27859SRichard Henderson | ARM_EL_IL | (cm << 8) | (wnr << 6) | 0x22; 2801fe27859SRichard Henderson } 2811fe27859SRichard Henderson 2821fe27859SRichard Henderson static inline uint32_t syn_breakpoint(int same_el) 2831fe27859SRichard Henderson { 2841fe27859SRichard Henderson return (EC_BREAKPOINT << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT) 2851fe27859SRichard Henderson | ARM_EL_IL | 0x22; 2861fe27859SRichard Henderson } 2871fe27859SRichard Henderson 2881fe27859SRichard Henderson static inline uint32_t syn_wfx(int cv, int cond, int ti, bool is_16bit) 2891fe27859SRichard Henderson { 2901fe27859SRichard Henderson return (EC_WFX_TRAP << ARM_EL_EC_SHIFT) | 2911fe27859SRichard Henderson (is_16bit ? 0 : (1 << ARM_EL_IL_SHIFT)) | 2921fe27859SRichard Henderson (cv << 24) | (cond << 20) | ti; 2931fe27859SRichard Henderson } 2941fe27859SRichard Henderson 295520d1621SPeter Maydell static inline uint32_t syn_illegalstate(void) 296520d1621SPeter Maydell { 297520d1621SPeter Maydell return (EC_ILLEGALSTATE << ARM_EL_EC_SHIFT) | ARM_EL_IL; 298520d1621SPeter Maydell } 299520d1621SPeter Maydell 300ee03027aSRichard Henderson static inline uint32_t syn_pcalignment(void) 301ee03027aSRichard Henderson { 302ee03027aSRichard Henderson return (EC_PCALIGNMENT << ARM_EL_EC_SHIFT) | ARM_EL_IL; 303ee03027aSRichard Henderson } 304ee03027aSRichard Henderson 3053c29632fSRichard Henderson static inline uint32_t syn_serror(uint32_t extra) 3063c29632fSRichard Henderson { 3073c29632fSRichard Henderson return (EC_SERROR << ARM_EL_EC_SHIFT) | ARM_EL_IL | extra; 3083c29632fSRichard Henderson } 3093c29632fSRichard Henderson 3101fe27859SRichard Henderson #endif /* TARGET_ARM_SYNDROME_H */ 311