1 | /* $NetBSD: syscallvar.h,v 1.11 2015/09/24 14:34:22 christos Exp $ */ |
2 | |
3 | /*- |
4 | * Copyright (c) 2008 The NetBSD Foundation, Inc. |
5 | * All rights reserved. |
6 | * |
7 | * This code is derived from software developed for The NetBSD Foundation |
8 | * by Andrew Doran. |
9 | * |
10 | * Redistribution and use in source and binary forms, with or without |
11 | * modification, are permitted provided that the following conditions |
12 | * are met: |
13 | * 1. Redistributions of source code must retain the above copyright |
14 | * notice, this list of conditions and the following disclaimer. |
15 | * 2. Redistributions in binary form must reproduce the above copyright |
16 | * notice, this list of conditions and the following disclaimer in the |
17 | * documentation and/or other materials provided with the distribution. |
18 | * |
19 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS |
20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS |
23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
29 | * POSSIBILITY OF SUCH DAMAGE. |
30 | */ |
31 | |
32 | #ifndef _SYS_SYSCALLVAR_H_ |
33 | #define _SYS_SYSCALLVAR_H_ |
34 | |
35 | #ifndef _KERNEL |
36 | #error nothing of interest to userspace here |
37 | #endif |
38 | |
39 | #if defined(_KERNEL) && defined(_KERNEL_OPT) |
40 | #include "opt_dtrace.h" |
41 | #endif |
42 | |
43 | #include <sys/systm.h> |
44 | #include <sys/proc.h> |
45 | |
46 | extern struct emul emul_netbsd; |
47 | |
48 | struct syscall_package { |
49 | u_short sp_code; |
50 | u_short sp_flags; |
51 | sy_call_t *sp_call; |
52 | }; |
53 | |
54 | void syscall_init(void); |
55 | int syscall_establish(const struct emul *, const struct syscall_package *); |
56 | int syscall_disestablish(const struct emul *, const struct syscall_package *); |
57 | |
58 | static inline int |
59 | sy_call(const struct sysent *sy, struct lwp *l, const void *uap, |
60 | register_t *rval) |
61 | { |
62 | int error; |
63 | |
64 | l->l_sysent = sy; |
65 | error = (*sy->sy_call)(l, uap, rval); |
66 | l->l_sysent = NULL; |
67 | |
68 | return error; |
69 | } |
70 | |
71 | static inline int |
72 | sy_invoke(const struct sysent *sy, struct lwp *l, const void *uap, |
73 | register_t *rval, int code) |
74 | { |
75 | const bool do_trace = l->l_proc->p_trace_enabled && |
76 | (sy->sy_flags & SYCALL_INDIRECT) == 0; |
77 | int error; |
78 | |
79 | #ifdef KDTRACE_HOOKS |
80 | #define KDTRACE_ENTRY(a) (a) |
81 | #else |
82 | #define KDTRACE_ENTRY(a) (0) |
83 | #endif |
84 | if (__predict_true(!(do_trace || KDTRACE_ENTRY(sy->sy_entry))) |
85 | || (error = trace_enter(code, sy, uap)) == 0) { |
86 | rval[0] = 0; |
87 | #if !defined(__mips__) && !defined(__m68k__) |
88 | /* |
89 | * Due to the mips userland code for SYS_break needing v1 to be |
90 | * preserved, we can't clear this on mips. |
91 | */ |
92 | rval[1] = 0; |
93 | #endif |
94 | error = sy_call(sy, l, uap, rval); |
95 | } |
96 | |
97 | if (__predict_false(do_trace || KDTRACE_ENTRY(sy->sy_return))) { |
98 | trace_exit(code, sy, uap, rval, error); |
99 | } |
100 | return error; |
101 | } |
102 | |
103 | /* inclusion in the kernel currently depends on SYSCALL_DEBUG */ |
104 | extern const char * const syscallnames[]; |
105 | extern const char * const altsyscallnames[]; |
106 | |
107 | #endif /* _SYS_SYSCALLVAR_H_ */ |
108 | |