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 240199c4e68d1f02894bdefe4b5d9e9ee4aedd8d62Thomas Gleixner#define arch_spin_is_locked(lp) ((lp)->lock != 0) 25f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 260199c4e68d1f02894bdefe4b5d9e9ee4aedd8d62Thomas Gleixner#define arch_spin_unlock_wait(lp) \ 27f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg do { rmb(); \ 28f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg } while((lp)->lock) 29f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 300199c4e68d1f02894bdefe4b5d9e9ee4aedd8d62Thomas Gleixnerstatic inline void arch_spin_lock(arch_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" brnz,pn %0, 2f\n" 37f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" nop\n" 38f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" .subsection 2\n" 39f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2: ldub [%1], %0\n" 40f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" brnz,pt %0, 2b\n" 41f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" nop\n" 42f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" ba,a,pt %%xcc, 1b\n" 43f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" .previous" 44f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "=&r" (tmp) 45f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "r" (lock) 46f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "memory"); 47f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg} 48f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 490199c4e68d1f02894bdefe4b5d9e9ee4aedd8d62Thomas Gleixnerstatic inline int arch_spin_trylock(arch_spinlock_t *lock) 50f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{ 51f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg unsigned long result; 52f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 53f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg __asm__ __volatile__( 54f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" ldstub [%1], %0\n" 55f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "=r" (result) 56f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "r" (lock) 57f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "memory"); 58f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 59f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg return (result == 0UL); 60f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg} 61f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 620199c4e68d1f02894bdefe4b5d9e9ee4aedd8d62Thomas Gleixnerstatic inline void arch_spin_unlock(arch_spinlock_t *lock) 63f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{ 64f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg __asm__ __volatile__( 65f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" stb %%g0, [%0]" 66f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : /* No outputs */ 67f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "r" (lock) 68f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "memory"); 69f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg} 70f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 710199c4e68d1f02894bdefe4b5d9e9ee4aedd8d62Thomas Gleixnerstatic inline void arch_spin_lock_flags(arch_spinlock_t *lock, unsigned long flags) 72f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{ 73f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg unsigned long tmp1, tmp2; 74f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 75f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg __asm__ __volatile__( 76f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1: ldstub [%2], %0\n" 77f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" brnz,pn %0, 2f\n" 78f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" nop\n" 79f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" .subsection 2\n" 80f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2: rdpr %%pil, %1\n" 81f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" wrpr %3, %%pil\n" 82f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"3: ldub [%2], %0\n" 83f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" brnz,pt %0, 3b\n" 84f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" nop\n" 85f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" ba,pt %%xcc, 1b\n" 86f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" wrpr %1, %%pil\n" 87f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" .previous" 88f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "=&r" (tmp1), "=&r" (tmp2) 89f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "r"(lock), "r"(flags) 90f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "memory"); 91f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg} 92f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 93f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg/* Multi-reader locks, these are much saner than the 32-bit Sparc ones... */ 94f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 95fb3a6bbc912b12347614e5742c7c61416cdb0ca0Thomas Gleixnerstatic void inline arch_read_lock(arch_rwlock_t *lock) 96f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{ 97f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg unsigned long tmp1, tmp2; 98f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 99f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg __asm__ __volatile__ ( 100f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1: ldsw [%2], %0\n" 101f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" brlz,pn %0, 2f\n" 102f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"4: add %0, 1, %1\n" 103f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" cas [%2], %0, %1\n" 104f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" cmp %0, %1\n" 105f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" bne,pn %%icc, 1b\n" 106f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" nop\n" 107f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" .subsection 2\n" 108f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2: ldsw [%2], %0\n" 109f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" brlz,pt %0, 2b\n" 110f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" nop\n" 111f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" ba,a,pt %%xcc, 4b\n" 112f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" .previous" 113f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "=&r" (tmp1), "=&r" (tmp2) 114f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "r" (lock) 115f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "memory"); 116f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg} 117f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 118fb3a6bbc912b12347614e5742c7c61416cdb0ca0Thomas Gleixnerstatic int inline arch_read_trylock(arch_rwlock_t *lock) 119f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{ 120f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg int tmp1, tmp2; 121f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 122f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg __asm__ __volatile__ ( 123f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1: ldsw [%2], %0\n" 124f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" brlz,a,pn %0, 2f\n" 125f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" mov 0, %0\n" 126f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" add %0, 1, %1\n" 127f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" cas [%2], %0, %1\n" 128f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" cmp %0, %1\n" 129f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" bne,pn %%icc, 1b\n" 130f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" mov 1, %0\n" 131f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2:" 132f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "=&r" (tmp1), "=&r" (tmp2) 133f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "r" (lock) 134f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "memory"); 135f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 136f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg return tmp1; 137f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg} 138f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 139fb3a6bbc912b12347614e5742c7c61416cdb0ca0Thomas Gleixnerstatic void inline arch_read_unlock(arch_rwlock_t *lock) 140f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{ 141f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg unsigned long tmp1, tmp2; 142f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 143f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg __asm__ __volatile__( 144f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1: lduw [%2], %0\n" 145f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" sub %0, 1, %1\n" 146f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" cas [%2], %0, %1\n" 147f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" cmp %0, %1\n" 148f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" bne,pn %%xcc, 1b\n" 149f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" nop" 150f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "=&r" (tmp1), "=&r" (tmp2) 151f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "r" (lock) 152f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "memory"); 153f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg} 154f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 155fb3a6bbc912b12347614e5742c7c61416cdb0ca0Thomas Gleixnerstatic void inline arch_write_lock(arch_rwlock_t *lock) 156f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{ 157f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg unsigned long mask, tmp1, tmp2; 158f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 159f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg mask = 0x80000000UL; 160f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 161f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg __asm__ __volatile__( 162f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1: lduw [%2], %0\n" 163f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" brnz,pn %0, 2f\n" 164f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"4: or %0, %3, %1\n" 165f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" cas [%2], %0, %1\n" 166f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" cmp %0, %1\n" 167f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" bne,pn %%icc, 1b\n" 168f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" nop\n" 169f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" .subsection 2\n" 170f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2: lduw [%2], %0\n" 171f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" brnz,pt %0, 2b\n" 172f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" nop\n" 173f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" ba,a,pt %%xcc, 4b\n" 174f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" .previous" 175f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "=&r" (tmp1), "=&r" (tmp2) 176f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "r" (lock), "r" (mask) 177f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "memory"); 178f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg} 179f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 180fb3a6bbc912b12347614e5742c7c61416cdb0ca0Thomas Gleixnerstatic void inline arch_write_unlock(arch_rwlock_t *lock) 181f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{ 182f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg __asm__ __volatile__( 183f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" stw %%g0, [%0]" 184f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : /* no outputs */ 185f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "r" (lock) 186f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "memory"); 187f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg} 188f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 189fb3a6bbc912b12347614e5742c7c61416cdb0ca0Thomas Gleixnerstatic int inline arch_write_trylock(arch_rwlock_t *lock) 190f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{ 191f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg unsigned long mask, tmp1, tmp2, result; 192f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 193f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg mask = 0x80000000UL; 194f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 195f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg __asm__ __volatile__( 196f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" mov 0, %2\n" 197f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1: lduw [%3], %0\n" 198f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" brnz,pn %0, 2f\n" 199f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" or %0, %4, %1\n" 200f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" cas [%3], %0, %1\n" 201f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" cmp %0, %1\n" 202f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" bne,pn %%icc, 1b\n" 203f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" nop\n" 204f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg" mov 1, %2\n" 205f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2:" 206f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "=&r" (tmp1), "=&r" (tmp2), "=&r" (result) 207f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "r" (lock), "r" (mask) 208f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg : "memory"); 209f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 210f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg return result; 211f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg} 212f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 213e5931943d02bf751b1ec849c0d2ade23d76a8d41Thomas Gleixner#define arch_read_lock_flags(p, f) arch_read_lock(p) 214e5931943d02bf751b1ec849c0d2ade23d76a8d41Thomas Gleixner#define arch_write_lock_flags(p, f) arch_write_lock(p) 215e5931943d02bf751b1ec849c0d2ade23d76a8d41Thomas Gleixner 216e5931943d02bf751b1ec849c0d2ade23d76a8d41Thomas Gleixner#define arch_read_can_lock(rw) (!((rw)->lock & 0x80000000UL)) 217e5931943d02bf751b1ec849c0d2ade23d76a8d41Thomas Gleixner#define arch_write_can_lock(rw) (!(rw)->lock) 218f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 2190199c4e68d1f02894bdefe4b5d9e9ee4aedd8d62Thomas Gleixner#define arch_spin_relax(lock) cpu_relax() 2200199c4e68d1f02894bdefe4b5d9e9ee4aedd8d62Thomas Gleixner#define arch_read_relax(lock) cpu_relax() 2210199c4e68d1f02894bdefe4b5d9e9ee4aedd8d62Thomas Gleixner#define arch_write_relax(lock) cpu_relax() 222f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 223f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#endif /* !(__ASSEMBLY__) */ 224f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg 225f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#endif /* !(__SPARC64_SPINLOCK_H) */ 226