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

David Laight David.Laight at ACULAB.COM
Fri Sep 11 01:31:53 AEST 2020



> -----Original Message-----
> From: Segher Boessenkool <segher at kernel.crashing.org>
> Sent: 10 September 2020 16:21
> To: David Laight <David.Laight at ACULAB.COM>
> Cc: 'Christophe Leroy' <christophe.leroy at csgroup.eu>; 'Linus Torvalds' <torvalds at linux-
> foundation.org>; linux-arch <linux-arch at vger.kernel.org>; Kees Cook <keescook at chromium.org>; the
> arch/x86 maintainers <x86 at kernel.org>; Nick Desaulniers <ndesaulniers at google.com>; Linux Kernel
> Mailing List <linux-kernel at vger.kernel.org>; Alexey Dobriyan <adobriyan at gmail.com>; Luis Chamberlain
> <mcgrof at kernel.org>; Al Viro <viro at zeniv.linux.org.uk>; linux-fsdevel <linux-fsdevel at vger.kernel.org>;
> linuxppc-dev <linuxppc-dev at lists.ozlabs.org>; Christoph Hellwig <hch at lst.de>
> 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)



More information about the Linuxppc-dev mailing list