lkml.org 
[lkml]   [2020]   [Sep]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
SubjectRE: [PATCH v2] x86/uaccess: Use pointer masking to limit uaccess speculation
Date
From: Josh Poimboeuf <jpoimboe@redhat.com>
> Sent: 08 September 2020 18:43
> Hi x86 maintainers,
...
> > --- a/arch/x86/lib/putuser.S
> > +++ b/arch/x86/lib/putuser.S
> > @@ -38,6 +38,8 @@ SYM_FUNC_START(__put_user_1)
> > ENTER
> > cmp TASK_addr_limit(%_ASM_BX),%_ASM_CX
> > jae .Lbad_put_user
> > + sbb %_ASM_BX, %_ASM_BX /* uaccess_mask_ptr() */
> > + and %_ASM_BX, %_ASM_CX
> > ASM_STAC
> > 1: movb %al,(%_ASM_CX)
> > xor %eax,%eax

For 64bit the sbb+and pattern can be replaced by an instruction
that clears the high bit (eg btr $63, %rcx).
This isn't dependant on the earlier instructions so can execute
in parallel with them.

I still think that doing the same comparisons in access_ok()
and for the pointer masking is silly - and they should get merged.

While it may be possible to fake 'asm volatile goto with outputs'
by using a local asm register variable and alternative pattern
might be to have access_ok() return 0 (fail) or ~0 (ok).
Then the usage can be (with a load of casts):
p1 = p & access_ok(p);
if (!p1 && p)
return -EFAULT;
foo(*p1);
With any luck the compiler will use the result of the & for the
!p1 test.

David



-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)
\
 
 \ /
  Last update: 2020-09-09 10:20    [W:0.075 / U:3.124 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site