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()
242 bool is_conditional_branch(struct ppc_inst instr) in is_conditional_branch() argument
244 unsigned int opcode = ppc_inst_primary_opcode(instr); in is_conditional_branch()
249 switch ((ppc_inst_val(instr) >> 1) & 0x3ff) { in is_conditional_branch()
260 int create_branch(struct ppc_inst *instr, in create_branch() argument
266 *instr = ppc_inst(0); in create_branch()
276 *instr = ppc_inst(0x48000000 | (flags & 0x3) | (offset & 0x03FFFFFC)); in create_branch()
281 int create_cond_branch(struct ppc_inst *instr, const struct ppc_inst *addr, in create_cond_branch() argument
295 *instr = ppc_inst(0x40000000 | (flags & 0x3FF0003) | (offset & 0xFFFC)); in create_cond_branch()
300 static unsigned int branch_opcode(struct ppc_inst instr) in branch_opcode() argument
302 return ppc_inst_primary_opcode(instr) & 0x3F; in branch_opcode()
305 static int instr_is_branch_iform(struct ppc_inst instr) in instr_is_branch_iform() argument
307 return branch_opcode(instr) == 18; in instr_is_branch_iform()
310 static int instr_is_branch_bform(struct ppc_inst instr) in instr_is_branch_bform() argument
312 return branch_opcode(instr) == 16; in instr_is_branch_bform()
315 int instr_is_relative_branch(struct ppc_inst instr) in instr_is_relative_branch() argument
317 if (ppc_inst_val(instr) & BRANCH_ABSOLUTE) in instr_is_relative_branch()
320 return instr_is_branch_iform(instr) || instr_is_branch_bform(instr); in instr_is_relative_branch()
323 int instr_is_relative_link_branch(struct ppc_inst instr) in instr_is_relative_link_branch() argument
325 return instr_is_relative_branch(instr) && (ppc_inst_val(instr) & BRANCH_SET_LINK); in instr_is_relative_link_branch()
328 static unsigned long branch_iform_target(const struct ppc_inst *instr) in branch_iform_target() argument
332 imm = ppc_inst_val(*instr) & 0x3FFFFFC; in branch_iform_target()
338 if ((ppc_inst_val(*instr) & BRANCH_ABSOLUTE) == 0) in branch_iform_target()
339 imm += (unsigned long)instr; in branch_iform_target()
344 static unsigned long branch_bform_target(const struct ppc_inst *instr) in branch_bform_target() argument
348 imm = ppc_inst_val(*instr) & 0xFFFC; in branch_bform_target()
354 if ((ppc_inst_val(*instr) & BRANCH_ABSOLUTE) == 0) in branch_bform_target()
355 imm += (unsigned long)instr; in branch_bform_target()
360 unsigned long branch_target(const struct ppc_inst *instr) in branch_target() argument
362 if (instr_is_branch_iform(ppc_inst_read(instr))) in branch_target()
363 return branch_iform_target(instr); in branch_target()
364 else if (instr_is_branch_bform(ppc_inst_read(instr))) in branch_target()
365 return branch_bform_target(instr); in branch_target()
370 int instr_is_branch_to_addr(const struct ppc_inst *instr, unsigned long addr) in instr_is_branch_to_addr() argument
372 if (instr_is_branch_iform(ppc_inst_read(instr)) || in instr_is_branch_to_addr()
373 instr_is_branch_bform(ppc_inst_read(instr))) in instr_is_branch_to_addr()
374 return branch_target(instr) == addr; in instr_is_branch_to_addr()
379 int translate_branch(struct ppc_inst *instr, const struct ppc_inst *dest, in translate_branch() argument
386 return create_branch(instr, dest, target, in translate_branch()
389 return create_cond_branch(instr, dest, target, in translate_branch()
424 struct ppc_inst instr; in test_branch_iform() local
427 addr = (unsigned long)&instr; in test_branch_iform()
448 instr = ppc_inst(0x48000103); in test_branch_iform()
449 check(instr_is_branch_to_addr(&instr, 0x100)); in test_branch_iform()
451 instr = ppc_inst(0x480420ff); in test_branch_iform()
452 check(instr_is_branch_to_addr(&instr, 0x420fc)); in test_branch_iform()
454 instr = ppc_inst(0x49fffffc); in test_branch_iform()
455 check(instr_is_branch_to_addr(&instr, addr + 0x1FFFFFC)); in test_branch_iform()
457 instr = ppc_inst(0x4bfffffc); in test_branch_iform()
458 check(instr_is_branch_to_addr(&instr, addr - 4)); in test_branch_iform()
460 instr = ppc_inst(0x4a000000); in test_branch_iform()
461 check(instr_is_branch_to_addr(&instr, addr - 0x2000000)); in test_branch_iform()
464 err = create_branch(&instr, &instr, addr, BRANCH_SET_LINK); in test_branch_iform()
465 check(instr_is_branch_to_addr(&instr, addr)); in test_branch_iform()
468 err = create_branch(&instr, &instr, addr - 0x100, BRANCH_SET_LINK); in test_branch_iform()
469 check(instr_is_branch_to_addr(&instr, addr - 0x100)); in test_branch_iform()
472 err = create_branch(&instr, &instr, addr + 0x100, 0); in test_branch_iform()
473 check(instr_is_branch_to_addr(&instr, addr + 0x100)); in test_branch_iform()
476 err = create_branch(&instr, &instr, addr - 0x2000000, BRANCH_SET_LINK); in test_branch_iform()
477 check(instr_is_branch_to_addr(&instr, addr - 0x2000000)); in test_branch_iform()
480 err = create_branch(&instr, &instr, addr - 0x2000004, BRANCH_SET_LINK); in test_branch_iform()
484 err = create_branch(&instr, &instr, addr + 0x2000000, BRANCH_SET_LINK); in test_branch_iform()
488 err = create_branch(&instr, &instr, addr + 3, BRANCH_SET_LINK); in test_branch_iform()
492 err = create_branch(&instr, &instr, addr, 0xFFFFFFFC); in test_branch_iform()
493 check(instr_is_branch_to_addr(&instr, addr)); in test_branch_iform()
494 check(ppc_inst_equal(instr, ppc_inst(0x48000000))); in test_branch_iform()
501 struct ppc_inst instr; in test_create_function_call() local
506 create_branch(&instr, iptr, dest, BRANCH_SET_LINK); in test_create_function_call()
507 patch_instruction(iptr, instr); in test_create_function_call()
515 struct ppc_inst *iptr, instr; in test_branch_bform() local
518 iptr = &instr; in test_branch_bform()
531 instr = ppc_inst(0x43ff0103); in test_branch_bform()
532 check(instr_is_branch_to_addr(&instr, 0x100)); in test_branch_bform()
534 instr = ppc_inst(0x43ff20ff); in test_branch_bform()
535 check(instr_is_branch_to_addr(&instr, 0x20fc)); in test_branch_bform()
537 instr = ppc_inst(0x43ff7ffc); in test_branch_bform()
538 check(instr_is_branch_to_addr(&instr, addr + 0x7FFC)); in test_branch_bform()
540 instr = ppc_inst(0x43fffffc); in test_branch_bform()
541 check(instr_is_branch_to_addr(&instr, addr - 4)); in test_branch_bform()
543 instr = ppc_inst(0x43ff8000); in test_branch_bform()
544 check(instr_is_branch_to_addr(&instr, addr - 0x8000)); in test_branch_bform()
550 err = create_cond_branch(&instr, iptr, addr, flags); in test_branch_bform()
551 check(instr_is_branch_to_addr(&instr, addr)); in test_branch_bform()
554 err = create_cond_branch(&instr, iptr, addr - 0x100, flags); in test_branch_bform()
555 check(instr_is_branch_to_addr(&instr, addr - 0x100)); in test_branch_bform()
558 err = create_cond_branch(&instr, iptr, addr + 0x100, flags); in test_branch_bform()
559 check(instr_is_branch_to_addr(&instr, addr + 0x100)); in test_branch_bform()
562 err = create_cond_branch(&instr, iptr, addr - 0x8000, flags); in test_branch_bform()
563 check(instr_is_branch_to_addr(&instr, addr - 0x8000)); in test_branch_bform()
566 err = create_cond_branch(&instr, iptr, addr - 0x8004, flags); in test_branch_bform()
570 err = create_cond_branch(&instr, iptr, addr + 0x8000, flags); in test_branch_bform()
574 err = create_cond_branch(&instr, iptr, addr + 3, flags); in test_branch_bform()
578 err = create_cond_branch(&instr, iptr, addr, 0xFFFFFFFC); in test_branch_bform()
579 check(instr_is_branch_to_addr(&instr, addr)); in test_branch_bform()
580 check(ppc_inst_equal(instr, ppc_inst(0x43FF0000))); in test_branch_bform()
587 struct ppc_inst instr; in test_translate_branch() local
601 translate_branch(&instr, q, p); in test_translate_branch()
602 patch_instruction(q, instr); in test_translate_branch()
610 translate_branch(&instr, q, p); in test_translate_branch()
611 patch_instruction(q, instr); in test_translate_branch()
621 translate_branch(&instr, q, p); in test_translate_branch()
622 patch_instruction(q, instr); in test_translate_branch()
632 translate_branch(&instr, q, p); in test_translate_branch()
633 patch_instruction(q, instr); in test_translate_branch()
642 translate_branch(&instr, q, p); in test_translate_branch()
643 patch_instruction(q, instr); in test_translate_branch()
653 create_cond_branch(&instr, p, addr, 0); in test_translate_branch()
654 patch_instruction(p, instr); in test_translate_branch()
657 translate_branch(&instr, q, p); in test_translate_branch()
658 patch_instruction(q, instr); in test_translate_branch()
664 create_cond_branch(&instr, p, addr, 0xFFFFFFFC); in test_translate_branch()
665 patch_instruction(p, instr); in test_translate_branch()
667 translate_branch(&instr, q, p); in test_translate_branch()
668 patch_instruction(q, instr); in test_translate_branch()
676 create_cond_branch(&instr, p, addr, 0xFFFFFFFC); in test_translate_branch()
677 patch_instruction(p, instr); in test_translate_branch()
679 translate_branch(&instr, q, p); in test_translate_branch()
680 patch_instruction(q, instr); in test_translate_branch()
688 create_cond_branch(&instr, p, addr, BRANCH_SET_LINK); in test_translate_branch()
689 patch_instruction(p, instr); in test_translate_branch()
691 translate_branch(&instr, q, p); in test_translate_branch()
692 patch_instruction(q, instr); in test_translate_branch()
699 create_cond_branch(&instr, p, addr, 0); in test_translate_branch()
700 patch_instruction(p, instr); in test_translate_branch()
702 translate_branch(&instr, q, p); in test_translate_branch()
703 patch_instruction(q, instr); in test_translate_branch()