@@ -460,50 +460,26 @@ static void kprobe_emulate_call(struct kprobe *p, struct pt_regs *regs)
460
460
}
461
461
NOKPROBE_SYMBOL (kprobe_emulate_call );
462
462
463
- static nokprobe_inline
464
- void __kprobe_emulate_jmp (struct kprobe * p , struct pt_regs * regs , bool cond )
463
+ static void kprobe_emulate_jmp (struct kprobe * p , struct pt_regs * regs )
465
464
{
466
465
unsigned long ip = regs -> ip - INT3_INSN_SIZE + p -> ainsn .size ;
467
466
468
- if (cond )
469
- ip += p -> ainsn .rel32 ;
467
+ ip += p -> ainsn .rel32 ;
470
468
int3_emulate_jmp (regs , ip );
471
469
}
472
-
473
- static void kprobe_emulate_jmp (struct kprobe * p , struct pt_regs * regs )
474
- {
475
- __kprobe_emulate_jmp (p , regs , true);
476
- }
477
470
NOKPROBE_SYMBOL (kprobe_emulate_jmp );
478
471
479
- static const unsigned long jcc_mask [6 ] = {
480
- [0 ] = X86_EFLAGS_OF ,
481
- [1 ] = X86_EFLAGS_CF ,
482
- [2 ] = X86_EFLAGS_ZF ,
483
- [3 ] = X86_EFLAGS_CF | X86_EFLAGS_ZF ,
484
- [4 ] = X86_EFLAGS_SF ,
485
- [5 ] = X86_EFLAGS_PF ,
486
- };
487
-
488
472
static void kprobe_emulate_jcc (struct kprobe * p , struct pt_regs * regs )
489
473
{
490
- bool invert = p -> ainsn .jcc .type & 1 ;
491
- bool match ;
474
+ unsigned long ip = regs -> ip - INT3_INSN_SIZE + p -> ainsn .size ;
492
475
493
- if (p -> ainsn .jcc .type < 0xc ) {
494
- match = regs -> flags & jcc_mask [p -> ainsn .jcc .type >> 1 ];
495
- } else {
496
- match = ((regs -> flags & X86_EFLAGS_SF ) >> X86_EFLAGS_SF_BIT ) ^
497
- ((regs -> flags & X86_EFLAGS_OF ) >> X86_EFLAGS_OF_BIT );
498
- if (p -> ainsn .jcc .type >= 0xe )
499
- match = match || (regs -> flags & X86_EFLAGS_ZF );
500
- }
501
- __kprobe_emulate_jmp (p , regs , (match && !invert ) || (!match && invert ));
476
+ int3_emulate_jcc (regs , p -> ainsn .jcc .type , ip , p -> ainsn .rel32 );
502
477
}
503
478
NOKPROBE_SYMBOL (kprobe_emulate_jcc );
504
479
505
480
static void kprobe_emulate_loop (struct kprobe * p , struct pt_regs * regs )
506
481
{
482
+ unsigned long ip = regs -> ip - INT3_INSN_SIZE + p -> ainsn .size ;
507
483
bool match ;
508
484
509
485
if (p -> ainsn .loop .type != 3 ) { /* LOOP* */
@@ -531,7 +507,9 @@ static void kprobe_emulate_loop(struct kprobe *p, struct pt_regs *regs)
531
507
else if (p -> ainsn .loop .type == 1 ) /* LOOPE */
532
508
match = match && (regs -> flags & X86_EFLAGS_ZF );
533
509
534
- __kprobe_emulate_jmp (p , regs , match );
510
+ if (match )
511
+ ip += p -> ainsn .rel32 ;
512
+ int3_emulate_jmp (regs , ip );
535
513
}
536
514
NOKPROBE_SYMBOL (kprobe_emulate_loop );
537
515
0 commit comments