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