diff options
| -rw-r--r-- | arch/x86/kernel/traps.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 7932338d7cb3..a9e7548e1790 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
| @@ -99,6 +99,12 @@ static inline void preempt_conditional_sti(struct pt_regs *regs) | |||
| 99 | local_irq_enable(); | 99 | local_irq_enable(); |
| 100 | } | 100 | } |
| 101 | 101 | ||
| 102 | static inline void conditional_cli(struct pt_regs *regs) | ||
| 103 | { | ||
| 104 | if (regs->flags & X86_EFLAGS_IF) | ||
| 105 | local_irq_disable(); | ||
| 106 | } | ||
| 107 | |||
| 102 | static inline void preempt_conditional_cli(struct pt_regs *regs) | 108 | static inline void preempt_conditional_cli(struct pt_regs *regs) |
| 103 | { | 109 | { |
| 104 | if (regs->flags & X86_EFLAGS_IF) | 110 | if (regs->flags & X86_EFLAGS_IF) |
| @@ -626,8 +632,10 @@ clear_dr7: | |||
| 626 | 632 | ||
| 627 | #ifdef CONFIG_X86_32 | 633 | #ifdef CONFIG_X86_32 |
| 628 | debug_vm86: | 634 | debug_vm86: |
| 635 | /* reenable preemption: handle_vm86_trap() might sleep */ | ||
| 636 | dec_preempt_count(); | ||
| 629 | handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, 1); | 637 | handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, 1); |
| 630 | preempt_conditional_cli(regs); | 638 | conditional_cli(regs); |
| 631 | return; | 639 | return; |
| 632 | #endif | 640 | #endif |
| 633 | 641 | ||
