diff options
Diffstat (limited to 'arch/x86/kernel')
| -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)  		local_irq_enable();  } +static inline void conditional_cli(struct pt_regs *regs) +{ +	if (regs->flags & X86_EFLAGS_IF) +		local_irq_disable(); +} +  static inline void preempt_conditional_cli(struct pt_regs *regs)  {  	if (regs->flags & X86_EFLAGS_IF) @@ -626,8 +632,10 @@ clear_dr7:  #ifdef CONFIG_X86_32  debug_vm86: +	/* reenable preemption: handle_vm86_trap() might sleep */ +	dec_preempt_count();  	handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, 1); -	preempt_conditional_cli(regs); +	conditional_cli(regs);  	return;  #endif  | 
