diff options
| -rw-r--r-- | arch/x86/include/asm/fpu-internal.h | 13 | ||||
| -rw-r--r-- | arch/x86/kernel/entry_32.S | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/entry_64.S | 2 |
3 files changed, 10 insertions, 9 deletions
diff --git a/arch/x86/include/asm/fpu-internal.h b/arch/x86/include/asm/fpu-internal.h index c49a613c6452..cea1c76d49bf 100644 --- a/arch/x86/include/asm/fpu-internal.h +++ b/arch/x86/include/asm/fpu-internal.h | |||
| @@ -293,12 +293,13 @@ static inline int restore_fpu_checking(struct task_struct *tsk) | |||
| 293 | /* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception | 293 | /* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception |
| 294 | is pending. Clear the x87 state here by setting it to fixed | 294 | is pending. Clear the x87 state here by setting it to fixed |
| 295 | values. "m" is a random variable that should be in L1 */ | 295 | values. "m" is a random variable that should be in L1 */ |
| 296 | alternative_input( | 296 | if (unlikely(static_cpu_has(X86_FEATURE_FXSAVE_LEAK))) { |
| 297 | ASM_NOP8 ASM_NOP2, | 297 | asm volatile( |
| 298 | "emms\n\t" /* clear stack tags */ | 298 | "fnclex\n\t" |
| 299 | "fildl %P[addr]", /* set F?P to defined value */ | 299 | "emms\n\t" |
| 300 | X86_FEATURE_FXSAVE_LEAK, | 300 | "fildl %P[addr]" /* set F?P to defined value */ |
| 301 | [addr] "m" (tsk->thread.fpu.has_fpu)); | 301 | : : [addr] "m" (tsk->thread.fpu.has_fpu)); |
| 302 | } | ||
| 302 | 303 | ||
| 303 | return fpu_restore_checking(&tsk->thread.fpu); | 304 | return fpu_restore_checking(&tsk->thread.fpu); |
| 304 | } | 305 | } |
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index 51e2988c5728..a2a4f4697889 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
| @@ -1082,7 +1082,7 @@ ENTRY(ftrace_caller) | |||
| 1082 | pushl $0 /* Pass NULL as regs pointer */ | 1082 | pushl $0 /* Pass NULL as regs pointer */ |
| 1083 | movl 4*4(%esp), %eax | 1083 | movl 4*4(%esp), %eax |
| 1084 | movl 0x4(%ebp), %edx | 1084 | movl 0x4(%ebp), %edx |
| 1085 | leal function_trace_op, %ecx | 1085 | movl function_trace_op, %ecx |
| 1086 | subl $MCOUNT_INSN_SIZE, %eax | 1086 | subl $MCOUNT_INSN_SIZE, %eax |
| 1087 | 1087 | ||
| 1088 | .globl ftrace_call | 1088 | .globl ftrace_call |
| @@ -1140,7 +1140,7 @@ ENTRY(ftrace_regs_caller) | |||
| 1140 | movl 12*4(%esp), %eax /* Load ip (1st parameter) */ | 1140 | movl 12*4(%esp), %eax /* Load ip (1st parameter) */ |
| 1141 | subl $MCOUNT_INSN_SIZE, %eax /* Adjust ip */ | 1141 | subl $MCOUNT_INSN_SIZE, %eax /* Adjust ip */ |
| 1142 | movl 0x4(%ebp), %edx /* Load parent ip (2nd parameter) */ | 1142 | movl 0x4(%ebp), %edx /* Load parent ip (2nd parameter) */ |
| 1143 | leal function_trace_op, %ecx /* Save ftrace_pos in 3rd parameter */ | 1143 | movl function_trace_op, %ecx /* Save ftrace_pos in 3rd parameter */ |
| 1144 | pushl %esp /* Save pt_regs as 4th parameter */ | 1144 | pushl %esp /* Save pt_regs as 4th parameter */ |
| 1145 | 1145 | ||
| 1146 | GLOBAL(ftrace_regs_call) | 1146 | GLOBAL(ftrace_regs_call) |
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index e21b0785a85b..1e96c3628bf2 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
| @@ -88,7 +88,7 @@ END(function_hook) | |||
| 88 | MCOUNT_SAVE_FRAME \skip | 88 | MCOUNT_SAVE_FRAME \skip |
| 89 | 89 | ||
| 90 | /* Load the ftrace_ops into the 3rd parameter */ | 90 | /* Load the ftrace_ops into the 3rd parameter */ |
| 91 | leaq function_trace_op, %rdx | 91 | movq function_trace_op(%rip), %rdx |
| 92 | 92 | ||
| 93 | /* Load ip into the first parameter */ | 93 | /* Load ip into the first parameter */ |
| 94 | movq RIP(%rsp), %rdi | 94 | movq RIP(%rsp), %rdi |
