Lines Matching refs:state

24 void __kprobes disasm_instr(unsigned long addr, struct disasm_state *state,  in disasm_instr()  argument
35 memset(state, 0, sizeof(struct disasm_state)); in disasm_instr()
51 state->major_opcode = (word1 >> 11) & 0x1F; in disasm_instr()
54 if (state->major_opcode < 0x0B) { in disasm_instr()
57 state->instr_len = 4; in disasm_instr()
59 state->words[0] = (word1 << 16) | word0; in disasm_instr()
61 state->instr_len = 2; in disasm_instr()
62 state->words[0] = word1; in disasm_instr()
66 word1 = *((uint16_t *)(addr + state->instr_len)); in disasm_instr()
67 word0 = *((uint16_t *)(addr + state->instr_len + 2)); in disasm_instr()
68 state->words[1] = (word1 << 16) | word0; in disasm_instr()
70 switch (state->major_opcode) { in disasm_instr()
72 state->is_branch = 1; in disasm_instr()
75 fieldA = (IS_BIT(state->words[0], 16)) ? in disasm_instr()
76 FIELD_s25(state->words[0]) : in disasm_instr()
77 FIELD_s21(state->words[0]); in disasm_instr()
79 state->delay_slot = IS_BIT(state->words[0], 5); in disasm_instr()
80 state->target = fieldA + (addr & ~0x3); in disasm_instr()
81 state->flow = direct_jump; in disasm_instr()
85 if (IS_BIT(state->words[0], 16)) { in disasm_instr()
88 fieldA = (IS_BIT(state->words[0], 17)) ? in disasm_instr()
89 (FIELD_s25(state->words[0]) & ~0x3) : in disasm_instr()
90 FIELD_s21(state->words[0]); in disasm_instr()
92 state->flow = direct_call; in disasm_instr()
95 fieldA = FIELD_s9(state->words[0]) & ~0x3; in disasm_instr()
96 state->flow = direct_jump; in disasm_instr()
99 state->delay_slot = IS_BIT(state->words[0], 5); in disasm_instr()
100 state->target = fieldA + (addr & ~0x3); in disasm_instr()
101 state->is_branch = 1; in disasm_instr()
105 state->write = 0; in disasm_instr()
106 state->di = BITS(state->words[0], 11, 11); in disasm_instr()
107 if (state->di) in disasm_instr()
109 state->x = BITS(state->words[0], 6, 6); in disasm_instr()
110 state->zz = BITS(state->words[0], 7, 8); in disasm_instr()
111 state->aa = BITS(state->words[0], 9, 10); in disasm_instr()
112 state->wb_reg = FIELD_B(state->words[0]); in disasm_instr()
113 if (state->wb_reg == REG_LIMM) { in disasm_instr()
114 state->instr_len += 4; in disasm_instr()
115 state->aa = 0; in disasm_instr()
116 state->src1 = state->words[1]; in disasm_instr()
118 state->src1 = get_reg(state->wb_reg, regs, cregs); in disasm_instr()
120 state->src2 = FIELD_s9(state->words[0]); in disasm_instr()
121 state->dest = FIELD_A(state->words[0]); in disasm_instr()
122 state->pref = (state->dest == REG_LIMM); in disasm_instr()
126 state->write = 1; in disasm_instr()
127 state->di = BITS(state->words[0], 5, 5); in disasm_instr()
128 if (state->di) in disasm_instr()
130 state->aa = BITS(state->words[0], 3, 4); in disasm_instr()
131 state->zz = BITS(state->words[0], 1, 2); in disasm_instr()
132 state->src1 = FIELD_C(state->words[0]); in disasm_instr()
133 if (state->src1 == REG_LIMM) { in disasm_instr()
134 state->instr_len += 4; in disasm_instr()
135 state->src1 = state->words[1]; in disasm_instr()
137 state->src1 = get_reg(state->src1, regs, cregs); in disasm_instr()
139 state->wb_reg = FIELD_B(state->words[0]); in disasm_instr()
140 if (state->wb_reg == REG_LIMM) { in disasm_instr()
141 state->aa = 0; in disasm_instr()
142 state->instr_len += 4; in disasm_instr()
143 state->src2 = state->words[1]; in disasm_instr()
145 state->src2 = get_reg(state->wb_reg, regs, cregs); in disasm_instr()
147 state->src3 = FIELD_s9(state->words[0]); in disasm_instr()
151 subopcode = MINOR_OPCODE(state->words[0]); in disasm_instr()
160 state->delay_slot = 1; in disasm_instr()
166 op_format = BITS(state->words[0], 22, 23); in disasm_instr()
168 (!IS_BIT(state->words[0], 5)))) { in disasm_instr()
169 fieldC = FIELD_C(state->words[0]); in disasm_instr()
172 fieldC = state->words[1]; in disasm_instr()
173 state->instr_len += 4; in disasm_instr()
178 && (IS_BIT(state->words[0], 5)))) { in disasm_instr()
179 fieldC = FIELD_C(state->words[0]); in disasm_instr()
182 fieldC = FIELD_s12(state->words[0]); in disasm_instr()
186 state->target = fieldC; in disasm_instr()
187 state->flow = is_linked ? in disasm_instr()
190 state->target = get_reg(fieldC, regs, cregs); in disasm_instr()
191 state->flow = is_linked ? in disasm_instr()
194 state->is_branch = 1; in disasm_instr()
198 if (BITS(state->words[0], 22, 23) == 3) { in disasm_instr()
200 fieldC = FIELD_C(state->words[0]); in disasm_instr()
204 state->is_branch = 1; in disasm_instr()
205 state->flow = direct_jump; in disasm_instr()
206 state->target = fieldC; in disasm_instr()
213 state->di = BITS(state->words[0], 15, 15); in disasm_instr()
214 if (state->di) in disasm_instr()
216 state->x = BITS(state->words[0], 16, 16); in disasm_instr()
217 state->zz = BITS(state->words[0], 17, 18); in disasm_instr()
218 state->aa = BITS(state->words[0], 22, 23); in disasm_instr()
219 state->wb_reg = FIELD_B(state->words[0]); in disasm_instr()
220 if (state->wb_reg == REG_LIMM) { in disasm_instr()
221 state->instr_len += 4; in disasm_instr()
222 state->src1 = state->words[1]; in disasm_instr()
224 state->src1 = get_reg(state->wb_reg, regs, in disasm_instr()
227 state->src2 = FIELD_C(state->words[0]); in disasm_instr()
228 if (state->src2 == REG_LIMM) { in disasm_instr()
229 state->instr_len += 4; in disasm_instr()
230 state->src2 = state->words[1]; in disasm_instr()
232 state->src2 = get_reg(state->src2, regs, in disasm_instr()
235 state->dest = FIELD_A(state->words[0]); in disasm_instr()
236 if (state->dest == REG_LIMM) in disasm_instr()
237 state->pref = 1; in disasm_instr()
243 switch (BITS(state->words[0], 22, 23)) { in disasm_instr()
245 if (FIELD_C(state->words[0]) == REG_LIMM) in disasm_instr()
246 state->instr_len += 4; in disasm_instr()
253 if ((!IS_BIT(state->words[0], 5)) && in disasm_instr()
254 (FIELD_C(state->words[0]) == REG_LIMM)) in disasm_instr()
255 state->instr_len += 4; in disasm_instr()
264 switch (BITS(state->words[0], 22, 23)) { in disasm_instr()
266 if ((FIELD_B(state->words[0]) == REG_LIMM) || in disasm_instr()
267 (FIELD_C(state->words[0]) == REG_LIMM)) in disasm_instr()
268 state->instr_len += 4; in disasm_instr()
275 if ((!IS_BIT(state->words[0], 5)) && in disasm_instr()
276 ((FIELD_B(state->words[0]) == REG_LIMM) || in disasm_instr()
277 (FIELD_C(state->words[0]) == REG_LIMM))) in disasm_instr()
278 state->instr_len += 4; in disasm_instr()
287 state->zz = BITS(state->words[0], 3, 4); in disasm_instr()
288 state->src1 = get_reg(FIELD_S_B(state->words[0]), regs, cregs); in disasm_instr()
289 state->src2 = get_reg(FIELD_S_C(state->words[0]), regs, cregs); in disasm_instr()
290 state->dest = FIELD_S_A(state->words[0]); in disasm_instr()
295 if ((BITS(state->words[0], 3, 4) < 3) && in disasm_instr()
296 (FIELD_S_H(state->words[0]) == REG_LIMM)) in disasm_instr()
297 state->instr_len += 4; in disasm_instr()
301 subopcode = BITS(state->words[0], 5, 7); in disasm_instr()
307 state->target = get_reg(FIELD_S_B(state->words[0]), in disasm_instr()
309 state->delay_slot = subopcode & 1; in disasm_instr()
310 state->flow = (subopcode >= 2) ? in disasm_instr()
314 switch (BITS(state->words[0], 8, 10)) { in disasm_instr()
319 state->delay_slot = (subopcode == 7); in disasm_instr()
320 state->flow = indirect_jump; in disasm_instr()
321 state->target = get_reg(31, regs, cregs); in disasm_instr()
331 state->src1 = get_reg(FIELD_S_B(state->words[0]), regs, cregs); in disasm_instr()
332 state->src2 = FIELD_S_u7(state->words[0]); in disasm_instr()
333 state->dest = FIELD_S_C(state->words[0]); in disasm_instr()
340 state->zz = 1; in disasm_instr()
344 state->x = 1; in disasm_instr()
348 state->zz = 2; in disasm_instr()
349 state->src1 = get_reg(FIELD_S_B(state->words[0]), regs, cregs); in disasm_instr()
350 state->src2 = FIELD_S_u6(state->words[0]); in disasm_instr()
351 state->dest = FIELD_S_C(state->words[0]); in disasm_instr()
355 state->write = 1; in disasm_instr()
356 state->src1 = get_reg(FIELD_S_C(state->words[0]), regs, cregs); in disasm_instr()
357 state->src2 = get_reg(FIELD_S_B(state->words[0]), regs, cregs); in disasm_instr()
358 state->src3 = FIELD_S_u7(state->words[0]); in disasm_instr()
362 state->write = 1; in disasm_instr()
363 state->zz = 2; in disasm_instr()
364 state->src1 = get_reg(FIELD_S_C(state->words[0]), regs, cregs); in disasm_instr()
365 state->src2 = get_reg(FIELD_S_B(state->words[0]), regs, cregs); in disasm_instr()
366 state->src3 = FIELD_S_u6(state->words[0]); in disasm_instr()
373 state->write = BITS(state->words[0], 6, 6); in disasm_instr()
374 state->zz = BITS(state->words[0], 5, 5); in disasm_instr()
375 if (state->zz) in disasm_instr()
377 if (!state->write) { in disasm_instr()
378 state->src1 = get_reg(28, regs, cregs); in disasm_instr()
379 state->src2 = FIELD_S_u7(state->words[0]); in disasm_instr()
380 state->dest = FIELD_S_B(state->words[0]); in disasm_instr()
382 state->src1 = get_reg(FIELD_S_B(state->words[0]), regs, in disasm_instr()
384 state->src2 = get_reg(28, regs, cregs); in disasm_instr()
385 state->src3 = FIELD_S_u7(state->words[0]); in disasm_instr()
391 state->zz = BITS(state->words[0], 9, 10); in disasm_instr()
392 state->src1 = get_reg(26, regs, cregs); in disasm_instr()
393 state->src2 = state->zz ? FIELD_S_s10(state->words[0]) : in disasm_instr()
394 FIELD_S_s11(state->words[0]); in disasm_instr()
395 state->dest = 0; in disasm_instr()
399 state->src1 = regs->ret & ~3; in disasm_instr()
400 state->src2 = FIELD_S_u10(state->words[0]); in disasm_instr()
401 state->dest = FIELD_S_B(state->words[0]); in disasm_instr()
405 state->target = FIELD_S_s8(state->words[0]) + (addr & ~0x03); in disasm_instr()
406 state->flow = direct_jump; in disasm_instr()
407 state->is_branch = 1; in disasm_instr()
411 fieldA = (BITS(state->words[0], 9, 10) == 3) ? in disasm_instr()
412 FIELD_S_s7(state->words[0]) : in disasm_instr()
413 FIELD_S_s10(state->words[0]); in disasm_instr()
414 state->target = fieldA + (addr & ~0x03); in disasm_instr()
415 state->flow = direct_jump; in disasm_instr()
416 state->is_branch = 1; in disasm_instr()
420 state->target = FIELD_S_s13(state->words[0]) + (addr & ~0x03); in disasm_instr()
421 state->flow = direct_call; in disasm_instr()
422 state->is_branch = 1; in disasm_instr()
429 if (bytes_not_copied <= (8 - state->instr_len)) in disasm_instr()
432 fault: state->fault = 1; in disasm_instr()