> -----Original Message-----
> From: Segher Boessenkool <[email protected]>
> Sent: 10 September 2020 16:21
> To: David Laight <[email protected]>
> Cc: 'Christophe Leroy' <[email protected]>; 'Linus Torvalds' 
> <torvalds@linux-
> foundation.org>; linux-arch <[email protected]>; Kees Cook 
> <[email protected]>; the
> arch/x86 maintainers <[email protected]>; Nick Desaulniers 
> <[email protected]>; Linux Kernel
> Mailing List <[email protected]>; Alexey Dobriyan 
> <[email protected]>; Luis Chamberlain
> <[email protected]>; Al Viro <[email protected]>; linux-fsdevel 
> <[email protected]>;
> linuxppc-dev <[email protected]>; Christoph Hellwig <[email protected]>
> 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)

Reply via email to