lock.h revision 1.2 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