diff options
Diffstat (limited to 'arch/i386/kernel')
-rw-r--r-- | arch/i386/kernel/entry.S | 9 | ||||
-rw-r--r-- | arch/i386/kernel/process.c | 2 |
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: | |||
240 | check_userspace: | 240 | check_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 | ||
245 | ENTRY(resume_userspace) | 246 | ENTRY(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 |
384 | restore_nocheck: | 385 | restore_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.. */ |