Annotation of sys/arch/arm/arm/syscall.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: syscall.c,v 1.9 2007/04/27 18:45:00 drahn Exp $ */
2: /* $NetBSD: syscall.c,v 1.24 2003/11/14 19:03:17 scw Exp $ */
3:
4: /*-
5: * Copyright (c) 2000, 2003 The NetBSD Foundation, Inc.
6: * All rights reserved.
7: *
8: * This code is derived from software contributed to The NetBSD Foundation
9: * by Charles M. Hannum.
10: *
11: * Redistribution and use in source and binary forms, with or without
12: * modification, are permitted provided that the following conditions
13: * are met:
14: * 1. Redistributions of source code must retain the above copyright
15: * notice, this list of conditions and the following disclaimer.
16: * 2. Redistributions in binary form must reproduce the above copyright
17: * notice, this list of conditions and the following disclaimer in the
18: * documentation and/or other materials provided with the distribution.
19: * 3. All advertising materials mentioning features or use of this software
20: * must display the following acknowledgement:
21: * This product includes software developed by the NetBSD
22: * Foundation, Inc. and its contributors.
23: * 4. Neither the name of The NetBSD Foundation nor the names of its
24: * contributors may be used to endorse or promote products derived
25: * from this software without specific prior written permission.
26: *
27: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
28: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
31: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37: * POSSIBILITY OF SUCH DAMAGE.
38: */
39:
40: /*
41: * Copyright (c) 1994-1998 Mark Brinicombe.
42: * Copyright (c) 1994 Brini.
43: * All rights reserved.
44: *
45: * This code is derived from software written for Brini by Mark Brinicombe
46: *
47: * Redistribution and use in source and binary forms, with or without
48: * modification, are permitted provided that the following conditions
49: * are met:
50: * 1. Redistributions of source code must retain the above copyright
51: * notice, this list of conditions and the following disclaimer.
52: * 2. Redistributions in binary form must reproduce the above copyright
53: * notice, this list of conditions and the following disclaimer in the
54: * documentation and/or other materials provided with the distribution.
55: * 3. All advertising materials mentioning features or use of this software
56: * must display the following acknowledgement:
57: * This product includes software developed by Mark Brinicombe
58: * for the NetBSD Project.
59: * 4. The name of the company nor the name of the author may be used to
60: * endorse or promote products derived from this software without specific
61: * prior written permission.
62: *
63: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
64: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
65: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
66: * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
67: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
68: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
69: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
70: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
71: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
72: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
73: * SUCH DAMAGE.
74: *
75: * syscall entry handling
76: *
77: * Created : 09/11/94
78: */
79:
80: #include <sys/param.h>
81:
82: #include <sys/device.h>
83: #include <sys/errno.h>
84: #include <sys/kernel.h>
85: #include <sys/reboot.h>
86: #include <sys/signalvar.h>
87: #include <sys/syscall.h>
88: #include <sys/systm.h>
89: #include <sys/user.h>
90: #ifdef KTRACE
91: #include <sys/ktrace.h>
92: #endif
93:
94: #include "systrace.h"
95: #include <dev/systrace.h>
96:
97: #include <uvm/uvm_extern.h>
98:
99: #include <machine/cpu.h>
100: #include <machine/frame.h>
101: #include <machine/pcb.h>
102: #include <arm/swi.h>
103:
104: #ifdef acorn26
105: #include <machine/machdep.h>
106: #endif
107:
108: #define MAXARGS 8
109:
110: void
111: swi_handler(trapframe_t *frame)
112: {
113: struct proc *p = curproc;
114: const struct sysent *callp;
115: int code, error, orig_error;
116: u_int nap = 4, nargs;
117: register_t *ap, *args, copyargs[MAXARGS], rval[2];
118:
119: uvmexp.syscalls++;
120:
121: /* Re-enable interrupts if they were enabled previously */
122: if (__predict_true((frame->tf_spsr & I32_bit) == 0))
123: enable_interrupts(I32_bit);
124:
125: p->p_addr->u_pcb.pcb_tf = frame;
126:
127: code = frame->tf_r12;
128:
129: ap = &frame->tf_r0;
130: callp = p->p_emul->e_sysent;
131:
132: switch (code) {
133: case SYS_syscall:
134: code = *ap++;
135: nap--;
136: break;
137: case SYS___syscall:
138: code = ap[_QUAD_LOWWORD];
139: ap += 2;
140: nap -= 2;
141: break;
142: }
143:
144: if (code < 0 || code >= p->p_emul->e_nsysent) {
145: callp += p->p_emul->e_nosys;
146: } else {
147: callp += code;
148: }
149: nargs = callp->sy_argsize / sizeof(register_t);
150: if (nargs <= nap) {
151: args = ap;
152: error = 0;
153: } else {
154: KASSERT(nargs <= MAXARGS);
155: memcpy(copyargs, ap, nap * sizeof(register_t));
156: error = copyin((void *)frame->tf_usr_sp, copyargs + nap,
157: (nargs - nap) * sizeof(register_t));
158: args = copyargs;
159: }
160: orig_error = error;
161: #ifdef SYSCALL_DEBUG
162: scdebug_call(p, code, args);
163: #endif
164: #ifdef KTRACE
165: if (KTRPOINT(p, KTR_SYSCALL))
166: ktrsyscall(p, code, callp->sy_argsize, args);
167: #endif
168: if (error)
169: goto bad;
170:
171: rval[0] = 0;
172: rval[1] = frame->tf_r1;
173: #if NSYSTRACE > 0
174: if (ISSET(p->p_flag, P_SYSTRACE))
175: orig_error = error = systrace_redirect(code, p, args, rval);
176: else
177: #endif
178: orig_error = error = (*callp->sy_call)(p, args, rval);
179:
180: switch (error) {
181: case 0:
182: frame->tf_r0 = rval[0];
183: frame->tf_r1 = rval[1];
184:
185: frame->tf_spsr &= ~PSR_C_bit; /* carry bit */
186: break;
187:
188: case ERESTART:
189: /*
190: * Reconstruct the pc to point at the swi.
191: */
192: frame->tf_pc -= INSN_SIZE;
193: break;
194:
195: case EJUSTRETURN:
196: /* nothing to do */
197: break;
198:
199: default:
200: bad:
201: frame->tf_r0 = error;
202: frame->tf_spsr |= PSR_C_bit; /* carry bit */
203: break;
204: }
205: #ifdef SYSCALL_DEBUG
206: scdebug_ret(p, code, orig_error, rval);
207: #endif
208: userret(p);
209: #ifdef KTRACE
210: if (KTRPOINT(p, KTR_SYSRET))
211: ktrsysret(p, code, orig_error, rval[0]);
212: #endif
213: }
214:
215: void
216: child_return(arg)
217: void *arg;
218: {
219: struct proc *p = arg;
220: struct trapframe *frame = p->p_addr->u_pcb.pcb_tf;
221:
222: frame->tf_r0 = 0;
223: frame->tf_spsr &= ~PSR_C_bit; /* carry bit */
224:
225: userret(p);
226:
227: #ifdef KTRACE
228: if (KTRPOINT(p, KTR_SYSRET)) {
229: ktrsysret(p,
230: (p->p_flag & P_PPWAIT) ? SYS_vfork : SYS_fork, 0, 0);
231: }
232: #endif
233: }
CVSweb