1 /* radare - Apache 2.0 - Copyright 2013 - Adam Pridgen <dso@rice.edu || adam.pridgen@thecoverofnight.com> */
2 #include <r_anal.h>
3 
4 #ifndef R2_JAVA_OPS_H
5 #define R2_JAVA_OPS_H
6 
7 enum {
8 	R_ANAL_JAVA_ILL_OP  =-1,   /* illegal instruction // trap */
9 	R_ANAL_JAVA_NULL_OP = 0,
10 	R_ANAL_JAVA_NOP = 1, /* does nothing */
11 	R_ANAL_JAVA_STORE_OP  = 1 << 20,  // Load or Store memory operation
12 	R_ANAL_JAVA_LOAD_OP   = 1 << 21,  // Load or Store memory operation
13 	R_ANAL_JAVA_REG_OP	= 1 << 22,  // register operation
14 	R_ANAL_JAVA_OBJ_OP	= 1 << 23,  // operates on an object
15 	R_ANAL_JAVA_STACK_OP  = 1 << 25,  // stack based operation
16 	R_ANAL_JAVA_BIN_OP	= 1 << 26,  // binary operation
17 	R_ANAL_JAVA_CODE_OP   = 1 << 27,  // operates on code
18 	R_ANAL_JAVA_DATA_OP   = 1 << 28,  // operates on data
19 	R_ANAL_JAVA_UNK_OP  = 1 << 29,  /* unknown opcode type */
20 	R_ANAL_JAVA_REP_OP  = 1 << 30,  /* repeats next instruction N times */
21 	R_ANAL_JAVA_COND_OP = 1 << 31,
22 };
23 
24 enum {
25 	R_ANAL_JAVA_TYPE_REF_NULL  = 0,
26 	R_ANAL_JAVA_TYPE_REF_UNK   = 1 << 1,
27 	R_ANAL_JAVA_TYPE_REF	   = 1 << 2,
28 	R_ANAL_JAVA_TYPE_SIGNED	= 1 << 3,
29 	R_ANAL_JAVA_TYPE_PRIM	  = 1 << 4,
30 	R_ANAL_JAVA_TYPE_CONST	 = 1 << 5,
31 	R_ANAL_JAVA_TYPE_STATIC	= 1 << 6,
32 	R_ANAL_JAVA_TYPE_VOLATILE  = 1 << 7,
33 	R_ANAL_JAVA_TYPE_PUBLIC	= 1 << 8,
34 
35 	R_ANAL_JAVA_TYPE_BOOL   = 1 << 10,
36 	R_ANAL_JAVA_TYPE_BYTE   = 1 << 11,
37 	R_ANAL_JAVA_TYPE_SHORT  = 1 << 12,
38 	R_ANAL_JAVA_TYPE_INT32  = 1 << 13,
39 	R_ANAL_JAVA_TYPE_INTEGER = 1 << 13,
40 	R_ANAL_JAVA_TYPE_INT64  = 1 << 14,
41 	R_ANAL_JAVA_TYPE_LONG   = 1 << 14,
42 	R_ANAL_JAVA_TYPE_FLOAT  = 1 << 15,
43 	R_ANAL_JAVA_TYPE_DOUBLE = 1 << 16,
44 	R_ANAL_JAVA_TYPE_STRING = 1 << 17,
45 	R_ANAL_JAVA_TYPE_CHAR   = 1 << 18,
46 	R_ANAL_JAVA_TYPE_VOID   = 1 << 19,
47 };
48 
49 // code ops
50 enum {
51 	R_ANAL_JAVA_CODEOP_JMP	= 1 << 1  | R_ANAL_JAVA_CODE_OP,/* mandatory jump */
52 	R_ANAL_JAVA_CODEOP_CALL   = 1 << 2  | R_ANAL_JAVA_CODE_OP,/* call to subroutine (branch+link) */
53 	R_ANAL_JAVA_CODEOP_RET	= 1 << 3  | R_ANAL_JAVA_CODE_OP,/* returns from subrutine */
54 	R_ANAL_JAVA_CODEOP_TRAP   = 1 << 4  | R_ANAL_JAVA_CODE_OP,/* it's a trap! */
55 	R_ANAL_JAVA_CODEOP_SWI	= 1 << 5  | R_ANAL_JAVA_CODE_OP,/* syscall  software interrupt */
56 	R_ANAL_JAVA_CODEOP_IO	 = 1 << 6  | R_ANAL_JAVA_CODE_OP,
57 	R_ANAL_JAVA_CODEOP_LEAVE  = 1 << 7  | R_ANAL_JAVA_CODE_OP,
58 	R_ANAL_JAVA_CODEOP_SWITCH = 1 << 8  | R_ANAL_JAVA_CODE_OP,
59 	R_ANAL_JAVA_CODEOP_CJMP   = R_ANAL_JAVA_COND_OP | R_ANAL_JAVA_CODE_OP | R_ANAL_JAVA_CODEOP_JMP,
60 	R_ANAL_JAVA_CODEOP_EOB	= R_ANAL_JAVA_CODEOP_JMP | R_ANAL_JAVA_CODEOP_RET | R_ANAL_JAVA_CODEOP_LEAVE | R_ANAL_JAVA_CODEOP_SWITCH,
61 };
62 
63 enum {
64 	// call return types
65 			R_ANAL_JAVA_RET_TYPE_REF_NULL = 1 << 10,
66 	R_ANAL_JAVA_RET_TYPE_REF	  = 1 << 11 ,
67 	R_ANAL_JAVA_RET_TYPE_PRIM	 = 1 << 12 ,
68 	R_ANAL_JAVA_RET_TYPE_CONST	= 1 << 13,
69 	R_ANAL_JAVA_RET_TYPE_STATIC   = 1 << 14,
70 };
71 
72 // jmp conditionals
73 enum {
74 	// TODO these should be mapped to some sort of
75 	// flags register
76 			R_ANAL_JAVA_COND_EQ  = 1 << 11,
77 	R_ANAL_JAVA_COND_NE  = 1 << 12,
78 	R_ANAL_JAVA_COND_GE  = 1 << 13,
79 	R_ANAL_JAVA_COND_GT  = 1 << 14,
80 	R_ANAL_JAVA_COND_LE  = 1 << 15,
81 	R_ANAL_JAVA_COND_LT  = 1 << 16,
82 	R_ANAL_JAVA_COND_AL  = 1 << 17,
83 	R_ANAL_JAVA_COND_NV  = 1 << 18,
84 	R_ANAL_JAVA_COND_NULL  = 1 << 19,
85 };
86 
87 // bin ops
88 enum {
89 	R_ANAL_JAVA_BINOP_NEG = 0 | R_ANAL_JAVA_BIN_OP,
90 	R_ANAL_JAVA_BINOP_XCHG = 1 << 1 | R_ANAL_JAVA_BIN_OP,
91 	R_ANAL_JAVA_BINOP_CMP  = 1 << 2  | R_ANAL_JAVA_BIN_OP,
92 	R_ANAL_JAVA_BINOP_ADD  = 1 << 3  | R_ANAL_JAVA_BIN_OP,
93 	R_ANAL_JAVA_BINOP_SUB  = 1 << 4  | R_ANAL_JAVA_BIN_OP,
94 	R_ANAL_JAVA_BINOP_MUL  = 1 << 6  | R_ANAL_JAVA_BIN_OP,
95 	R_ANAL_JAVA_BINOP_DIV  = 1 << 7  | R_ANAL_JAVA_BIN_OP,
96 	R_ANAL_JAVA_BINOP_SHR  = 1 << 8  | R_ANAL_JAVA_BIN_OP,
97 	R_ANAL_JAVA_BINOP_SHL  = 1 << 9  | R_ANAL_JAVA_BIN_OP,
98 	R_ANAL_JAVA_BINOP_SAL  = 1 << 10 | R_ANAL_JAVA_BIN_OP,
99 	R_ANAL_JAVA_BINOP_SAR  = 1 << 11 | R_ANAL_JAVA_BIN_OP,
100 	R_ANAL_JAVA_BINOP_OR   = 1 << 12 | R_ANAL_JAVA_BIN_OP,
101 	R_ANAL_JAVA_BINOP_AND  = 1 << 14 | R_ANAL_JAVA_BIN_OP,
102 	R_ANAL_JAVA_BINOP_XOR  = 1 << 15 | R_ANAL_JAVA_BIN_OP,
103 	R_ANAL_JAVA_BINOP_NOT  = 1 << 16 | R_ANAL_JAVA_BIN_OP,
104 	R_ANAL_JAVA_BINOP_MOD  = 1 << 17 | R_ANAL_JAVA_BIN_OP,
105 	R_ANAL_JAVA_BINOP_ROR  = 1 << 18 | R_ANAL_JAVA_BIN_OP,
106 	R_ANAL_JAVA_BINOP_ROL  = 1 << 19 | R_ANAL_JAVA_BIN_OP,
107 };
108 
109 // Object ops
110 enum {
111 	R_ANAL_JAVA_OBJOP_CAST  = 1 << 0 | R_ANAL_JAVA_OBJ_OP,
112 	R_ANAL_JAVA_OBJOP_CHECK = 1 << 1 | R_ANAL_JAVA_OBJ_OP,
113 	R_ANAL_JAVA_OBJOP_NEW   = 1 << 2 | R_ANAL_JAVA_OBJ_OP,
114 	R_ANAL_JAVA_OBJOP_DEL   = 1 << 3 | R_ANAL_JAVA_OBJ_OP,
115 	R_ANAL_JAVA_OBJOP_SIZE   = 1 << 4 | R_ANAL_JAVA_OBJ_OP,
116 };
117 
118 
119 // Memory or Data Operations
120 // Locations of item loaded (base of indirect)
121 enum {
122 	R_ANAL_JAVA_LDST_FROM_REF   =  1 << 1,
123 	R_ANAL_JAVA_LDST_FROM_MEM   =  1 << 1,
124 
125 	R_ANAL_JAVA_LDST_FROM_REG   =  1 << 2,
126 	R_ANAL_JAVA_LDST_FROM_STACK =  1 << 3,
127 	R_ANAL_JAVA_LDST_FROM_CONST =  1 << 4,
128 	R_ANAL_JAVA_LDST_FROM_VAR   =  1 << 5,
129 
130 	// If indirect load, where are we getting the indirection,
131 			R_ANAL_JAVA_LDST_INDIRECT_REF  = 1 << 6,
132 	R_ANAL_JAVA_LDST_INDIRECT_MEM  = 1 << 6,
133 
134 	R_ANAL_JAVA_LDST_INDIRECT_REG   =  1 << 7,
135 	R_ANAL_JAVA_LDST_INDIRECT_STACK =  1 << 8,
136 	R_ANAL_JAVA_LDST_INDIRECT_IDX   =  1 << 9,
137 	R_ANAL_JAVA_LDST_INDIRECT_VAR   =  1 << 10,
138 
139 	// Location to put the item,
140 			R_ANAL_JAVA_LDST_TO_REF  = 1 << 11,
141 	R_ANAL_JAVA_LDST_TO_MEM  = 1 << 11,
142 
143 	R_ANAL_JAVA_LDST_TO_REG = 1 << 12,
144 	R_ANAL_JAVA_LDST_TO_STACK =  1 << 13,
145 	R_ANAL_JAVA_LDST_TO_VAR =    1 << 14,
146 
147 	// Stack, Memory, Register, Bss, Data ,
148 			R_ANAL_JAVA_LDST_OP_PUSH  = 1 << 15  ,
149 	R_ANAL_JAVA_LDST_OP_POP   = 1 << 16,
150 	R_ANAL_JAVA_LDST_OP_MOV   = 1 << 17 ,
151 	R_ANAL_JAVA_LDST_OP_EFF_ADDR   = 1 << 18,
152 };
153 
154 enum {
155 
156 	R_ANAL_JAVA_LDST_LOAD_FROM_CONST_REF_TO_STACK = R_ANAL_JAVA_LDST_OP_PUSH |\
157 		R_ANAL_JAVA_LOAD_OP |\
158 		R_ANAL_JAVA_LDST_FROM_REF |\
159 		R_ANAL_JAVA_LDST_FROM_CONST |\
160 		R_ANAL_JAVA_LDST_TO_STACK |\
161 		R_ANAL_JAVA_TYPE_REF,
162 
163 
164 
165 	R_ANAL_JAVA_LDST_LOAD_FROM_CONST_TO_STACK = R_ANAL_JAVA_LDST_OP_PUSH |\
166 		R_ANAL_JAVA_LOAD_OP |\
167 		R_ANAL_JAVA_LDST_FROM_CONST |\
168 		R_ANAL_JAVA_LDST_TO_STACK,
169 
170 	R_ANAL_JAVA_LDST_LOAD_FROM_CONST_INDIRECT_TO_STACK = R_ANAL_JAVA_LDST_OP_PUSH |\
171 		R_ANAL_JAVA_LOAD_OP |\
172 		R_ANAL_JAVA_LDST_FROM_CONST |\
173 		R_ANAL_JAVA_LDST_INDIRECT_IDX |\
174 		R_ANAL_JAVA_LDST_TO_STACK,
175 
176 	R_ANAL_JAVA_LDST_LOAD_FROM_VAR_INDIRECT_TO_STACK = R_ANAL_JAVA_LDST_OP_PUSH |\
177 		 R_ANAL_JAVA_LOAD_OP |\
178 		 R_ANAL_JAVA_LDST_FROM_VAR |\
179 		 R_ANAL_JAVA_LDST_INDIRECT_IDX |\
180 		 R_ANAL_JAVA_LDST_TO_STACK,
181 
182 	R_ANAL_JAVA_LDST_LOAD_FROM_VAR_INDIRECT_TO_STACK_REF = R_ANAL_JAVA_LDST_OP_PUSH |\
183 		 R_ANAL_JAVA_LOAD_OP |\
184 		 R_ANAL_JAVA_LDST_FROM_VAR |\
185 		 R_ANAL_JAVA_LDST_INDIRECT_IDX |\
186 		 R_ANAL_JAVA_LDST_TO_STACK,
187 
188 	R_ANAL_JAVA_LDST_LOAD_FROM_VAR_TO_STACK = R_ANAL_JAVA_LDST_OP_PUSH |\
189 		 R_ANAL_JAVA_LOAD_OP |\
190 		 R_ANAL_JAVA_LDST_FROM_VAR |\
191 		 R_ANAL_JAVA_LDST_INDIRECT_IDX |\
192 		 R_ANAL_JAVA_LDST_TO_STACK,
193 
194 	R_ANAL_JAVA_LDST_LOAD_FROM_VAR_TO_STACK_REF = R_ANAL_JAVA_LDST_OP_PUSH |\
195 		 R_ANAL_JAVA_LOAD_OP |\
196 		 R_ANAL_JAVA_LDST_FROM_VAR |\
197 		 R_ANAL_JAVA_LDST_INDIRECT_IDX |\
198 		 R_ANAL_JAVA_LDST_TO_STACK,
199 
200 	R_ANAL_JAVA_LDST_LOAD_FROM_REF_INDIRECT_TO_STACK = R_ANAL_JAVA_LDST_OP_PUSH |\
201 		 R_ANAL_JAVA_LOAD_OP |\
202 		 R_ANAL_JAVA_LDST_FROM_REF |\
203 		 R_ANAL_JAVA_LDST_INDIRECT_IDX |\
204 		 R_ANAL_JAVA_LDST_TO_STACK,
205 
206 	R_ANAL_JAVA_LDST_LOAD_FROM_REF_INDIRECT_TO_STACK_REF = R_ANAL_JAVA_LDST_OP_PUSH |\
207 		 R_ANAL_JAVA_LOAD_OP |\
208 		 R_ANAL_JAVA_LDST_FROM_REF |\
209 		 R_ANAL_JAVA_LDST_INDIRECT_IDX |\
210 		 R_ANAL_JAVA_LDST_TO_STACK,
211 
212 	R_ANAL_JAVA_LDST_STORE_FROM_STACK_INDIRECT_TO_VAR = R_ANAL_JAVA_LDST_OP_PUSH |\
213 		 R_ANAL_JAVA_STORE_OP |\
214 		 R_ANAL_JAVA_LDST_FROM_STACK |\
215 		 R_ANAL_JAVA_LDST_INDIRECT_IDX |\
216 		 R_ANAL_JAVA_LDST_TO_VAR,
217 
218 	R_ANAL_JAVA_LDST_STORE_FROM_STACK_INDIRECT_TO_VAR_REF = R_ANAL_JAVA_LDST_OP_PUSH |\
219 		 R_ANAL_JAVA_STORE_OP |\
220 		 R_ANAL_JAVA_LDST_FROM_STACK |\
221 		 R_ANAL_JAVA_LDST_INDIRECT_IDX |\
222 		 R_ANAL_JAVA_LDST_TO_VAR,
223 
224 	R_ANAL_JAVA_LDST_STORE_FROM_STACK_TO_VAR = R_ANAL_JAVA_LDST_OP_PUSH |\
225 		 R_ANAL_JAVA_STORE_OP |\
226 		 R_ANAL_JAVA_LDST_FROM_STACK |\
227 		 R_ANAL_JAVA_LDST_TO_VAR,
228 
229 	R_ANAL_JAVA_LDST_STORE_FROM_STACK_TO_VAR_REF = R_ANAL_JAVA_LDST_OP_PUSH |\
230 		 R_ANAL_JAVA_STORE_OP |\
231 		 R_ANAL_JAVA_LDST_FROM_STACK |\
232 		 R_ANAL_JAVA_LDST_TO_VAR,
233 
234 	R_ANAL_JAVA_LDST_STORE_FROM_STACK_INDIRECT_TO_REF = R_ANAL_JAVA_LDST_OP_PUSH |\
235 		 R_ANAL_JAVA_STORE_OP |\
236 		 R_ANAL_JAVA_LDST_FROM_STACK |\
237 		 R_ANAL_JAVA_LDST_TO_REF,
238 
239 	R_ANAL_JAVA_LDST_STORE_FROM_STACK_INDIRECT_TO_REF_REF = R_ANAL_JAVA_LDST_OP_PUSH |\
240 		 R_ANAL_JAVA_STORE_OP |\
241 		 R_ANAL_JAVA_LDST_FROM_STACK |\
242 		 R_ANAL_JAVA_LDST_TO_REF,
243 
244 	R_ANAL_JAVA_LDST_LOAD_FROM_REF_TO_STACK = R_ANAL_JAVA_LDST_OP_PUSH |\
245 		 R_ANAL_JAVA_LOAD_OP |\
246 		 R_ANAL_JAVA_LDST_FROM_REF |\
247 		 R_ANAL_JAVA_LDST_TO_STACK |\
248 		 R_ANAL_JAVA_TYPE_PRIM,
249 
250 	R_ANAL_JAVA_LDST_LOAD_FROM_PRIM_VAR_TO_STACK = R_ANAL_JAVA_LDST_OP_PUSH |\
251 		   R_ANAL_JAVA_LOAD_OP |\
252 		   R_ANAL_JAVA_LDST_FROM_VAR |\
253 		   R_ANAL_JAVA_TYPE_PRIM,
254 
255 	R_ANAL_JAVA_LDST_LOAD_GET_STATIC = R_ANAL_JAVA_LDST_OP_PUSH |\
256 		R_ANAL_JAVA_LOAD_OP |\
257 		R_ANAL_JAVA_LDST_FROM_REF |\
258 		R_ANAL_JAVA_LDST_TO_STACK |\
259 		R_ANAL_JAVA_TYPE_REF,
260 
261 	R_ANAL_JAVA_LDST_STORE_PUT_STATIC = R_ANAL_JAVA_LDST_OP_POP |\
262 		R_ANAL_JAVA_STORE_OP |\
263 		R_ANAL_JAVA_LDST_FROM_STACK |\
264 		R_ANAL_JAVA_LDST_TO_REF |\
265 		R_ANAL_JAVA_TYPE_REF,
266 
267 	R_ANAL_JAVA_LDST_LOAD_GET_FIELD = R_ANAL_JAVA_LDST_OP_PUSH |\
268 		R_ANAL_JAVA_LOAD_OP |\
269 		R_ANAL_JAVA_LDST_FROM_REF |\
270 		R_ANAL_JAVA_LDST_TO_STACK |\
271 		R_ANAL_JAVA_TYPE_REF,
272 
273 	R_ANAL_JAVA_LDST_STORE_PUT_FIELD = R_ANAL_JAVA_LDST_OP_POP |\
274 		R_ANAL_JAVA_STORE_OP |\
275 		R_ANAL_JAVA_LDST_FROM_STACK |\
276 		R_ANAL_JAVA_LDST_TO_REF |\
277 		R_ANAL_JAVA_TYPE_REF,
278 };
279 
280 #endif
281