2 * Copyright (C) 2015 by pierrr kuo
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
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.
15 #ifndef OPENOCD_TARGET_ARMV8_OPCODES_H
16 #define OPENOCD_TARGET_ARMV8_OPCODES_H
18 #include "arm_opcodes.h"
20 #define SYSTEM_CUREL_MASK 0xC0
21 #define SYSTEM_CUREL_SHIFT 6
22 #define SYSTEM_CUREL_EL0 0x0
23 #define SYSTEM_CUREL_EL1 0x1
24 #define SYSTEM_CUREL_EL2 0x2
25 #define SYSTEM_CUREL_EL3 0x3
26 #define SYSTEM_CUREL_NONCH 0xF
27 #define SYSTEM_AARCH64 0x1
29 #define SYSTEM_AAR64_MODE_EL0t 0x0
30 #define SYSTEM_AAR64_MODE_EL1t 0x4
31 #define SYSTEM_AAR64_MODE_EL1h 0x5
32 #define SYSTEM_AAR64_MODE_EL2t 0x8
33 #define SYSTEM_AAR64_MODE_EL2h 0x9
34 #define SYSTEM_AAR64_MODE_EL3t 0xC
35 #define SYSTEM_AAR64_MODE_EL3h 0xd
37 #define SYSTEM_DAIF 0b1101101000010001
38 #define SYSTEM_DAIF_MASK 0x3C0
39 #define SYSTEM_DAIF_SHIFT 6
41 #define SYSTEM_ELR_EL1 0b1100001000000001
42 #define SYSTEM_ELR_EL2 0b1110001000000001
43 #define SYSTEM_ELR_EL3 0b1111001000000001
45 #define SYSTEM_FPCR 0b1101101000100000
46 #define SYSTEM_FPSR 0b1101101000100001
47 #define SYSTEM_DAIF 0b1101101000010001
48 #define SYSTEM_NZCV 0b1101101000010000
49 #define SYSTEM_SP_EL0 0b1100001000001000
50 #define SYSTEM_SP_EL1 0b1110001000001000
51 #define SYSTEM_SP_EL2 0b1111001000001000
52 #define SYSTEM_SP_SEL 0b1100001000010000
53 #define SYSTEM_SPSR_ABT 0b1110001000011001
54 #define SYSTEM_SPSR_FIQ 0b1110001000011011
55 #define SYSTEM_SPSR_IRQ 0b1110001000011000
56 #define SYSTEM_SPSR_UND 0b1110001000011010
58 #define SYSTEM_SPSR_EL1 0b1100001000000000
59 #define SYSTEM_SPSR_EL2 0b1110001000000000
60 #define SYSTEM_SPSR_EL3 0b1111001000000000
62 #define SYSTEM_ISR_EL1 0b1100011000001000
64 #define SYSTEM_DBG_DSPSR_EL0 0b1101101000101000
65 #define SYSTEM_DBG_DLR_EL0 0b1101101000101001
66 #define SYSTEM_DBG_DTRRX_EL0 0b1001100000101000
67 #define SYSTEM_DBG_DTRTX_EL0 0b1001100000101000
68 #define SYSTEM_DBG_DBGDTR_EL0 0b1001100000100000
70 #define SYSTEM_CCSIDR 0b1100100000000000
71 #define SYSTEM_CLIDR 0b1100100000000001
72 #define SYSTEM_CSSELR 0b1101000000000000
73 #define SYSTEM_CTYPE 0b1101100000000001
74 #define SYSTEM_CTR 0b1101100000000001
76 #define SYSTEM_DCCISW 0b0100001111110010
77 #define SYSTEM_DCCSW 0b0100001111010010
78 #define SYSTEM_ICIVAU 0b0101101110101001
79 #define SYSTEM_DCCVAU 0b0101101111011001
80 #define SYSTEM_DCCIVAC 0b0101101111110001
82 #define SYSTEM_MPIDR 0b1100000000000101
84 #define SYSTEM_TCR_EL1 0b1100000100000010
85 #define SYSTEM_TCR_EL2 0b1110000100000010
86 #define SYSTEM_TCR_EL3 0b1111000100000010
88 #define SYSTEM_TTBR0_EL1 0b1100000100000000
89 #define SYSTEM_TTBR0_EL2 0b1110000100000000
90 #define SYSTEM_TTBR0_EL3 0b1111000100000000
91 #define SYSTEM_TTBR1_EL1 0b1100000100000001
93 /* ARMv8 address translation */
94 #define SYSTEM_PAR_EL1 0b1100001110100000
95 #define SYSTEM_ATS12E0R 0b0110001111000110
96 #define SYSTEM_ATS12E1R 0b0110001111000100
97 #define SYSTEM_ATS1E2R 0b0110001111000000
98 #define SYSTEM_ATS1E3R 0b0111001111000000
100 /* fault status and fault address */
101 #define SYSTEM_FAR_EL1 0b1100001100000000
102 #define SYSTEM_FAR_EL2 0b1110001100000000
103 #define SYSTEM_FAR_EL3 0b1111001100000000
104 #define SYSTEM_ESR_EL1 0b1100001010010000
105 #define SYSTEM_ESR_EL2 0b1110001010010000
106 #define SYSTEM_ESR_EL3 0b1111001010010000
108 #define ARMV8_MRS_DSPSR(Rt) (0xd53b4500 | (Rt))
109 #define ARMV8_MSR_DSPSR(Rt) (0xd51b4500 | (Rt))
110 #define ARMV8_MRS_DLR(Rt) (0xd53b4520 | (Rt))
111 #define ARMV8_MSR_DLR(Rt) (0xd51b4520 | (Rt))
113 /* T32 instruction to access coprocessor registers */
114 #define ARMV8_MCR_T1(cp, CRn, opc1, CRm, opc2, Rt) ARMV4_5_MCR(cp, opc1, Rt, CRn, CRm, opc2)
115 #define ARMV8_MRC_T1(cp, CRn, opc1, CRm, opc2, Rt) ARMV4_5_MRC(cp, opc1, Rt, CRn, CRm, opc2)
117 /* T32 instructions to access DSPSR and DLR */
118 #define ARMV8_MRC_DSPSR(Rt) ARMV8_MRC_T1(15, 4, 3, 5, 0, Rt)
119 #define ARMV8_MCR_DSPSR(Rt) ARMV8_MCR_T1(15, 4, 3, 5, 0, Rt)
120 #define ARMV8_MRC_DLR(Rt) ARMV8_MRC_T1(15, 4, 3, 5, 1, Rt)
121 #define ARMV8_MCR_DLR(Rt) ARMV8_MCR_T1(15, 4, 3, 5, 1, Rt)
123 #define ARMV8_DCPS1(IM) (0xd4a00001 | (((IM) & 0xFFFF) << 5))
124 #define ARMV8_DCPS2(IM) (0xd4a00002 | (((IM) & 0xFFFF) << 5))
125 #define ARMV8_DCPS3(IM) (0xd4a00003 | (((IM) & 0xFFFF) << 5))
126 #define ARMV8_DCPS(EL, IM) (0xd4a00000 | (((IM) & 0xFFFF) << 5) | EL)
127 #define ARMV8_DCPS_T1(EL) (0xf78f8000 | EL)
128 #define ARMV8_DRPS 0xd6bf03e0
129 #define ARMV8_ERET_T1 0xf3de8f00
131 #define ARMV8_DSB_SY 0xd5033F9F
132 #define ARMV8_DSB_SY_T1 0xf3bf8f4f
133 #define ARMV8_ISB 0xd5033fdf
134 #define ARMV8_ISB_SY_T1 0xf3bf8f6f
136 #define ARMV8_MRS(System, Rt) (0xd5300000 | ((System) << 5) | (Rt))
137 /* ARM V8 Move to system register. */
138 #define ARMV8_MSR_GP(System, Rt) \
139 (0xd5100000 | ((System) << 5) | (Rt))
140 /* ARM V8 Move immediate to process state field. */
141 #define ARMV8_MSR_IM(Op1, CRm, Op2) \
142 (0xd500401f | ((Op1) << 16) | ((CRm) << 8) | ((Op2) << 5))
144 #define ARMV8_MRS_T1(R, M1, Rd, M) (0xF3E08020 | (R << 20) | (M1 << 16) | (Rd << 8) | (M << 4))
145 #define ARMV8_MRS_xPSR_T1(R, Rd) (0xF3EF8000 | (R << 20) | (Rd << 8))
146 #define ARMV8_MSR_GP_T1(R, M1, Rd, M) (0xF3808020 | (R << 20) | (M1 << 8) | (Rd << 16) | (M << 4))
147 #define ARMV8_MSR_GP_xPSR_T1(R, Rn, mask) (0xF3808000 | (R << 20) | (Rn << 16) | (mask << 8))
149 #define ARMV8_BKPT(Im) (0xD4200000 | ((Im & 0xffff) << 5))
150 #define ARMV8_HLT(Im) (0x0D4400000 | ((Im & 0xffff) << 5))
151 #define ARMV8_HLT_A1(Im) (0xE1000070 | ((Im & 0xFFF0) << 4) | (Im & 0xF))
153 #define ARMV8_MOVFSP_64(Rt) ((1 << 31) | 0x11000000 | (0x1f << 5) | (Rt))
154 #define ARMV8_MOVTSP_64(Rt) ((1 << 31) | 0x11000000 | (Rt << 5) | (0x1F))
155 #define ARMV8_MOVFSP_32(Rt) (0x11000000 | (0x1f << 5) | (Rt))
156 #define ARMV8_MOVTSP_32(Rt) (0x11000000 | (Rt << 5) | (0x1F))
158 #define ARMV8_SYS(System, Rt) (0xD5080000 | ((System) << 5) | Rt)
182 extern uint32_t armv8_opcode(struct armv8_common *armv8, enum armv8_opcode);
183 extern void armv8_select_opcodes(struct armv8_common *armv8, bool state_is_aarch64);
185 #endif /* OPENOCD_TARGET_ARMV8_OPCODES_H */