147 int enabled = (systrace_sysent[sysnum].stsy_entry != DTRACE_IDNONE ||
148 systrace_sysent[sysnum].stsy_return != DTRACE_IDNONE);
149
150 if (SYSTRACE_ISENTRY((uintptr_t)parg)) {
151 systrace_sysent[sysnum].stsy_entry = id;
152 #ifdef _SYSCALL32_IMPL
153 systrace_sysent32[sysnum].stsy_entry = id;
154 #endif
155 } else {
156 systrace_sysent[sysnum].stsy_return = id;
157 #ifdef _SYSCALL32_IMPL
158 systrace_sysent32[sysnum].stsy_return = id;
159 #endif
160 }
161
162 if (enabled) {
163 ASSERT(sysent[sysnum].sy_callc == dtrace_systrace_syscall);
164 return (0);
165 }
166
167 (void) casptr(&sysent[sysnum].sy_callc,
168 (void *)systrace_sysent[sysnum].stsy_underlying,
169 (void *)dtrace_systrace_syscall);
170 #ifdef _SYSCALL32_IMPL
171 (void) casptr(&sysent32[sysnum].sy_callc,
172 (void *)systrace_sysent32[sysnum].stsy_underlying,
173 (void *)dtrace_systrace_syscall32);
174 #endif
175 return (0);
176 }
177
178 /*ARGSUSED*/
179 static void
180 systrace_disable(void *arg, dtrace_id_t id, void *parg)
181 {
182 int sysnum = SYSTRACE_SYSNUM((uintptr_t)parg);
183 int disable = (systrace_sysent[sysnum].stsy_entry == DTRACE_IDNONE ||
184 systrace_sysent[sysnum].stsy_return == DTRACE_IDNONE);
185
186 if (disable) {
187 (void) casptr(&sysent[sysnum].sy_callc,
188 (void *)dtrace_systrace_syscall,
189 (void *)systrace_sysent[sysnum].stsy_underlying);
190
191 #ifdef _SYSCALL32_IMPL
192 (void) casptr(&sysent32[sysnum].sy_callc,
193 (void *)dtrace_systrace_syscall32,
194 (void *)systrace_sysent32[sysnum].stsy_underlying);
195 #endif
196 }
197
198 if (SYSTRACE_ISENTRY((uintptr_t)parg)) {
199 systrace_sysent[sysnum].stsy_entry = DTRACE_IDNONE;
200 #ifdef _SYSCALL32_IMPL
201 systrace_sysent32[sysnum].stsy_entry = DTRACE_IDNONE;
202 #endif
203 } else {
204 systrace_sysent[sysnum].stsy_return = DTRACE_IDNONE;
205 #ifdef _SYSCALL32_IMPL
206 systrace_sysent32[sysnum].stsy_return = DTRACE_IDNONE;
207 #endif
208 }
209 }
210
211 static dtrace_pattr_t systrace_attr = {
212 { DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON },
|
147 int enabled = (systrace_sysent[sysnum].stsy_entry != DTRACE_IDNONE ||
148 systrace_sysent[sysnum].stsy_return != DTRACE_IDNONE);
149
150 if (SYSTRACE_ISENTRY((uintptr_t)parg)) {
151 systrace_sysent[sysnum].stsy_entry = id;
152 #ifdef _SYSCALL32_IMPL
153 systrace_sysent32[sysnum].stsy_entry = id;
154 #endif
155 } else {
156 systrace_sysent[sysnum].stsy_return = id;
157 #ifdef _SYSCALL32_IMPL
158 systrace_sysent32[sysnum].stsy_return = id;
159 #endif
160 }
161
162 if (enabled) {
163 ASSERT(sysent[sysnum].sy_callc == dtrace_systrace_syscall);
164 return (0);
165 }
166
167 (void) atomic_cas_ptr(&sysent[sysnum].sy_callc,
168 (void *)systrace_sysent[sysnum].stsy_underlying,
169 (void *)dtrace_systrace_syscall);
170 #ifdef _SYSCALL32_IMPL
171 (void) atomic_cas_ptr(&sysent32[sysnum].sy_callc,
172 (void *)systrace_sysent32[sysnum].stsy_underlying,
173 (void *)dtrace_systrace_syscall32);
174 #endif
175 return (0);
176 }
177
178 /*ARGSUSED*/
179 static void
180 systrace_disable(void *arg, dtrace_id_t id, void *parg)
181 {
182 int sysnum = SYSTRACE_SYSNUM((uintptr_t)parg);
183 int disable = (systrace_sysent[sysnum].stsy_entry == DTRACE_IDNONE ||
184 systrace_sysent[sysnum].stsy_return == DTRACE_IDNONE);
185
186 if (disable) {
187 (void) atomic_cas_ptr(&sysent[sysnum].sy_callc,
188 (void *)dtrace_systrace_syscall,
189 (void *)systrace_sysent[sysnum].stsy_underlying);
190
191 #ifdef _SYSCALL32_IMPL
192 (void) atomic_cas_ptr(&sysent32[sysnum].sy_callc,
193 (void *)dtrace_systrace_syscall32,
194 (void *)systrace_sysent32[sysnum].stsy_underlying);
195 #endif
196 }
197
198 if (SYSTRACE_ISENTRY((uintptr_t)parg)) {
199 systrace_sysent[sysnum].stsy_entry = DTRACE_IDNONE;
200 #ifdef _SYSCALL32_IMPL
201 systrace_sysent32[sysnum].stsy_entry = DTRACE_IDNONE;
202 #endif
203 } else {
204 systrace_sysent[sysnum].stsy_return = DTRACE_IDNONE;
205 #ifdef _SYSCALL32_IMPL
206 systrace_sysent32[sysnum].stsy_return = DTRACE_IDNONE;
207 #endif
208 }
209 }
210
211 static dtrace_pattr_t systrace_attr = {
212 { DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON },
|