Lines Matching refs:instr

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