Commit | Line | Data |
---|---|---|
984263bc MD |
1 | /*- |
2 | * Copyright (c) 1982, 1988, 1991 The Regents of the University of California. | |
3 | * All rights reserved. | |
4 | * | |
5 | * Redistribution and use in source and binary forms, with or without | |
6 | * modification, are permitted provided that the following conditions | |
7 | * are met: | |
8 | * 1. Redistributions of source code must retain the above copyright | |
9 | * notice, this list of conditions and the following disclaimer. | |
10 | * 2. Redistributions in binary form must reproduce the above copyright | |
11 | * notice, this list of conditions and the following disclaimer in the | |
12 | * documentation and/or other materials provided with the distribution. | |
2c64e990 | 13 | * 3. Neither the name of the University nor the names of its contributors |
984263bc MD |
14 | * may be used to endorse or promote products derived from this software |
15 | * without specific prior written permission. | |
16 | * | |
17 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
18 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
19 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
20 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
21 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
22 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
23 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
24 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
25 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
26 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
27 | * SUCH DAMAGE. | |
28 | * | |
29 | * $FreeBSD: src/sys/sys/sysent.h,v 1.27.2.5 2002/03/17 11:08:38 alfred Exp $ | |
30 | */ | |
31 | ||
32 | #ifndef _SYS_SYSENT_H_ | |
33 | #define _SYS_SYSENT_H_ | |
34 | ||
1bd40720 MD |
35 | #ifndef _SYS_TYPES_H_ |
36 | #include <sys/types.h> | |
37 | #endif | |
38 | ||
7d20a8ff | 39 | struct lwp; |
80d831e1 | 40 | struct sysmsg; |
984263bc | 41 | |
80d831e1 | 42 | typedef int sy_call_t (struct sysmsg *sysmsg, const void *); |
984263bc MD |
43 | |
44 | struct sysent { /* system call table */ | |
0807c4ed MD |
45 | int32_t sy_narg; /* number of arguments */ |
46 | uint32_t sy_rsize; /* sizeof(result) */ | |
1fa2b4b4 MD |
47 | sy_call_t *sy_call; /* start function */ |
48 | sy_call_t *sy_abort; /* abort function (only if start was async) */ | |
984263bc MD |
49 | }; |
50 | ||
984263bc MD |
51 | struct image_params; |
52 | struct __sigset; | |
53 | struct trapframe; | |
54 | struct vnode; | |
55 | ||
56 | struct sysentvec { | |
57 | int sv_size; /* number of entries */ | |
58 | struct sysent *sv_table; /* pointer to sysent */ | |
984263bc MD |
59 | int sv_sigsize; /* size of signal translation table */ |
60 | int *sv_sigtbl; /* signal translation table */ | |
61 | int sv_errsize; /* size of errno translation table */ | |
62 | int *sv_errtbl; /* errno translation table */ | |
b153f746 | 63 | int (*sv_transtrap) (int, int); |
984263bc | 64 | /* translate trap-to-signal mapping */ |
b153f746 | 65 | int (*sv_fixup) (register_t **, struct image_params *); |
984263bc | 66 | /* stack fixup function */ |
b153f746 RG |
67 | void (*sv_sendsig) (void (*)(int), int, |
68 | struct __sigset *, u_long); | |
984263bc MD |
69 | /* send signal */ |
70 | char *sv_sigcode; /* start of sigtramp code */ | |
71 | int *sv_szsigcode; /* size of sigtramp code */ | |
270ac911 | 72 | /* prep syscall (must be MPSAFE) */ |
984263bc | 73 | char *sv_name; /* name of binary type */ |
7d20a8ff | 74 | int (*sv_coredump) (struct lwp *, int, struct vnode *, |
b153f746 | 75 | off_t); |
984263bc | 76 | /* function to dump core, or NULL */ |
b153f746 | 77 | int (*sv_imgact_try) (struct image_params *); |
984263bc MD |
78 | int sv_minsigstksz; /* minimum signal stack size */ |
79 | }; | |
80 | ||
81 | #ifdef _KERNEL | |
984263bc MD |
82 | extern struct sysent sysent[]; |
83 | ||
84 | #define NO_SYSCALL (-1) | |
85 | ||
86 | struct module; | |
87 | ||
88 | struct syscall_module_data { | |
89 | int (*chainevh)(struct module *, int, void *); /* next handler */ | |
90 | void *chainarg; /* arg for next event handler */ | |
91 | int *offset; /* offset into sysent */ | |
92 | struct sysent *new_sysent; /* new sysent */ | |
93 | struct sysent old_sysent; /* old sysent */ | |
94 | }; | |
95 | ||
96 | #define SYSCALL_MODULE(name, offset, new_sysent, evh, arg) \ | |
97 | static struct syscall_module_data name##_syscall_mod = { \ | |
98 | evh, arg, offset, new_sysent, { 0, NULL } \ | |
99 | }; \ | |
100 | \ | |
101 | static moduledata_t name##_mod = { \ | |
102 | #name, \ | |
103 | syscall_module_handler, \ | |
104 | &name##_syscall_mod \ | |
105 | }; \ | |
106 | DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE) | |
107 | ||
108 | #define SYSCALL_MODULE_HELPER(syscallname) \ | |
109 | static int syscallname##_syscall = SYS_##syscallname; \ | |
110 | static struct sysent syscallname##_sysent = { \ | |
f9a13fc4 MD |
111 | ((sizeof(struct syscallname ## _args ) - sizeof(struct sysmsg)) \ |
112 | / sizeof(register_t)), \ | |
984263bc MD |
113 | (sy_call_t *)& syscallname \ |
114 | }; \ | |
115 | SYSCALL_MODULE(syscallname, \ | |
116 | & syscallname##_syscall, & syscallname##_sysent, \ | |
117 | NULL, NULL); | |
118 | ||
b153f746 RG |
119 | int syscall_register (int *offset, struct sysent *new_sysent, |
120 | struct sysent *old_sysent); | |
121 | int syscall_deregister (int *offset, struct sysent *old_sysent); | |
122 | int syscall_module_handler (struct module *mod, int what, void *arg); | |
984263bc MD |
123 | |
124 | #endif /* _KERNEL */ | |
125 | ||
126 | #endif /* !_SYS_SYSENT_H_ */ |