diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-13 20:28:16 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-13 20:28:16 -0400 |
commit | 2fd7476de999124bbf6830aa59ac092c882280fe (patch) | |
tree | 81522f679ccdf38067e03102d2b64e44fc777204 /arch/x86/ia32 | |
parent | ba1a96fc7ddcaf0c8d4a6752f6a70f080bc307ac (diff) | |
parent | 4ea48a01bb1a99f4185b77cd90cf962730336cc4 (diff) |
Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 fixes from Ingo Molnar:
"Misc smaller fixes that missed the v3.17 cycle"
* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
x86/build: Add arch/x86/purgatory/ make generated files to gitignore
x86: Fix section conflict for numachip
x86: Reject x32 executables if x32 ABI not supported
x86_64, entry: Filter RFLAGS.NT on entry from userspace
x86, boot, kaslr: Fix nuisance warning on 32-bit builds
Diffstat (limited to 'arch/x86/ia32')
-rw-r--r-- | arch/x86/ia32/ia32entry.S | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S index 4299eb05023c..711de084ab57 100644 --- a/arch/x86/ia32/ia32entry.S +++ b/arch/x86/ia32/ia32entry.S | |||
@@ -151,6 +151,16 @@ ENTRY(ia32_sysenter_target) | |||
151 | 1: movl (%rbp),%ebp | 151 | 1: movl (%rbp),%ebp |
152 | _ASM_EXTABLE(1b,ia32_badarg) | 152 | _ASM_EXTABLE(1b,ia32_badarg) |
153 | ASM_CLAC | 153 | ASM_CLAC |
154 | |||
155 | /* | ||
156 | * Sysenter doesn't filter flags, so we need to clear NT | ||
157 | * ourselves. To save a few cycles, we can check whether | ||
158 | * NT was set instead of doing an unconditional popfq. | ||
159 | */ | ||
160 | testl $X86_EFLAGS_NT,EFLAGS(%rsp) /* saved EFLAGS match cpu */ | ||
161 | jnz sysenter_fix_flags | ||
162 | sysenter_flags_fixed: | ||
163 | |||
154 | orl $TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET) | 164 | orl $TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET) |
155 | testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) | 165 | testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) |
156 | CFI_REMEMBER_STATE | 166 | CFI_REMEMBER_STATE |
@@ -184,6 +194,8 @@ sysexit_from_sys_call: | |||
184 | TRACE_IRQS_ON | 194 | TRACE_IRQS_ON |
185 | ENABLE_INTERRUPTS_SYSEXIT32 | 195 | ENABLE_INTERRUPTS_SYSEXIT32 |
186 | 196 | ||
197 | CFI_RESTORE_STATE | ||
198 | |||
187 | #ifdef CONFIG_AUDITSYSCALL | 199 | #ifdef CONFIG_AUDITSYSCALL |
188 | .macro auditsys_entry_common | 200 | .macro auditsys_entry_common |
189 | movl %esi,%r9d /* 6th arg: 4th syscall arg */ | 201 | movl %esi,%r9d /* 6th arg: 4th syscall arg */ |
@@ -226,7 +238,6 @@ sysexit_from_sys_call: | |||
226 | .endm | 238 | .endm |
227 | 239 | ||
228 | sysenter_auditsys: | 240 | sysenter_auditsys: |
229 | CFI_RESTORE_STATE | ||
230 | auditsys_entry_common | 241 | auditsys_entry_common |
231 | movl %ebp,%r9d /* reload 6th syscall arg */ | 242 | movl %ebp,%r9d /* reload 6th syscall arg */ |
232 | jmp sysenter_dispatch | 243 | jmp sysenter_dispatch |
@@ -235,6 +246,11 @@ sysexit_audit: | |||
235 | auditsys_exit sysexit_from_sys_call | 246 | auditsys_exit sysexit_from_sys_call |
236 | #endif | 247 | #endif |
237 | 248 | ||
249 | sysenter_fix_flags: | ||
250 | pushq_cfi $(X86_EFLAGS_IF|X86_EFLAGS_FIXED) | ||
251 | popfq_cfi | ||
252 | jmp sysenter_flags_fixed | ||
253 | |||
238 | sysenter_tracesys: | 254 | sysenter_tracesys: |
239 | #ifdef CONFIG_AUDITSYSCALL | 255 | #ifdef CONFIG_AUDITSYSCALL |
240 | testl $(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) | 256 | testl $(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) |