Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1686934
| From | Andrey Rybainin <ryabinin.a.a@gmail.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in get_user() inline asm" |
| Date | 2017-07-13 23:30 +0200 |
| Message-ID | <u2TQl-2st-5@gated-at.bofh.it> (permalink) |
| References | (5 earlier) <u2zeW-6fP-17@gated-at.bofh.it> <u2QIO-ye-11@gated-at.bofh.it> <u2Rlv-Ow-1@gated-at.bofh.it> <u2SUi-1Tu-21@gated-at.bofh.it> <u2TGG-2pl-15@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
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);" ?
FWIW patch works (builds) for me with gcc.
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