FreeBSD/Linux Kernel Cross Reference
sys/kern/syscall_sw.c
1 /*
2 * Mach Operating System
3 * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University
4 * All Rights Reserved.
5 *
6 * Permission to use, copy, modify and distribute this software and its
7 * documentation is hereby granted, provided that both the copyright
8 * notice and this permission notice appear in all copies of the
9 * software, derivative works or modified versions, and any portions
10 * thereof, and that both notices appear in supporting documentation.
11 *
12 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
13 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
14 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
15 *
16 * Carnegie Mellon requests users of this software to return to
17 *
18 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
19 * School of Computer Science
20 * Carnegie Mellon University
21 * Pittsburgh PA 15213-3890
22 *
23 * any improvements or extensions that they make and grant Carnegie Mellon
24 * the rights to redistribute these changes.
25 */
26 /*
27 * HISTORY
28 * $Log: syscall_sw.c,v $
29 * Revision 2.16 93/08/10 15:11:27 mrt
30 * Put atm traps under NET_ATM conditional.
31 * [93/08/02 cmaeda]
32 * Moved syscall_device_writev_request to 39 since it
33 * was conflicting with init_process at 41. Added
34 * comments to trap numbers that are unixoid traps
35 * handled by emulator.
36 * [93/07/19 cmaeda]
37 *
38 * Added device_write traps.
39 * [93/07/03 cmaeda]
40 *
41 * Added evc_wait_clear. Very similar to evc_wait.
42 * [93/07/03 cmaeda]
43 *
44 * Included traps for network interface.
45 * [93/06/09 15:42:13 jcb]
46 *
47 * Revision 2.15 92/08/03 17:39:34 jfriedl
48 * removed silly prototypes
49 * [92/08/02 jfriedl]
50 *
51 * Revision 2.14 92/05/21 17:16:12 jfriedl
52 * tried prototypes.
53 * [92/05/20 jfriedl]
54 *
55 * Revision 2.13 92/02/19 16:06:58 elf
56 * Added syscall_thread_depress_abort.
57 * [92/01/20 rwd]
58 *
59 * Revision 2.12 92/01/03 20:40:19 dbg
60 * Use continuations always in evc_wait.
61 * [91/12/27 af]
62 *
63 * Revision 2.11 91/12/13 14:54:49 jsb
64 * Added evc_wait().
65 * [91/12/12 17:42:00 af]
66 *
67 * Revision 2.10 91/05/14 16:47:45 mrt
68 * Correcting copyright
69 *
70 * Revision 2.9 91/03/16 14:52:12 rpd
71 * Changed swtch, swtch_pri, and thread_switch to MACH_TRAP_STACK.
72 * [91/01/17 rpd]
73 *
74 * Revision 2.8 91/02/05 17:29:44 mrt
75 * Changed to new Mach copyright
76 * [91/02/01 16:18:37 mrt]
77 *
78 * Revision 2.7 91/01/08 15:17:21 rpd
79 * Changed to use MACH_TRAP_STACK appropriately.
80 * [90/12/27 21:20:57 rpd]
81 *
82 * Revision 2.6 90/09/09 14:32:58 rpd
83 * Added mach_port_allocate_name
84 * [90/09/05 rwd]
85 *
86 * Revision 2.5 90/06/19 22:59:30 rpd
87 * Added mach_port_allocate, mach_port_deallocate, mach_port_insert_right.
88 * [90/06/02 rpd]
89 *
90 * Revision 2.4 90/06/02 14:56:26 rpd
91 * Updated for new IPC and scheduling technology.
92 * [90/03/26 22:20:34 rpd]
93 *
94 * Revision 2.3 90/05/29 18:36:48 rwd
95 * New traps from rfr (vm_map, task_create etc.)
96 * [90/04/20 rwd]
97 *
98 * Revision 2.2 89/10/16 15:22:13 rwd
99 * Added debug option for kern_invalid.
100 * [89/09/29 rwd]
101 *
102 * Made swtch_pri trap call swtch, ignoring priority argument (it
103 * scrambles scheduling).
104 * [89/02/02 dbg]
105 *
106 * Removed all non-MACH calls and options.
107 * [88/10/28 dbg]
108 *
109 * Revision 2.1 89/08/03 15:51:36 rwd
110 * Created.
111 *
112 * Revision 2.8 89/03/05 16:48:24 rpd
113 * Renamed the obsolete msg_{send,receive,rpc} traps to
114 * msg_{send,receive,rpc}_old.
115 * [89/02/15 13:50:10 rpd]
116 *
117 * Revision 2.7 89/02/25 18:09:05 gm0w
118 * Changes for cleanup.
119 *
120 * Revision 2.6 89/01/10 23:32:13 rpd
121 * Added MACH_IPC_XXXHACK conditionals around the obsolete IPC traps.
122 * [89/01/10 23:10:07 rpd]
123 *
124 * Revision 2.5 88/12/19 02:47:31 mwyoung
125 * Removed old MACH conditionals.
126 * [88/12/13 mwyoung]
127 *
128 * Revision 2.4 88/10/27 10:48:53 rpd
129 * Changed msg_{send,receive,rpc}_trap to 20, 21, 22.
130 * [88/10/26 14:45:13 rpd]
131 *
132 * Revision 2.3 88/10/11 10:20:33 rpd
133 * Changed includes to the new style. Replaced msg_receive_,
134 * msg_rpc_ with msg_send_trap, msg_receive_trap, msg_rpc_trap.
135 * [88/10/06 12:22:30 rpd]
136 *
137 * 7-Apr-88 David Black (dlb) at Carnegie-Mellon University
138 * removed thread_times().
139 *
140 * 18-Jan-88 David Golub (dbg) at Carnegie-Mellon University
141 * Replaced task_data with thread_reply; change is invisible to
142 * users.
143 *
144 * 03-Mar-88 Douglas Orr (dorr) at Carnegie-Mellon University
145 * Added htg_unix_syscall()
146 *
147 * 27-Apr-87 Michael Young (mwyoung) at Carnegie-Mellon University
148 * Added new forms of msg_receive, msg_rpc.
149 *
150 * 1-Apr-87 William Bolosky (bolosky) at Carnegie-Mellon University
151 * Added "WARNING:" comment.
152 *
153 * 30-Mar-87 David Black (dlb) at Carnegie-Mellon University
154 * Added kern_timestamp()
155 *
156 * 27-Mar-87 David Black (dlb) at Carnegie-Mellon University
157 * Added thread_times() for MACH_TIME_NEW. Flushed MACH_TIME.
158 *
159 * 25-Mar-87 Avadis Tevanian (avie) at Carnegie-Mellon University
160 * Added map_fd.
161 *
162 * 27-Feb-87 Michael Young (mwyoung) at Carnegie-Mellon University
163 * MACH_IPC: Turn off Accent compatibility traps.
164 *
165 * 4-Feb-87 Michael Young (mwyoung) at Carnegie-Mellon University
166 * Added ctimes() routine, to make a workable restore program.
167 *
168 * 10-Nov-86 Michael Young (mwyoung) at Carnegie-Mellon University
169 * Eliminated KPortToPID.
170 *
171 * 7-Nov-86 Michael Young (mwyoung) at Carnegie-Mellon University
172 * Added "init_process".
173 *
174 * 29-Oct-86 Michael Young (mwyoung) at Carnegie-Mellon University
175 * Added inode_swap_preference.
176 *
177 * 12-Oct-86 Michael Young (mwyoung) at Carnegie-Mellon University
178 * Major reorganization: added msg_send, msg_receive, msg_rpc;
179 * moved real Mach traps up front; renamed table.
180 */
181
182 #include <mach_ipc_compat.h>
183 #include <net_atm.h>
184
185 #include <mach/port.h>
186 #include <mach/kern_return.h>
187 #include <kern/syscall_sw.h>
188
189 /* Include declarations of the trap functions. */
190 #include <mach/mach_traps.h>
191 #include <mach/message.h>
192 #include <kern/syscall_subr.h>
193 #include <chips/nw_mk.h>
194
195
196 /*
197 * To add a new entry:
198 * Add an "MACH_TRAP(routine, arg count)" to the table below.
199 *
200 * Add trap definition to mach/syscall_sw.h and
201 * recompile user library.
202 *
203 * WARNING: If you add a trap which requires more than 7
204 * parameters, mach/ca/syscall_sw.h and ca/trap.c both need
205 * to be modified for it to work successfully on an
206 * RT. Similarly, mach/mips/syscall_sw.h and mips/locore.s
207 * need to be modified before it will work on Pmaxen.
208 *
209 * WARNING: Don't use numbers 0 through -9. They (along with
210 * the positive numbers) are reserved for Unix.
211 */
212
213 int kern_invalid_debug = 0;
214
215 mach_port_t null_port()
216 {
217 if (kern_invalid_debug) Debugger("null_port mach trap");
218 return(MACH_PORT_NULL);
219 }
220
221 kern_return_t kern_invalid()
222 {
223 if (kern_invalid_debug) Debugger("kern_invalid mach trap");
224 return(KERN_INVALID_ARGUMENT);
225 }
226
227 extern kern_return_t syscall_vm_map();
228 extern kern_return_t syscall_vm_allocate();
229 extern kern_return_t syscall_vm_deallocate();
230
231 extern kern_return_t syscall_task_create();
232 extern kern_return_t syscall_task_terminate();
233 extern kern_return_t syscall_task_suspend();
234 extern kern_return_t syscall_task_set_special_port();
235
236 extern kern_return_t syscall_mach_port_allocate();
237 extern kern_return_t syscall_mach_port_deallocate();
238 extern kern_return_t syscall_mach_port_insert_right();
239 extern kern_return_t syscall_mach_port_allocate_name();
240
241 extern kern_return_t syscall_thread_depress_abort();
242 extern kern_return_t evc_wait();
243 extern kern_return_t evc_wait_clear();
244
245 extern kern_return_t syscall_device_write_request();
246 extern kern_return_t syscall_device_writev_request();
247
248 mach_trap_t mach_trap_table[] = {
249 MACH_TRAP(kern_invalid, 0), /* 0 */ /* Unix */
250 MACH_TRAP(kern_invalid, 0), /* 1 */ /* Unix */
251 MACH_TRAP(kern_invalid, 0), /* 2 */ /* Unix */
252 MACH_TRAP(kern_invalid, 0), /* 3 */ /* Unix */
253 MACH_TRAP(kern_invalid, 0), /* 4 */ /* Unix */
254 MACH_TRAP(kern_invalid, 0), /* 5 */ /* Unix */
255 MACH_TRAP(kern_invalid, 0), /* 6 */ /* Unix */
256 MACH_TRAP(kern_invalid, 0), /* 7 */ /* Unix */
257 MACH_TRAP(kern_invalid, 0), /* 8 */ /* Unix */
258 MACH_TRAP(kern_invalid, 0), /* 9 */ /* Unix */
259
260 #if MACH_IPC_COMPAT
261 MACH_TRAP(task_self, 0), /* 10 */ /* obsolete */
262 MACH_TRAP(thread_reply, 0), /* 11 */ /* obsolete */
263 MACH_TRAP(task_notify, 0), /* 12 */ /* obsolete */
264 MACH_TRAP(thread_self, 0), /* 13 */ /* obsolete */
265 #else /* MACH_IPC_COMPAT */
266 MACH_TRAP(null_port, 0), /* 10 */
267 MACH_TRAP(null_port, 0), /* 11 */
268 MACH_TRAP(null_port, 0), /* 12 */
269 MACH_TRAP(null_port, 0), /* 13 */
270 #endif /* MACH_IPC_COMPAT */
271 MACH_TRAP(kern_invalid, 0), /* 14 */
272 MACH_TRAP(kern_invalid, 0), /* 15 */
273 MACH_TRAP(kern_invalid, 0), /* 16 */
274 MACH_TRAP_STACK(evc_wait, 1), /* 17 */
275 MACH_TRAP_STACK(evc_wait_clear, 1), /* 18 */
276 MACH_TRAP(kern_invalid, 0), /* 19 */
277
278 #if MACH_IPC_COMPAT
279 MACH_TRAP(msg_send_trap, 4), /* 20 */ /* obsolete */
280 MACH_TRAP_STACK(msg_receive_trap, 5), /* 21 */ /* obsolete */
281 MACH_TRAP_STACK(msg_rpc_trap, 6), /* 22 */ /* obsolete */
282 #else /* MACH_IPC_COMPAT */
283 MACH_TRAP(kern_invalid, 0), /* 20 */
284 MACH_TRAP(kern_invalid, 0), /* 21 */
285 MACH_TRAP(kern_invalid, 0), /* 22 */
286 #endif /* MACH_IPC_COMPAT */
287 MACH_TRAP(kern_invalid, 0), /* 23 */
288 MACH_TRAP(kern_invalid, 0), /* 24 */
289 MACH_TRAP_STACK(mach_msg_trap, 7), /* 25 */
290 MACH_TRAP(mach_reply_port, 0), /* 26 */
291 MACH_TRAP(mach_thread_self, 0), /* 27 */
292 MACH_TRAP(mach_task_self, 0), /* 28 */
293 MACH_TRAP(mach_host_self, 0), /* 29 */
294
295 MACH_TRAP(kern_invalid, 0), /* 30 */
296 MACH_TRAP(kern_invalid, 0), /* 31 */
297 MACH_TRAP(kern_invalid, 0), /* 32 */
298 MACH_TRAP(kern_invalid, 0), /* 33 emul: task_by_pid */
299 MACH_TRAP(kern_invalid, 0), /* 34 emul: pid_by_task */
300 MACH_TRAP(kern_invalid, 0), /* 35 */
301 MACH_TRAP(kern_invalid, 0), /* 36 */
302 MACH_TRAP(kern_invalid, 0), /* 37 */
303 MACH_TRAP(kern_invalid, 0), /* 38 */
304
305 MACH_TRAP(syscall_device_writev_request, 6), /* 39 */
306 MACH_TRAP(syscall_device_write_request, 6), /* 40 */
307
308 MACH_TRAP(kern_invalid, 0), /* 41 emul: init_process */
309 MACH_TRAP(kern_invalid, 0), /* 42 */
310 MACH_TRAP(kern_invalid, 0), /* 43 emul: map_fd */
311 MACH_TRAP(kern_invalid, 0), /* 44 emul: rfs_make_symlink */
312 MACH_TRAP(kern_invalid, 0), /* 45 */
313 MACH_TRAP(kern_invalid, 0), /* 46 */
314 MACH_TRAP(kern_invalid, 0), /* 47 */
315 MACH_TRAP(kern_invalid, 0), /* 48 */
316 MACH_TRAP(kern_invalid, 0), /* 49 */
317
318 MACH_TRAP(kern_invalid, 0), /* 50 */
319 MACH_TRAP(kern_invalid, 0), /* 51 */
320 MACH_TRAP(kern_invalid, 0), /* 52 emul: htg_syscall */
321 MACH_TRAP(kern_invalid, 0), /* 53 emul: set_ras_address */
322 MACH_TRAP(kern_invalid, 0), /* 54 */
323 #if MACH_IPC_COMPAT
324 MACH_TRAP(host_self, 0), /* 55 */
325 #else /* MACH_IPC_COMPAT */
326 MACH_TRAP(null_port, 0), /* 55 */
327 #endif /* MACH_IPC_COMPAT */
328 MACH_TRAP(null_port, 0), /* 56 */
329 MACH_TRAP(kern_invalid, 0), /* 57 */
330 MACH_TRAP(kern_invalid, 0), /* 58 */
331 MACH_TRAP_STACK(swtch_pri, 1), /* 59 */
332
333 MACH_TRAP_STACK(swtch, 0), /* 60 */
334 MACH_TRAP_STACK(thread_switch, 3), /* 61 */
335 MACH_TRAP(kern_invalid, 0), /* 62 */
336 MACH_TRAP(kern_invalid, 0), /* 63 */
337 MACH_TRAP(syscall_vm_map, 11), /* 64 */
338 MACH_TRAP(syscall_vm_allocate, 4), /* 65 */
339 MACH_TRAP(syscall_vm_deallocate, 3), /* 66 */
340 MACH_TRAP(kern_invalid, 0), /* 67 */
341 MACH_TRAP(syscall_task_create, 3), /* 68 */
342 MACH_TRAP(syscall_task_terminate, 1), /* 69 */
343
344 MACH_TRAP(syscall_task_suspend, 1), /* 70 */
345 MACH_TRAP(syscall_task_set_special_port, 3), /* 71 */
346 MACH_TRAP(syscall_mach_port_allocate, 3), /* 72 */
347 MACH_TRAP(syscall_mach_port_deallocate, 2), /* 73 */
348 MACH_TRAP(syscall_mach_port_insert_right, 4), /* 74 */
349 MACH_TRAP(syscall_mach_port_allocate_name, 3), /* 75 */
350 MACH_TRAP(syscall_thread_depress_abort, 1), /* 76 */
351 MACH_TRAP(kern_invalid, 0), /* 77 */
352 MACH_TRAP(kern_invalid, 0), /* 78 */
353 MACH_TRAP(kern_invalid, 0), /* 79 */
354
355 #if NET_ATM
356 MACH_TRAP(mk_update,3), /* 80 */
357 MACH_TRAP(mk_lookup,2), /* 81 */
358 MACH_TRAP_STACK(mk_endpoint_allocate,4), /* 82 */
359 MACH_TRAP_STACK(mk_endpoint_deallocate,1), /* 83 */
360 MACH_TRAP(mk_buffer_allocate,2), /* 84 */
361 MACH_TRAP(mk_buffer_deallocate,2), /* 85 */
362 MACH_TRAP_STACK(mk_connection_open,4), /* 86 */
363 MACH_TRAP_STACK(mk_connection_accept,3), /* 87 */
364 MACH_TRAP_STACK(mk_connection_close,1), /* 88 */
365 MACH_TRAP_STACK(mk_multicast_add,4), /* 89 */
366 MACH_TRAP_STACK(mk_multicast_drop,4), /* 90 */
367 MACH_TRAP(mk_endpoint_status,3), /* 91 */
368 MACH_TRAP_STACK(mk_send,3), /* 92 */
369 MACH_TRAP_STACK(mk_receive,2), /* 93 */
370 MACH_TRAP_STACK(mk_rpc,4), /* 94 */
371 MACH_TRAP_STACK(mk_select,3), /* 95 */
372 #else /* NET_ATM */
373 MACH_TRAP(kern_invalid, 0), /* 80 */
374 MACH_TRAP(kern_invalid, 0), /* 81 */
375 MACH_TRAP(kern_invalid, 0), /* 82 */
376 MACH_TRAP(kern_invalid, 0), /* 83 */
377 MACH_TRAP(kern_invalid, 0), /* 84 */
378 MACH_TRAP(kern_invalid, 0), /* 85 */
379 MACH_TRAP(kern_invalid, 0), /* 86 */
380 MACH_TRAP(kern_invalid, 0), /* 87 */
381 MACH_TRAP(kern_invalid, 0), /* 88 */
382 MACH_TRAP(kern_invalid, 0), /* 89 */
383 MACH_TRAP(kern_invalid, 0), /* 90 */
384 MACH_TRAP(kern_invalid, 0), /* 91 */
385 MACH_TRAP(kern_invalid, 0), /* 92 */
386 MACH_TRAP(kern_invalid, 0), /* 93 */
387 MACH_TRAP(kern_invalid, 0), /* 94 */
388 MACH_TRAP(kern_invalid, 0), /* 95 */
389 #endif /* NET_ATM */
390
391 MACH_TRAP(kern_invalid, 0), /* 96 */
392 MACH_TRAP(kern_invalid, 0), /* 97 */
393 MACH_TRAP(kern_invalid, 0), /* 98 */
394 MACH_TRAP(kern_invalid, 0), /* 99 */
395
396 MACH_TRAP(kern_invalid, 0), /* 100 */
397 MACH_TRAP(kern_invalid, 0), /* 101 */
398 MACH_TRAP(kern_invalid, 0), /* 102 */
399 MACH_TRAP(kern_invalid, 0), /* 103 */
400 MACH_TRAP(kern_invalid, 0), /* 104 */
401 MACH_TRAP(kern_invalid, 0), /* 105 */
402 MACH_TRAP(kern_invalid, 0), /* 106 */
403 MACH_TRAP(kern_invalid, 0), /* 107 */
404 MACH_TRAP(kern_invalid, 0), /* 108 */
405 MACH_TRAP(kern_invalid, 0), /* 109 */
406
407 MACH_TRAP(kern_invalid, 0), /* 110 */
408 MACH_TRAP(kern_invalid, 0), /* 111 */
409 MACH_TRAP(kern_invalid, 0), /* 112 */
410 MACH_TRAP(kern_invalid, 0), /* 113 */
411 MACH_TRAP(kern_invalid, 0), /* 114 */
412 MACH_TRAP(kern_invalid, 0), /* 115 */
413 MACH_TRAP(kern_invalid, 0), /* 116 */
414 MACH_TRAP(kern_invalid, 0), /* 117 */
415 MACH_TRAP(kern_invalid, 0), /* 118 */
416 MACH_TRAP(kern_invalid, 0), /* 119 */
417
418 MACH_TRAP(kern_invalid, 0), /* 120 */
419 MACH_TRAP(kern_invalid, 0), /* 121 */
420 MACH_TRAP(kern_invalid, 0), /* 122 */
421 MACH_TRAP(kern_invalid, 0), /* 123 */
422 MACH_TRAP(kern_invalid, 0), /* 124 */
423 MACH_TRAP(kern_invalid, 0), /* 125 */
424 MACH_TRAP(kern_invalid, 0), /* 126 */
425 MACH_TRAP(kern_invalid, 0), /* 127 */
426 MACH_TRAP(kern_invalid, 0), /* 128 */
427 MACH_TRAP(kern_invalid, 0), /* 129 */
428 };
429
430 int mach_trap_count = (sizeof(mach_trap_table) / sizeof(mach_trap_table[0]));
Cache object: fcda7110b782e3e701cdf8d1e269bf48
|