From: Matthias Kaehlcke <mka@chromium.org>
To: Andrey Rybainin <ryabinin.a.a@gmail.com>
Cc: "Josh Poimboeuf" <jpoimboe@redhat.com>,
"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 Mailing List" <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 Rosenkränzer" <Bernhard.Rosenkranzer@linaro.org>
Subject: Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm"
Date: Thu, 13 Jul 2017 14:43:26 -0700 [thread overview]
Message-ID: <20170713214326.GI95735@google.com> (raw)
In-Reply-To: <b2875614-7562-4dd6-29ee-99c0e4184837@gmail.com>
El Fri, Jul 14, 2017 at 12:25:42AM +0300 Andrey Rybainin ha dit:
>
>
> On 07/14/2017 12:14 AM, Matthias Kaehlcke wrote:
> > El Thu, Jul 13, 2017 at 11:20:04PM +0300 Andrey Rybainin ha dit:
> >
> >> On 07/13/2017 09:47 PM, Matthias Kaehlcke wrote:
> >>
> >>> Thanks for your analysis!
> >>>
> >>>> 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:
> >>>
> >>
> >> AFAIR clang works much better with global named registers.
> >> Could you check if the patch bellow helps?
> >>
> >>
> >> ---
> >> arch/x86/include/asm/uaccess.h | 7 +++++--
> >> 1 file changed, 5 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h
> >> index a059aac9e937..121204387978 100644
> >> --- a/arch/x86/include/asm/uaccess.h
> >> +++ b/arch/x86/include/asm/uaccess.h
> >> @@ -157,15 +157,18 @@ __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL))
> >> * Clang/LLVM cares about the size of the register, but still wants
> >> * the base register for something that ends up being a pair.
> >> */
> >> +
> >> +register unsigned long __current_sp asm(_ASM_SP);
> >> +
> >> #define get_user(x, ptr) \
> >> ({ \
> >> int __ret_gu; \
> >> register __inttype(*(ptr)) __val_gu asm("%"_ASM_DX); \
> >> - register void *__sp asm(_ASM_SP); \
> >> __chk_user_ptr(ptr); \
> >> might_fault(); \
> >> asm volatile("call __get_user_%P4" \
> >> - : "=a" (__ret_gu), "=r" (__val_gu), "+r" (__sp) \
> >> + : "=a" (__ret_gu), "=r" (__val_gu), \
> >> + "+r" (__current_sp) \
> >> : "0" (ptr), "i" (sizeof(*(ptr)))); \
> >> (x) = (__force __typeof__(*(ptr))) __val_gu; \
> >> __builtin_expect(__ret_gu, 0); \
> >
> > Thanks for the suggestion, however it fails to build with both gcc and clang:
> >
> > fs/ioctl.c:585:6: error: use of undeclared identifier '__current_sp'
> > if (get_user(count, &argp->dest_count)) {
> > ^
> > arch/x86/include/asm/uaccess.h:168:16: note: expanded from macro 'get_user'
> > "+r" (__current_sp)
> > \
> >
> > The references I found refer to __current_sp as an intrinsic function
> > for ARM32.
>
> What? __current_sp declared right above get_user() as "register unsigned long __current_sp asm(_ASM_SP);"
> Did you actually applied my patch or you just modified the code yourself but have missed
> "register unsigned long __current_sp asm(_ASM_SP);" ?
Indeed, since the patch is only a few lines and I had the function
already open in the editor it seemed easier to change the affected
lines than to apply the patch and I missed the definition <:‑|
After adding the missing line the code builds with clang and the stack
pointer is not corrupted.
next prev parent reply other threads:[~2017-07-13 21:43 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-12 21:27 [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" Matthias Kaehlcke
2017-07-12 22:12 ` Josh Poimboeuf
2017-07-12 22:20 ` Matthias Kaehlcke
2017-07-12 22:35 ` Josh Poimboeuf
2017-07-12 22:36 ` Josh Poimboeuf
2017-07-12 23:22 ` Matthias Kaehlcke
2017-07-13 18:00 ` Josh Poimboeuf
2017-07-13 18:47 ` Matthias Kaehlcke
2017-07-13 19:25 ` Josh Poimboeuf
2017-07-13 19:38 ` Michael Davidson
2017-07-13 20:18 ` Josh Poimboeuf
2017-07-13 20:20 ` Andrey Rybainin
2017-07-13 20:34 ` Josh Poimboeuf
2017-07-13 21:12 ` Matthias Kaehlcke
2017-07-13 21:34 ` Josh Poimboeuf
2017-07-13 21:57 ` Matthias Kaehlcke
2017-07-19 17:46 ` Josh Poimboeuf
2017-07-19 21:50 ` Matthias Kaehlcke
2017-07-20 10:01 ` Andrey Ryabinin
2017-07-20 15:18 ` Josh Poimboeuf
2017-07-20 15:30 ` Andrey Ryabinin
2017-07-20 20:56 ` Josh Poimboeuf
2017-07-21 9:13 ` Andrey Ryabinin
2017-07-21 13:24 ` Josh Poimboeuf
2017-07-29 0:38 ` Matthias Kaehlcke
2017-07-29 0:55 ` Josh Poimboeuf
2017-07-29 0:58 ` Josh Poimboeuf
2017-07-29 1:06 ` Matthias Kaehlcke
2017-07-13 21:14 ` Matthias Kaehlcke
2017-07-13 21:25 ` Andrey Rybainin
2017-07-13 21:43 ` Matthias Kaehlcke [this message]
2017-07-13 21:52 ` Josh Poimboeuf
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=20170713214326.GI95735@google.com \
--to=mka@chromium.org \
--cc=Bernhard.Rosenkranzer@linaro.org \
--cc=arnd@arndb.de \
--cc=bp@suse.de \
--cc=chris.j.arges@canonical.com \
--cc=dianders@chromium.org \
--cc=ghackmann@google.com \
--cc=hpa@zytor.com \
--cc=jpoimboe@redhat.com \
--cc=keescook@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=md@google.com \
--cc=mingo@redhat.com \
--cc=ndesaulniers@google.com \
--cc=ryabinin.a.a@gmail.com \
--cc=srhines@google.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.