annotate usr/src/uts/sparc/os/syscall.c @ 13082:87f89233b883

6964154 Missing unlock in set_all_zone_usr_proc_sys() 6964159 Missing unlock in immu_quiesce() and immu_unquiesce() 6964162 Pointer dereferenced before NULL check in kcpc_reqs_add() 6964446 Uninitialized variable used in rootnex_coredma_bindhdl() 6965638 Potential memory leak in configure_ffc() 6965642 Freeing variable that may be NULL in kmem_free()
author Ethindra Ramamurthy <Ethindra.Ramamurthy@Sun.COM>
date Wed, 11 Aug 2010 12:52:19 -0400
parents a63258283f8f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
4 * The contents of this file are subject to the terms of the
1972
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
5 * Common Development and Distribution License (the "License").
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
6 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
7 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
9 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
10 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
11 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
12 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
13 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
15 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
16 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
17 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
18 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
19 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
20 */
1048
e29b523f29b4 6309243 gcc and libproc don't get along on SPARC
raf
parents: 769
diff changeset
21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
22 /*
13082
87f89233b883 6964154 Missing unlock in set_all_zone_usr_proc_sys()
Ethindra Ramamurthy <Ethindra.Ramamurthy@Sun.COM>
parents: 11861
diff changeset
23 * Copyright (c) 1991, 2010, Oracle and/or its affiliates. All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
24 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
25
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
26 #include <sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
27 #include <sys/vmparam.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
28 #include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
29 #include <sys/sysmacros.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
30 #include <sys/systm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
31 #include <sys/cmn_err.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
32 #include <sys/signal.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
33 #include <sys/stack.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
34 #include <sys/cred.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
35 #include <sys/user.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
36 #include <sys/debug.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
37 #include <sys/errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
38 #include <sys/proc.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
39 #include <sys/var.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
40 #include <sys/inline.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
41 #include <sys/syscall.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
42 #include <sys/ucontext.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
43 #include <sys/cpuvar.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
44 #include <sys/siginfo.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
45 #include <sys/trap.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
46 #include <sys/machtrap.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
47 #include <sys/sysinfo.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
48 #include <sys/procfs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
49 #include <sys/prsystm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
50 #include <sys/fpu/fpusystm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
51 #include <sys/modctl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
52 #include <sys/aio_impl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
53 #include <c2/audit.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
54 #include <sys/tnf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
55 #include <sys/tnf_probe.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
56 #include <sys/machpcb.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
57 #include <sys/privregs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
58 #include <sys/copyops.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
59 #include <sys/timer.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
60 #include <sys/priv.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
61 #include <sys/msacct.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
62
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
63 int syscalltrace = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
64 #ifdef SYSCALLTRACE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
65 static kmutex_t systrace_lock; /* syscall tracing lock */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
66 #endif /* SYSCALLTRACE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
67
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
68 static krwlock_t *lock_syscall(struct sysent *, uint_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
69
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
70 #ifdef _SYSCALL32_IMPL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
71 static struct sysent *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
72 lwp_getsysent(klwp_t *lwp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
73 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
74 if (lwp_getdatamodel(lwp) == DATAMODEL_NATIVE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
75 return (sysent);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
76 return (sysent32);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
77 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
78 #define LWP_GETSYSENT(lwp) (lwp_getsysent(lwp))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
79 #else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
80 #define LWP_GETSYSENT(lwp) (sysent)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
81 #endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
82
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
83 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
84 * Called to restore the lwp's register window just before
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
85 * returning to user level (only if the registers have been
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
86 * fetched or modified through /proc).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
87 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
88 /*ARGSUSED1*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
89 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
90 xregrestore(klwp_t *lwp, int shared)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
91 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
92 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
93 * If locals+ins were modified by /proc copy them out.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
94 * Also copy to the shared window, if necessary.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
95 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
96 if (lwp->lwp_pcb.pcb_xregstat == XREGMODIFIED) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
97 struct machpcb *mpcb = lwptompcb(lwp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
98 caddr_t sp = (caddr_t)lwptoregs(lwp)->r_sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
99
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
100 size_t rwinsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
101 caddr_t rwp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
102 int is64;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
104 if (lwp_getdatamodel(lwp) == DATAMODEL_LP64) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
105 rwinsize = sizeof (struct rwindow);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
106 rwp = sp + STACK_BIAS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
107 is64 = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
108 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
109 rwinsize = sizeof (struct rwindow32);
1048
e29b523f29b4 6309243 gcc and libproc don't get along on SPARC
raf
parents: 769
diff changeset
110 sp = (caddr_t)(uintptr_t)(caddr32_t)(uintptr_t)sp;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
111 rwp = sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
112 is64 = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
113 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
115 if (is64)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
116 (void) copyout_nowatch(&lwp->lwp_pcb.pcb_xregs,
5753
d64b1f799526 1162981 Remove C2_AUDIT #defines from the kernel and build files
gww
parents: 3828
diff changeset
117 rwp, rwinsize);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
118 else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
119 struct rwindow32 rwindow32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
120 int watched;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
121
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
122 watched = watch_disable_addr(rwp, rwinsize, S_WRITE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
123 rwindow_nto32(&lwp->lwp_pcb.pcb_xregs, &rwindow32);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
124 (void) copyout(&rwindow32, rwp, rwinsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
125 if (watched)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
126 watch_enable_addr(rwp, rwinsize, S_WRITE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
127 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
128
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
129 /* also copy to the user return window */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
130 mpcb->mpcb_rsp[0] = sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
131 mpcb->mpcb_rsp[1] = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
132 bcopy(&lwp->lwp_pcb.pcb_xregs, &mpcb->mpcb_rwin[0],
5753
d64b1f799526 1162981 Remove C2_AUDIT #defines from the kernel and build files
gww
parents: 3828
diff changeset
133 sizeof (lwp->lwp_pcb.pcb_xregs));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
134 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
135 lwp->lwp_pcb.pcb_xregstat = XREGNONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
136 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
137
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
138
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
139 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
140 * Get the arguments to the current system call.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
141 * lwp->lwp_ap normally points to the out regs in the reg structure.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
142 * If the user is going to change the out registers and might want to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
143 * get the args (for /proc tracing), it must copy the args elsewhere
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
144 * via save_syscall_args().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
145 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
146 uint_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
147 get_syscall_args(klwp_t *lwp, long *argp, int *nargsp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
148 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
149 kthread_t *t = lwptot(lwp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
150 uint_t code = t->t_sysnum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
151 long mask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
152 long *ap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
153 int nargs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
154
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
155 if (lwptoproc(lwp)->p_model == DATAMODEL_ILP32)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
156 mask = (uint32_t)0xffffffffU;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
157 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
158 mask = 0xffffffffffffffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
159
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
160 if (code != 0 && code < NSYSCALL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
161
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
162 nargs = LWP_GETSYSENT(lwp)[code].sy_narg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
163
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
164 ASSERT(nargs <= MAXSYSARGS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
165
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
166 *nargsp = nargs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
167 ap = lwp->lwp_ap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
168 while (nargs-- > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
169 *argp++ = *ap++ & mask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
170 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
171 *nargsp = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
172 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
173 return (code);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
174 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
175
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
176 #ifdef _SYSCALL32_IMPL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
177 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
178 * Get the arguments to the current 32-bit system call.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
179 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
180 uint_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
181 get_syscall32_args(klwp_t *lwp, int *argp, int *nargsp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
182 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
183 long args[MAXSYSARGS];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
184 uint_t i, code;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
186 code = get_syscall_args(lwp, args, nargsp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
187 for (i = 0; i != *nargsp; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
188 *argp++ = (int)args[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
189 return (code);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
190 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
191 #endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
192
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
193 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
194 * Save the system call arguments in a safe place.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
195 * lwp->lwp_ap normally points to the out regs in the reg structure.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
196 * If the user is going to change the out registers, g1, or the stack,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
197 * and might want to get the args (for /proc tracing), it must copy
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
198 * the args elsewhere via save_syscall_args().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
199 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
200 * This may be called from stop() even when we're not in a system call.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
201 * Since there's no easy way to tell, this must be safe (not panic).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
202 * If the copyins get data faults, return non-zero.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
203 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
204 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
205 save_syscall_args()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
206 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
207 kthread_t *t = curthread;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
208 klwp_t *lwp = ttolwp(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
209 struct regs *rp = lwptoregs(lwp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
210 uint_t code = t->t_sysnum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
211 uint_t nargs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
212 int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
213 caddr_t ua;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
214 model_t datamodel;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
215
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
216 if (lwp->lwp_argsaved || code == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
217 return (0); /* args already saved or not needed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
218
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
219 if (code >= NSYSCALL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
220 nargs = 0; /* illegal syscall */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
221 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
222 struct sysent *se = LWP_GETSYSENT(lwp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
223 struct sysent *callp = se + code;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
224
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
225 nargs = callp->sy_narg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
226 if (LOADABLE_SYSCALL(callp) && nargs == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
227 krwlock_t *module_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
228
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
229 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
230 * Find out how many arguments the system
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
231 * call uses.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
232 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
233 * We have the property that loaded syscalls
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
234 * never change the number of arguments they
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
235 * use after they've been loaded once. This
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
236 * allows us to stop for /proc tracing without
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
237 * holding the module lock.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
238 * /proc is assured that sy_narg is valid.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
239 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
240 module_lock = lock_syscall(se, code);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
241 nargs = callp->sy_narg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
242 rw_exit(module_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
243 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
244 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
245
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
246 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
247 * Fetch the system call arguments.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
248 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
249 if (nargs == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
250 goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
251
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
252
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
253 ASSERT(nargs <= MAXSYSARGS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
254
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
255 if ((datamodel = lwp_getdatamodel(lwp)) == DATAMODEL_ILP32) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
257 if (rp->r_g1 == 0) { /* indirect syscall */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
258
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
259 lwp->lwp_arg[0] = (uint32_t)rp->r_o1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
260 lwp->lwp_arg[1] = (uint32_t)rp->r_o2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
261 lwp->lwp_arg[2] = (uint32_t)rp->r_o3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
262 lwp->lwp_arg[3] = (uint32_t)rp->r_o4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
263 lwp->lwp_arg[4] = (uint32_t)rp->r_o5;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
264 if (nargs > 5) {
1048
e29b523f29b4 6309243 gcc and libproc don't get along on SPARC
raf
parents: 769
diff changeset
265 ua = (caddr_t)(uintptr_t)(caddr32_t)(uintptr_t)
e29b523f29b4 6309243 gcc and libproc don't get along on SPARC
raf
parents: 769
diff changeset
266 (rp->r_sp + MINFRAME32);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
267 for (i = 5; i < nargs; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
268 uint32_t a;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
269 if (fuword32(ua, &a) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
270 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
271 lwp->lwp_arg[i] = a;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
272 ua += sizeof (a);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
273 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
274 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
275 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
276 lwp->lwp_arg[0] = (uint32_t)rp->r_o0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
277 lwp->lwp_arg[1] = (uint32_t)rp->r_o1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
278 lwp->lwp_arg[2] = (uint32_t)rp->r_o2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
279 lwp->lwp_arg[3] = (uint32_t)rp->r_o3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
280 lwp->lwp_arg[4] = (uint32_t)rp->r_o4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
281 lwp->lwp_arg[5] = (uint32_t)rp->r_o5;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
282 if (nargs > 6) {
1048
e29b523f29b4 6309243 gcc and libproc don't get along on SPARC
raf
parents: 769
diff changeset
283 ua = (caddr_t)(uintptr_t)(caddr32_t)(uintptr_t)
e29b523f29b4 6309243 gcc and libproc don't get along on SPARC
raf
parents: 769
diff changeset
284 (rp->r_sp + MINFRAME32);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
285 for (i = 6; i < nargs; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
286 uint32_t a;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
287 if (fuword32(ua, &a) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
288 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
289 lwp->lwp_arg[i] = a;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
290 ua += sizeof (a);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
291 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
292 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
293 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
294 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
295 ASSERT(datamodel == DATAMODEL_LP64);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
296 lwp->lwp_arg[0] = rp->r_o0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
297 lwp->lwp_arg[1] = rp->r_o1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
298 lwp->lwp_arg[2] = rp->r_o2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
299 lwp->lwp_arg[3] = rp->r_o3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
300 lwp->lwp_arg[4] = rp->r_o4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
301 lwp->lwp_arg[5] = rp->r_o5;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
302 if (nargs > 6) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
303 ua = (caddr_t)rp->r_sp + MINFRAME + STACK_BIAS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
304 for (i = 6; i < nargs; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
305 unsigned long a;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
306 if (fulword(ua, &a) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
307 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
308 lwp->lwp_arg[i] = a;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
309 ua += sizeof (a);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
310 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
311 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
312 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
313
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
314 out:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
315 lwp->lwp_ap = lwp->lwp_arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
316 lwp->lwp_argsaved = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
317 t->t_post_sys = 1; /* so lwp_ap will be reset */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
318 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
319 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
320
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
321 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
322 reset_syscall_args(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
323 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
324 klwp_t *lwp = ttolwp(curthread);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
325
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
326 lwp->lwp_ap = (long *)&lwptoregs(lwp)->r_o0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
327 lwp->lwp_argsaved = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
328 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
329
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
330 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
331 * nonexistent system call-- signal lwp (may want to handle it)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
332 * flag error if lwp won't see signal immediately
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
333 * This works for old or new calling sequence.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
334 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
335 int64_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
336 nosys()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
337 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
338 tsignal(curthread, SIGSYS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
339 return ((int64_t)set_errno(ENOSYS));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
340 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
341
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
342 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
343 * Perform pre-system-call processing, including stopping for tracing,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
344 * auditing, microstate-accounting, etc.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
345 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
346 * This routine is called only if the t_pre_sys flag is set. Any condition
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
347 * requiring pre-syscall handling must set the t_pre_sys flag. If the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
348 * condition is persistent, this routine will repost t_pre_sys.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
349 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
350 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
351 pre_syscall(int arg0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
352 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
353 unsigned int code;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
354 kthread_t *t = curthread;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
355 proc_t *p = ttoproc(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
356 klwp_t *lwp = ttolwp(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
357 struct regs *rp = lwptoregs(lwp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
358 int repost;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
359
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
360 t->t_pre_sys = repost = 0; /* clear pre-syscall processing flag */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
361
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
362 ASSERT(t->t_schedflag & TS_DONT_SWAP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
363
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
364 syscall_mstate(LMS_USER, LMS_SYSTEM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
365
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
366 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
367 * The syscall arguments in the out registers should be pointed to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
368 * by lwp_ap. If the args need to be copied so that the outs can
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
369 * be changed without losing the ability to get the args for /proc,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
370 * they can be saved by save_syscall_args(), and lwp_ap will be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
371 * restored by post_syscall().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
372 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
373 ASSERT(lwp->lwp_ap == (long *)&rp->r_o0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
374
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
375 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
376 * Make sure the thread is holding the latest credentials for the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
377 * process. The credentials in the process right now apply to this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
378 * thread for the entire system call.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
379 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
380 if (t->t_cred != p->p_cred) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
381 cred_t *oldcred = t->t_cred;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
382 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
383 * DTrace accesses t_cred in probe context. t_cred must
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
384 * always be either NULL, or point to a valid, allocated cred
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
385 * structure.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
386 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
387 t->t_cred = crgetcred();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
388 crfree(oldcred);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
389 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
390
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
391 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
392 * Undo special arrangements to single-step the lwp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
393 * so that a debugger will see valid register contents.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
394 * Also so that the pc is valid for syncfpu().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
395 * Also so that a syscall like exec() can be stepped.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
396 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
397 if (lwp->lwp_pcb.pcb_step != STEP_NONE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
398 (void) prundostep();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
399 repost = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
400 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
401
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
402 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
403 * Check for indirect system call in case we stop for tracing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
404 * Don't allow multiple indirection.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
405 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
406 code = t->t_sysnum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
407 if (code == 0 && arg0 != 0) { /* indirect syscall */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
408 code = arg0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
409 t->t_sysnum = arg0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
410 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
411
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
412 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
413 * From the proc(4) manual page:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
414 * When entry to a system call is being traced, the traced process
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
415 * stops after having begun the call to the system but before the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
416 * system call arguments have been fetched from the process.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
417 * If proc changes the args we must refetch them after starting.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
418 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
419 if (PTOU(p)->u_systrap) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
420 if (prismember(&PTOU(p)->u_entrymask, code)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
421 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
422 * Recheck stop condition, now that lock is held.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
423 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
424 mutex_enter(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
425 if (PTOU(p)->u_systrap &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
426 prismember(&PTOU(p)->u_entrymask, code)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
427 stop(PR_SYSENTRY, code);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
428 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
429 * Must refetch args since they were
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
430 * possibly modified by /proc. Indicate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
431 * that the valid copy is in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
432 * registers.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
433 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
434 lwp->lwp_argsaved = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
435 lwp->lwp_ap = (long *)&rp->r_o0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
436 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
437 mutex_exit(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
438 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
439 repost = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
440 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
441
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
442 if (lwp->lwp_sysabort) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
443 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
444 * lwp_sysabort may have been set via /proc while the process
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
445 * was stopped on PR_SYSENTRY. If so, abort the system call.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
446 * Override any error from the copyin() of the arguments.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
447 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
448 lwp->lwp_sysabort = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
449 (void) set_errno(EINTR); /* sets post-sys processing */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
450 t->t_pre_sys = 1; /* repost anyway */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
451 return (1); /* don't do system call, return EINTR */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
452 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
453
11861
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
454 /* begin auditing for this syscall */
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
455 if (audit_active == C2AUDIT_LOADED) {
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
456 uint32_t auditing = au_zone_getstate(NULL);
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
457
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
458 if (auditing & AU_AUDIT_MASK) {
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
459 int error;
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
460 if (error = audit_start(T_SYSCALL, code, auditing, \
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
461 0, lwp)) {
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
462 t->t_pre_sys = 1; /* repost anyway */
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
463 lwp->lwp_error = 0; /* for old drivers */
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
464 return (error);
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
465 }
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
466 repost = 1;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
467 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
468 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
469
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
470 #ifndef NPROBE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
471 /* Kernel probe */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
472 if (tnf_tracing_active) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
473 TNF_PROBE_1(syscall_start, "syscall thread", /* CSTYLED */,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
474 tnf_sysnum, sysnum, t->t_sysnum);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
475 t->t_post_sys = 1; /* make sure post_syscall runs */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
476 repost = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
477 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
478 #endif /* NPROBE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
479
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
480 #ifdef SYSCALLTRACE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
481 if (syscalltrace) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
482 int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
483 long *ap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
484 char *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
485 char *sysname;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
486 struct sysent *callp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
487
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
488 if (code >= NSYSCALL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
489 callp = &nosys_ent; /* nosys has no args */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
490 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
491 callp = LWP_GETSYSENT(lwp) + code;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
492 (void) save_syscall_args();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
493 mutex_enter(&systrace_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
494 printf("%d: ", p->p_pid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
495 if (code >= NSYSCALL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
496 printf("0x%x", code);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
497 else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
498 sysname = mod_getsysname(code);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
499 printf("%s[0x%x]", sysname == NULL ? "NULL" :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
500 sysname, code);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
501 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
502 cp = "(";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
503 for (i = 0, ap = lwp->lwp_ap; i < callp->sy_narg; i++, ap++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
504 printf("%s%lx", cp, *ap);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
505 cp = ", ";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
506 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
507 if (i)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
508 printf(")");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
509 printf(" %s id=0x%p\n", PTOU(p)->u_comm, curthread);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
510 mutex_exit(&systrace_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
511 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
512 #endif /* SYSCALLTRACE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
513
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
514 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
515 * If there was a continuing reason for pre-syscall processing,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
516 * set the t_pre_sys flag for the next system call.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
517 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
518 if (repost)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
519 t->t_pre_sys = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
520 lwp->lwp_error = 0; /* for old drivers */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
521 lwp->lwp_badpriv = PRIV_NONE; /* for privilege tracing */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
522 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
523 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
524
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
525 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
526 * Post-syscall processing. Perform abnormal system call completion
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
527 * actions such as /proc tracing, profiling, signals, preemption, etc.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
528 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
529 * This routine is called only if t_post_sys, t_sig_check, or t_astflag is set.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
530 * Any condition requiring pre-syscall handling must set one of these.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
531 * If the condition is persistent, this routine will repost t_post_sys.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
532 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
533 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
534 post_syscall(long rval1, long rval2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
535 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
536 kthread_t *t = curthread;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
537 proc_t *p = curproc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
538 klwp_t *lwp = ttolwp(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
539 struct regs *rp = lwptoregs(lwp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
540 uint_t error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
541 int code = t->t_sysnum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
542 int repost = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
543 int proc_stop = 0; /* non-zero if stopping for /proc */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
544 int sigprof = 0; /* non-zero if sending SIGPROF */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
545
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
546 t->t_post_sys = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
547
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
548 error = lwp->lwp_errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
549
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
550 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
551 * Code can be zero if this is a new LWP returning after a forkall(),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
552 * other than the one which matches the one in the parent which called
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
553 * forkall(). In these LWPs, skip most of post-syscall activity.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
554 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
555 if (code == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
556 goto sig_check;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
557
11861
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
558 /* put out audit record for this syscall */
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
559 if (AU_AUDITING()) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
560 rval_t rval; /* fix audit_finish() someday */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
561
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
562 /* XX64 -- truncation of 64-bit return values? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
563 rval.r_val1 = (int)rval1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
564 rval.r_val2 = (int)rval2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
565 audit_finish(T_SYSCALL, code, error, &rval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
566 repost = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
567 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
568
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
569 if (curthread->t_pdmsg != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
570 char *m = curthread->t_pdmsg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
571
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
572 uprintf("%s", m);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
573 kmem_free(m, strlen(m) + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
574 curthread->t_pdmsg = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
575 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
576
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
577 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
578 * If we're going to stop for /proc tracing, set the flag and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
579 * save the arguments so that the return values don't smash them.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
580 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
581 if (PTOU(p)->u_systrap) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
582 if (prismember(&PTOU(p)->u_exitmask, code)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
583 proc_stop = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
584 (void) save_syscall_args();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
585 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
586 repost = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
587 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
588
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
589 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
590 * Similarly check to see if SIGPROF might be sent.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
591 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
592 if (curthread->t_rprof != NULL &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
593 curthread->t_rprof->rp_anystate != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
594 (void) save_syscall_args();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
595 sigprof = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
596 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
597
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
598 if (lwp->lwp_eosys == NORMALRETURN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
599 if (error == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
600 #ifdef SYSCALLTRACE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
601 if (syscalltrace) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
602 mutex_enter(&systrace_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
603 printf(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
604 "%d: r_val1=0x%lx, r_val2=0x%lx, id 0x%p\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
605 p->p_pid, rval1, rval2, curthread);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
606 mutex_exit(&systrace_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
607 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
608 #endif /* SYSCALLTRACE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
609 rp->r_tstate &= ~TSTATE_IC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
610 rp->r_o0 = rval1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
611 rp->r_o1 = rval2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
612 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
613 int sig;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
614
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
615 #ifdef SYSCALLTRACE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
616 if (syscalltrace) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
617 mutex_enter(&systrace_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
618 printf("%d: error=%d, id 0x%p\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
619 p->p_pid, error, curthread);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
620 mutex_exit(&systrace_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
621 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
622 #endif /* SYSCALLTRACE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
623 if (error == EINTR && t->t_activefd.a_stale)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
624 error = EBADF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
625 if (error == EINTR &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
626 (sig = lwp->lwp_cursig) != 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
627 sigismember(&PTOU(p)->u_sigrestart, sig) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
628 PTOU(p)->u_signal[sig - 1] != SIG_DFL &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
629 PTOU(p)->u_signal[sig - 1] != SIG_IGN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
630 error = ERESTART;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
631 rp->r_o0 = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
632 rp->r_tstate |= TSTATE_IC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
633 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
634 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
635 * The default action is to redo the trap instruction.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
636 * We increment the pc and npc past it for NORMALRETURN.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
637 * JUSTRETURN has set up a new pc and npc already.
769
9710ecbd3653 6342194 fix for 6260557 broke forkall()
raf
parents: 715
diff changeset
638 * If we are a cloned thread of forkall(), don't
9710ecbd3653 6342194 fix for 6260557 broke forkall()
raf
parents: 715
diff changeset
639 * adjust here because we have already inherited
9710ecbd3653 6342194 fix for 6260557 broke forkall()
raf
parents: 715
diff changeset
640 * the adjusted values from our clone.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
641 */
769
9710ecbd3653 6342194 fix for 6260557 broke forkall()
raf
parents: 715
diff changeset
642 if (!(t->t_flag & T_FORKALL)) {
9710ecbd3653 6342194 fix for 6260557 broke forkall()
raf
parents: 715
diff changeset
643 rp->r_pc = rp->r_npc;
9710ecbd3653 6342194 fix for 6260557 broke forkall()
raf
parents: 715
diff changeset
644 rp->r_npc += 4;
9710ecbd3653 6342194 fix for 6260557 broke forkall()
raf
parents: 715
diff changeset
645 }
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
646 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
647
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
648 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
649 * From the proc(4) manual page:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
650 * When exit from a system call is being traced, the traced process
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
651 * stops on completion of the system call just prior to checking for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
652 * signals and returning to user level. At this point all return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
653 * values have been stored into the traced process's saved registers.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
654 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
655 if (proc_stop) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
656 mutex_enter(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
657 if (PTOU(p)->u_systrap &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
658 prismember(&PTOU(p)->u_exitmask, code))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
659 stop(PR_SYSEXIT, code);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
660 mutex_exit(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
661 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
662
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
663 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
664 * If we are the parent returning from a successful
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
665 * vfork, wait for the child to exec or exit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
666 * This code must be here and not in the bowels of the system
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
667 * so that /proc can intercept exit from vfork in a timely way.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
668 */
3828
ab5910e1f24a 6533431 assertion failed: code == 119 || code == 142, file: ../../intel/ia32/os/syscall.c, line: 607
raf
parents: 3792
diff changeset
669 if (t->t_flag & T_VFPARENT) {
3235
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 1972
diff changeset
670 ASSERT(code == SYS_vfork || code == SYS_forksys);
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 1972
diff changeset
671 ASSERT(rp->r_o1 == 0 && error == 0);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
672 vfwait((pid_t)rval1);
3828
ab5910e1f24a 6533431 assertion failed: code == 119 || code == 142, file: ../../intel/ia32/os/syscall.c, line: 607
raf
parents: 3792
diff changeset
673 t->t_flag &= ~T_VFPARENT;
3235
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 1972
diff changeset
674 }
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
675
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
676 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
677 * If profiling is active, bill the current PC in user-land
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
678 * and keep reposting until profiling is disabled.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
679 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
680 if (p->p_prof.pr_scale) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
681 if (lwp->lwp_oweupc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
682 profil_tick(rp->r_pc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
683 repost = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
684 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
685
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
686 sig_check:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
687 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
688 * Reset flag for next time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
689 * We must do this after stopping on PR_SYSEXIT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
690 * because /proc uses the information in lwp_eosys.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
691 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
692 lwp->lwp_eosys = NORMALRETURN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
693 clear_stale_fd();
769
9710ecbd3653 6342194 fix for 6260557 broke forkall()
raf
parents: 715
diff changeset
694 t->t_flag &= ~T_FORKALL;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
695
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
696 if (t->t_astflag | t->t_sig_check) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
697 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
698 * Turn off the AST flag before checking all the conditions that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
699 * may have caused an AST. This flag is on whenever a signal or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
700 * unusual condition should be handled after the next trap or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
701 * syscall.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
702 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
703 astoff(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
704 t->t_sig_check = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
705
1972
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
706 /*
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
707 * The following check is legal for the following reasons:
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
708 * 1) The thread we are checking, is ourselves, so there is
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
709 * no way the proc can go away.
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
710 * 2) The only time we need to be protected by the
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
711 * lock is if the binding is changed.
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
712 *
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
713 * Note we will still take the lock and check the binding
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
714 * if the condition was true without the lock held. This
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
715 * prevents lock contention among threads owned by the
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
716 * same proc.
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
717 */
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
718
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
719 if (curthread->t_proc_flag & TP_CHANGEBIND) {
1972
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
720 mutex_enter(&p->p_lock);
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
721 if (curthread->t_proc_flag & TP_CHANGEBIND) {
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
722 timer_lwpbind();
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
723 curthread->t_proc_flag &= ~TP_CHANGEBIND;
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
724 }
900a0df1ef21 6295364 post_syscall has lock inefficencies
dv142724
parents: 1048
diff changeset
725 mutex_exit(&p->p_lock);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
726 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
727
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
728 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
729 * for kaio requests on the special kaio poll queue,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
730 * copyout their results to user memory.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
731 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
732 if (p->p_aio)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
733 aio_cleanup(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
734
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
735 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
736 * If this LWP was asked to hold, call holdlwp(), which will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
737 * stop. holdlwps() sets this up and calls pokelwps() which
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
738 * sets the AST flag.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
739 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
740 * Also check TP_EXITLWP, since this is used by fresh new LWPs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
741 * through lwp_rtt(). That flag is set if the lwp_create(2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
742 * syscall failed after creating the LWP.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
743 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
744 if (ISHOLD(p) || (t->t_proc_flag & TP_EXITLWP))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
745 holdlwp();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
746
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
747 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
748 * All code that sets signals and makes ISSIG_PENDING
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
749 * evaluate true must set t_sig_check afterwards.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
750 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
751 if (ISSIG_PENDING(t, lwp, p)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
752 if (issig(FORREAL))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
753 psig();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
754 t->t_sig_check = 1; /* recheck next time */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
755 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
756
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
757 if (sigprof) {
9870
b2e907fa2ec2 6719215 profile timer survives exec; handler does not; process crashes with Profile Timer Expired
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 5753
diff changeset
758 int nargs = (code > 0 && code < NSYSCALL)?
b2e907fa2ec2 6719215 profile timer survives exec; handler does not; process crashes with Profile Timer Expired
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 5753
diff changeset
759 LWP_GETSYSENT(lwp)[code].sy_narg : 0;
b2e907fa2ec2 6719215 profile timer survives exec; handler does not; process crashes with Profile Timer Expired
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 5753
diff changeset
760 realsigprof(code, nargs, error);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
761 t->t_sig_check = 1; /* recheck next time */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
762 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
763
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
764 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
765 * If a performance counter overflow interrupt was
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
766 * delivered *during* the syscall, then re-enable the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
767 * AST so that we take a trip through trap() to cause
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
768 * the SIGEMT to be delivered.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
769 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
770 if (lwp->lwp_pcb.pcb_flags & CPC_OVERFLOW)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
771 aston(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
772
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
773 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
774 * If an asynchronous hardware error is pending, turn AST flag
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
775 * back on. AST will be checked again before we return to user
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
776 * mode and we'll come back through trap() to handle the error.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
777 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
778 if (lwp->lwp_pcb.pcb_flags & ASYNC_HWERR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
779 aston(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
780 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
781
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
782 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
783 * Restore register window if a debugger modified it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
784 * Set up to perform a single-step if a debugger requested it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
785 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
786 if (lwp->lwp_pcb.pcb_xregstat != XREGNONE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
787 xregrestore(lwp, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
788
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
789 lwp->lwp_errno = 0; /* clear error for next time */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
790
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
791 #ifndef NPROBE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
792 /* Kernel probe */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
793 if (tnf_tracing_active) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
794 TNF_PROBE_3(syscall_end, "syscall thread", /* CSTYLED */,
5753
d64b1f799526 1162981 Remove C2_AUDIT #defines from the kernel and build files
gww
parents: 3828
diff changeset
795 tnf_long, rval1, rval1,
d64b1f799526 1162981 Remove C2_AUDIT #defines from the kernel and build files
gww
parents: 3828
diff changeset
796 tnf_long, rval2, rval2,
d64b1f799526 1162981 Remove C2_AUDIT #defines from the kernel and build files
gww
parents: 3828
diff changeset
797 tnf_long, errno, (long)error);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
798 repost = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
799 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
800 #endif /* NPROBE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
801
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
802 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
803 * Set state to LWP_USER here so preempt won't give us a kernel
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
804 * priority if it occurs after this point. Call CL_TRAPRET() to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
805 * restore the user-level priority.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
806 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
807 * It is important that no locks (other than spinlocks) be entered
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
808 * after this point before returning to user mode (unless lwp_state
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
809 * is set back to LWP_SYS).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
810 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
811 * Sampled times past this point are charged to the user.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
812 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
813 lwp->lwp_state = LWP_USER;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
814
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
815 if (t->t_trapret) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
816 t->t_trapret = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
817 thread_lock(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
818 CL_TRAPRET(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
819 thread_unlock(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
820 }
3792
57ba782523b7 PSARC/2004/402 CPU Caps
akolb
parents: 3235
diff changeset
821 if (CPU->cpu_runrun || t->t_schedflag & TS_ANYWAITQ)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
822 preempt();
10230
ea2823eb6ac6 6338698 Application deadlocks on an lwpchan lock when a watchpoint is enabled on a thread stack
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 9870
diff changeset
823 prunstop();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
824
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
825 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
826 * t_post_sys will be set if pcb_step is active.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
827 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
828 if (lwp->lwp_pcb.pcb_step != STEP_NONE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
829 prdostep();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
830 repost = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
831 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
832
715
dff3e101c534 6260557 sparc post_syscall handler clears t_sysnum earlier than x86
rab
parents: 0
diff changeset
833 t->t_sysnum = 0; /* no longer in a system call */
dff3e101c534 6260557 sparc post_syscall handler clears t_sysnum earlier than x86
rab
parents: 0
diff changeset
834
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
835 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
836 * In case the args were copied to the lwp, reset the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
837 * pointer so the next syscall will have the right lwp_ap pointer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
838 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
839 lwp->lwp_ap = (long *)&rp->r_o0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
840 lwp->lwp_argsaved = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
841
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
842 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
843 * If there was a continuing reason for post-syscall processing,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
844 * set the t_post_sys flag for the next system call.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
845 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
846 if (repost)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
847 t->t_post_sys = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
848
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
849 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
850 * If there is a ustack registered for this lwp, and the stack rlimit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
851 * has been altered, read in the ustack. If the saved stack rlimit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
852 * matches the bounds of the ustack, update the ustack to reflect
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
853 * the new rlimit. If the new stack rlimit is RLIM_INFINITY, disable
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
854 * stack checking by setting the size to 0.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
855 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
856 if (lwp->lwp_ustack != 0 && lwp->lwp_old_stk_ctl != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
857 rlim64_t new_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
858 model_t model;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
859 caddr_t top;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
860 struct rlimit64 rl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
861
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
862 mutex_enter(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
863 new_size = p->p_stk_ctl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
864 model = p->p_model;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
865 top = p->p_usrstack;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
866 (void) rctl_rlimit_get(rctlproc_legacy[RLIMIT_STACK], p, &rl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
867 mutex_exit(&p->p_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
868
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
869 if (rl.rlim_cur == RLIM64_INFINITY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
870 new_size = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
871
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
872 if (model == DATAMODEL_NATIVE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
873 stack_t stk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
874
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
875 if (copyin((stack_t *)lwp->lwp_ustack, &stk,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
876 sizeof (stack_t)) == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
877 (stk.ss_size == lwp->lwp_old_stk_ctl ||
5753
d64b1f799526 1162981 Remove C2_AUDIT #defines from the kernel and build files
gww
parents: 3828
diff changeset
878 stk.ss_size == 0) &&
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
879 stk.ss_sp == top - stk.ss_size) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
880 stk.ss_sp = (void *)((uintptr_t)stk.ss_sp +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
881 stk.ss_size - new_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
882 stk.ss_size = new_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
883
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
884 (void) copyout(&stk,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
885 (stack_t *)lwp->lwp_ustack,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
886 sizeof (stack_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
887 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
888 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
889 stack32_t stk32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
890
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
891 if (copyin((stack32_t *)lwp->lwp_ustack, &stk32,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
892 sizeof (stack32_t)) == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
893 (stk32.ss_size == lwp->lwp_old_stk_ctl ||
1048
e29b523f29b4 6309243 gcc and libproc don't get along on SPARC
raf
parents: 769
diff changeset
894 stk32.ss_size == 0) &&
e29b523f29b4 6309243 gcc and libproc don't get along on SPARC
raf
parents: 769
diff changeset
895 stk32.ss_sp ==
e29b523f29b4 6309243 gcc and libproc don't get along on SPARC
raf
parents: 769
diff changeset
896 (caddr32_t)(uintptr_t)(top - stk32.ss_size)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
897 stk32.ss_sp += stk32.ss_size - new_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
898 stk32.ss_size = new_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
899
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
900 (void) copyout(&stk32,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
901 (stack32_t *)lwp->lwp_ustack,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
902 sizeof (stack32_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
903 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
904 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
905
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
906 lwp->lwp_old_stk_ctl = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
907 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
908
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
909 syscall_mstate(LMS_SYSTEM, LMS_USER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
910 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
911
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
912 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
913 * Call a system call which takes a pointer to the user args struct and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
914 * a pointer to the return values. This is a bit slower than the standard
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
915 * C arg-passing method in some cases.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
916 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
917 int64_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
918 syscall_ap()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
919 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
920 uint_t error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
921 struct sysent *callp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
922 rval_t rval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
923 klwp_t *lwp = ttolwp(curthread);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
924 struct regs *rp = lwptoregs(lwp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
925
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
926 callp = LWP_GETSYSENT(lwp) + curthread->t_sysnum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
927
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
928 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
929 * If the arguments don't fit in registers %o0 - o5, make sure they
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
930 * have been copied to the lwp_arg array.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
931 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
932 if (callp->sy_narg > 6 && save_syscall_args())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
933 return ((int64_t)set_errno(EFAULT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
934
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
935 rval.r_val1 = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
936 rval.r_val2 = (int)rp->r_o1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
937 lwp->lwp_error = 0; /* for old drivers */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
938 error = (*(callp->sy_call))(lwp->lwp_ap, &rval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
939 if (error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
940 return ((int64_t)set_errno(error));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
941 return (rval.r_vals);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
942 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
943
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
944 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
945 * Load system call module.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
946 * Returns with pointer to held read lock for module.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
947 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
948 static krwlock_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
949 lock_syscall(struct sysent *table, uint_t code)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
950 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
951 krwlock_t *module_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
952 struct modctl *modp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
953 int id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
954 struct sysent *callp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
955
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
956 module_lock = table[code].sy_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
957 callp = &table[code];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
958
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
959 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
960 * Optimization to only call modload if we don't have a loaded
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
961 * syscall.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
962 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
963 rw_enter(module_lock, RW_READER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
964 if (LOADED_SYSCALL(callp))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
965 return (module_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
966 rw_exit(module_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
967
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
968 for (;;) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
969 if ((id = modload("sys", syscallnames[code])) == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
970 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
971
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
972 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
973 * If we loaded successfully at least once, the modctl
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
974 * will still be valid, so we try to grab it by filename.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
975 * If this call fails, it's because the mod_filename
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
976 * was changed after the call to modload() (mod_hold_by_name()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
977 * is the likely culprit). We can safely just take
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
978 * another lap if this is the case; the modload() will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
979 * change the mod_filename back to one by which we can
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
980 * find the modctl.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
981 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
982 modp = mod_find_by_filename("sys", syscallnames[code]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
983
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
984 if (modp == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
985 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
986
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
987 mutex_enter(&mod_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
988
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
989 if (!modp->mod_installed) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
990 mutex_exit(&mod_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
991 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
992 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
993 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
994 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
995
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
996 rw_enter(module_lock, RW_READER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
997
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
998 if (id != -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
999 mutex_exit(&mod_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1001 return (module_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1002 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1003
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1004 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1005 * Loadable syscall support.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1006 * If needed, load the module, then reserve it by holding a read
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1007 * lock for the duration of the call.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1008 * Later, if the syscall is not unloadable, it could patch the vector.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1009 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1010 /*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1011 int64_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1012 loadable_syscall(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1013 long a0, long a1, long a2, long a3,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1014 long a4, long a5, long a6, long a7)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1015 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1016 int64_t rval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1017 struct sysent *callp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1018 struct sysent *se = LWP_GETSYSENT(ttolwp(curthread));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1019 krwlock_t *module_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1020 int code;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1021
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1022 code = curthread->t_sysnum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1023 callp = se + code;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1024
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1025 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1026 * Try to autoload the system call if necessary.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1027 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1028 module_lock = lock_syscall(se, code);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1029 THREAD_KPRI_RELEASE(); /* drop priority given by rw_enter */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1030
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1031 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1032 * we've locked either the loaded syscall or nosys
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1033 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1034 if (callp->sy_flags & SE_ARGC) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1035 int64_t (*sy_call)();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1036
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1037 sy_call = (int64_t (*)())callp->sy_call;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1038 rval = (*sy_call)(a0, a1, a2, a3, a4, a5);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1039 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1040 rval = syscall_ap();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1041 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1042
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1043 THREAD_KPRI_REQUEST(); /* regain priority from read lock */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1044 rw_exit(module_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1045 return (rval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1046 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1047
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1048 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1049 * Handle indirect system calls.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1050 * This interface should be deprecated. The library can handle
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1051 * this more efficiently, but keep this implementation for old binaries.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1052 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1053 * XX64 Needs some work.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1054 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1055 int64_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1056 indir(int code, long a0, long a1, long a2, long a3, long a4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1057 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1058 klwp_t *lwp = ttolwp(curthread);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1059 struct sysent *callp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1060
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1061 if (code <= 0 || code >= NSYSCALL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1062 return (nosys());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1063
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1064 ASSERT(lwp->lwp_ap != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1065
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1066 curthread->t_sysnum = code;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1067 callp = LWP_GETSYSENT(lwp) + code;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1068
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1069 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1070 * Handle argument setup, unless already done in pre_syscall().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1071 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1072 if (callp->sy_narg > 5) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1073 if (save_syscall_args()) /* move args to LWP array */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1074 return ((int64_t)set_errno(EFAULT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1075 } else if (!lwp->lwp_argsaved) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1076 long *ap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1077
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1078 ap = lwp->lwp_ap; /* args haven't been saved */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1079 lwp->lwp_ap = ap + 1; /* advance arg pointer */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1080 curthread->t_post_sys = 1; /* so lwp_ap will be reset */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1081 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1082 return ((*callp->sy_callc)(a0, a1, a2, a3, a4, lwp->lwp_arg[5]));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1083 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1084
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1085 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1086 * set_errno - set an error return from the current system call.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1087 * This could be a macro.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1088 * This returns the value it is passed, so that the caller can
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1089 * use tail-recursion-elimination and do return (set_errno(ERRNO));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1090 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1091 uint_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1092 set_errno(uint_t error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1093 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1094 ASSERT(error != 0); /* must not be used to clear errno */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1095
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1096 curthread->t_post_sys = 1; /* have post_syscall do error return */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1097 return (ttolwp(curthread)->lwp_errno = error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1098 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1099
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1100 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1101 * set_proc_pre_sys - Set pre-syscall processing for entire process.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1102 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1103 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1104 set_proc_pre_sys(proc_t *p)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1105 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1106 kthread_t *t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1107 kthread_t *first;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1109 ASSERT(MUTEX_HELD(&p->p_lock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1110
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1111 t = first = p->p_tlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1112 do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1113 t->t_pre_sys = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1114 } while ((t = t->t_forw) != first);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1115 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1117 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1118 * set_proc_post_sys - Set post-syscall processing for entire process.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1119 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1120 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1121 set_proc_post_sys(proc_t *p)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1122 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1123 kthread_t *t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1124 kthread_t *first;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1125
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1126 ASSERT(MUTEX_HELD(&p->p_lock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1127
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1128 t = first = p->p_tlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1129 do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1130 t->t_post_sys = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1131 } while ((t = t->t_forw) != first);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1132 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1133
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1134 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1135 * set_proc_sys - Set pre- and post-syscall processing for entire process.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1136 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1137 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1138 set_proc_sys(proc_t *p)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1139 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1140 kthread_t *t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1141 kthread_t *first;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1142
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1143 ASSERT(MUTEX_HELD(&p->p_lock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1144
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1145 t = first = p->p_tlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1146 do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1147 t->t_pre_sys = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1148 t->t_post_sys = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1149 } while ((t = t->t_forw) != first);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1150 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1151
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1152 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1153 * set_all_proc_sys - set pre- and post-syscall processing flags for all
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1154 * user processes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1155 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1156 * This is needed when auditing, tracing, or other facilities which affect
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1157 * all processes are turned on.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1158 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1159 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1160 set_all_proc_sys()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1161 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1162 kthread_t *t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1163 kthread_t *first;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1164
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1165 mutex_enter(&pidlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1166 t = first = curthread;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1167 do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1168 t->t_pre_sys = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1169 t->t_post_sys = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1170 } while ((t = t->t_next) != first);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1171 mutex_exit(&pidlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1172 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1173
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1174 /*
11861
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1175 * set_all_zone_usr_proc_sys - set pre- and post-syscall processing flags for
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1176 * all user processes running in the zone of the current process
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1177 *
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1178 * This is needed when auditing is turned on.
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1179 */
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1180 void
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1181 set_all_zone_usr_proc_sys(zoneid_t zoneid)
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1182 {
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1183 proc_t *p;
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1184 kthread_t *t;
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1185
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1186 mutex_enter(&pidlock);
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1187 for (p = practive; p != NULL; p = p->p_next) {
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1188 /* skip kernel processes */
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1189 if (p->p_exec == NULLVP || p->p_as == &kas ||
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1190 p->p_stat == SIDL || p->p_stat == SZOMB ||
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1191 (p->p_flag & (SSYS | SEXITING | SEXITLWPS)))
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1192 continue;
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1193 /*
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1194 * Only processes in the given zone (eventually in
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1195 * all zones) are taken into account
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1196 */
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1197 if (zoneid == ALL_ZONES || p->p_zone->zone_id == zoneid) {
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1198 mutex_enter(&p->p_lock);
13082
87f89233b883 6964154 Missing unlock in set_all_zone_usr_proc_sys()
Ethindra Ramamurthy <Ethindra.Ramamurthy@Sun.COM>
parents: 11861
diff changeset
1199 if ((t = p->p_tlist) == NULL) {
87f89233b883 6964154 Missing unlock in set_all_zone_usr_proc_sys()
Ethindra Ramamurthy <Ethindra.Ramamurthy@Sun.COM>
parents: 11861
diff changeset
1200 mutex_exit(&p->p_lock);
11861
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1201 continue;
13082
87f89233b883 6964154 Missing unlock in set_all_zone_usr_proc_sys()
Ethindra Ramamurthy <Ethindra.Ramamurthy@Sun.COM>
parents: 11861
diff changeset
1202 }
11861
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1203 /*
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1204 * Set pre- and post-syscall processing flags
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1205 * for all threads of the process
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1206 */
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1207 do {
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1208 t->t_pre_sys = 1;
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1209 t->t_post_sys = 1;
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1210 } while (p->p_tlist != (t = t->t_forw));
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1211 mutex_exit(&p->p_lock);
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1212 }
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1213 }
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1214 mutex_exit(&pidlock);
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1215 }
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1216
a63258283f8f PSARC/2009/354 Always on / no reboot Solaris Audit
Marek Pospisil <Marek.Pospisil@Sun.COM>
parents: 10230
diff changeset
1217 /*
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1218 * set_proc_ast - Set asynchronous service trap (AST) flag for all
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1219 * threads in process.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1220 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1221 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1222 set_proc_ast(proc_t *p)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1223 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1224 kthread_t *t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1225 kthread_t *first;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1226
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1227 ASSERT(MUTEX_HELD(&p->p_lock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1228
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1229 t = first = p->p_tlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1230 do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1231 aston(t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1232 } while ((t = t->t_forw) != first);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1233 }