1 1.10 skrll /* $NetBSD: lock.h,v 1.10 2023/10/06 11:45:37 skrll Exp $ */ 2 1.1 cherry 3 1.1 cherry /*- 4 1.1 cherry * Copyright (c) 2000 The NetBSD Foundation, Inc. 5 1.1 cherry * All rights reserved. 6 1.1 cherry * 7 1.1 cherry * This code is derived from software contributed to The NetBSD Foundation 8 1.1 cherry * by Jason R. Thorpe. 9 1.1 cherry * 10 1.1 cherry * Redistribution and use in source and binary forms, with or without 11 1.1 cherry * modification, are permitted provided that the following conditions 12 1.1 cherry * are met: 13 1.1 cherry * 1. Redistributions of source code must retain the above copyright 14 1.1 cherry * notice, this list of conditions and the following disclaimer. 15 1.1 cherry * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 cherry * notice, this list of conditions and the following disclaimer in the 17 1.1 cherry * documentation and/or other materials provided with the distribution. 18 1.1 cherry * 19 1.1 cherry * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 cherry * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 cherry * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 cherry * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 cherry * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 cherry * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 cherry * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 cherry * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 cherry * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 cherry * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 cherry * POSSIBILITY OF SUCH DAMAGE. 30 1.1 cherry */ 31 1.1 cherry 32 1.1 cherry /* 33 1.1 cherry * Machine-dependent spin lock operations. 34 1.1 cherry */ 35 1.1 cherry 36 1.1 cherry #ifndef _IA64_LOCK_H_ 37 1.1 cherry #define _IA64_LOCK_H_ 38 1.1 cherry 39 1.2 kochi static __inline int 40 1.6 christos __SIMPLELOCK_LOCKED_P(const __cpu_simple_lock_t *__ptr) 41 1.2 kochi { 42 1.2 kochi return *__ptr == __SIMPLELOCK_LOCKED; 43 1.2 kochi } 44 1.2 kochi 45 1.2 kochi static __inline int 46 1.6 christos __SIMPLELOCK_UNLOCKED_P(const __cpu_simple_lock_t *__ptr) 47 1.2 kochi { 48 1.2 kochi return *__ptr == __SIMPLELOCK_UNLOCKED; 49 1.2 kochi } 50 1.2 kochi 51 1.2 kochi static __inline void 52 1.2 kochi __cpu_simple_lock_set(__cpu_simple_lock_t *__ptr) 53 1.2 kochi { 54 1.2 kochi 55 1.2 kochi *__ptr = __SIMPLELOCK_LOCKED; 56 1.2 kochi } 57 1.2 kochi 58 1.2 kochi static __inline void 59 1.2 kochi __cpu_simple_lock_clear(__cpu_simple_lock_t *__ptr) 60 1.2 kochi { 61 1.2 kochi 62 1.2 kochi *__ptr = __SIMPLELOCK_UNLOCKED; 63 1.2 kochi } 64 1.2 kochi 65 1.2 kochi #ifdef _KERNEL 66 1.2 kochi 67 1.2 kochi #define SPINLOCK_SPIN_HOOK /* nothing */ 68 1.7 scole #define SPINLOCK_BACKOFF_HOOK /* XXX ia64_pause() */ 69 1.2 kochi 70 1.2 kochi #endif 71 1.2 kochi 72 1.2 kochi static __inline void __cpu_simple_lock_init(__cpu_simple_lock_t *) 73 1.2 kochi __unused; 74 1.2 kochi static __inline void __cpu_simple_lock(__cpu_simple_lock_t *) 75 1.2 kochi __unused; 76 1.2 kochi static __inline int __cpu_simple_lock_try(__cpu_simple_lock_t *) 77 1.2 kochi __unused; 78 1.2 kochi static __inline void __cpu_simple_unlock(__cpu_simple_lock_t *) 79 1.2 kochi __unused; 80 1.2 kochi 81 1.2 kochi static __inline void 82 1.2 kochi __cpu_simple_lock_init(__cpu_simple_lock_t *lockp) 83 1.2 kochi { 84 1.2 kochi 85 1.2 kochi *lockp = __SIMPLELOCK_UNLOCKED; 86 1.2 kochi } 87 1.2 kochi 88 1.2 kochi static __inline int 89 1.2 kochi __cpu_simple_lock_try(__cpu_simple_lock_t *lockp) 90 1.2 kochi { 91 1.2 kochi uint8_t val; 92 1.2 kochi 93 1.2 kochi val = __SIMPLELOCK_LOCKED; 94 1.10 skrll __asm volatile ("xchg1 %0=[%1],%2" : 95 1.2 kochi "=r" (val) 96 1.4 kiyohara :"r" (lockp), "r" (val) 97 1.4 kiyohara :"memory"); 98 1.2 kochi return val == __SIMPLELOCK_UNLOCKED; 99 1.2 kochi } 100 1.2 kochi 101 1.2 kochi static __inline void 102 1.2 kochi __cpu_simple_lock(__cpu_simple_lock_t *lockp) 103 1.2 kochi { 104 1.2 kochi 105 1.2 kochi while (!__cpu_simple_lock_try(lockp)) 106 1.2 kochi /* nothing */; 107 1.2 kochi __insn_barrier(); 108 1.2 kochi } 109 1.2 kochi 110 1.2 kochi static __inline void 111 1.2 kochi __cpu_simple_unlock(__cpu_simple_lock_t *lockp) 112 1.2 kochi { 113 1.2 kochi 114 1.2 kochi __insn_barrier(); 115 1.2 kochi *lockp = __SIMPLELOCK_UNLOCKED; 116 1.2 kochi } 117 1.1 cherry 118 1.5 scole static __inline void 119 1.7 scole ia64_pause(void) 120 1.7 scole { 121 1.7 scole __asm __volatile("hint @pause" ::: "memory"); 122 1.5 scole } 123 1.5 scole 124 1.1 cherry #endif /* _IA64_LOCK_H_ */ 125