Messages in this thread | | | Date | Tue, 10 Aug 2010 09:05:55 +0200 | From | Ingo Molnar <> | Subject | Re: [PATCH] x86: remove __phys_reloc_hide |
| |
* H. Peter Anvin <hpa@zytor.com> wrote:
> On 08/09/2010 12:22 AM, Andi Kleen wrote: > > On Mon, Aug 09, 2010 at 04:04:45PM +0900, Namhyung Kim wrote: > >>> It hides the value conversion from the compiler through asm() > >>> > >>> -Andi > >>> > >> > >> Yes, indeed. But for what? __pa_symbol() is just used to get the address > >> of some linker symbols in forms of unsigned long which has same bit > >> representation as pointer in x86 (and all supported archs). So do we > >> still need it or am I missing something? > > > > The original reason was that the C standard allows the compiler > > to make some assumptions on the pointer arithmetic that is done > > on symbol addresses (e.g. no wrapping). This is exploited > > by the optimizer in the compiler to generate better code. > > > > This lead to a miscompilation on PowerPC a couple of years back at > > least with the va->pa conversion. > > > > After that RELOC_HIDE was introduced after funelling the > > symbol address through an empty asm statement was recommended > > as the official way to do this by the gcc developers. > > > > I think x86-64 does not normally wrap here, but it's > > still safer to do it this way. > > > > We pass -fno-strict-overflow to the kernel now, which takes care of the > underlying problem, at least for current versions of gcc. Unfortunately > we still have people who want to use very old gcc versions to compile > the kernel, so it's probably better to leave it in at least until we > formally kill off support for gcc 3.
Namhyung, mind sending a patch that adds a comment to __pa_symbol() to point out the connection to -fno-strict-overflow and that it can be removed once all supported versions of GCC understand -fno-strict-overflow?
That would make for one less piece of legacy voodoo code in the kernel ;-)
Thanks,
Ingo
| |