Lines Matching refs:instr

23 static int __patch_instruction(u32 *exec_addr, ppc_inst_t instr, u32 *patch_addr)
25 if (!ppc_inst_prefixed(instr)) {
26 u32 val = ppc_inst_val(instr);
30 u64 val = ppc_inst_as_ulong(instr);
45 int raw_patch_instruction(u32 *addr, ppc_inst_t instr)
47 return __patch_instruction(addr, instr, addr);
279 static int __do_patch_instruction_mm(u32 *addr, ppc_inst_t instr)
308 err = __patch_instruction(addr, instr, patch_addr);
325 static int __do_patch_instruction(u32 *addr, ppc_inst_t instr)
342 err = __patch_instruction(addr, instr, patch_addr);
350 int patch_instruction(u32 *addr, ppc_inst_t instr)
362 return raw_patch_instruction(addr, instr);
366 err = __do_patch_instruction_mm(addr, instr);
368 err = __do_patch_instruction(addr, instr);
381 ppc_inst_t instr = ppc_inst_read(code);
383 if (ppc_inst_prefixed(instr)) {
384 u64 val = ppc_inst_as_ulong(instr);
388 u32 val = ppc_inst_val(instr);
515 ppc_inst_t instr;
517 if (create_branch(&instr, addr, target, flags))
520 return patch_instruction(addr, instr);
527 bool is_conditional_branch(ppc_inst_t instr)
529 unsigned int opcode = ppc_inst_primary_opcode(instr);
534 switch ((ppc_inst_val(instr) >> 1) & 0x3ff) {
545 int create_cond_branch(ppc_inst_t *instr, const u32 *addr,
559 *instr = ppc_inst(0x40000000 | (flags & 0x3FF0003) | (offset & 0xFFFC));
564 int instr_is_relative_branch(ppc_inst_t instr)
566 if (ppc_inst_val(instr) & BRANCH_ABSOLUTE)
569 return instr_is_branch_iform(instr) || instr_is_branch_bform(instr);
572 int instr_is_relative_link_branch(ppc_inst_t instr)
574 return instr_is_relative_branch(instr) && (ppc_inst_val(instr) & BRANCH_SET_LINK);
577 static unsigned long branch_iform_target(const u32 *instr)
581 imm = ppc_inst_val(ppc_inst_read(instr)) & 0x3FFFFFC;
587 if ((ppc_inst_val(ppc_inst_read(instr)) & BRANCH_ABSOLUTE) == 0)
588 imm += (unsigned long)instr;
593 static unsigned long branch_bform_target(const u32 *instr)
597 imm = ppc_inst_val(ppc_inst_read(instr)) & 0xFFFC;
603 if ((ppc_inst_val(ppc_inst_read(instr)) & BRANCH_ABSOLUTE) == 0)
604 imm += (unsigned long)instr;
609 unsigned long branch_target(const u32 *instr)
611 if (instr_is_branch_iform(ppc_inst_read(instr)))
612 return branch_iform_target(instr);
613 else if (instr_is_branch_bform(ppc_inst_read(instr)))
614 return branch_bform_target(instr);
619 int translate_branch(ppc_inst_t *instr, const u32 *dest, const u32 *src)
625 return create_branch(instr, dest, target,
628 return create_cond_branch(instr, dest, target,