diff options
Diffstat (limited to 'arch/x86/entry/entry_32.S')
| -rw-r--r-- | arch/x86/entry/entry_32.S | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S index 4838037f97f6..a1f28a54f23a 100644 --- a/arch/x86/entry/entry_32.S +++ b/arch/x86/entry/entry_32.S | |||
| @@ -44,6 +44,7 @@ | |||
| 44 | #include <asm/asm.h> | 44 | #include <asm/asm.h> |
| 45 | #include <asm/smap.h> | 45 | #include <asm/smap.h> |
| 46 | #include <asm/frame.h> | 46 | #include <asm/frame.h> |
| 47 | #include <asm/nospec-branch.h> | ||
| 47 | 48 | ||
| 48 | .section .entry.text, "ax" | 49 | .section .entry.text, "ax" |
| 49 | 50 | ||
| @@ -290,7 +291,7 @@ ENTRY(ret_from_fork) | |||
| 290 | 291 | ||
| 291 | /* kernel thread */ | 292 | /* kernel thread */ |
| 292 | 1: movl %edi, %eax | 293 | 1: movl %edi, %eax |
| 293 | call *%ebx | 294 | CALL_NOSPEC %ebx |
| 294 | /* | 295 | /* |
| 295 | * A kernel thread is allowed to return here after successfully | 296 | * A kernel thread is allowed to return here after successfully |
| 296 | * calling do_execve(). Exit to userspace to complete the execve() | 297 | * calling do_execve(). Exit to userspace to complete the execve() |
| @@ -919,7 +920,7 @@ common_exception: | |||
| 919 | movl %ecx, %es | 920 | movl %ecx, %es |
| 920 | TRACE_IRQS_OFF | 921 | TRACE_IRQS_OFF |
| 921 | movl %esp, %eax # pt_regs pointer | 922 | movl %esp, %eax # pt_regs pointer |
| 922 | call *%edi | 923 | CALL_NOSPEC %edi |
| 923 | jmp ret_from_exception | 924 | jmp ret_from_exception |
| 924 | END(common_exception) | 925 | END(common_exception) |
| 925 | 926 | ||
| @@ -941,9 +942,10 @@ ENTRY(debug) | |||
| 941 | movl %esp, %eax # pt_regs pointer | 942 | movl %esp, %eax # pt_regs pointer |
| 942 | 943 | ||
| 943 | /* Are we currently on the SYSENTER stack? */ | 944 | /* Are we currently on the SYSENTER stack? */ |
| 944 | PER_CPU(cpu_tss + CPU_TSS_SYSENTER_stack + SIZEOF_SYSENTER_stack, %ecx) | 945 | movl PER_CPU_VAR(cpu_entry_area), %ecx |
| 945 | subl %eax, %ecx /* ecx = (end of SYSENTER_stack) - esp */ | 946 | addl $CPU_ENTRY_AREA_entry_stack + SIZEOF_entry_stack, %ecx |
| 946 | cmpl $SIZEOF_SYSENTER_stack, %ecx | 947 | subl %eax, %ecx /* ecx = (end of entry_stack) - esp */ |
| 948 | cmpl $SIZEOF_entry_stack, %ecx | ||
| 947 | jb .Ldebug_from_sysenter_stack | 949 | jb .Ldebug_from_sysenter_stack |
| 948 | 950 | ||
| 949 | TRACE_IRQS_OFF | 951 | TRACE_IRQS_OFF |
| @@ -984,9 +986,10 @@ ENTRY(nmi) | |||
| 984 | movl %esp, %eax # pt_regs pointer | 986 | movl %esp, %eax # pt_regs pointer |
| 985 | 987 | ||
| 986 | /* Are we currently on the SYSENTER stack? */ | 988 | /* Are we currently on the SYSENTER stack? */ |
| 987 | PER_CPU(cpu_tss + CPU_TSS_SYSENTER_stack + SIZEOF_SYSENTER_stack, %ecx) | 989 | movl PER_CPU_VAR(cpu_entry_area), %ecx |
| 988 | subl %eax, %ecx /* ecx = (end of SYSENTER_stack) - esp */ | 990 | addl $CPU_ENTRY_AREA_entry_stack + SIZEOF_entry_stack, %ecx |
| 989 | cmpl $SIZEOF_SYSENTER_stack, %ecx | 991 | subl %eax, %ecx /* ecx = (end of entry_stack) - esp */ |
| 992 | cmpl $SIZEOF_entry_stack, %ecx | ||
| 990 | jb .Lnmi_from_sysenter_stack | 993 | jb .Lnmi_from_sysenter_stack |
| 991 | 994 | ||
| 992 | /* Not on SYSENTER stack. */ | 995 | /* Not on SYSENTER stack. */ |
