|
@@ -99,6 +99,12 @@ static inline void preempt_conditional_sti(struct pt_regs *regs)
|
|
local_irq_enable();
|
|
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)
|
|
static inline void preempt_conditional_cli(struct pt_regs *regs)
|
|
{
|
|
{
|
|
if (regs->flags & X86_EFLAGS_IF)
|
|
if (regs->flags & X86_EFLAGS_IF)
|
|
@@ -626,8 +632,10 @@ clear_dr7:
|
|
|
|
|
|
#ifdef CONFIG_X86_32
|
|
#ifdef CONFIG_X86_32
|
|
debug_vm86:
|
|
debug_vm86:
|
|
|
|
+ /* reenable preemption: handle_vm86_trap() might sleep */
|
|
|
|
+ dec_preempt_count();
|
|
handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, 1);
|
|
handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, 1);
|
|
- preempt_conditional_cli(regs);
|
|
|
|
|
|
+ conditional_cli(regs);
|
|
return;
|
|
return;
|
|
#endif
|
|
#endif
|
|
|
|
|