From: tip-bot for Dave Hansen <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: torvalds@linux-foundation.org, peterz@infradead.org,
dave@sr71.net, mingo@kernel.org, dave.hansen@linux.intel.com,
hpa@zytor.com, akpm@linux-foundation.org,
linux-kernel@vger.kernel.org, tglx@linutronix.de
Subject: [tip:x86/fpu] x86/mpx: Use 32-bit-only cmpxchg() for 32-bit apps
Date: Tue, 9 Jun 2015 05:35:05 -0700 [thread overview]
Message-ID: <tip-6ac52bb4913eadfa327138b91aab5d37234a2c3b@git.kernel.org> (raw)
In-Reply-To: <20150607183705.672B115E@viggo.jf.intel.com>
Commit-ID: 6ac52bb4913eadfa327138b91aab5d37234a2c3b
Gitweb: http://git.kernel.org/tip/6ac52bb4913eadfa327138b91aab5d37234a2c3b
Author: Dave Hansen <dave.hansen@linux.intel.com>
AuthorDate: Sun, 7 Jun 2015 11:37:05 -0700
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Tue, 9 Jun 2015 12:24:33 +0200
x86/mpx: Use 32-bit-only cmpxchg() for 32-bit apps
user_atomic_cmpxchg_inatomic() actually looks at sizeof(*ptr) to
figure out how many bytes to copy. If we run it on a 64-bit
kernel with a 64-bit pointer, it will copy a 64-bit bounds
directory entry. That's fine, except when we have 32-bit
programs with 32-bit bounds directory entries and we only *want*
32-bits.
This patch breaks the cmpxchg() operation out in to its own
function and performs the 32-bit type swizzling in there.
Note, the "64-bit" version of this code _would_ work on a
32-bit-only kernel. The issue this patch addresses is only for
when the kernel's 'long' is mismatched from the size of the
bounds directory entry of the process we are working on.
The new helper modifies 'actual_old_val' or returns an error.
But gcc doesn't know this, so it warns about 'actual_old_val'
being unused. Shut it up with an uninitialized_var().
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Dave Hansen <dave@sr71.net>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20150607183705.672B115E@viggo.jf.intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
arch/x86/mm/mpx.c | 41 ++++++++++++++++++++++++++++++++++++-----
1 file changed, 36 insertions(+), 5 deletions(-)
diff --git a/arch/x86/mm/mpx.c b/arch/x86/mm/mpx.c
index 8cc7934..294ea20 100644
--- a/arch/x86/mm/mpx.c
+++ b/arch/x86/mm/mpx.c
@@ -419,6 +419,35 @@ int mpx_disable_management(void)
return 0;
}
+static int mpx_cmpxchg_bd_entry(struct mm_struct *mm,
+ unsigned long *curval,
+ unsigned long __user *addr,
+ unsigned long old_val, unsigned long new_val)
+{
+ int ret;
+ /*
+ * user_atomic_cmpxchg_inatomic() actually uses sizeof()
+ * the pointer that we pass to it to figure out how much
+ * data to cmpxchg. We have to be careful here not to
+ * pass a pointer to a 64-bit data type when we only want
+ * a 32-bit copy.
+ */
+ if (is_64bit_mm(mm)) {
+ ret = user_atomic_cmpxchg_inatomic(curval,
+ addr, old_val, new_val);
+ } else {
+ u32 uninitialized_var(curval_32);
+ u32 old_val_32 = old_val;
+ u32 new_val_32 = new_val;
+ u32 __user *addr_32 = (u32 __user *)addr;
+
+ ret = user_atomic_cmpxchg_inatomic(&curval_32,
+ addr_32, old_val_32, new_val_32);
+ *curval = curval_32;
+ }
+ return ret;
+}
+
/*
* With 32-bit mode, MPX_BT_SIZE_BYTES is 4MB, and the size of each
* bounds table is 16KB. With 64-bit mode, MPX_BT_SIZE_BYTES is 2GB,
@@ -426,6 +455,7 @@ int mpx_disable_management(void)
*/
static int allocate_bt(long __user *bd_entry)
{
+ struct mm_struct *mm = current->mm;
unsigned long expected_old_val = 0;
unsigned long actual_old_val = 0;
unsigned long bt_addr;
@@ -455,8 +485,8 @@ static int allocate_bt(long __user *bd_entry)
* mmap_sem at this point, unlike some of the other part
* of the MPX code that have to pagefault_disable().
*/
- ret = user_atomic_cmpxchg_inatomic(&actual_old_val, bd_entry,
- expected_old_val, bd_new_entry);
+ ret = mpx_cmpxchg_bd_entry(mm, &actual_old_val, bd_entry,
+ expected_old_val, bd_new_entry);
if (ret)
goto out_unmap;
@@ -710,15 +740,16 @@ static int unmap_single_bt(struct mm_struct *mm,
long __user *bd_entry, unsigned long bt_addr)
{
unsigned long expected_old_val = bt_addr | MPX_BD_ENTRY_VALID_FLAG;
- unsigned long actual_old_val = 0;
+ unsigned long uninitialized_var(actual_old_val);
int ret;
while (1) {
int need_write = 1;
+ unsigned long cleared_bd_entry = 0;
pagefault_disable();
- ret = user_atomic_cmpxchg_inatomic(&actual_old_val, bd_entry,
- expected_old_val, 0);
+ ret = mpx_cmpxchg_bd_entry(mm, &actual_old_val,
+ bd_entry, expected_old_val, cleared_bd_entry);
pagefault_enable();
if (!ret)
break;
next prev parent reply other threads:[~2015-06-09 12:35 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-07 18:37 [PATCH 00/19] x86, mpx updates for 4.2 (take 9) Dave Hansen
2015-06-07 18:37 ` [PATCH 01/19] x86, mpx, xsave: Fix up bad get_xsave_addr() assumptions Dave Hansen
2015-06-09 12:30 ` [tip:x86/fpu] x86/fpu/xstate: " tip-bot for Dave Hansen
2015-06-07 18:37 ` [PATCH 02/19] x86, fpu: Wrap get_xsave_addr() to make it safer Dave Hansen
2015-06-09 12:31 ` [tip:x86/fpu] x86/fpu/xstate: " tip-bot for Dave Hansen
2015-06-07 18:37 ` [PATCH 03/19] x86, mpx: Use new get_xsave_field_ptr() Dave Hansen
2015-06-09 12:31 ` [tip:x86/fpu] x86/mpx: Use the new get_xsave_field_ptr()API tip-bot for Dave Hansen
2015-06-07 18:37 ` [PATCH 05/19] x86, mpx: remove redundant MPX_BNDCFG_ADDR_MASK Dave Hansen
2015-06-09 12:32 ` [tip:x86/fpu] x86/mpx: Remove " tip-bot for Qiaowei Ren
2015-06-07 18:37 ` [PATCH 06/19] x86, mpx: Restrict mmap size check to bounds tables Dave Hansen
2015-06-09 12:32 ` [tip:x86/fpu] x86/mpx: Restrict the mmap() " tip-bot for Dave Hansen
2015-06-07 18:37 ` [PATCH 04/19] x86, mpx: Cleanup: Do not pass task around when unnecessary Dave Hansen
2015-06-09 12:31 ` [tip:x86/fpu] x86/mpx: Clean up the code by not passing a task pointer " tip-bot for Dave Hansen
2015-06-07 18:37 ` [PATCH 07/19] x86, mpx: boot-time disable Dave Hansen
2015-06-09 12:32 ` [tip:x86/fpu] x86/mpx: Introduce a boot-time disable flag tip-bot for Dave Hansen
2015-06-07 18:37 ` [PATCH 09/19] x86, mpx: trace entry to bounds exception paths Dave Hansen
2015-06-09 12:33 ` [tip:x86/fpu] x86/mpx: Trace " tip-bot for Dave Hansen
2015-06-07 18:37 ` [PATCH 08/19] x86, mpx: trace #BR exceptions Dave Hansen
2015-06-09 12:33 ` [tip:x86/fpu] x86/mpx: Trace " tip-bot for Dave Hansen
2015-06-07 18:37 ` [PATCH 10/19] x86, mpx: Trace the attempts to find bounds tables Dave Hansen
2015-06-09 12:33 ` [tip:x86/fpu] x86/mpx: " tip-bot for Dave Hansen
2015-06-07 18:37 ` [PATCH 13/19] x86, mpx: Add temporary variable to reduce masking Dave Hansen
2015-06-09 12:34 ` [tip:x86/fpu] x86/mpx: " tip-bot for Dave Hansen
2015-06-07 18:37 ` [PATCH 12/19] x86: make is_64bit_mm() widely available Dave Hansen
2015-06-09 12:34 ` [tip:x86/fpu] x86: Make " tip-bot for Dave Hansen
2015-06-07 18:37 ` [PATCH 11/19] x86, mpx: trace allocation of new bounds tables Dave Hansen
2015-06-09 12:33 ` [tip:x86/fpu] x86/mpx: Trace " tip-bot for Dave Hansen
2015-06-07 18:37 ` [PATCH 14/19] x86, mpx: new directory entry to addr helper Dave Hansen
2015-06-09 12:34 ` [tip:x86/fpu] x86/mpx: Introduce new 'directory entry' to 'addr' helper function tip-bot for Dave Hansen
2015-06-07 18:37 ` [PATCH 16/19] x86, mpx: support 32-bit binaries on 64-bit kernel Dave Hansen
2015-06-09 12:35 ` [tip:x86/fpu] x86/mpx: Support 32-bit binaries on 64-bit kernels tip-bot for Dave Hansen
2015-06-07 18:37 ` [PATCH 15/19] x86, mpx: do 32-bit-only cmpxchg for 32-bit apps Dave Hansen
2015-06-09 12:35 ` tip-bot for Dave Hansen [this message]
2015-06-07 18:37 ` [PATCH 17/19] x86, mpx: rewrite unmap code Dave Hansen
2015-06-09 12:35 ` [tip:x86/fpu] x86/mpx: Rewrite the " tip-bot for Dave Hansen
2015-06-07 18:37 ` [PATCH 19/19] x86, mpx: allow mixed binaries again Dave Hansen
2015-06-09 12:36 ` [tip:x86/fpu] x86/mpx: Allow 32-bit binaries on 64-bit kernels again tip-bot for Dave Hansen
2015-06-07 18:37 ` [PATCH 18/19] x86, mpx: do not count MPX VMAs as neighbors when unmapping Dave Hansen
2015-06-09 10:23 ` Ingo Molnar
2015-06-09 12:35 ` [tip:x86/fpu] x86/mpx: Do " tip-bot for Dave Hansen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=tip-6ac52bb4913eadfa327138b91aab5d37234a2c3b@git.kernel.org \
--to=tipbot@zytor.com \
--cc=akpm@linux-foundation.org \
--cc=dave.hansen@linux.intel.com \
--cc=dave@sr71.net \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox