aboutsummaryrefslogtreecommitdiffstats
path: root/arch/i386/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/i386/kernel')
-rw-r--r--arch/i386/kernel/entry.S9
-rw-r--r--arch/i386/kernel/process.c2
2 files changed, 6 insertions, 5 deletions
diff --git a/arch/i386/kernel/entry.S b/arch/i386/kernel/entry.S
index 3872fca5c74a..284f2e908ad0 100644
--- a/arch/i386/kernel/entry.S
+++ b/arch/i386/kernel/entry.S
@@ -240,8 +240,9 @@ ret_from_intr:
240check_userspace: 240check_userspace:
241 movl EFLAGS(%esp), %eax # mix EFLAGS and CS 241 movl EFLAGS(%esp), %eax # mix EFLAGS and CS
242 movb CS(%esp), %al 242 movb CS(%esp), %al
243 testl $(VM_MASK | 3), %eax 243 andl $(VM_MASK | SEGMENT_RPL_MASK), %eax
244 jz resume_kernel 244 cmpl $USER_RPL, %eax
245 jb resume_kernel # not returning to v8086 or userspace
245ENTRY(resume_userspace) 246ENTRY(resume_userspace)
246 DISABLE_INTERRUPTS # make sure we don't miss an interrupt 247 DISABLE_INTERRUPTS # make sure we don't miss an interrupt
247 # setting need_resched or sigpending 248 # setting need_resched or sigpending
@@ -377,8 +378,8 @@ restore_all:
377 # See comments in process.c:copy_thread() for details. 378 # See comments in process.c:copy_thread() for details.
378 movb OLDSS(%esp), %ah 379 movb OLDSS(%esp), %ah
379 movb CS(%esp), %al 380 movb CS(%esp), %al
380 andl $(VM_MASK | (4 << 8) | 3), %eax 381 andl $(VM_MASK | (SEGMENT_TI_MASK << 8) | SEGMENT_RPL_MASK), %eax
381 cmpl $((4 << 8) | 3), %eax 382 cmpl $((SEGMENT_LDT << 8) | USER_RPL), %eax
382 CFI_REMEMBER_STATE 383 CFI_REMEMBER_STATE
383 je ldt_ss # returning to user-space with LDT SS 384 je ldt_ss # returning to user-space with LDT SS
384restore_nocheck: 385restore_nocheck:
diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c
index 220aeca59c3a..8c190ca7ae44 100644
--- a/arch/i386/kernel/process.c
+++ b/arch/i386/kernel/process.c
@@ -338,7 +338,7 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
338 regs.xes = __USER_DS; 338 regs.xes = __USER_DS;
339 regs.orig_eax = -1; 339 regs.orig_eax = -1;
340 regs.eip = (unsigned long) kernel_thread_helper; 340 regs.eip = (unsigned long) kernel_thread_helper;
341 regs.xcs = __KERNEL_CS; 341 regs.xcs = __KERNEL_CS | get_kernel_rpl();
342 regs.eflags = X86_EFLAGS_IF | X86_EFLAGS_SF | X86_EFLAGS_PF | 0x2; 342 regs.eflags = X86_EFLAGS_IF | X86_EFLAGS_SF | X86_EFLAGS_PF | 0x2;
343 343
344 /* Ok, create the new process.. */ 344 /* Ok, create the new process.. */