Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1686858
| Path | csiph.com!aioe.org!bofh.it!news.nic.it!robomod |
|---|---|
| From | Josh Poimboeuf <jpoimboe@redhat.com> |
| Newsgroups | linux.kernel |
| Subject | Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" |
| Date | Thu, 13 Jul 2017 21:30:01 +0200 |
| Message-ID | <u2RYd-1gM-9@gated-at.bofh.it> (permalink) |
| References | <u2xmP-53z-29@gated-at.bofh.it> <u2y9c-5zv-11@gated-at.bofh.it> <u2yiS-5DX-9@gated-at.bofh.it> <u2ysy-5Ke-9@gated-at.bofh.it> <u2ysz-5Ke-29@gated-at.bofh.it> <u2zeW-6fP-17@gated-at.bofh.it> <u2QIO-ye-11@gated-at.bofh.it> <u2Rlv-Ow-1@gated-at.bofh.it> |
| Dmarc-Filter | OpenDMARC Filter v1.3.2 mx1.redhat.com 27D3351141 |
| Authentication-Results | ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com |
| Authentication-Results | ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=jpoimboe@redhat.com |
| Dkim-Filter | OpenDKIM Filter v2.11.0 mx1.redhat.com 27D3351141 |
| MIME-Version | 1.0 |
| Content-Type | text/plain; charset=utf-8 |
| Content-Disposition | inline |
| User-Agent | Mutt/1.6.0.1 (2016-04-01) |
| X-Scanned-By | MIMEDefang 2.79 on 10.5.11.13 |
| X-Greylist | Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 13 Jul 2017 19:25:57 +0000 (UTC) |
| Sender | robomod@news.nic.it |
| List-ID | <linux-kernel.vger.kernel.org> |
| X-Mailing-List | linux-kernel@vger.kernel.org |
| Approved | robomod@news.nic.it |
| Lines | 42 |
| Organization | linux.* mail to news gateway |
| X-Original-Cc | Chris J Arges <chris.j.arges@canonical.com>, Borislav Petkov <bp@suse.de>, Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@redhat.com>, "H . Peter Anvin" <hpa@zytor.com>, x86@kernel.org, linux-kernel@vger.kernel.org, Douglas Anderson <dianders@chromium.org>, Michael Davidson <md@google.com>, Greg Hackmann <ghackmann@google.com>, Nick Desaulniers <ndesaulniers@google.com>, Stephen Hines <srhines@google.com>, Kees Cook <keescook@chromium.org>, Arnd Bergmann <arnd@arndb.de>, Bernhard.Rosenkranzer@linaro.org |
| X-Original-Date | Thu, 13 Jul 2017 14:25:54 -0500 |
| X-Original-Message-ID | <20170713192554.f4xznyxjkdtrmh3f@treble> |
| X-Original-References | <20170712212744.23660-1-mka@chromium.org> <20170712221242.puv5illztsla4nph@treble> <20170712222040.GD95735@google.com> <20170712223547.fyra43dizqooosbs@treble> <20170712223630.gb237t4vhrqeu5zd@treble> <20170712232213.GE95735@google.com> <20170713180001.mvwzdmudht56hdk5@treble> <20170713184748.GF95735@google.com> |
| X-Original-Sender | linux-kernel-owner@vger.kernel.org |
| Xref | csiph.com linux.kernel:1686858 |
Show key headers only | View raw
On Thu, Jul 13, 2017 at 11:47:48AM -0700, Matthias Kaehlcke wrote:
> > What happens if you try the below patch instead of the revert? Any
> > chance the offending instruction goes away?
> >
> > diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h
> > index 11433f9..beac907 100644
> > --- a/arch/x86/include/asm/uaccess.h
> > +++ b/arch/x86/include/asm/uaccess.h
> > @@ -171,7 +171,7 @@ __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL))
> > might_fault(); \
> > asm volatile("call __get_user_%P4" \
> > : "=a" (__ret_gu), "=r" (__val_gu), "+r" (__sp) \
> > - : "0" (ptr), "i" (sizeof(*(ptr)))); \
> > + : "0" (ptr), "i" (sizeof(*(ptr))), "r" (__sp)); \
> > (x) = (__force __typeof__(*(ptr))) __val_gu; \
> > __builtin_expect(__ret_gu, 0); \
> > })
>
> The generated code is basically the same, only that now the value from
> the stack is stored in a register and written twice to RSP:
>
> ffffffff813676ba: 31 c0 xor %eax,%eax
> ffffffff813676bc: 48 89 45 c8 mov %rax,-0x38(%rbp)
> ffffffff813676c0: 45 31 ff xor %r15d,%r15d
> ffffffff813676c3: 48 89 45 a8 mov %rax,-0x58(%rbp)
> ...
> ffffffff81367918: 48 8b 4d a8 mov -0x58(%rbp),%rcx
> ffffffff8136791c: 48 89 cc mov %rcx,%rsp
> ffffffff8136791f: 48 89 cc mov %rcx,%rsp
> ffffffff81367922: e8 69 26 f1 ff callq ffffffff81279f90 <__get_user_4>
LOL. Why corrupt the stack pointer with a single instruction (reading a
zero from memory, no less) when you can instead do it with three
instructions, including two duplicates?
Anyway this seems like a clang bug to me. If I specify RSP as an input
register then the compiler shouldn't overwrite it first. For that
matter it has no reason to overwrite it if it's an output register
either.
--
Josh
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" Matthias Kaehlcke <mka@chromium.org> - 2017-07-12 23:30 +0200
Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" Josh Poimboeuf <jpoimboe@redhat.com> - 2017-07-13 00:20 +0200
Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" Matthias Kaehlcke <mka@chromium.org> - 2017-07-13 00:30 +0200
Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" Josh Poimboeuf <jpoimboe@redhat.com> - 2017-07-13 00:40 +0200
Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" Josh Poimboeuf <jpoimboe@redhat.com> - 2017-07-13 00:40 +0200
Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" Josh Poimboeuf <jpoimboe@redhat.com> - 2017-07-13 20:10 +0200
Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" Matthias Kaehlcke <mka@chromium.org> - 2017-07-13 20:50 +0200
Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" Josh Poimboeuf <jpoimboe@redhat.com> - 2017-07-13 21:30 +0200
Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" Michael Davidson <md@google.com> - 2017-07-13 21:40 +0200
Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" Josh Poimboeuf <jpoimboe@redhat.com> - 2017-07-13 22:20 +0200
Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" Andrey Rybainin <ryabinin.a.a@gmail.com> - 2017-07-13 22:30 +0200
Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" Josh Poimboeuf <jpoimboe@redhat.com> - 2017-07-13 22:40 +0200
Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" Matthias Kaehlcke <mka@chromium.org> - 2017-07-13 23:20 +0200
Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" Josh Poimboeuf <jpoimboe@redhat.com> - 2017-07-13 23:40 +0200
Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" Matthias Kaehlcke <mka@chromium.org> - 2017-07-14 00:00 +0200
Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" Matthias Kaehlcke <mka@chromium.org> - 2017-07-13 23:20 +0200
Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" Andrey Rybainin <ryabinin.a.a@gmail.com> - 2017-07-13 23:30 +0200
Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" Matthias Kaehlcke <mka@chromium.org> - 2017-07-13 23:50 +0200
Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" Josh Poimboeuf <jpoimboe@redhat.com> - 2017-07-14 00:00 +0200
csiph-web