diff options
| -rw-r--r-- | arch/x86/kernel/traps.c | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/vm86_32.c | 10 |
2 files changed, 9 insertions, 2 deletions
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 60788dee0f8a..9f4edeb21323 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
| @@ -575,6 +575,7 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) | |||
| 575 | if (regs->flags & X86_VM_MASK) { | 575 | if (regs->flags & X86_VM_MASK) { |
| 576 | handle_vm86_trap((struct kernel_vm86_regs *) regs, | 576 | handle_vm86_trap((struct kernel_vm86_regs *) regs, |
| 577 | error_code, 1); | 577 | error_code, 1); |
| 578 | preempt_conditional_cli(regs); | ||
| 578 | return; | 579 | return; |
| 579 | } | 580 | } |
| 580 | 581 | ||
diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c index 5ffb5622f793..61fb98519622 100644 --- a/arch/x86/kernel/vm86_32.c +++ b/arch/x86/kernel/vm86_32.c | |||
| @@ -551,8 +551,14 @@ cannot_handle: | |||
| 551 | int handle_vm86_trap(struct kernel_vm86_regs *regs, long error_code, int trapno) | 551 | int handle_vm86_trap(struct kernel_vm86_regs *regs, long error_code, int trapno) |
| 552 | { | 552 | { |
| 553 | if (VMPI.is_vm86pus) { | 553 | if (VMPI.is_vm86pus) { |
| 554 | if ((trapno == 3) || (trapno == 1)) | 554 | if ((trapno == 3) || (trapno == 1)) { |
| 555 | return_to_32bit(regs, VM86_TRAP + (trapno << 8)); | 555 | KVM86->regs32->ax = VM86_TRAP + (trapno << 8); |
| 556 | /* setting this flag forces the code in entry_32.S to | ||
| 557 | call save_v86_state() and change the stack pointer | ||
| 558 | to KVM86->regs32 */ | ||
| 559 | set_thread_flag(TIF_IRET); | ||
| 560 | return 0; | ||
| 561 | } | ||
| 556 | do_int(regs, trapno, (unsigned char __user *) (regs->pt.ss << 4), SP(regs)); | 562 | do_int(regs, trapno, (unsigned char __user *) (regs->pt.ss << 4), SP(regs)); |
| 557 | return 0; | 563 | return 0; |
| 558 | } | 564 | } |
