[PATCH] [RFC] Emulate "lwsync" to run standard user land on e500 cores
James Yang
James.Yang at freescale.com
Sat Oct 26 02:13:09 EST 2013
On Fri, 25 Oct 2013, David Laight wrote:
> > This is not a distro issue. It's a libstdc++ portability issue. libstdc++
> > hardcodes lwsync unless __NO_LWSYNC__ is explicitly defined,
> > which you only get with -mcpu=8540/-mcpu=8548. When compiled
> > for any powerpc target other than -mcpu=8540/-mcpu=8548, including
> > the default -mcpu=common, libstdc++ will end up containing lwsync.
> > There is no way to explicitly request libstdc++ to be built without lwsync
> > with an -mcpu target other than 8540/8548.
> >
> > The issue is easily demonstrated by running a program that throws a
> > C++ exception: __cxa_throw() is called, which has an lwsync. This
> > results in an illegal instruction exception when run on an e500v1/e500v2.
>
> Perhaps libstc++ should be working out at run time whether lwsync is
> valid?
lwsync has been in libstdc++ for over 8 years so there's a substantial
amount of legacy binary code that exists such that changing libstdc++
now won't solve the problem.
This isn't a performance issue, it's a functional issue -- libstdc++
for -mcpu=common targets doesn't work on e500v1/e500v2. (QorIQ P4080
that have e500mc and newer cores support lwsync so this is no longer
an issue.)
If one /really/ cared about losing performance while running common
target binaries, emulating lwsync is an inconsequential performance
loss compared to the kernel doing floating point emulation.
Recompiling libstdc++ (and all your other userland) with -mcpu=8548 is
what you'd have to do to avoid classic FP and use Embedded FP or SPE,
and if you are doing that you'll get sync instead of lwsync in
libstdc++.
More information about the Linuxppc-dev
mailing list