Annotation of src/sys/kern/sys_syscall.c, Revision 1.9
1.9 ! martin 1: /* $NetBSD: sys_syscall.c,v 1.8 2008/02/06 22:12:42 dsl Exp $ */
1.1 dsl 2:
3: /*-
4: * Copyright (c) 2006 The NetBSD Foundation, Inc.
5: * All rights reserved.
6: *
7: * This code is derived from software contributed to The NetBSD Foundation
8: * by David Laight.
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: #include <sys/cdefs.h>
1.9 ! martin 33: __KERNEL_RCSID(0, "$NetBSD: sys_syscall.c,v 1.8 2008/02/06 22:12:42 dsl Exp $");
1.1 dsl 34:
35: #include <sys/syscall_stats.h>
36:
37: /*
38: * MI indirect system call support.
39: * Included from sys_indirect.c and compat/netbsd32/netbsd32_indirect.c
40: *
41: * SYS_SYSCALL is set to the required function name.
42: */
43:
44: #define CONCAT(a,b) __CONCAT(a,b)
45:
46: int
1.4 dsl 47: SYS_SYSCALL(struct lwp *l, const struct CONCAT(SYS_SYSCALL, _args) *uap,
48: register_t *rval)
1.1 dsl 49: {
1.3 dsl 50: /* {
1.1 dsl 51: syscallarg(int) code;
52: syscallarg(register_t) args[SYS_MAXSYSARGS];
1.3 dsl 53: } */
1.1 dsl 54: const struct sysent *callp;
55: struct proc *p = l->l_proc;
56: int code;
57: int error;
1.8 dsl 58: int narg;
1.1 dsl 59: #ifdef NETBSD32_SYSCALL
60: register_t args64[SYS_MAXSYSARGS];
1.8 dsl 61: int i;
1.1 dsl 62: #define TRACE_ARGS args64
63: #else
1.5 dsl 64: #define TRACE_ARGS &SCARG(uap, args[0])
1.1 dsl 65: #endif
66:
67: callp = p->p_emul->e_sysent;
68:
69: code = SCARG(uap, code) & (SYS_NSYSENT - 1);
70: SYSCALL_COUNT(syscall_counts, code);
71: callp += code;
72:
73: if (__predict_false(callp->sy_flags & SYCALL_INDIRECT))
74: return ENOSYS;
75:
76: if (__predict_true(!p->p_trace_enabled))
77: return callp->sy_call(l, &uap->args, rval);
78:
1.8 dsl 79: narg = callp->sy_narg;
1.1 dsl 80: #ifdef NETBSD32_SYSCALL
81: for (i = 0; i < narg; i++)
82: args64[i] = SCARG(uap, args[i]);
83: #endif
84:
1.8 dsl 85: error = trace_enter(code, TRACE_ARGS, narg);
1.1 dsl 86: if (__predict_false(error != 0))
87: return error;
88: error = callp->sy_call(l, &uap->args, rval);
1.8 dsl 89: trace_exit(code, rval, error);
1.1 dsl 90: return error;
91:
92: #undef TRACE_ARGS
93: }
CVSweb <webmaster@jp.NetBSD.org>