From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754041AbbCaMkA (ORCPT ); Tue, 31 Mar 2015 08:40:00 -0400 Received: from terminus.zytor.com ([198.137.202.10]:57365 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751083AbbCaMj5 (ORCPT ); Tue, 31 Mar 2015 08:39:57 -0400 Date: Tue, 31 Mar 2015 05:39:22 -0700 From: tip-bot for Ingo Molnar Message-ID: Cc: bp@suse.de, torvalds@linux-foundation.org, mingo@kernel.org, oleg@redhat.com, hpa@zytor.com, dvlasenk@redhat.com, tglx@linutronix.de, linux-kernel@vger.kernel.org, luto@amacapital.net, spender@grsecurity.net, luto@kernel.org, bp@alien8.de Reply-To: torvalds@linux-foundation.org, bp@suse.de, dvlasenk@redhat.com, hpa@zytor.com, mingo@kernel.org, oleg@redhat.com, spender@grsecurity.net, luto@amacapital.net, tglx@linutronix.de, linux-kernel@vger.kernel.org, bp@alien8.de, luto@kernel.org In-Reply-To: <20150329090233.GA1963@gmail.com> References: <20150329090233.GA1963@gmail.com> To: linux-tip-commits@vger.kernel.org Subject: [tip:x86/asm] x86/asm/entry: Remove user_mode_ignore_vm86() Git-Commit-ID: 55474c48b4726fd3914c1ec47fced0f931729979 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 55474c48b4726fd3914c1ec47fced0f931729979 Gitweb: http://git.kernel.org/tip/55474c48b4726fd3914c1ec47fced0f931729979 Author: Ingo Molnar AuthorDate: Sun, 29 Mar 2015 11:02:34 +0200 Committer: Ingo Molnar CommitDate: Tue, 31 Mar 2015 11:45:19 +0200 x86/asm/entry: Remove user_mode_ignore_vm86() user_mode_ignore_vm86() can be used instead of user_mode(), in places where we have already done a v8086_mode() security check of ptregs. But doing this check in the wrong place would be a bug that could result in security problems, and also the naming still isn't very clear. Furthermore, it only affects 32-bit kernels, while most development happens on 64-bit kernels. If we replace them with user_mode() checks then the cost is only a very minor increase in various slowpaths: text data bss dec hex filename 10573391 703562 1753042 13029995 c6d26b vmlinux.o.before 10573423 703562 1753042 13030027 c6d28b vmlinux.o.after So lets get rid of this distinction once and for all. Acked-by: Borislav Petkov Acked-by: Andy Lutomirski Cc: Andrew Lutomirski Cc: Andy Lutomirski Cc: Borislav Petkov Cc: Brad Spengler Cc: Denys Vlasenko Cc: H. Peter Anvin Cc: Linus Torvalds Cc: Oleg Nesterov Cc: Thomas Gleixner Link: http://lkml.kernel.org/r/20150329090233.GA1963@gmail.com Signed-off-by: Ingo Molnar --- arch/x86/include/asm/ptrace.h | 17 ----------------- arch/x86/kernel/cpu/perf_event.c | 2 +- arch/x86/kernel/traps.c | 6 +++--- 3 files changed, 4 insertions(+), 21 deletions(-) diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h index d20bae2..19507ff 100644 --- a/arch/x86/include/asm/ptrace.h +++ b/arch/x86/include/asm/ptrace.h @@ -113,23 +113,6 @@ static inline int user_mode(struct pt_regs *regs) #endif } -/* - * This is the fastest way to check whether regs come from user space. - * It is unsafe if regs might come from vm86 mode, though -- in vm86 - * mode, all bits of CS and SS are completely under the user's control. - * The CPU considers vm86 mode to be CPL 3 regardless of CS and SS. - * - * Do NOT use this function unless you have already ruled out the - * possibility that regs came from vm86 mode. - * - * We check for RPL != 0 instead of RPL == 3 because we don't use rings - * 1 or 2 and this is more efficient. - */ -static inline int user_mode_ignore_vm86(struct pt_regs *regs) -{ - return (regs->cs & SEGMENT_RPL_MASK) != 0; -} - static inline int v8086_mode(struct pt_regs *regs) { #ifdef CONFIG_X86_32 diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index 56f7e60..e2888a3 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c @@ -2159,7 +2159,7 @@ static unsigned long code_segment_base(struct pt_regs *regs) if (regs->flags & X86_VM_MASK) return 0x10 * regs->cs; - if (user_mode_ignore_vm86(regs) && regs->cs != __USER_CS) + if (user_mode(regs) && regs->cs != __USER_CS) return get_segment_base(regs->cs); #else if (user_mode(regs) && !user_64bit_mode(regs) && diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index c8eb469..6751c5c 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c @@ -207,7 +207,7 @@ do_trap_no_signal(struct task_struct *tsk, int trapnr, char *str, return -1; } - if (!user_mode_ignore_vm86(regs)) { + if (!user_mode(regs)) { if (!fixup_exception(regs)) { tsk->thread.error_code = error_code; tsk->thread.trap_nr = trapnr; @@ -468,7 +468,7 @@ do_general_protection(struct pt_regs *regs, long error_code) } tsk = current; - if (!user_mode_ignore_vm86(regs)) { + if (!user_mode(regs)) { if (fixup_exception(regs)) goto exit; @@ -685,7 +685,7 @@ dotraplinkage void do_debug(struct pt_regs *regs, long error_code) * We already checked v86 mode above, so we can check for kernel mode * by just checking the CPL of CS. */ - if ((dr6 & DR_STEP) && !user_mode_ignore_vm86(regs)) { + if ((dr6 & DR_STEP) && !user_mode(regs)) { tsk->thread.debugreg6 &= ~DR_STEP; set_tsk_thread_flag(tsk, TIF_SINGLESTEP); regs->flags &= ~X86_EFLAGS_TF;