Messages in this thread Patch in this message | | | From | David Laight <> | Subject | RE: [PATCH v2] x86/uaccess: Use pointer masking to limit uaccess speculation | Date | Wed, 9 Sep 2020 08:20:07 +0000 |
| |
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)
| |