diff options
| -rw-r--r-- | arch/x86/kernel/traps.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 142d70c74b02..725ef4d17cd5 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
| @@ -526,6 +526,7 @@ asmlinkage __kprobes struct pt_regs *sync_regs(struct pt_regs *eregs) | |||
| 526 | dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) | 526 | dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) |
| 527 | { | 527 | { |
| 528 | struct task_struct *tsk = current; | 528 | struct task_struct *tsk = current; |
| 529 | int user_icebp = 0; | ||
| 529 | unsigned long dr6; | 530 | unsigned long dr6; |
| 530 | int si_code; | 531 | int si_code; |
| 531 | 532 | ||
| @@ -534,6 +535,14 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) | |||
| 534 | /* Filter out all the reserved bits which are preset to 1 */ | 535 | /* Filter out all the reserved bits which are preset to 1 */ |
| 535 | dr6 &= ~DR6_RESERVED; | 536 | dr6 &= ~DR6_RESERVED; |
| 536 | 537 | ||
| 538 | /* | ||
| 539 | * If dr6 has no reason to give us about the origin of this trap, | ||
| 540 | * then it's very likely the result of an icebp/int01 trap. | ||
| 541 | * User wants a sigtrap for that. | ||
| 542 | */ | ||
| 543 | if (!dr6 && user_mode(regs)) | ||
| 544 | user_icebp = 1; | ||
| 545 | |||
| 537 | /* Catch kmemcheck conditions first of all! */ | 546 | /* Catch kmemcheck conditions first of all! */ |
| 538 | if ((dr6 & DR_STEP) && kmemcheck_trap(regs)) | 547 | if ((dr6 & DR_STEP) && kmemcheck_trap(regs)) |
| 539 | return; | 548 | return; |
| @@ -575,7 +584,7 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) | |||
| 575 | regs->flags &= ~X86_EFLAGS_TF; | 584 | regs->flags &= ~X86_EFLAGS_TF; |
| 576 | } | 585 | } |
| 577 | si_code = get_si_code(tsk->thread.debugreg6); | 586 | si_code = get_si_code(tsk->thread.debugreg6); |
| 578 | if (tsk->thread.debugreg6 & (DR_STEP | DR_TRAP_BITS)) | 587 | if (tsk->thread.debugreg6 & (DR_STEP | DR_TRAP_BITS) || user_icebp) |
| 579 | send_sigtrap(tsk, regs, error_code, si_code); | 588 | send_sigtrap(tsk, regs, error_code, si_code); |
| 580 | preempt_conditional_cli(regs); | 589 | preempt_conditional_cli(regs); |
| 581 | 590 | ||
