Lines Matching refs:instr

26 static int __patch_instruction(unsigned int *exec_addr, unsigned int instr,  in __patch_instruction()  argument
31 __put_user_size(instr, patch_addr, 4, err); in __patch_instruction()
41 int raw_patch_instruction(unsigned int *addr, unsigned int instr) in raw_patch_instruction() argument
43 return __patch_instruction(addr, instr, addr); in raw_patch_instruction()
145 static int do_patch_instruction(unsigned int *addr, unsigned int instr) in do_patch_instruction() argument
159 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(unsigned int *addr, unsigned int instr) in do_patch_instruction() argument
187 return raw_patch_instruction(addr, instr); in do_patch_instruction()
192 int patch_instruction(unsigned int *addr, unsigned int instr) in patch_instruction() argument
199 return do_patch_instruction(addr, instr); in patch_instruction()
216 int patch_instruction_site(s32 *site, unsigned int instr) in patch_instruction_site() argument
221 return patch_instruction(addr, instr); in patch_instruction_site()
250 bool is_conditional_branch(unsigned int instr) in is_conditional_branch() argument
252 unsigned int opcode = instr >> 26; in is_conditional_branch()
257 switch ((instr >> 1) & 0x3ff) { in is_conditional_branch()
308 static unsigned int branch_opcode(unsigned int instr) in branch_opcode() argument
310 return (instr >> 26) & 0x3F; in branch_opcode()
313 static int instr_is_branch_iform(unsigned int instr) in instr_is_branch_iform() argument
315 return branch_opcode(instr) == 18; in instr_is_branch_iform()
318 static int instr_is_branch_bform(unsigned int instr) in instr_is_branch_bform() argument
320 return branch_opcode(instr) == 16; in instr_is_branch_bform()
323 int instr_is_relative_branch(unsigned int instr) in instr_is_relative_branch() argument
325 if (instr & BRANCH_ABSOLUTE) in instr_is_relative_branch()
328 return instr_is_branch_iform(instr) || instr_is_branch_bform(instr); in instr_is_relative_branch()
331 int instr_is_relative_link_branch(unsigned int instr) in instr_is_relative_link_branch() argument
333 return instr_is_relative_branch(instr) && (instr & BRANCH_SET_LINK); in instr_is_relative_link_branch()
336 static unsigned long branch_iform_target(const unsigned int *instr) in branch_iform_target() argument
340 imm = *instr & 0x3FFFFFC; in branch_iform_target()
346 if ((*instr & BRANCH_ABSOLUTE) == 0) in branch_iform_target()
347 imm += (unsigned long)instr; in branch_iform_target()
352 static unsigned long branch_bform_target(const unsigned int *instr) in branch_bform_target() argument
356 imm = *instr & 0xFFFC; in branch_bform_target()
362 if ((*instr & BRANCH_ABSOLUTE) == 0) in branch_bform_target()
363 imm += (unsigned long)instr; in branch_bform_target()
368 unsigned long branch_target(const unsigned int *instr) in branch_target() argument
370 if (instr_is_branch_iform(*instr)) in branch_target()
371 return branch_iform_target(instr); in branch_target()
372 else if (instr_is_branch_bform(*instr)) in branch_target()
373 return branch_bform_target(instr); in branch_target()
378 int instr_is_branch_to_addr(const unsigned int *instr, unsigned long addr) in instr_is_branch_to_addr() argument
380 if (instr_is_branch_iform(*instr) || instr_is_branch_bform(*instr)) in instr_is_branch_to_addr()
381 return branch_target(instr) == addr; in instr_is_branch_to_addr()
428 unsigned int instr; in test_branch_iform() local
431 addr = (unsigned long)&instr; in test_branch_iform()
452 instr = 0x48000103; in test_branch_iform()
453 check(instr_is_branch_to_addr(&instr, 0x100)); in test_branch_iform()
455 instr = 0x480420ff; in test_branch_iform()
456 check(instr_is_branch_to_addr(&instr, 0x420fc)); in test_branch_iform()
458 instr = 0x49fffffc; in test_branch_iform()
459 check(instr_is_branch_to_addr(&instr, addr + 0x1FFFFFC)); in test_branch_iform()
461 instr = 0x4bfffffc; in test_branch_iform()
462 check(instr_is_branch_to_addr(&instr, addr - 4)); in test_branch_iform()
464 instr = 0x4a000000; in test_branch_iform()
465 check(instr_is_branch_to_addr(&instr, addr - 0x2000000)); in test_branch_iform()
468 instr = create_branch(&instr, addr, BRANCH_SET_LINK); in test_branch_iform()
469 check(instr_is_branch_to_addr(&instr, addr)); in test_branch_iform()
472 instr = create_branch(&instr, addr - 0x100, BRANCH_SET_LINK); in test_branch_iform()
473 check(instr_is_branch_to_addr(&instr, addr - 0x100)); in test_branch_iform()
476 instr = create_branch(&instr, addr + 0x100, 0); in test_branch_iform()
477 check(instr_is_branch_to_addr(&instr, addr + 0x100)); in test_branch_iform()
480 instr = create_branch(&instr, addr - 0x2000000, BRANCH_SET_LINK); in test_branch_iform()
481 check(instr_is_branch_to_addr(&instr, addr - 0x2000000)); in test_branch_iform()
484 instr = create_branch(&instr, addr - 0x2000004, BRANCH_SET_LINK); in test_branch_iform()
485 check(instr == 0); in test_branch_iform()
488 instr = create_branch(&instr, addr + 0x2000000, BRANCH_SET_LINK); in test_branch_iform()
489 check(instr == 0); in test_branch_iform()
492 instr = create_branch(&instr, addr + 3, BRANCH_SET_LINK); in test_branch_iform()
493 check(instr == 0); in test_branch_iform()
496 instr = create_branch(&instr, addr, 0xFFFFFFFC); in test_branch_iform()
497 check(instr_is_branch_to_addr(&instr, addr)); in test_branch_iform()
498 check(instr == 0x48000000); in test_branch_iform()
516 unsigned int *iptr, instr, flags; in test_branch_bform() local
518 iptr = &instr; in test_branch_bform()
531 instr = 0x43ff0103; in test_branch_bform()
532 check(instr_is_branch_to_addr(&instr, 0x100)); in test_branch_bform()
534 instr = 0x43ff20ff; in test_branch_bform()
535 check(instr_is_branch_to_addr(&instr, 0x20fc)); in test_branch_bform()
537 instr = 0x43ff7ffc; in test_branch_bform()
538 check(instr_is_branch_to_addr(&instr, addr + 0x7FFC)); in test_branch_bform()
540 instr = 0x43fffffc; in test_branch_bform()
541 check(instr_is_branch_to_addr(&instr, addr - 4)); in test_branch_bform()
543 instr = 0x43ff8000; in test_branch_bform()
544 check(instr_is_branch_to_addr(&instr, addr - 0x8000)); in test_branch_bform()
550 instr = create_cond_branch(iptr, addr, flags); in test_branch_bform()
551 check(instr_is_branch_to_addr(&instr, addr)); in test_branch_bform()
554 instr = create_cond_branch(iptr, addr - 0x100, flags); in test_branch_bform()
555 check(instr_is_branch_to_addr(&instr, addr - 0x100)); in test_branch_bform()
558 instr = create_cond_branch(iptr, addr + 0x100, flags); in test_branch_bform()
559 check(instr_is_branch_to_addr(&instr, addr + 0x100)); in test_branch_bform()
562 instr = create_cond_branch(iptr, addr - 0x8000, flags); in test_branch_bform()
563 check(instr_is_branch_to_addr(&instr, addr - 0x8000)); in test_branch_bform()
566 instr = create_cond_branch(iptr, addr - 0x8004, flags); in test_branch_bform()
567 check(instr == 0); in test_branch_bform()
570 instr = create_cond_branch(iptr, addr + 0x8000, flags); in test_branch_bform()
571 check(instr == 0); in test_branch_bform()
574 instr = create_cond_branch(iptr, addr + 3, flags); in test_branch_bform()
575 check(instr == 0); in test_branch_bform()
578 instr = create_cond_branch(iptr, addr, 0xFFFFFFFC); in test_branch_bform()
579 check(instr_is_branch_to_addr(&instr, addr)); in test_branch_bform()
580 check(instr == 0x43FF0000); in test_branch_bform()