x86: kprobe cleanup resume_execution
PATCH 2/4 x86: kprobe cleanup resume_execution
This patch cleans up and fixes bugs in resume_execution on x86-64. Kprobes for x86-64 may cause a kernel crash if it inserted on "iret" instruction.
"call absolute" case 0x9a is invalid on x86-64, so we don't need treat it, leave it ifdef X86_32.
- Add "iret"(0xcf) case.to X86_64
- Fold jmp absolute (0xea) handling into iret/ret/lret handling
Based on patch from Masami Hiramatsu <[email protected]>
Signed-off-by Harvey Harrison <[email protected]>
--- arch/x86/kernel/kprobes.c | 11 +++-------- 1 files changed, 3 insertions(+), 8 deletions(-)
arch/x86/kernel/kprobes.c +3 -8
@@ -748,12 +748,13 @@ static void __kprobes resume_execution(struct kprobe *p, *tos &= ~(TF_MASK |IF_MASK ); *tos |= kcb->kprobe_old_flags;break ; -case 0xc2 :/* ret/lret */ +case 0xc2 :/* iret/ret/lret */ case 0xc3 :case 0xca :case 0xcb : +case 0xcf : +case 0xea :/* jmp absolute -- ip is correct */ #ifdef CONFIG_X86_32 -case 0xcf :/* iret */ /* ip is already adjusted, no more changes required */ p->ainsn.boostable =1 ;#endif
@@ -783,12 +784,6 @@ static void __kprobes resume_execution(struct kprobe *p, goto no_change; }break ; -case 0xea :/* jmp absolute -- ip is correct */ -#ifdef CONFIG_X86_32 -/* ip is already adjusted, no more changes required */ - p->ainsn.boostable =1 ; -#endif - goto no_change;default :break ; }
Signature · 1 line
1.5.4.rc0.1083.gf568