]> git.saurik.com Git - apple/xnu.git/blob - iokit/IOKit/ppc/IOSharedLockImp.h
xnu-123.5.tar.gz
[apple/xnu.git] / iokit / IOKit / ppc / IOSharedLockImp.h
1 /*
2 * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
11 *
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
18 * under the License.
19 *
20 * @APPLE_LICENSE_HEADER_END@
21 */
22 /*
23 * Copyright (c) 1998 Apple Computer, Inc. All rights reserved.
24 *
25 * HISTORY
26 *
27 */
28
29 /* Copyright (c) 1992 NeXT Computer, Inc. All rights reserved.
30 *
31 * EventShmemLock.h - Shared memory area locks for use between the
32 * WindowServer and the Event Driver.
33 *
34 * HISTORY
35 * 30 Nov 1992 Ben Fathi (benf@next.com)
36 * Ported to m98k.
37 *
38 * 29 April 1992 Mike Paquette at NeXT
39 * Created.
40 *
41 * Multiprocessor locks used within the shared memory area between the
42 * kernel and event system. These must work in both user and kernel mode.
43 * The locks are defined in an include file so they get exported to the local
44 * include file area.
45 */
46
47
48 #ifndef _IOKIT_IOSHAREDLOCKIMP_H
49 #define _IOKIT_IOSHAREDLOCKIMP_H
50
51 #include <architecture/ppc/asm_help.h>
52
53 // 'Till we're building in kernel
54 .macro DISABLE_PREEMPTION
55 #ifdef KERNEL
56 #endif
57 .endmacro
58 .macro ENABLE_PREEMPTION
59 #ifdef KERNEL
60 #endif
61 .endmacro
62
63 /*
64 * void
65 * ev_lock(p)
66 * register int *p;
67 *
68 * Lock the lock pointed to by p. Spin (possibly forever) until
69 * the lock is available. Test and test and set logic used.
70 */
71 TEXT
72
73 #ifndef KERNEL
74 LEAF(_ev_lock)
75 LEAF(_IOSpinLock)
76 li a6,1 // lock value
77 lwarx a7,0,a0 // CEMV10
78 9:
79 sync
80 lwarx a7,0,a0 // read the lock
81 cmpwi cr0,a7,0 // is it busy?
82 bne- 9b // yes, spin
83 sync
84 stwcx. a6,0,a0 // try to get the lock
85 bne- 9b // failed, try again
86 isync
87 blr // got it, return
88 END(_ev_lock)
89 #endif
90
91 /*
92 * void
93 * spin_unlock(p)
94 * int *p;
95 *
96 * Unlock the lock pointed to by p.
97 */
98
99 LEAF(_ev_unlock)
100 LEAF(_IOSpinUnlock)
101 sync
102 li a7,0
103 stw a7,0(a0)
104 ENABLE_PREEMPTION()
105 blr
106 END(_ev_unlock)
107
108
109 /*
110 * ev_try_lock(p)
111 * int *p;
112 *
113 * Try to lock p. Return TRUE if successful in obtaining lock.
114 */
115
116 LEAF(_ev_try_lock)
117 LEAF(_IOTrySpinLock)
118 li a6,1 // lock value
119 DISABLE_PREEMPTION()
120 lwarx a7,0,a0 // CEMV10
121 8:
122 sync
123 lwarx a7,0,a0 // read the lock
124 cmpwi cr0,a7,0 // is it busy?
125 bne- 9f // yes, give up
126 sync
127 stwcx. a6,0,a0 // try to get the lock
128 bne- 8b // failed, try again
129 li a0,1 // return TRUE
130 isync
131 blr
132 9:
133 ENABLE_PREEMPTION()
134 li a0,0 // return FALSE
135 blr
136 END(_ev_try_lock)
137
138 #endif /* ! _IOKIT_IOSHAREDLOCKIMP_H */