spinlock_64.h revision 64f2dde3f743c8a1ad8c0a1aa74166c1034afd92
1f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg/* spinlock.h: 64-bit Sparc spinlock support. 2f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg * 3f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) 4f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg */ 5f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 6f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#ifndef __SPARC64_SPINLOCK_H 7f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __SPARC64_SPINLOCK_H 8f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 9f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#ifndef __ASSEMBLY__ 10f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 11f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg/* To get debugging spinlocks which detect and catch 12f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg * deadlock situations, set CONFIG_DEBUG_SPINLOCK 13f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg * and rebuild your kernel. 14f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg */ 15f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 1664f2dde3f743c8a1ad8c0a1aa74166c1034afd92David S. Miller/* Because we play games to save cycles in the non-contention case, we 1764f2dde3f743c8a1ad8c0a1aa74166c1034afd92David S. Miller * need to be extra careful about branch targets into the "spinning" 1864f2dde3f743c8a1ad8c0a1aa74166c1034afd92David S. Miller * code. They live in their own section, but the newer V9 branches 1964f2dde3f743c8a1ad8c0a1aa74166c1034afd92David S. Miller * have a shorter range than the traditional 32-bit sparc branch 2064f2dde3f743c8a1ad8c0a1aa74166c1034afd92David S. Miller * variants. The rule is that the branches that go into and out of 2164f2dde3f743c8a1ad8c0a1aa74166c1034afd92David S. Miller * the spinner sections must be pre-V9 branches. 22f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg */ 23f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 24f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __raw_spin_is_locked(lp) ((lp)->lock != 0) 25f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 26f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __raw_spin_unlock_wait(lp) \ 27f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg do { rmb(); \ 28f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg } while((lp)->lock) 29f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 30f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborgstatic inline void __raw_spin_lock(raw_spinlock_t *lock) 31f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{ 32f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg unsigned long tmp; 33f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 34f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg __asm__ __volatile__( 35f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1: ldstub [%1], %0\n" 36f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" membar #StoreLoad | #StoreStore\n" 37f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" brnz,pn %0, 2f\n" 38f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" nop\n" 39f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" .subsection 2\n" 40f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2: ldub [%1], %0\n" 41f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" membar #LoadLoad\n" 42f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" brnz,pt %0, 2b\n" 43f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" nop\n" 44f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" ba,a,pt %%xcc, 1b\n" 45f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" .previous" 46f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "=&r" (tmp) 47f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "r" (lock) 48f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "memory"); 49f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg} 50f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 51f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborgstatic inline int __raw_spin_trylock(raw_spinlock_t *lock) 52f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{ 53f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg unsigned long result; 54f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 55f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg __asm__ __volatile__( 56f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" ldstub [%1], %0\n" 57f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" membar #StoreLoad | #StoreStore" 58f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "=r" (result) 59f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "r" (lock) 60f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "memory"); 61f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 62f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg return (result == 0UL); 63f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg} 64f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 65f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborgstatic inline void __raw_spin_unlock(raw_spinlock_t *lock) 66f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{ 67f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg __asm__ __volatile__( 68f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" membar #StoreStore | #LoadStore\n" 69f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" stb %%g0, [%0]" 70f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : /* No outputs */ 71f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "r" (lock) 72f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "memory"); 73f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg} 74f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 75f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborgstatic inline void __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long flags) 76f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{ 77f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg unsigned long tmp1, tmp2; 78f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 79f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg __asm__ __volatile__( 80f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1: ldstub [%2], %0\n" 81f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" membar #StoreLoad | #StoreStore\n" 82f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" brnz,pn %0, 2f\n" 83f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" nop\n" 84f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" .subsection 2\n" 85f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2: rdpr %%pil, %1\n" 86f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" wrpr %3, %%pil\n" 87f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"3: ldub [%2], %0\n" 88f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" membar #LoadLoad\n" 89f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" brnz,pt %0, 3b\n" 90f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" nop\n" 91f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" ba,pt %%xcc, 1b\n" 92f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" wrpr %1, %%pil\n" 93f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" .previous" 94f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "=&r" (tmp1), "=&r" (tmp2) 95f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "r"(lock), "r"(flags) 96f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "memory"); 97f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg} 98f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 99f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg/* Multi-reader locks, these are much saner than the 32-bit Sparc ones... */ 100f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 101f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborgstatic void inline __read_lock(raw_rwlock_t *lock) 102f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{ 103f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg unsigned long tmp1, tmp2; 104f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 105f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg __asm__ __volatile__ ( 106f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1: ldsw [%2], %0\n" 107f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" brlz,pn %0, 2f\n" 108f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"4: add %0, 1, %1\n" 109f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" cas [%2], %0, %1\n" 110f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" cmp %0, %1\n" 111f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" membar #StoreLoad | #StoreStore\n" 112f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" bne,pn %%icc, 1b\n" 113f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" nop\n" 114f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" .subsection 2\n" 115f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2: ldsw [%2], %0\n" 116f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" membar #LoadLoad\n" 117f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" brlz,pt %0, 2b\n" 118f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" nop\n" 119f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" ba,a,pt %%xcc, 4b\n" 120f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" .previous" 121f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "=&r" (tmp1), "=&r" (tmp2) 122f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "r" (lock) 123f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "memory"); 124f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg} 125f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 126f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborgstatic int inline __read_trylock(raw_rwlock_t *lock) 127f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{ 128f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg int tmp1, tmp2; 129f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 130f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg __asm__ __volatile__ ( 131f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1: ldsw [%2], %0\n" 132f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" brlz,a,pn %0, 2f\n" 133f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" mov 0, %0\n" 134f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" add %0, 1, %1\n" 135f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" cas [%2], %0, %1\n" 136f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" cmp %0, %1\n" 137f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" membar #StoreLoad | #StoreStore\n" 138f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" bne,pn %%icc, 1b\n" 139f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" mov 1, %0\n" 140f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2:" 141f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "=&r" (tmp1), "=&r" (tmp2) 142f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "r" (lock) 143f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "memory"); 144f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 145f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg return tmp1; 146f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg} 147f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 148f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborgstatic void inline __read_unlock(raw_rwlock_t *lock) 149f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{ 150f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg unsigned long tmp1, tmp2; 151f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 152f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg __asm__ __volatile__( 153f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" membar #StoreLoad | #LoadLoad\n" 154f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1: lduw [%2], %0\n" 155f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" sub %0, 1, %1\n" 156f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" cas [%2], %0, %1\n" 157f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" cmp %0, %1\n" 158f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" bne,pn %%xcc, 1b\n" 159f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" nop" 160f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "=&r" (tmp1), "=&r" (tmp2) 161f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "r" (lock) 162f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "memory"); 163f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg} 164f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 165f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborgstatic void inline __write_lock(raw_rwlock_t *lock) 166f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{ 167f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg unsigned long mask, tmp1, tmp2; 168f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 169f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg mask = 0x80000000UL; 170f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 171f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg __asm__ __volatile__( 172f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1: lduw [%2], %0\n" 173f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" brnz,pn %0, 2f\n" 174f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"4: or %0, %3, %1\n" 175f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" cas [%2], %0, %1\n" 176f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" cmp %0, %1\n" 177f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" membar #StoreLoad | #StoreStore\n" 178f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" bne,pn %%icc, 1b\n" 179f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" nop\n" 180f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" .subsection 2\n" 181f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2: lduw [%2], %0\n" 182f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" membar #LoadLoad\n" 183f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" brnz,pt %0, 2b\n" 184f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" nop\n" 185f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" ba,a,pt %%xcc, 4b\n" 186f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" .previous" 187f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "=&r" (tmp1), "=&r" (tmp2) 188f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "r" (lock), "r" (mask) 189f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "memory"); 190f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg} 191f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 192f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborgstatic void inline __write_unlock(raw_rwlock_t *lock) 193f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{ 194f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg __asm__ __volatile__( 195f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" membar #LoadStore | #StoreStore\n" 196f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" stw %%g0, [%0]" 197f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : /* no outputs */ 198f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "r" (lock) 199f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "memory"); 200f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg} 201f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 202f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborgstatic int inline __write_trylock(raw_rwlock_t *lock) 203f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{ 204f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg unsigned long mask, tmp1, tmp2, result; 205f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 206f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg mask = 0x80000000UL; 207f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 208f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg __asm__ __volatile__( 209f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" mov 0, %2\n" 210f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1: lduw [%3], %0\n" 211f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" brnz,pn %0, 2f\n" 212f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" or %0, %4, %1\n" 213f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" cas [%3], %0, %1\n" 214f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" cmp %0, %1\n" 215f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" membar #StoreLoad | #StoreStore\n" 216f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" bne,pn %%icc, 1b\n" 217f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" nop\n" 218f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" mov 1, %2\n" 219f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2:" 220f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "=&r" (tmp1), "=&r" (tmp2), "=&r" (result) 221f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "r" (lock), "r" (mask) 222f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "memory"); 223f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 224f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg return result; 225f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg} 226f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 227f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __raw_read_lock(p) __read_lock(p) 228f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __raw_read_trylock(p) __read_trylock(p) 229f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __raw_read_unlock(p) __read_unlock(p) 230f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __raw_write_lock(p) __write_lock(p) 231f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __raw_write_unlock(p) __write_unlock(p) 232f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __raw_write_trylock(p) __write_trylock(p) 233f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 234f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __raw_read_can_lock(rw) (!((rw)->lock & 0x80000000UL)) 235f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __raw_write_can_lock(rw) (!(rw)->lock) 236f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 237f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define _raw_spin_relax(lock) cpu_relax() 238f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define _raw_read_relax(lock) cpu_relax() 239f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define _raw_write_relax(lock) cpu_relax() 240f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 241f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#endif /* !(__ASSEMBLY__) */ 242f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 243f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#endif /* !(__SPARC64_SPINLOCK_H) */ 244