|
@@ -98,12 +98,6 @@
|
|
|
#endif
|
|
|
.endm
|
|
|
|
|
|
-#ifdef CONFIG_VM86
|
|
|
-#define resume_userspace_sig check_userspace
|
|
|
-#else
|
|
|
-#define resume_userspace_sig resume_userspace
|
|
|
-#endif
|
|
|
-
|
|
|
/*
|
|
|
* User gs save/restore
|
|
|
*
|
|
@@ -327,10 +321,19 @@ ret_from_exception:
|
|
|
preempt_stop(CLBR_ANY)
|
|
|
ret_from_intr:
|
|
|
GET_THREAD_INFO(%ebp)
|
|
|
-check_userspace:
|
|
|
+resume_userspace_sig:
|
|
|
+#ifdef CONFIG_VM86
|
|
|
movl PT_EFLAGS(%esp), %eax # mix EFLAGS and CS
|
|
|
movb PT_CS(%esp), %al
|
|
|
andl $(X86_EFLAGS_VM | SEGMENT_RPL_MASK), %eax
|
|
|
+#else
|
|
|
+ /*
|
|
|
+ * We can be coming here from a syscall done in the kernel space,
|
|
|
+ * e.g. a failed kernel_execve().
|
|
|
+ */
|
|
|
+ movl PT_CS(%esp), %eax
|
|
|
+ andl $SEGMENT_RPL_MASK, %eax
|
|
|
+#endif
|
|
|
cmpl $USER_RPL, %eax
|
|
|
jb resume_kernel # not returning to v8086 or userspace
|
|
|
|