On 11/22/2014 01:25 AM, John David Anglin wrote: > #define ABORT_INSTRUCTION asm ("iitlbp %r0,(%sr0, %r0)") ... > +static inline long > +__kernel_cmpxchg2 (void * oldval, void * newval, void *mem, int val_size) > +{ > + register unsigned long lws_mem asm("r26") = (unsigned long) (mem); > + register long lws_ret asm("r28"); > + register long lws_errno asm("r21"); > + register unsigned long lws_old asm("r25") = (unsigned long) oldval; > + register unsigned long lws_new asm("r24") = (unsigned long) newval; > + register int lws_size asm("r23") = val_size; > + asm volatile ( "ble 0xb0(%%sr2, %%r0) \n\t" > + "ldi %2, %%r20 \n\t" > + : "=r" (lws_ret), "=r" (lws_errno) > + : "i" (2), "r" (lws_mem), "r" (lws_old), "r" (lws_new), "r" (lws_size) > + : "r1", "r20", "r22", "r29", "r31", "fr4", "memory" > + ); > + if (__builtin_expect (lws_errno == -EFAULT || lws_errno == -ENOSYS, 0)) > + ABORT_INSTRUCTION;
Probably better to use __builtin_trap, now that you've added it. At least then the compiler knows there's no fallthrough from the ABORT_INSTRUCTION path. Any chance someone wants to add this support to libatomic? Currently pa is using the posix path, using locks. r~