diff options
-rw-r--r-- | arch/x86/include/asm/system.h | 6 | ||||
-rw-r--r-- | arch/x86/kernel/entry_64.S | 2 |
2 files changed, 5 insertions, 3 deletions
diff --git a/arch/x86/include/asm/system.h b/arch/x86/include/asm/system.h index 8e626ea33a1a..fa47b1e6a866 100644 --- a/arch/x86/include/asm/system.h +++ b/arch/x86/include/asm/system.h | |||
@@ -96,15 +96,15 @@ do { \ | |||
96 | "thread_return:\n\t" \ | 96 | "thread_return:\n\t" \ |
97 | "movq %%gs:%P[pda_pcurrent],%%rsi\n\t" \ | 97 | "movq %%gs:%P[pda_pcurrent],%%rsi\n\t" \ |
98 | "movq %P[thread_info](%%rsi),%%r8\n\t" \ | 98 | "movq %P[thread_info](%%rsi),%%r8\n\t" \ |
99 | LOCK_PREFIX "btr %[tif_fork],%P[ti_flags](%%r8)\n\t" \ | ||
100 | "movq %%rax,%%rdi\n\t" \ | 99 | "movq %%rax,%%rdi\n\t" \ |
101 | "jc ret_from_fork\n\t" \ | 100 | "testl %[_tif_fork],%P[ti_flags](%%r8)\n\t" \ |
101 | "jnz ret_from_fork\n\t" \ | ||
102 | RESTORE_CONTEXT \ | 102 | RESTORE_CONTEXT \ |
103 | : "=a" (last) \ | 103 | : "=a" (last) \ |
104 | : [next] "S" (next), [prev] "D" (prev), \ | 104 | : [next] "S" (next), [prev] "D" (prev), \ |
105 | [threadrsp] "i" (offsetof(struct task_struct, thread.sp)), \ | 105 | [threadrsp] "i" (offsetof(struct task_struct, thread.sp)), \ |
106 | [ti_flags] "i" (offsetof(struct thread_info, flags)), \ | 106 | [ti_flags] "i" (offsetof(struct thread_info, flags)), \ |
107 | [tif_fork] "i" (TIF_FORK), \ | 107 | [_tif_fork] "i" (_TIF_FORK), \ |
108 | [thread_info] "i" (offsetof(struct task_struct, stack)), \ | 108 | [thread_info] "i" (offsetof(struct task_struct, stack)), \ |
109 | [pda_pcurrent] "i" (offsetof(struct x8664_pda, pcurrent)) \ | 109 | [pda_pcurrent] "i" (offsetof(struct x8664_pda, pcurrent)) \ |
110 | : "memory", "cc" __EXTRA_CLOBBER) | 110 | : "memory", "cc" __EXTRA_CLOBBER) |
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index e28c7a987793..38dd37458e44 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
@@ -408,6 +408,8 @@ END(save_paranoid) | |||
408 | ENTRY(ret_from_fork) | 408 | ENTRY(ret_from_fork) |
409 | DEFAULT_FRAME | 409 | DEFAULT_FRAME |
410 | 410 | ||
411 | LOCK ; btr $TIF_FORK,TI_flags(%r8) | ||
412 | |||
411 | push kernel_eflags(%rip) | 413 | push kernel_eflags(%rip) |
412 | CFI_ADJUST_CFA_OFFSET 8 | 414 | CFI_ADJUST_CFA_OFFSET 8 |
413 | popf # reset kernel eflags | 415 | popf # reset kernel eflags |