|
|
1.1 root 1: /*
2: * Copyright (c) 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: * @OSF_COPYRIGHT@
24: */
25: /*
26: * Mach Operating System
27: * Copyright (c) 1991,1990 Carnegie Mellon University
28: * All Rights Reserved.
29: *
30: * Permission to use, copy, modify and distribute this software and its
31: * documentation is hereby granted, provided that both the copyright
32: * notice and this permission notice appear in all copies of the
33: * software, derivative works or modified versions, and any portions
34: * thereof, and that both notices appear in supporting documentation.
35: *
36: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
37: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
38: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
39: *
40: * Carnegie Mellon requests users of this software to return to
41: *
42: * Software Distribution Coordinator or [email protected]
43: * School of Computer Science
44: * Carnegie Mellon University
45: * Pittsburgh PA 15213-3890
46: *
47: * any improvements or extensions that they make and grant Carnegie Mellon
48: * the rights to redistribute these changes.
49: */
50:
51: /*
52: */
53:
54: #ifndef _I386AT_MP_H_
55: #define _I386AT_MP_H_
56:
57: #include <cpus.h>
58: #include <platforms.h>
59: #include <mp_v1_1.h>
60: #include <mach_rt.h>
61: #include <mach_assert.h>
62:
63: #if NCPUS > 1
64: #include <i386/apic.h>
65: #include <i386/AT386/mp/mp_events.h>
66:
67: #define CPU_NUMBER(r) \
68: movl EXT(lapic_id), r ; \
69: movl 0(r),r ; \
70: shrl $LAPIC_ID_SHIFT, r; \
71: andl $LAPIC_ID_MASK, r
72:
73:
74: #define MP_IPL SPL6 /* software interrupt level */
75:
76: /* word describing the reason for the interrupt, one per cpu */
77:
78: #ifndef ASSEMBLER
79: #include <kern/lock.h>
80: extern cpu_int_word[];
81: extern real_ncpus; /* real number of cpus */
82: extern wncpu; /* wanted number of cpus */
83: decl_simple_lock_data(extern,kdb_lock) /* kdb lock */
84:
85: extern int kdb_cpu; /* current cpu running kdb */
86: extern int kdb_debug;
87: extern int kdb_is_slave[];
88: extern int kdb_active[];
89: #endif /* ASSEMBLER */
90:
91: #define i_bit(bit, word) ((long)(*(word)) & ((long)1 << (bit)))
92:
93:
94: /*
95: * Device driver synchronization.
96: *
97: * at386_io_lock(op) and at386_io_unlock() are called
98: * by device drivers when accessing H/W. The underlying
99: * Processing is machine dependant. But the op argument
100: * to the at386_io_lock is generic
101: */
102:
103: #define MP_DEV_OP_MAX 4
104: #define MP_DEV_WAIT MP_DEV_OP_MAX /* Wait for the lock */
105:
106: /*
107: * If the caller specifies an op value different than MP_DEV_WAIT, the
108: * at386_io_lock function must return true if lock was successful else
109: * false
110: */
111:
112: #define MP_DEV_OP_START 0 /* If lock busy, register a pending start op */
113: #define MP_DEV_OP_INTR 1 /* If lock busy, register a pending intr */
114: #define MP_DEV_OP_TIMEO 2 /* If lock busy, register a pending timeout */
115: #define MP_DEV_OP_CALLB 3 /* If lock busy, register a pending callback */
116:
117: #else /* NCPUS > 1 */
118: #define at386_io_lock_state()
119: #define at386_io_lock(op) (TRUE)
120: #define at386_io_unlock()
121: #if MP_V1_1
122: #include <i386/apic.h>
123: #endif /* MP_V1_1 */
124: #endif /* NCPUS > 1 */
125:
126: #if MACH_RT
127: #define _DISABLE_PREEMPTION(r) \
128: movl $CPD_PREEMPTION_LEVEL,r ; \
129: incl %gs:(r)
130:
131: #define _ENABLE_PREEMPTION(r) \
132: movl $CPD_PREEMPTION_LEVEL,r ; \
133: decl %gs:(r) ; \
134: jne 9f ; \
135: pushl %eax ; \
136: pushl %ecx ; \
137: pushl %edx ; \
138: call EXT(kernel_preempt_check) ; \
139: popl %edx ; \
140: popl %ecx ; \
141: popl %eax ; \
142: 9:
143:
144: #define _ENABLE_PREEMPTION_NO_CHECK(r) \
145: movl $CPD_PREEMPTION_LEVEL,r ; \
146: decl %gs:(r)
147:
148: #if MACH_ASSERT
149: #define DISABLE_PREEMPTION(r) \
150: pushl %eax; \
151: pushl %ecx; \
152: pushl %edx; \
153: call EXT(_disable_preemption); \
154: popl %edx; \
155: popl %ecx; \
156: popl %eax
157: #define ENABLE_PREEMPTION(r) \
158: pushl %eax; \
159: pushl %ecx; \
160: pushl %edx; \
161: call EXT(_enable_preemption); \
162: popl %edx; \
163: popl %ecx; \
164: popl %eax
165: #define ENABLE_PREEMPTION_NO_CHECK(r) \
166: pushl %eax; \
167: pushl %ecx; \
168: pushl %edx; \
169: call EXT(_enable_preemption_no_check); \
170: popl %edx; \
171: popl %ecx; \
172: popl %eax
173: #if NCPUS > 1
174: #define MP_DISABLE_PREEMPTION(r) \
175: pushl %eax; \
176: pushl %ecx; \
177: pushl %edx; \
178: call EXT(_mp_disable_preemption); \
179: popl %edx; \
180: popl %ecx; \
181: popl %eax
182: #define MP_ENABLE_PREEMPTION(r) \
183: pushl %eax; \
184: pushl %ecx; \
185: pushl %edx; \
186: call EXT(_mp_enable_preemption); \
187: popl %edx; \
188: popl %ecx; \
189: popl %eax
190: #define MP_ENABLE_PREEMPTION_NO_CHECK(r) \
191: pushl %eax; \
192: pushl %ecx; \
193: pushl %edx; \
194: call EXT(_mp_enable_preemption_no_check); \
195: popl %edx; \
196: popl %ecx; \
197: popl %eax
198: #else /* NCPUS > 1 */
199: #define MP_DISABLE_PREEMPTION(r)
200: #define MP_ENABLE_PREEMPTION(r)
201: #define MP_ENABLE_PREEMPTION_NO_CHECK(r)
202: #endif /* NCPUS > 1 */
203: #else /* MACH_ASSERT */
204: #define DISABLE_PREEMPTION(r) _DISABLE_PREEMPTION(r)
205: #define ENABLE_PREEMPTION(r) _ENABLE_PREEMPTION(r)
206: #define ENABLE_PREEMPTION_NO_CHECK(r) _ENABLE_PREEMPTION_NO_CHECK(r)
207: #if NCPUS > 1
208: #define MP_DISABLE_PREEMPTION(r) _DISABLE_PREEMPTION(r)
209: #define MP_ENABLE_PREEMPTION(r) _ENABLE_PREEMPTION(r)
210: #define MP_ENABLE_PREEMPTION_NO_CHECK(r) _ENABLE_PREEMPTION_NO_CHECK(r)
211: #else /* NCPUS > 1 */
212: #define MP_DISABLE_PREEMPTION(r)
213: #define MP_ENABLE_PREEMPTION(r)
214: #define MP_ENABLE_PREEMPTION_NO_CHECK(r)
215: #endif /* NCPUS > 1 */
216: #endif /* MACH_ASSERT */
217:
218: #else /* MACH_RT */
219: #define DISABLE_PREEMPTION(r)
220: #define ENABLE_PREEMPTION(r)
221: #define ENABLE_PREEMPTION_NO_CHECK(r)
222: #define MP_DISABLE_PREEMPTION(r)
223: #define MP_ENABLE_PREEMPTION(r)
224: #define MP_ENABLE_PREEMPTION_NO_CHECK(r)
225: #endif /* MACH_RT */
226:
227: #endif /* _I386AT_MP_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.