Lines Matching refs:instr

21 static int __patch_instruction(struct ppc_inst *exec_addr, struct ppc_inst instr,  in __patch_instruction()  argument
24 if (!ppc_inst_prefixed(instr)) in __patch_instruction()
25 __put_user_asm_goto(ppc_inst_val(instr), patch_addr, failed, "stw"); in __patch_instruction()
27 __put_user_asm_goto(ppc_inst_as_u64(instr), patch_addr, failed, "std"); in __patch_instruction()
38 int raw_patch_instruction(struct ppc_inst *addr, struct ppc_inst instr) in raw_patch_instruction() argument
40 return __patch_instruction(addr, instr, addr); in raw_patch_instruction()
146 static int do_patch_instruction(struct ppc_inst *addr, struct ppc_inst instr) in do_patch_instruction() argument
160 return raw_patch_instruction(addr, instr); in do_patch_instruction()
172 __patch_instruction(addr, instr, patch_addr); in do_patch_instruction()
185 static int do_patch_instruction(struct ppc_inst *addr, struct ppc_inst instr) in do_patch_instruction() argument
187 return raw_patch_instruction(addr, instr); in do_patch_instruction()
192 int patch_instruction(struct ppc_inst *addr, struct ppc_inst instr) in patch_instruction() argument
199 return do_patch_instruction(addr, instr); in patch_instruction()
205 struct ppc_inst instr; in patch_branch() local
207 create_branch(&instr, addr, target, flags); in patch_branch()
208 return patch_instruction(addr, instr); in patch_branch()
237 bool is_conditional_branch(struct ppc_inst instr) in is_conditional_branch() argument
239 unsigned int opcode = ppc_inst_primary_opcode(instr); in is_conditional_branch()
244 switch ((ppc_inst_val(instr) >> 1) & 0x3ff) { in is_conditional_branch()
255 int create_branch(struct ppc_inst *instr, in create_branch() argument
261 *instr = ppc_inst(0); in create_branch()
271 *instr = ppc_inst(0x48000000 | (flags & 0x3) | (offset & 0x03FFFFFC)); in create_branch()
276 int create_cond_branch(struct ppc_inst *instr, const struct ppc_inst *addr, in create_cond_branch() argument
290 *instr = ppc_inst(0x40000000 | (flags & 0x3FF0003) | (offset & 0xFFFC)); in create_cond_branch()
295 static unsigned int branch_opcode(struct ppc_inst instr) in branch_opcode() argument
297 return ppc_inst_primary_opcode(instr) & 0x3F; in branch_opcode()
300 static int instr_is_branch_iform(struct ppc_inst instr) in instr_is_branch_iform() argument
302 return branch_opcode(instr) == 18; in instr_is_branch_iform()
305 static int instr_is_branch_bform(struct ppc_inst instr) in instr_is_branch_bform() argument
307 return branch_opcode(instr) == 16; in instr_is_branch_bform()
310 int instr_is_relative_branch(struct ppc_inst instr) in instr_is_relative_branch() argument
312 if (ppc_inst_val(instr) & BRANCH_ABSOLUTE) in instr_is_relative_branch()
315 return instr_is_branch_iform(instr) || instr_is_branch_bform(instr); in instr_is_relative_branch()
318 int instr_is_relative_link_branch(struct ppc_inst instr) in instr_is_relative_link_branch() argument
320 return instr_is_relative_branch(instr) && (ppc_inst_val(instr) & BRANCH_SET_LINK); in instr_is_relative_link_branch()
323 static unsigned long branch_iform_target(const struct ppc_inst *instr) in branch_iform_target() argument
327 imm = ppc_inst_val(*instr) & 0x3FFFFFC; in branch_iform_target()
333 if ((ppc_inst_val(*instr) & BRANCH_ABSOLUTE) == 0) in branch_iform_target()
334 imm += (unsigned long)instr; in branch_iform_target()
339 static unsigned long branch_bform_target(const struct ppc_inst *instr) in branch_bform_target() argument
343 imm = ppc_inst_val(*instr) & 0xFFFC; in branch_bform_target()
349 if ((ppc_inst_val(*instr) & BRANCH_ABSOLUTE) == 0) in branch_bform_target()
350 imm += (unsigned long)instr; in branch_bform_target()
355 unsigned long branch_target(const struct ppc_inst *instr) in branch_target() argument
357 if (instr_is_branch_iform(ppc_inst_read(instr))) in branch_target()
358 return branch_iform_target(instr); in branch_target()
359 else if (instr_is_branch_bform(ppc_inst_read(instr))) in branch_target()
360 return branch_bform_target(instr); in branch_target()
365 int instr_is_branch_to_addr(const struct ppc_inst *instr, unsigned long addr) in instr_is_branch_to_addr() argument
367 if (instr_is_branch_iform(ppc_inst_read(instr)) || in instr_is_branch_to_addr()
368 instr_is_branch_bform(ppc_inst_read(instr))) in instr_is_branch_to_addr()
369 return branch_target(instr) == addr; in instr_is_branch_to_addr()
374 int translate_branch(struct ppc_inst *instr, const struct ppc_inst *dest, in translate_branch() argument
381 return create_branch(instr, dest, target, in translate_branch()
384 return create_cond_branch(instr, dest, target, in translate_branch()
419 struct ppc_inst instr; in test_branch_iform() local
422 addr = (unsigned long)&instr; in test_branch_iform()
443 instr = ppc_inst(0x48000103); in test_branch_iform()
444 check(instr_is_branch_to_addr(&instr, 0x100)); in test_branch_iform()
446 instr = ppc_inst(0x480420ff); in test_branch_iform()
447 check(instr_is_branch_to_addr(&instr, 0x420fc)); in test_branch_iform()
449 instr = ppc_inst(0x49fffffc); in test_branch_iform()
450 check(instr_is_branch_to_addr(&instr, addr + 0x1FFFFFC)); in test_branch_iform()
452 instr = ppc_inst(0x4bfffffc); in test_branch_iform()
453 check(instr_is_branch_to_addr(&instr, addr - 4)); in test_branch_iform()
455 instr = ppc_inst(0x4a000000); in test_branch_iform()
456 check(instr_is_branch_to_addr(&instr, addr - 0x2000000)); in test_branch_iform()
459 err = create_branch(&instr, &instr, addr, BRANCH_SET_LINK); in test_branch_iform()
460 check(instr_is_branch_to_addr(&instr, addr)); in test_branch_iform()
463 err = create_branch(&instr, &instr, addr - 0x100, BRANCH_SET_LINK); in test_branch_iform()
464 check(instr_is_branch_to_addr(&instr, addr - 0x100)); in test_branch_iform()
467 err = create_branch(&instr, &instr, addr + 0x100, 0); in test_branch_iform()
468 check(instr_is_branch_to_addr(&instr, addr + 0x100)); in test_branch_iform()
471 err = create_branch(&instr, &instr, addr - 0x2000000, BRANCH_SET_LINK); in test_branch_iform()
472 check(instr_is_branch_to_addr(&instr, addr - 0x2000000)); in test_branch_iform()
475 err = create_branch(&instr, &instr, addr - 0x2000004, BRANCH_SET_LINK); in test_branch_iform()
479 err = create_branch(&instr, &instr, addr + 0x2000000, BRANCH_SET_LINK); in test_branch_iform()
483 err = create_branch(&instr, &instr, addr + 3, BRANCH_SET_LINK); in test_branch_iform()
487 err = create_branch(&instr, &instr, addr, 0xFFFFFFFC); in test_branch_iform()
488 check(instr_is_branch_to_addr(&instr, addr)); in test_branch_iform()
489 check(ppc_inst_equal(instr, ppc_inst(0x48000000))); in test_branch_iform()
496 struct ppc_inst instr; in test_create_function_call() local
501 create_branch(&instr, iptr, dest, BRANCH_SET_LINK); in test_create_function_call()
502 patch_instruction(iptr, instr); in test_create_function_call()
510 struct ppc_inst *iptr, instr; in test_branch_bform() local
513 iptr = &instr; in test_branch_bform()
526 instr = ppc_inst(0x43ff0103); in test_branch_bform()
527 check(instr_is_branch_to_addr(&instr, 0x100)); in test_branch_bform()
529 instr = ppc_inst(0x43ff20ff); in test_branch_bform()
530 check(instr_is_branch_to_addr(&instr, 0x20fc)); in test_branch_bform()
532 instr = ppc_inst(0x43ff7ffc); in test_branch_bform()
533 check(instr_is_branch_to_addr(&instr, addr + 0x7FFC)); in test_branch_bform()
535 instr = ppc_inst(0x43fffffc); in test_branch_bform()
536 check(instr_is_branch_to_addr(&instr, addr - 4)); in test_branch_bform()
538 instr = ppc_inst(0x43ff8000); in test_branch_bform()
539 check(instr_is_branch_to_addr(&instr, addr - 0x8000)); in test_branch_bform()
545 err = create_cond_branch(&instr, iptr, addr, flags); in test_branch_bform()
546 check(instr_is_branch_to_addr(&instr, addr)); in test_branch_bform()
549 err = create_cond_branch(&instr, iptr, addr - 0x100, flags); in test_branch_bform()
550 check(instr_is_branch_to_addr(&instr, addr - 0x100)); in test_branch_bform()
553 err = create_cond_branch(&instr, iptr, addr + 0x100, flags); in test_branch_bform()
554 check(instr_is_branch_to_addr(&instr, addr + 0x100)); in test_branch_bform()
557 err = create_cond_branch(&instr, iptr, addr - 0x8000, flags); in test_branch_bform()
558 check(instr_is_branch_to_addr(&instr, addr - 0x8000)); in test_branch_bform()
561 err = create_cond_branch(&instr, iptr, addr - 0x8004, flags); in test_branch_bform()
565 err = create_cond_branch(&instr, iptr, addr + 0x8000, flags); in test_branch_bform()
569 err = create_cond_branch(&instr, iptr, addr + 3, flags); in test_branch_bform()
573 err = create_cond_branch(&instr, iptr, addr, 0xFFFFFFFC); in test_branch_bform()
574 check(instr_is_branch_to_addr(&instr, addr)); in test_branch_bform()
575 check(ppc_inst_equal(instr, ppc_inst(0x43FF0000))); in test_branch_bform()
582 struct ppc_inst instr; in test_translate_branch() local
596 translate_branch(&instr, q, p); in test_translate_branch()
597 patch_instruction(q, instr); in test_translate_branch()
605 translate_branch(&instr, q, p); in test_translate_branch()
606 patch_instruction(q, instr); in test_translate_branch()
616 translate_branch(&instr, q, p); in test_translate_branch()
617 patch_instruction(q, instr); in test_translate_branch()
627 translate_branch(&instr, q, p); in test_translate_branch()
628 patch_instruction(q, instr); in test_translate_branch()
637 translate_branch(&instr, q, p); in test_translate_branch()
638 patch_instruction(q, instr); in test_translate_branch()
648 create_cond_branch(&instr, p, addr, 0); in test_translate_branch()
649 patch_instruction(p, instr); in test_translate_branch()
652 translate_branch(&instr, q, p); in test_translate_branch()
653 patch_instruction(q, instr); in test_translate_branch()
659 create_cond_branch(&instr, p, addr, 0xFFFFFFFC); in test_translate_branch()
660 patch_instruction(p, instr); in test_translate_branch()
662 translate_branch(&instr, q, p); in test_translate_branch()
663 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, BRANCH_SET_LINK); 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()
694 create_cond_branch(&instr, p, addr, 0); in test_translate_branch()
695 patch_instruction(p, instr); in test_translate_branch()
697 translate_branch(&instr, q, p); in test_translate_branch()
698 patch_instruction(q, instr); in test_translate_branch()