Lines Matching refs:instr
21 static int __patch_instruction(u32 *exec_addr, struct ppc_inst instr, u32 *patch_addr) in __patch_instruction() argument
23 if (!ppc_inst_prefixed(instr)) { in __patch_instruction()
24 u32 val = ppc_inst_val(instr); in __patch_instruction()
28 u64 val = ppc_inst_as_ulong(instr); in __patch_instruction()
42 int raw_patch_instruction(u32 *addr, struct ppc_inst instr) in raw_patch_instruction() argument
44 return __patch_instruction(addr, instr, addr); in raw_patch_instruction()
144 static int do_patch_instruction(u32 *addr, struct ppc_inst instr) in do_patch_instruction() argument
158 return raw_patch_instruction(addr, instr); in do_patch_instruction()
170 __patch_instruction(addr, instr, patch_addr); in do_patch_instruction()
183 static int do_patch_instruction(u32 *addr, struct ppc_inst instr) in do_patch_instruction() argument
185 return raw_patch_instruction(addr, instr); in do_patch_instruction()
190 int patch_instruction(u32 *addr, struct ppc_inst instr) in patch_instruction() argument
197 return do_patch_instruction(addr, instr); in patch_instruction()
203 struct ppc_inst instr; in patch_branch() local
205 create_branch(&instr, addr, target, flags); in patch_branch()
206 return patch_instruction(addr, instr); in patch_branch()
240 bool is_conditional_branch(struct ppc_inst instr) in is_conditional_branch() argument
242 unsigned int opcode = ppc_inst_primary_opcode(instr); in is_conditional_branch()
247 switch ((ppc_inst_val(instr) >> 1) & 0x3ff) { in is_conditional_branch()
258 int create_branch(struct ppc_inst *instr, const u32 *addr, in create_branch() argument
263 *instr = ppc_inst(0); in create_branch()
273 *instr = ppc_inst(0x48000000 | (flags & 0x3) | (offset & 0x03FFFFFC)); in create_branch()
278 int create_cond_branch(struct ppc_inst *instr, const u32 *addr, in create_cond_branch() argument
292 *instr = ppc_inst(0x40000000 | (flags & 0x3FF0003) | (offset & 0xFFFC)); in create_cond_branch()
297 static unsigned int branch_opcode(struct ppc_inst instr) in branch_opcode() argument
299 return ppc_inst_primary_opcode(instr) & 0x3F; in branch_opcode()
302 static int instr_is_branch_iform(struct ppc_inst instr) in instr_is_branch_iform() argument
304 return branch_opcode(instr) == 18; in instr_is_branch_iform()
307 static int instr_is_branch_bform(struct ppc_inst instr) in instr_is_branch_bform() argument
309 return branch_opcode(instr) == 16; in instr_is_branch_bform()
312 int instr_is_relative_branch(struct ppc_inst instr) in instr_is_relative_branch() argument
314 if (ppc_inst_val(instr) & BRANCH_ABSOLUTE) in instr_is_relative_branch()
317 return instr_is_branch_iform(instr) || instr_is_branch_bform(instr); in instr_is_relative_branch()
320 int instr_is_relative_link_branch(struct ppc_inst instr) in instr_is_relative_link_branch() argument
322 return instr_is_relative_branch(instr) && (ppc_inst_val(instr) & BRANCH_SET_LINK); in instr_is_relative_link_branch()
325 static unsigned long branch_iform_target(const u32 *instr) in branch_iform_target() argument
329 imm = ppc_inst_val(ppc_inst_read(instr)) & 0x3FFFFFC; in branch_iform_target()
335 if ((ppc_inst_val(ppc_inst_read(instr)) & BRANCH_ABSOLUTE) == 0) in branch_iform_target()
336 imm += (unsigned long)instr; in branch_iform_target()
341 static unsigned long branch_bform_target(const u32 *instr) in branch_bform_target() argument
345 imm = ppc_inst_val(ppc_inst_read(instr)) & 0xFFFC; in branch_bform_target()
351 if ((ppc_inst_val(ppc_inst_read(instr)) & BRANCH_ABSOLUTE) == 0) in branch_bform_target()
352 imm += (unsigned long)instr; in branch_bform_target()
357 unsigned long branch_target(const u32 *instr) in branch_target() argument
359 if (instr_is_branch_iform(ppc_inst_read(instr))) in branch_target()
360 return branch_iform_target(instr); in branch_target()
361 else if (instr_is_branch_bform(ppc_inst_read(instr))) in branch_target()
362 return branch_bform_target(instr); in branch_target()
367 int translate_branch(struct ppc_inst *instr, const u32 *dest, const u32 *src) in translate_branch() argument
373 return create_branch(instr, dest, target, in translate_branch()
376 return create_cond_branch(instr, dest, target, in translate_branch()
400 static int instr_is_branch_to_addr(const u32 *instr, unsigned long addr) in instr_is_branch_to_addr() argument
402 if (instr_is_branch_iform(ppc_inst_read(instr)) || in instr_is_branch_to_addr()
403 instr_is_branch_bform(ppc_inst_read(instr))) in instr_is_branch_to_addr()
404 return branch_target(instr) == addr; in instr_is_branch_to_addr()
420 struct ppc_inst instr; in test_branch_iform() local
460 err = create_branch(&instr, iptr, addr, BRANCH_SET_LINK); in test_branch_iform()
461 patch_instruction(iptr, instr); in test_branch_iform()
465 err = create_branch(&instr, iptr, addr - 0x100, BRANCH_SET_LINK); in test_branch_iform()
466 patch_instruction(iptr, instr); in test_branch_iform()
470 err = create_branch(&instr, iptr, addr + 0x100, 0); in test_branch_iform()
471 patch_instruction(iptr, instr); in test_branch_iform()
475 err = create_branch(&instr, iptr, addr - 0x2000000, BRANCH_SET_LINK); in test_branch_iform()
476 patch_instruction(iptr, instr); in test_branch_iform()
480 err = create_branch(&instr, iptr, addr - 0x2000004, BRANCH_SET_LINK); in test_branch_iform()
484 err = create_branch(&instr, iptr, addr + 0x2000000, BRANCH_SET_LINK); in test_branch_iform()
488 err = create_branch(&instr, iptr, addr + 3, BRANCH_SET_LINK); in test_branch_iform()
492 err = create_branch(&instr, iptr, addr, 0xFFFFFFFC); in test_branch_iform()
493 patch_instruction(iptr, instr); in test_branch_iform()
495 check(ppc_inst_equal(instr, ppc_inst(0x48000000))); in test_branch_iform()
502 struct ppc_inst instr; in test_create_function_call() local
507 create_branch(&instr, iptr, dest, BRANCH_SET_LINK); in test_create_function_call()
508 patch_instruction(iptr, instr); in test_create_function_call()
516 struct ppc_inst instr; in test_branch_bform() local
552 err = create_cond_branch(&instr, iptr, addr, flags); in test_branch_bform()
553 patch_instruction(iptr, instr); in test_branch_bform()
557 err = create_cond_branch(&instr, iptr, addr - 0x100, flags); in test_branch_bform()
558 patch_instruction(iptr, instr); in test_branch_bform()
562 err = create_cond_branch(&instr, iptr, addr + 0x100, flags); in test_branch_bform()
563 patch_instruction(iptr, instr); in test_branch_bform()
567 err = create_cond_branch(&instr, iptr, addr - 0x8000, flags); in test_branch_bform()
568 patch_instruction(iptr, instr); in test_branch_bform()
572 err = create_cond_branch(&instr, iptr, addr - 0x8004, flags); in test_branch_bform()
576 err = create_cond_branch(&instr, iptr, addr + 0x8000, flags); in test_branch_bform()
580 err = create_cond_branch(&instr, iptr, addr + 3, flags); in test_branch_bform()
584 err = create_cond_branch(&instr, iptr, addr, 0xFFFFFFFC); in test_branch_bform()
585 patch_instruction(iptr, instr); in test_branch_bform()
587 check(ppc_inst_equal(instr, ppc_inst(0x43FF0000))); in test_branch_bform()
594 struct ppc_inst instr; in test_translate_branch() local
608 translate_branch(&instr, q, p); in test_translate_branch()
609 patch_instruction(q, instr); in test_translate_branch()
617 translate_branch(&instr, q, p); in test_translate_branch()
618 patch_instruction(q, instr); in test_translate_branch()
628 translate_branch(&instr, q, p); in test_translate_branch()
629 patch_instruction(q, instr); in test_translate_branch()
639 translate_branch(&instr, q, p); in test_translate_branch()
640 patch_instruction(q, instr); in test_translate_branch()
649 translate_branch(&instr, q, p); in test_translate_branch()
650 patch_instruction(q, instr); in test_translate_branch()
660 create_cond_branch(&instr, p, addr, 0); in test_translate_branch()
661 patch_instruction(p, instr); in test_translate_branch()
664 translate_branch(&instr, q, p); in test_translate_branch()
665 patch_instruction(q, instr); in test_translate_branch()
671 create_cond_branch(&instr, p, addr, 0xFFFFFFFC); in test_translate_branch()
672 patch_instruction(p, instr); in test_translate_branch()
674 translate_branch(&instr, q, p); in test_translate_branch()
675 patch_instruction(q, instr); in test_translate_branch()
683 create_cond_branch(&instr, p, addr, 0xFFFFFFFC); in test_translate_branch()
684 patch_instruction(p, instr); in test_translate_branch()
686 translate_branch(&instr, q, p); in test_translate_branch()
687 patch_instruction(q, instr); in test_translate_branch()
695 create_cond_branch(&instr, p, addr, BRANCH_SET_LINK); in test_translate_branch()
696 patch_instruction(p, instr); in test_translate_branch()
698 translate_branch(&instr, q, p); in test_translate_branch()
699 patch_instruction(q, instr); in test_translate_branch()
706 create_cond_branch(&instr, p, addr, 0); in test_translate_branch()
707 patch_instruction(p, instr); in test_translate_branch()
709 translate_branch(&instr, q, p); in test_translate_branch()
710 patch_instruction(q, instr); in test_translate_branch()