RE: remove the last set_fs() in common code, and remove it for x86 and powerpc v3

From: David Laight
Date: Thu Sep 10 2020 - 11:34:36 EST




> -----Original Message-----
> From: Segher Boessenkool <segher@xxxxxxxxxxxxxxxxxxx>
> Sent: 10 September 2020 16:21
> To: David Laight <David.Laight@xxxxxxxxxx>
> Cc: 'Christophe Leroy' <christophe.leroy@xxxxxxxxxx>; 'Linus Torvalds' <torvalds@linux-
> foundation.org>; linux-arch <linux-arch@xxxxxxxxxxxxxxx>; Kees Cook <keescook@xxxxxxxxxxxx>; the
> arch/x86 maintainers <x86@xxxxxxxxxx>; Nick Desaulniers <ndesaulniers@xxxxxxxxxx>; Linux Kernel
> Mailing List <linux-kernel@xxxxxxxxxxxxxxx>; Alexey Dobriyan <adobriyan@xxxxxxxxx>; Luis Chamberlain
> <mcgrof@xxxxxxxxxx>; Al Viro <viro@xxxxxxxxxxxxxxxxxx>; linux-fsdevel <linux-fsdevel@xxxxxxxxxxxxxxx>;
> linuxppc-dev <linuxppc-dev@xxxxxxxxxxxxxxxx>; Christoph Hellwig <hch@xxxxxx>
> Subject: Re: remove the last set_fs() in common code, and remove it for x86 and powerpc v3
>
> On Thu, Sep 10, 2020 at 12:26:53PM +0000, David Laight wrote:
> > Actually this is pretty sound:
> > __label__ label;
> > register int eax asm ("eax");
> > // Ensure eax can't be reloaded from anywhere
> > // In particular it can't be reloaded after the asm goto line
> > asm volatile ("" : "=r" (eax));
>
> This asm is fine. It says it writes the "eax" variable, which lives in
> the eax register *in that asm* (so *not* guaranteed after it!).
>
> > // Provided gcc doesn't save eax here...
> > asm volatile goto ("xxxxx" ::: "eax" : label);
>
> So this is incorrect.

>From the other email:

> It is neither input nor output operand here! Only *then* is a local
> register asm guaranteed to be in the given reg: as input or output to an
> inline asm.

Ok, so adding '"r" (eax)' to the input section helps a bit.

> > // ... and reload the saved value here.
> > // The input value here will be that modified by the 'asm goto'.
> > // Since this modifies eax it can't be moved before the 'asm goto'.
> > asm volatile ("" : "+r" (eax));
> > // So here eax must contain the value set by the "xxxxx" instructions.
>
> No, the register eax will contain the value of the eax variable. In the
> asm; it might well be there before or after the asm as well, but none of
> that is guaranteed.

Perhaps not 'guaranteed', but very unlikely to be wrong.
It doesn't give gcc much scope for not generating the desired code.

David

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)