xref: /openbmc/qemu/target/arm/syndrome.h (revision 11a3c4a286d5dc603582ea0a1fca62c2ec0a1aee)
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,
515572f755SPeter Maydell     EC_ERETTRAP               = 0x1a,
528a69a423SAaron Lindsay     EC_PACFAIL                = 0x1c,
5358b2908eSRichard Henderson     EC_SMETRAP                = 0x1d,
54f65a9bc7SRichard Henderson     EC_GPC                    = 0x1e,
551fe27859SRichard Henderson     EC_INSNABORT              = 0x20,
561fe27859SRichard Henderson     EC_INSNABORT_SAME_EL      = 0x21,
571fe27859SRichard Henderson     EC_PCALIGNMENT            = 0x22,
581fe27859SRichard Henderson     EC_DATAABORT              = 0x24,
591fe27859SRichard Henderson     EC_DATAABORT_SAME_EL      = 0x25,
601fe27859SRichard Henderson     EC_SPALIGNMENT            = 0x26,
6131aaaddeSPeter Maydell     EC_MOP                    = 0x27,
621fe27859SRichard Henderson     EC_AA32_FPTRAP            = 0x28,
631fe27859SRichard Henderson     EC_AA64_FPTRAP            = 0x2c,
641fe27859SRichard Henderson     EC_SERROR                 = 0x2f,
651fe27859SRichard Henderson     EC_BREAKPOINT             = 0x30,
661fe27859SRichard Henderson     EC_BREAKPOINT_SAME_EL     = 0x31,
671fe27859SRichard Henderson     EC_SOFTWARESTEP           = 0x32,
681fe27859SRichard Henderson     EC_SOFTWARESTEP_SAME_EL   = 0x33,
691fe27859SRichard Henderson     EC_WATCHPOINT             = 0x34,
701fe27859SRichard Henderson     EC_WATCHPOINT_SAME_EL     = 0x35,
711fe27859SRichard Henderson     EC_AA32_BKPT              = 0x38,
721fe27859SRichard Henderson     EC_VECTORCATCH            = 0x3a,
731fe27859SRichard Henderson     EC_AA64_BKPT              = 0x3c,
741fe27859SRichard Henderson };
751fe27859SRichard Henderson 
7658b2908eSRichard Henderson typedef enum {
7758b2908eSRichard Henderson     SME_ET_AccessTrap,
7858b2908eSRichard Henderson     SME_ET_Streaming,
7958b2908eSRichard Henderson     SME_ET_NotStreaming,
8058b2908eSRichard Henderson     SME_ET_InactiveZA,
8158b2908eSRichard Henderson } SMEExceptionType;
8258b2908eSRichard Henderson 
831fe27859SRichard Henderson #define ARM_EL_EC_SHIFT 26
841fe27859SRichard Henderson #define ARM_EL_IL_SHIFT 25
851fe27859SRichard Henderson #define ARM_EL_ISV_SHIFT 24
861fe27859SRichard Henderson #define ARM_EL_IL (1 << ARM_EL_IL_SHIFT)
871fe27859SRichard Henderson #define ARM_EL_ISV (1 << ARM_EL_ISV_SHIFT)
881fe27859SRichard Henderson 
891fe27859SRichard Henderson static inline uint32_t syn_get_ec(uint32_t syn)
901fe27859SRichard Henderson {
911fe27859SRichard Henderson     return syn >> ARM_EL_EC_SHIFT;
921fe27859SRichard Henderson }
931fe27859SRichard Henderson 
941fe27859SRichard Henderson /*
951fe27859SRichard Henderson  * Utility functions for constructing various kinds of syndrome value.
961fe27859SRichard Henderson  * Note that in general we follow the AArch64 syndrome values; in a
971fe27859SRichard Henderson  * few cases the value in HSR for exceptions taken to AArch32 Hyp
981fe27859SRichard Henderson  * mode differs slightly, and we fix this up when populating HSR in
991fe27859SRichard Henderson  * arm_cpu_do_interrupt_aarch32_hyp().
1001fe27859SRichard Henderson  * The exception is FP/SIMD access traps -- these report extra information
1011fe27859SRichard Henderson  * when taking an exception to AArch32. For those we include the extra coproc
1021fe27859SRichard Henderson  * and TA fields, and mask them out when taking the exception to AArch64.
1031fe27859SRichard Henderson  */
1041fe27859SRichard Henderson static inline uint32_t syn_uncategorized(void)
1051fe27859SRichard Henderson {
1061fe27859SRichard Henderson     return (EC_UNCATEGORIZED << ARM_EL_EC_SHIFT) | ARM_EL_IL;
1071fe27859SRichard Henderson }
1081fe27859SRichard Henderson 
1091fe27859SRichard Henderson static inline uint32_t syn_aa64_svc(uint32_t imm16)
1101fe27859SRichard Henderson {
1111fe27859SRichard Henderson     return (EC_AA64_SVC << ARM_EL_EC_SHIFT) | ARM_EL_IL | (imm16 & 0xffff);
1121fe27859SRichard Henderson }
1131fe27859SRichard Henderson 
1141fe27859SRichard Henderson static inline uint32_t syn_aa64_hvc(uint32_t imm16)
1151fe27859SRichard Henderson {
1161fe27859SRichard Henderson     return (EC_AA64_HVC << ARM_EL_EC_SHIFT) | ARM_EL_IL | (imm16 & 0xffff);
1171fe27859SRichard Henderson }
1181fe27859SRichard Henderson 
1191fe27859SRichard Henderson static inline uint32_t syn_aa64_smc(uint32_t imm16)
1201fe27859SRichard Henderson {
1211fe27859SRichard Henderson     return (EC_AA64_SMC << ARM_EL_EC_SHIFT) | ARM_EL_IL | (imm16 & 0xffff);
1221fe27859SRichard Henderson }
1231fe27859SRichard Henderson 
1241fe27859SRichard Henderson static inline uint32_t syn_aa32_svc(uint32_t imm16, bool is_16bit)
1251fe27859SRichard Henderson {
1261fe27859SRichard Henderson     return (EC_AA32_SVC << ARM_EL_EC_SHIFT) | (imm16 & 0xffff)
1271fe27859SRichard Henderson         | (is_16bit ? 0 : ARM_EL_IL);
1281fe27859SRichard Henderson }
1291fe27859SRichard Henderson 
1301fe27859SRichard Henderson static inline uint32_t syn_aa32_hvc(uint32_t imm16)
1311fe27859SRichard Henderson {
1321fe27859SRichard Henderson     return (EC_AA32_HVC << ARM_EL_EC_SHIFT) | ARM_EL_IL | (imm16 & 0xffff);
1331fe27859SRichard Henderson }
1341fe27859SRichard Henderson 
1351fe27859SRichard Henderson static inline uint32_t syn_aa32_smc(void)
1361fe27859SRichard Henderson {
1371fe27859SRichard Henderson     return (EC_AA32_SMC << ARM_EL_EC_SHIFT) | ARM_EL_IL;
1381fe27859SRichard Henderson }
1391fe27859SRichard Henderson 
1401fe27859SRichard Henderson static inline uint32_t syn_aa64_bkpt(uint32_t imm16)
1411fe27859SRichard Henderson {
1421fe27859SRichard Henderson     return (EC_AA64_BKPT << ARM_EL_EC_SHIFT) | ARM_EL_IL | (imm16 & 0xffff);
1431fe27859SRichard Henderson }
1441fe27859SRichard Henderson 
1451fe27859SRichard Henderson static inline uint32_t syn_aa32_bkpt(uint32_t imm16, bool is_16bit)
1461fe27859SRichard Henderson {
1471fe27859SRichard Henderson     return (EC_AA32_BKPT << ARM_EL_EC_SHIFT) | (imm16 & 0xffff)
1481fe27859SRichard Henderson         | (is_16bit ? 0 : ARM_EL_IL);
1491fe27859SRichard Henderson }
1501fe27859SRichard Henderson 
1511fe27859SRichard Henderson static inline uint32_t syn_aa64_sysregtrap(int op0, int op1, int op2,
1521fe27859SRichard Henderson                                            int crn, int crm, int rt,
1531fe27859SRichard Henderson                                            int isread)
1541fe27859SRichard Henderson {
1551fe27859SRichard Henderson     return (EC_SYSTEMREGISTERTRAP << ARM_EL_EC_SHIFT) | ARM_EL_IL
1561fe27859SRichard Henderson         | (op0 << 20) | (op2 << 17) | (op1 << 14) | (crn << 10) | (rt << 5)
1571fe27859SRichard Henderson         | (crm << 1) | isread;
1581fe27859SRichard Henderson }
1591fe27859SRichard Henderson 
1601fe27859SRichard Henderson static inline uint32_t syn_cp14_rt_trap(int cv, int cond, int opc1, int opc2,
1611fe27859SRichard Henderson                                         int crn, int crm, int rt, int isread,
1621fe27859SRichard Henderson                                         bool is_16bit)
1631fe27859SRichard Henderson {
1641fe27859SRichard Henderson     return (EC_CP14RTTRAP << ARM_EL_EC_SHIFT)
1651fe27859SRichard Henderson         | (is_16bit ? 0 : ARM_EL_IL)
1661fe27859SRichard Henderson         | (cv << 24) | (cond << 20) | (opc2 << 17) | (opc1 << 14)
1671fe27859SRichard Henderson         | (crn << 10) | (rt << 5) | (crm << 1) | isread;
1681fe27859SRichard Henderson }
1691fe27859SRichard Henderson 
1701fe27859SRichard Henderson static inline uint32_t syn_cp15_rt_trap(int cv, int cond, int opc1, int opc2,
1711fe27859SRichard Henderson                                         int crn, int crm, int rt, int isread,
1721fe27859SRichard Henderson                                         bool is_16bit)
1731fe27859SRichard Henderson {
1741fe27859SRichard Henderson     return (EC_CP15RTTRAP << ARM_EL_EC_SHIFT)
1751fe27859SRichard Henderson         | (is_16bit ? 0 : ARM_EL_IL)
1761fe27859SRichard Henderson         | (cv << 24) | (cond << 20) | (opc2 << 17) | (opc1 << 14)
1771fe27859SRichard Henderson         | (crn << 10) | (rt << 5) | (crm << 1) | isread;
1781fe27859SRichard Henderson }
1791fe27859SRichard Henderson 
1801fe27859SRichard Henderson static inline uint32_t syn_cp14_rrt_trap(int cv, int cond, int opc1, int crm,
1811fe27859SRichard Henderson                                          int rt, int rt2, int isread,
1821fe27859SRichard Henderson                                          bool is_16bit)
1831fe27859SRichard Henderson {
1841fe27859SRichard Henderson     return (EC_CP14RRTTRAP << ARM_EL_EC_SHIFT)
1851fe27859SRichard Henderson         | (is_16bit ? 0 : ARM_EL_IL)
1861fe27859SRichard Henderson         | (cv << 24) | (cond << 20) | (opc1 << 16)
1871fe27859SRichard Henderson         | (rt2 << 10) | (rt << 5) | (crm << 1) | isread;
1881fe27859SRichard Henderson }
1891fe27859SRichard Henderson 
1901fe27859SRichard Henderson static inline uint32_t syn_cp15_rrt_trap(int cv, int cond, int opc1, int crm,
1911fe27859SRichard Henderson                                          int rt, int rt2, int isread,
1921fe27859SRichard Henderson                                          bool is_16bit)
1931fe27859SRichard Henderson {
1941fe27859SRichard Henderson     return (EC_CP15RRTTRAP << ARM_EL_EC_SHIFT)
1951fe27859SRichard Henderson         | (is_16bit ? 0 : ARM_EL_IL)
1961fe27859SRichard Henderson         | (cv << 24) | (cond << 20) | (opc1 << 16)
1971fe27859SRichard Henderson         | (rt2 << 10) | (rt << 5) | (crm << 1) | isread;
1981fe27859SRichard Henderson }
1991fe27859SRichard Henderson 
200fa33eeadSRichard Henderson static inline uint32_t syn_fp_access_trap(int cv, int cond, bool is_16bit,
201fa33eeadSRichard Henderson                                           int coproc)
2021fe27859SRichard Henderson {
203fa33eeadSRichard Henderson     /* AArch32 FP trap or any AArch64 FP/SIMD trap: TA == 0 */
2041fe27859SRichard Henderson     return (EC_ADVSIMDFPACCESSTRAP << ARM_EL_EC_SHIFT)
2051fe27859SRichard Henderson         | (is_16bit ? 0 : ARM_EL_IL)
206fa33eeadSRichard Henderson         | (cv << 24) | (cond << 20) | coproc;
2071fe27859SRichard Henderson }
2081fe27859SRichard Henderson 
2091fe27859SRichard Henderson static inline uint32_t syn_simd_access_trap(int cv, int cond, bool is_16bit)
2101fe27859SRichard Henderson {
2111fe27859SRichard Henderson     /* AArch32 SIMD trap: TA == 1 coproc == 0 */
2121fe27859SRichard Henderson     return (EC_ADVSIMDFPACCESSTRAP << ARM_EL_EC_SHIFT)
2131fe27859SRichard Henderson         | (is_16bit ? 0 : ARM_EL_IL)
2141fe27859SRichard Henderson         | (cv << 24) | (cond << 20) | (1 << 5);
2151fe27859SRichard Henderson }
2161fe27859SRichard Henderson 
2171fe27859SRichard Henderson static inline uint32_t syn_sve_access_trap(void)
2181fe27859SRichard Henderson {
219*11a3c4a2SPeter Maydell     return (EC_SVEACCESSTRAP << ARM_EL_EC_SHIFT) | ARM_EL_IL;
2201fe27859SRichard Henderson }
2211fe27859SRichard Henderson 
2225572f755SPeter Maydell /*
2235572f755SPeter Maydell  * eret_op is bits [1:0] of the ERET instruction, so:
2245572f755SPeter Maydell  * 0 for ERET, 2 for ERETAA, 3 for ERETAB.
2255572f755SPeter Maydell  */
2265572f755SPeter Maydell static inline uint32_t syn_erettrap(int eret_op)
2275572f755SPeter Maydell {
2285572f755SPeter Maydell     return (EC_ERETTRAP << ARM_EL_EC_SHIFT) | ARM_EL_IL | eret_op;
2295572f755SPeter Maydell }
2305572f755SPeter Maydell 
23158b2908eSRichard Henderson static inline uint32_t syn_smetrap(SMEExceptionType etype, bool is_16bit)
23258b2908eSRichard Henderson {
23358b2908eSRichard Henderson     return (EC_SMETRAP << ARM_EL_EC_SHIFT)
23458b2908eSRichard Henderson         | (is_16bit ? 0 : ARM_EL_IL) | etype;
23558b2908eSRichard Henderson }
23658b2908eSRichard Henderson 
2378a69a423SAaron Lindsay static inline uint32_t syn_pacfail(bool data, int keynumber)
2388a69a423SAaron Lindsay {
2398a69a423SAaron Lindsay     int error_code = (data << 1) | keynumber;
2408a69a423SAaron Lindsay     return (EC_PACFAIL << ARM_EL_EC_SHIFT) | ARM_EL_IL | error_code;
2418a69a423SAaron Lindsay }
2428a69a423SAaron Lindsay 
2431fe27859SRichard Henderson static inline uint32_t syn_pactrap(void)
2441fe27859SRichard Henderson {
245*11a3c4a2SPeter Maydell     return (EC_PACTRAP << ARM_EL_EC_SHIFT) | ARM_EL_IL;
2461fe27859SRichard Henderson }
2471fe27859SRichard Henderson 
2481fe27859SRichard Henderson static inline uint32_t syn_btitrap(int btype)
2491fe27859SRichard Henderson {
250*11a3c4a2SPeter Maydell     return (EC_BTITRAP << ARM_EL_EC_SHIFT) | ARM_EL_IL | btype;
2511fe27859SRichard Henderson }
2521fe27859SRichard Henderson 
2538e228c9eSPeter Maydell static inline uint32_t syn_bxjtrap(int cv, int cond, int rm)
2548e228c9eSPeter Maydell {
2558e228c9eSPeter Maydell     return (EC_BXJTRAP << ARM_EL_EC_SHIFT) | ARM_EL_IL |
2568e228c9eSPeter Maydell         (cv << 24) | (cond << 20) | rm;
2578e228c9eSPeter Maydell }
2588e228c9eSPeter Maydell 
259f65a9bc7SRichard Henderson static inline uint32_t syn_gpc(int s2ptw, int ind, int gpcsc,
260f65a9bc7SRichard Henderson                                int cm, int s1ptw, int wnr, int fsc)
261f65a9bc7SRichard Henderson {
262f65a9bc7SRichard Henderson     /* TODO: FEAT_NV2 adds VNCR */
263f65a9bc7SRichard Henderson     return (EC_GPC << ARM_EL_EC_SHIFT) | ARM_EL_IL | (s2ptw << 21)
264f65a9bc7SRichard Henderson             | (ind << 20) | (gpcsc << 14) | (cm << 8) | (s1ptw << 7)
265f65a9bc7SRichard Henderson             | (wnr << 6) | fsc;
266f65a9bc7SRichard Henderson }
267f65a9bc7SRichard Henderson 
2681fe27859SRichard Henderson static inline uint32_t syn_insn_abort(int same_el, int ea, int s1ptw, int fsc)
2691fe27859SRichard Henderson {
2701fe27859SRichard Henderson     return (EC_INSNABORT << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT)
2711fe27859SRichard Henderson         | ARM_EL_IL | (ea << 9) | (s1ptw << 7) | fsc;
2721fe27859SRichard Henderson }
2731fe27859SRichard Henderson 
2741fe27859SRichard Henderson static inline uint32_t syn_data_abort_no_iss(int same_el, int fnv,
2751fe27859SRichard Henderson                                              int ea, int cm, int s1ptw,
2761fe27859SRichard Henderson                                              int wnr, int fsc)
2771fe27859SRichard Henderson {
2781fe27859SRichard Henderson     return (EC_DATAABORT << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT)
2791fe27859SRichard Henderson            | ARM_EL_IL
2801fe27859SRichard Henderson            | (fnv << 10) | (ea << 9) | (cm << 8) | (s1ptw << 7)
2811fe27859SRichard Henderson            | (wnr << 6) | fsc;
2821fe27859SRichard Henderson }
2831fe27859SRichard Henderson 
2841fe27859SRichard Henderson static inline uint32_t syn_data_abort_with_iss(int same_el,
2851fe27859SRichard Henderson                                                int sas, int sse, int srt,
2861fe27859SRichard Henderson                                                int sf, int ar,
2871fe27859SRichard Henderson                                                int ea, int cm, int s1ptw,
2881fe27859SRichard Henderson                                                int wnr, int fsc,
2891fe27859SRichard Henderson                                                bool is_16bit)
2901fe27859SRichard Henderson {
2911fe27859SRichard Henderson     return (EC_DATAABORT << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT)
2921fe27859SRichard Henderson            | (is_16bit ? 0 : ARM_EL_IL)
2931fe27859SRichard Henderson            | ARM_EL_ISV | (sas << 22) | (sse << 21) | (srt << 16)
2941fe27859SRichard Henderson            | (sf << 15) | (ar << 14)
2951fe27859SRichard Henderson            | (ea << 9) | (cm << 8) | (s1ptw << 7) | (wnr << 6) | fsc;
2961fe27859SRichard Henderson }
2971fe27859SRichard Henderson 
2981fe27859SRichard Henderson static inline uint32_t syn_swstep(int same_el, int isv, int ex)
2991fe27859SRichard Henderson {
3001fe27859SRichard Henderson     return (EC_SOFTWARESTEP << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT)
3011fe27859SRichard Henderson         | ARM_EL_IL | (isv << 24) | (ex << 6) | 0x22;
3021fe27859SRichard Henderson }
3031fe27859SRichard Henderson 
3041fe27859SRichard Henderson static inline uint32_t syn_watchpoint(int same_el, int cm, int wnr)
3051fe27859SRichard Henderson {
3061fe27859SRichard Henderson     return (EC_WATCHPOINT << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT)
3071fe27859SRichard Henderson         | ARM_EL_IL | (cm << 8) | (wnr << 6) | 0x22;
3081fe27859SRichard Henderson }
3091fe27859SRichard Henderson 
3101fe27859SRichard Henderson static inline uint32_t syn_breakpoint(int same_el)
3111fe27859SRichard Henderson {
3121fe27859SRichard Henderson     return (EC_BREAKPOINT << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT)
3131fe27859SRichard Henderson         | ARM_EL_IL | 0x22;
3141fe27859SRichard Henderson }
3151fe27859SRichard Henderson 
3161fe27859SRichard Henderson static inline uint32_t syn_wfx(int cv, int cond, int ti, bool is_16bit)
3171fe27859SRichard Henderson {
3181fe27859SRichard Henderson     return (EC_WFX_TRAP << ARM_EL_EC_SHIFT) |
3191fe27859SRichard Henderson            (is_16bit ? 0 : (1 << ARM_EL_IL_SHIFT)) |
3201fe27859SRichard Henderson            (cv << 24) | (cond << 20) | ti;
3211fe27859SRichard Henderson }
3221fe27859SRichard Henderson 
323520d1621SPeter Maydell static inline uint32_t syn_illegalstate(void)
324520d1621SPeter Maydell {
325520d1621SPeter Maydell     return (EC_ILLEGALSTATE << ARM_EL_EC_SHIFT) | ARM_EL_IL;
326520d1621SPeter Maydell }
327520d1621SPeter Maydell 
328ee03027aSRichard Henderson static inline uint32_t syn_pcalignment(void)
329ee03027aSRichard Henderson {
330ee03027aSRichard Henderson     return (EC_PCALIGNMENT << ARM_EL_EC_SHIFT) | ARM_EL_IL;
331ee03027aSRichard Henderson }
332ee03027aSRichard Henderson 
3333c29632fSRichard Henderson static inline uint32_t syn_serror(uint32_t extra)
3343c29632fSRichard Henderson {
3353c29632fSRichard Henderson     return (EC_SERROR << ARM_EL_EC_SHIFT) | ARM_EL_IL | extra;
3363c29632fSRichard Henderson }
3373c29632fSRichard Henderson 
33831aaaddeSPeter Maydell static inline uint32_t syn_mop(bool is_set, bool is_setg, int options,
33931aaaddeSPeter Maydell                                bool epilogue, bool wrong_option, bool option_a,
34031aaaddeSPeter Maydell                                int destreg, int srcreg, int sizereg)
34131aaaddeSPeter Maydell {
34231aaaddeSPeter Maydell     return (EC_MOP << ARM_EL_EC_SHIFT) | ARM_EL_IL |
34331aaaddeSPeter Maydell         (is_set << 24) | (is_setg << 23) | (options << 19) |
34431aaaddeSPeter Maydell         (epilogue << 18) | (wrong_option << 17) | (option_a << 16) |
34531aaaddeSPeter Maydell         (destreg << 10) | (srcreg << 5) | sizereg;
34631aaaddeSPeter Maydell }
34731aaaddeSPeter Maydell 
34831aaaddeSPeter Maydell 
3491fe27859SRichard Henderson #endif /* TARGET_ARM_SYNDROME_H */
350