On Tue, 13 Nov 2012, Jon Masters wrote:
On 11/11/2012 03:56 AM, Jon Masters wrote:
> This is an ugly kludge with some hand crafted assembly, but it builds
> locally, and I think the scratch build should succeed this time. Note, I
> was confused by the fact that there are at least *two* different sets of
> atomics implemented in OMPI (it's a mess). With this, both are now
> fixed, regardless of which compiler is being used.
I've updated the patch, following useful feedback from Nicolas Pitre.
There is at least one bug in the current code (r3 clobbering, bad use of
r12 because I knew it wasn't touched and didn't want to save it, which
was just plain lazy and shouldn't have been done). I've tested these
fixes in a little test harness and have a scratch going now:
I can see a few more issues in this patch:
The ARMv5 version of opal_atomic_add_32 doesn't return the new value as
the ARMv6 version does. If that is necessary, you'll need a "mov r0,
r1" before the pop. Same issue for opal_atomic_sub_32.
In the ARMv6 file, you use ldrexd/strexd instructions which are only
available with the k extension of the ARMv6 architecture. That means
non-SMP ARMv6 variants won't support those instructions. You probably
should consider using the __kuser_cmpxchg64 kernel helper instead in
that case.
And of course, the availability of __kuser_cmpxchg64 means that you
could add 64 bit support to the ARMv5 version as well if you feel like
it.
Nicolas