kprobes: dont steal interrupts from vm86
PATCH 1/1 kprobes: dont steal interrupts from vm86
Hello.
With kprobes enabled, vm86 doesn't feel good. The problem is that kprobes steal the interrupts (mainly int3 I think) from it for no good reason.
The attached patch fixes the problem by checking the VM flag where it makes sense.
Andrew, can this please be applied?
Signed-off-by Stas Sergeev <[email protected]>
linux/arch/i386/kernel/traps.c renamed from arch/i386/kernel/traps.c +12 -6
@@ -408,7 +408,8 @@#define DO_ERROR (trapnr, signr, str, name) \ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \ { \ - if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \ + if (!(regs->eflags & VM_MASK) && \ + notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \ == NOTIFY_STOP) \ return; \ do_trap(trapnr, signr, str, 0, regs, error_code, NULL); \
@@ -422,7 +423,8 @@ info.si_errno =0 ; \ info.si_code = sicode; \ info.si_addr = (void __user *)siaddr; \ -if (notify_die (DIE_TRAP , str, regs, error_code, trapnr, signr) \ +if (!(regs->eflags &VM_MASK ) && \ +notify_die (DIE_TRAP , str, regs, error_code, trapnr, signr) \ ==NOTIFY_STOP ) \return ; \do_trap (trapnr, signr, str,0 , regs, error_code, &info); \
@@ -431,7 +433,8 @@#define DO_VM86_ERROR (trapnr, signr, str, name) \ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \ { \ - if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \ + if (!(regs->eflags & VM_MASK) && \ + notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \ == NOTIFY_STOP) \ return; \ do_trap(trapnr, signr, str, 1, regs, error_code, NULL); \
@@ -445,7 +448,8 @@ info.si_errno =0 ; \ info.si_code = sicode; \ info.si_addr = (void __user *)siaddr; \ -if (notify_die (DIE_TRAP , str, regs, error_code, trapnr, signr) \ +if (!(regs->eflags &VM_MASK ) && \ +notify_die (DIE_TRAP , str, regs, error_code, trapnr, signr) \ ==NOTIFY_STOP ) \return ; \do_trap (trapnr, signr, str,1 , regs, error_code, &info); \
@@ -652,7 +656,8 @@#ifdef CONFIG_KPROBES asmlinkage int do_int3(struct pt_regs *regs, long error_code) { -if (notify_die (DIE_INT3 ,"int3" , regs, error_code,3 ,SIGTRAP ) +if (!(regs->eflags &VM_MASK ) && +notify_die (DIE_INT3 ,"int3" , regs, error_code,3 ,SIGTRAP ) ==NOTIFY_STOP )return 1 ;/* This is an interrupt gate, because kprobes wants interrupts
@@ -693,7 +698,8 @@ __asm__ __volatile__("movl %%db6,%0" :"=r" (condition)); -if (notify_die (DIE_DEBUG ,"debug" , regs, condition, error_code, +if (!(regs->eflags &VM_MASK ) && +notify_die (DIE_DEBUG ,"debug" , regs, condition, error_code,SIGTRAP ) ==NOTIFY_STOP )return ;/* It's safe to allow irq's after DR6 has been saved */