lock.h revision 1.1.2.4 1 1.1.2.4 sommerfe /* $NetBSD: lock.h,v 1.1.2.4 2001/01/07 18:21:55 sommerfeld Exp $ */
2 1.1.2.1 sommerfe
3 1.1.2.1 sommerfe /*-
4 1.1.2.2 sommerfe * Copyright (c) 2000 The NetBSD Foundation, Inc.
5 1.1.2.1 sommerfe * All rights reserved.
6 1.1.2.1 sommerfe *
7 1.1.2.1 sommerfe * This code is derived from software contributed to The NetBSD Foundation
8 1.1.2.2 sommerfe * by Jason R. Thorpe.
9 1.1.2.1 sommerfe *
10 1.1.2.1 sommerfe * Redistribution and use in source and binary forms, with or without
11 1.1.2.1 sommerfe * modification, are permitted provided that the following conditions
12 1.1.2.1 sommerfe * are met:
13 1.1.2.1 sommerfe * 1. Redistributions of source code must retain the above copyright
14 1.1.2.1 sommerfe * notice, this list of conditions and the following disclaimer.
15 1.1.2.1 sommerfe * 2. Redistributions in binary form must reproduce the above copyright
16 1.1.2.1 sommerfe * notice, this list of conditions and the following disclaimer in the
17 1.1.2.1 sommerfe * documentation and/or other materials provided with the distribution.
18 1.1.2.1 sommerfe * 3. All advertising materials mentioning features or use of this software
19 1.1.2.1 sommerfe * must display the following acknowledgement:
20 1.1.2.1 sommerfe * This product includes software developed by the NetBSD
21 1.1.2.1 sommerfe * Foundation, Inc. and its contributors.
22 1.1.2.1 sommerfe * 4. Neither the name of The NetBSD Foundation nor the names of its
23 1.1.2.1 sommerfe * contributors may be used to endorse or promote products derived
24 1.1.2.1 sommerfe * from this software without specific prior written permission.
25 1.1.2.1 sommerfe *
26 1.1.2.1 sommerfe * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 1.1.2.1 sommerfe * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 1.1.2.1 sommerfe * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 1.1.2.1 sommerfe * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 1.1.2.1 sommerfe * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 1.1.2.1 sommerfe * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 1.1.2.1 sommerfe * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 1.1.2.1 sommerfe * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 1.1.2.1 sommerfe * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 1.1.2.1 sommerfe * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 1.1.2.1 sommerfe * POSSIBILITY OF SUCH DAMAGE.
37 1.1.2.1 sommerfe */
38 1.1.2.1 sommerfe
39 1.1.2.1 sommerfe /*
40 1.1.2.1 sommerfe * Machine-dependent spin lock operations.
41 1.1.2.1 sommerfe */
42 1.1.2.1 sommerfe
43 1.1.2.2 sommerfe #ifndef _I386_LOCK_H_
44 1.1.2.2 sommerfe #define _I386_LOCK_H_
45 1.1.2.2 sommerfe
46 1.1.2.3 sommerfe #if defined(_KERNEL) && !defined(_LKM)
47 1.1.2.2 sommerfe #include "opt_lockdebug.h"
48 1.1.2.3 sommerfe #endif
49 1.1.2.2 sommerfe
50 1.1.2.2 sommerfe typedef __volatile int __cpu_simple_lock_t;
51 1.1.2.2 sommerfe
52 1.1.2.2 sommerfe #define __SIMPLELOCK_LOCKED 1
53 1.1.2.2 sommerfe #define __SIMPLELOCK_UNLOCKED 0
54 1.1.2.2 sommerfe
55 1.1.2.2 sommerfe #ifdef LOCKDEBUG
56 1.1.2.2 sommerfe
57 1.1.2.2 sommerfe extern void __cpu_simple_lock_init __P((__cpu_simple_lock_t *));
58 1.1.2.2 sommerfe extern void __cpu_simple_lock __P((__cpu_simple_lock_t *));
59 1.1.2.2 sommerfe extern int __cpu_simple_lock_try __P((__cpu_simple_lock_t *));
60 1.1.2.2 sommerfe extern void __cpu_simple_unlock __P((__cpu_simple_lock_t *));
61 1.1.2.2 sommerfe
62 1.1.2.2 sommerfe #else
63 1.1.2.2 sommerfe
64 1.1.2.4 sommerfe #include <machine/atomic.h>
65 1.1.2.4 sommerfe
66 1.1.2.2 sommerfe static __inline void __cpu_simple_lock_init __P((__cpu_simple_lock_t *))
67 1.1.2.2 sommerfe __attribute__((__unused__));
68 1.1.2.2 sommerfe static __inline void __cpu_simple_lock __P((__cpu_simple_lock_t *))
69 1.1.2.2 sommerfe __attribute__((__unused__));
70 1.1.2.2 sommerfe static __inline int __cpu_simple_lock_try __P((__cpu_simple_lock_t *))
71 1.1.2.2 sommerfe __attribute__((__unused__));
72 1.1.2.2 sommerfe static __inline void __cpu_simple_unlock __P((__cpu_simple_lock_t *))
73 1.1.2.2 sommerfe __attribute__((__unused__));
74 1.1.2.2 sommerfe
75 1.1.2.2 sommerfe static __inline void
76 1.1.2.4 sommerfe __cpu_simple_lock_init(__cpu_simple_lock_t *lockp)
77 1.1.2.2 sommerfe {
78 1.1.2.4 sommerfe *lockp = __SIMPLELOCK_UNLOCKED;
79 1.1.2.2 sommerfe }
80 1.1.2.2 sommerfe
81 1.1.2.2 sommerfe static __inline void
82 1.1.2.4 sommerfe __cpu_simple_lock(__cpu_simple_lock_t *lockp)
83 1.1.2.2 sommerfe {
84 1.1.2.4 sommerfe while (i386_atomic_testset_i(lockp, __SIMPLELOCK_LOCKED)
85 1.1.2.4 sommerfe == __SIMPLELOCK_LOCKED) {
86 1.1.2.4 sommerfe continue; /* spin */
87 1.1.2.4 sommerfe }
88 1.1.2.2 sommerfe }
89 1.1.2.2 sommerfe
90 1.1.2.2 sommerfe static __inline int
91 1.1.2.4 sommerfe __cpu_simple_lock_try(__cpu_simple_lock_t *lockp)
92 1.1.2.2 sommerfe {
93 1.1.2.4 sommerfe return (i386_atomic_testset_i(lockp, __SIMPLELOCK_LOCKED)
94 1.1.2.4 sommerfe == __SIMPLELOCK_UNLOCKED);
95 1.1.2.2 sommerfe }
96 1.1.2.2 sommerfe
97 1.1.2.2 sommerfe void
98 1.1.2.4 sommerfe __cpu_simple_unlock(__cpu_simple_lock_t *lockp)
99 1.1.2.2 sommerfe {
100 1.1.2.2 sommerfe
101 1.1.2.4 sommerfe *lockp = __SIMPLELOCK_UNLOCKED;
102 1.1.2.2 sommerfe }
103 1.1.2.2 sommerfe
104 1.1.2.2 sommerfe #endif /* !LOCKDEBUG */
105 1.1.2.2 sommerfe
106 1.1.2.2 sommerfe #endif /* _I386_LOCK_H_ */
107