1 /* $NetBSD: lock.h,v 1.2 2003/06/23 11:01:16 martin Exp $ */ 2 3 /*- 4 * Copyright (c) 1998, 1999, 2000, 2001 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, 9 * NASA Ames Research Center, and Matthew Fredette. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. All advertising materials mentioning features or use of this software 20 * must display the following acknowledgement: 21 * This product includes software developed by the NetBSD 22 * Foundation, Inc. and its contributors. 23 * 4. Neither the name of The NetBSD Foundation nor the names of its 24 * contributors may be used to endorse or promote products derived 25 * from this software without specific prior written permission. 26 * 27 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 28 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 29 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 30 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 31 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37 * POSSIBILITY OF SUCH DAMAGE. 38 */ 39 40 /* 41 * Machine-dependent spin lock operations. 42 */ 43 44 #ifndef _HPPA_LOCK_H_ 45 #define _HPPA_LOCK_H_ 46 47 #include "opt_multiprocessor.h" 48 49 #ifdef MULTIPROCESSOR 50 51 /* 52 * Semaphores must be aligned on 16-byte boundaries on the PA-RISC. 53 */ 54 typedef __volatile struct { 55 int32_t sem __attribute__ ((aligned (16))); 56 } __cpu_simple_lock_t; 57 58 59 static __inline void 60 __cpu_simple_lock_init(__cpu_simple_lock_t *alp) 61 { 62 __asm __volatile( 63 " ; BEGIN __cpu_simple_lock_init\n" 64 " stw %1, %0 \n" 65 " sync \n" 66 " ; END __cpu_simple_lock_init" 67 : "=m" (*alp->sem) 68 : "r" (__SIMPLELOCK_UNLOCKED)); 69 } 70 71 static __inline void 72 __cpu_simple_lock(__cpu_simple_lock_t *alp) 73 { 74 int32_t t0; 75 76 /* 77 * Note, if we detect that the lock is held when 78 * we do the initial load-clear-word, we spin using 79 * a non-locked load to save the coherency logic 80 * some work. 81 */ 82 83 __asm __volatile( 84 " ; BEGIN __cpu_simple_lock\n" 85 " ldcw %1, %0 \n" 86 " comb,<>,n %%r0,%0, 2f \n" 87 "1: comb,=,n %%r0,%0, 1b \n" 88 " ldw %1, %0 \n" 89 " ldcw %1, %0 \n" 90 " comb,=,n %%r0,%0, 1b \n" 91 " ldw %1, %0 \n" 92 "2: sync \n" 93 " ; END __cpu_simple_lock\n" 94 : "=r" (t0), "+m" (*alp->sem)); 95 } 96 97 static __inline int 98 __cpu_simple_lock_try(__cpu_simple_lock_t *alp) 99 { 100 int32_t t0; 101 102 __asm __volatile( 103 " ; BEGIN __cpu_simple_lock_try\n" 104 " ldcw %1, %0 \n" 105 " sync \n" 106 " ; END __cpu_simple_lock_try" 107 : "=r" (t0), "+m" (*alp->sem)); 108 return (t0 != 0); 109 } 110 111 static __inline void 112 __cpu_simple_unlock(__cpu_simple_lock_t *alp) 113 { 114 __asm __volatile( 115 " ; BEGIN __cpu_simple_unlock\n" 116 " sync \n" 117 " stw %1, %0 \n" 118 " ; END __cpu_simple_unlock" 119 : "+m" (*alp->sem) 120 : "r" (__SIMPLELOCK_UNLOCKED)); 121 } 122 123 #else /* !MULTIPROCESSOR */ 124 125 typedef __volatile int __cpu_simple_lock_t; 126 127 #define __SIMPLELOCK_LOCKED 1 128 #define __SIMPLELOCK_UNLOCKED 0 129 130 #endif /* !MULTIPROCESSOR */ 131 132 #endif /* _HPPA_LOCK_H_ */ 133