103ff217eSDavid du Colombier #include "u.h"
203ff217eSDavid du Colombier #include "libc.h"
303ff217eSDavid du Colombier
403ff217eSDavid du Colombier int
tas(long * x)503ff217eSDavid du Colombier tas(long *x)
603ff217eSDavid du Colombier {
7*58da3067SDavid du Colombier int v, t, i = 1;
803ff217eSDavid du Colombier
9*58da3067SDavid du Colombier #if ARMv5
1003ff217eSDavid du Colombier __asm__(
1103ff217eSDavid du Colombier "swp %0, %1, [%2]"
1203ff217eSDavid du Colombier : "=&r" (v)
1303ff217eSDavid du Colombier : "r" (1), "r" (x)
1403ff217eSDavid du Colombier : "memory"
1503ff217eSDavid du Colombier );
16*58da3067SDavid du Colombier #else
17*58da3067SDavid du Colombier __asm__ (
18*58da3067SDavid du Colombier "1: ldrex %0, [%2]\n"
19*58da3067SDavid du Colombier " strex %1, %3, [%2]\n"
20*58da3067SDavid du Colombier " teq %1, #0\n"
21*58da3067SDavid du Colombier " bne 1b"
22*58da3067SDavid du Colombier : "=&r" (v), "=&r" (t)
23*58da3067SDavid du Colombier : "r" (x), "r" (i)
24*58da3067SDavid du Colombier : "cc");
25*58da3067SDavid du Colombier #endif
2603ff217eSDavid du Colombier switch(v) {
2703ff217eSDavid du Colombier case 0:
2803ff217eSDavid du Colombier case 1:
2903ff217eSDavid du Colombier return v;
3003ff217eSDavid du Colombier default:
3103ff217eSDavid du Colombier print("canlock: corrupted 0x%lux\n", v);
3203ff217eSDavid du Colombier return 1;
3303ff217eSDavid du Colombier }
3403ff217eSDavid du Colombier }
35*58da3067SDavid du Colombier
36