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~

Reply via email to