[PATCH] fix broken vm86 interrupt/signal handling
Commit c3ff8ec31c1249d268cd11390649768a12bec1b9 ("[PATCH] i386: Don't miss pending signals returning to user mode after signal processing") meant that vm86 interrupt/signal handling got broken for the case when vm86 is called from kernel space. In this scenario, if signal is pending because of vm86 interrupt, do_notify_resume/do_signal exits immediately due to user_mode() check, without processing any signals. Thus, resume_userspace handler is spinning in a tight loop with signal pending and TIF_SIGPENDING is set. Previously everything worked Ok. No in-tree usage of vm86() from kernel space exists, but I've heard about a number of projects out there which use vm86 calls from kernel, one of them being this, for instance: http://dev.gentoo.org/~spock/projects/vesafb-tng/ The following patch fixes the issue. Signed-off-by: Aleksey Gorelov <aleksey_gorelov@phoenix.com> Cc: Atsushi Nemoto <anemo@mba.ocn.ne.jp> Cc: Roland McGrath <roland@redhat.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
c723e08460
commit
4031ff3881
@ -83,6 +83,12 @@ VM_MASK = 0x00020000
|
||||
#define resume_kernel restore_nocheck
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_VM86
|
||||
#define resume_userspace_sig check_userspace
|
||||
#else
|
||||
#define resume_userspace_sig resume_userspace
|
||||
#endif
|
||||
|
||||
#define SAVE_ALL \
|
||||
cld; \
|
||||
pushl %es; \
|
||||
@ -211,6 +217,7 @@ ret_from_exception:
|
||||
preempt_stop
|
||||
ret_from_intr:
|
||||
GET_THREAD_INFO(%ebp)
|
||||
check_userspace:
|
||||
movl EFLAGS(%esp), %eax # mix EFLAGS and CS
|
||||
movb CS(%esp), %al
|
||||
testl $(VM_MASK | 3), %eax
|
||||
@ -415,7 +422,7 @@ work_notifysig: # deal with pending signals and
|
||||
# vm86-space
|
||||
xorl %edx, %edx
|
||||
call do_notify_resume
|
||||
jmp resume_userspace
|
||||
jmp resume_userspace_sig
|
||||
|
||||
ALIGN
|
||||
work_notifysig_v86:
|
||||
@ -428,7 +435,7 @@ work_notifysig_v86:
|
||||
movl %eax, %esp
|
||||
xorl %edx, %edx
|
||||
call do_notify_resume
|
||||
jmp resume_userspace
|
||||
jmp resume_userspace_sig
|
||||
#endif
|
||||
|
||||
# perform syscall exit tracing
|
||||
|
Loading…
x
Reference in New Issue
Block a user