summaryrefslogtreecommitdiffstats
path: root/cddl/contrib/opensolaris/uts/common/dtrace/systrace.c
diff options
context:
space:
mode:
Diffstat (limited to 'cddl/contrib/opensolaris/uts/common/dtrace/systrace.c')
-rw-r--r--cddl/contrib/opensolaris/uts/common/dtrace/systrace.c373
1 files changed, 0 insertions, 373 deletions
diff --git a/cddl/contrib/opensolaris/uts/common/dtrace/systrace.c b/cddl/contrib/opensolaris/uts/common/dtrace/systrace.c
deleted file mode 100644
index be14660..0000000
--- a/cddl/contrib/opensolaris/uts/common/dtrace/systrace.c
+++ /dev/null
@@ -1,373 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#include <sys/dtrace.h>
-#include <sys/systrace.h>
-#include <sys/stat.h>
-#include <sys/systm.h>
-#include <sys/conf.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/atomic.h>
-
-#define SYSTRACE_ARTIFICIAL_FRAMES 1
-
-#define SYSTRACE_SHIFT 16
-#define SYSTRACE_ISENTRY(x) ((int)(x) >> SYSTRACE_SHIFT)
-#define SYSTRACE_SYSNUM(x) ((int)(x) & ((1 << SYSTRACE_SHIFT) - 1))
-#define SYSTRACE_ENTRY(id) ((1 << SYSTRACE_SHIFT) | (id))
-#define SYSTRACE_RETURN(id) (id)
-
-#if ((1 << SYSTRACE_SHIFT) <= NSYSCALL)
-#error 1 << SYSTRACE_SHIFT must exceed number of system calls
-#endif
-
-static dev_info_t *systrace_devi;
-static dtrace_provider_id_t systrace_id;
-
-static void
-systrace_init(struct sysent *actual, systrace_sysent_t **interposed)
-{
- systrace_sysent_t *sysent = *interposed;
- int i;
-
- if (sysent == NULL) {
- *interposed = sysent = kmem_zalloc(sizeof (systrace_sysent_t) *
- NSYSCALL, KM_SLEEP);
- }
-
- for (i = 0; i < NSYSCALL; i++) {
- struct sysent *a = &actual[i];
- systrace_sysent_t *s = &sysent[i];
-
- if (LOADABLE_SYSCALL(a) && !LOADED_SYSCALL(a))
- continue;
-
- if (a->sy_callc == dtrace_systrace_syscall)
- continue;
-
-#ifdef _SYSCALL32_IMPL
- if (a->sy_callc == dtrace_systrace_syscall32)
- continue;
-#endif
-
- s->stsy_underlying = a->sy_callc;
- }
-}
-
-/*ARGSUSED*/
-static void
-systrace_provide(void *arg, const dtrace_probedesc_t *desc)
-{
- int i;
-
- if (desc != NULL)
- return;
-
- systrace_init(sysent, &systrace_sysent);
-#ifdef _SYSCALL32_IMPL
- systrace_init(sysent32, &systrace_sysent32);
-#endif
-
- for (i = 0; i < NSYSCALL; i++) {
- if (systrace_sysent[i].stsy_underlying == NULL)
- continue;
-
- if (dtrace_probe_lookup(systrace_id, NULL,
- syscallnames[i], "entry") != 0)
- continue;
-
- (void) dtrace_probe_create(systrace_id, NULL, syscallnames[i],
- "entry", SYSTRACE_ARTIFICIAL_FRAMES,
- (void *)((uintptr_t)SYSTRACE_ENTRY(i)));
- (void) dtrace_probe_create(systrace_id, NULL, syscallnames[i],
- "return", SYSTRACE_ARTIFICIAL_FRAMES,
- (void *)((uintptr_t)SYSTRACE_RETURN(i)));
-
- systrace_sysent[i].stsy_entry = DTRACE_IDNONE;
- systrace_sysent[i].stsy_return = DTRACE_IDNONE;
-#ifdef _SYSCALL32_IMPL
- systrace_sysent32[i].stsy_entry = DTRACE_IDNONE;
- systrace_sysent32[i].stsy_return = DTRACE_IDNONE;
-#endif
- }
-}
-
-/*ARGSUSED*/
-static void
-systrace_destroy(void *arg, dtrace_id_t id, void *parg)
-{
- int sysnum = SYSTRACE_SYSNUM((uintptr_t)parg);
-
- /*
- * There's nothing to do here but assert that we have actually been
- * disabled.
- */
- if (SYSTRACE_ISENTRY((uintptr_t)parg)) {
- ASSERT(systrace_sysent[sysnum].stsy_entry == DTRACE_IDNONE);
-#ifdef _SYSCALL32_IMPL
- ASSERT(systrace_sysent32[sysnum].stsy_entry == DTRACE_IDNONE);
-#endif
- } else {
- ASSERT(systrace_sysent[sysnum].stsy_return == DTRACE_IDNONE);
-#ifdef _SYSCALL32_IMPL
- ASSERT(systrace_sysent32[sysnum].stsy_return == DTRACE_IDNONE);
-#endif
- }
-}
-
-/*ARGSUSED*/
-static void
-systrace_enable(void *arg, dtrace_id_t id, void *parg)
-{
- int sysnum = SYSTRACE_SYSNUM((uintptr_t)parg);
- int enabled = (systrace_sysent[sysnum].stsy_entry != DTRACE_IDNONE ||
- systrace_sysent[sysnum].stsy_return != DTRACE_IDNONE);
-
- if (SYSTRACE_ISENTRY((uintptr_t)parg)) {
- systrace_sysent[sysnum].stsy_entry = id;
-#ifdef _SYSCALL32_IMPL
- systrace_sysent32[sysnum].stsy_entry = id;
-#endif
- } else {
- systrace_sysent[sysnum].stsy_return = id;
-#ifdef _SYSCALL32_IMPL
- systrace_sysent32[sysnum].stsy_return = id;
-#endif
- }
-
- if (enabled) {
- ASSERT(sysent[sysnum].sy_callc == dtrace_systrace_syscall);
- return;
- }
-
- (void) casptr(&sysent[sysnum].sy_callc,
- (void *)systrace_sysent[sysnum].stsy_underlying,
- (void *)dtrace_systrace_syscall);
-#ifdef _SYSCALL32_IMPL
- (void) casptr(&sysent32[sysnum].sy_callc,
- (void *)systrace_sysent32[sysnum].stsy_underlying,
- (void *)dtrace_systrace_syscall32);
-#endif
-}
-
-/*ARGSUSED*/
-static void
-systrace_disable(void *arg, dtrace_id_t id, void *parg)
-{
- int sysnum = SYSTRACE_SYSNUM((uintptr_t)parg);
- int disable = (systrace_sysent[sysnum].stsy_entry == DTRACE_IDNONE ||
- systrace_sysent[sysnum].stsy_return == DTRACE_IDNONE);
-
- if (disable) {
- (void) casptr(&sysent[sysnum].sy_callc,
- (void *)dtrace_systrace_syscall,
- (void *)systrace_sysent[sysnum].stsy_underlying);
-
-#ifdef _SYSCALL32_IMPL
- (void) casptr(&sysent32[sysnum].sy_callc,
- (void *)dtrace_systrace_syscall32,
- (void *)systrace_sysent32[sysnum].stsy_underlying);
-#endif
- }
-
- if (SYSTRACE_ISENTRY((uintptr_t)parg)) {
- systrace_sysent[sysnum].stsy_entry = DTRACE_IDNONE;
-#ifdef _SYSCALL32_IMPL
- systrace_sysent32[sysnum].stsy_entry = DTRACE_IDNONE;
-#endif
- } else {
- systrace_sysent[sysnum].stsy_return = DTRACE_IDNONE;
-#ifdef _SYSCALL32_IMPL
- systrace_sysent32[sysnum].stsy_return = DTRACE_IDNONE;
-#endif
- }
-}
-
-static dtrace_pattr_t systrace_attr = {
-{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON },
-{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN },
-{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA },
-{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON },
-{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA },
-};
-
-static dtrace_pops_t systrace_pops = {
- systrace_provide,
- NULL,
- systrace_enable,
- systrace_disable,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- systrace_destroy
-};
-
-static int
-systrace_attach(dev_info_t *devi, ddi_attach_cmd_t cmd)
-{
- switch (cmd) {
- case DDI_ATTACH:
- break;
- case DDI_RESUME:
- return (DDI_SUCCESS);
- default:
- return (DDI_FAILURE);
- }
-
- systrace_probe = (void (*)())dtrace_probe;
- membar_enter();
-
- if (ddi_create_minor_node(devi, "systrace", S_IFCHR, 0,
- DDI_PSEUDO, NULL) == DDI_FAILURE ||
- dtrace_register("syscall", &systrace_attr, DTRACE_PRIV_USER, NULL,
- &systrace_pops, NULL, &systrace_id) != 0) {
- systrace_probe = systrace_stub;
- ddi_remove_minor_node(devi, NULL);
- return (DDI_FAILURE);
- }
-
- ddi_report_dev(devi);
- systrace_devi = devi;
-
- return (DDI_SUCCESS);
-}
-
-static int
-systrace_detach(dev_info_t *devi, ddi_detach_cmd_t cmd)
-{
- switch (cmd) {
- case DDI_DETACH:
- break;
- case DDI_SUSPEND:
- return (DDI_SUCCESS);
- default:
- return (DDI_FAILURE);
- }
-
- if (dtrace_unregister(systrace_id) != 0)
- return (DDI_FAILURE);
-
- ddi_remove_minor_node(devi, NULL);
- systrace_probe = systrace_stub;
- return (DDI_SUCCESS);
-}
-
-/*ARGSUSED*/
-static int
-systrace_info(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result)
-{
- int error;
-
- switch (infocmd) {
- case DDI_INFO_DEVT2DEVINFO:
- *result = (void *)systrace_devi;
- error = DDI_SUCCESS;
- break;
- case DDI_INFO_DEVT2INSTANCE:
- *result = (void *)0;
- error = DDI_SUCCESS;
- break;
- default:
- error = DDI_FAILURE;
- }
- return (error);
-}
-
-/*ARGSUSED*/
-static int
-systrace_open(dev_t *devp, int flag, int otyp, cred_t *cred_p)
-{
- return (0);
-}
-
-static struct cb_ops systrace_cb_ops = {
- systrace_open, /* open */
- nodev, /* close */
- nulldev, /* strategy */
- nulldev, /* print */
- nodev, /* dump */
- nodev, /* read */
- nodev, /* write */
- nodev, /* ioctl */
- nodev, /* devmap */
- nodev, /* mmap */
- nodev, /* segmap */
- nochpoll, /* poll */
- ddi_prop_op, /* cb_prop_op */
- 0, /* streamtab */
- D_NEW | D_MP /* Driver compatibility flag */
-};
-
-static struct dev_ops systrace_ops = {
- DEVO_REV, /* devo_rev, */
- 0, /* refcnt */
- systrace_info, /* get_dev_info */
- nulldev, /* identify */
- nulldev, /* probe */
- systrace_attach, /* attach */
- systrace_detach, /* detach */
- nodev, /* reset */
- &systrace_cb_ops, /* driver operations */
- NULL, /* bus operations */
- nodev /* dev power */
-};
-
-/*
- * Module linkage information for the kernel.
- */
-static struct modldrv modldrv = {
- &mod_driverops, /* module type (this is a pseudo driver) */
- "System Call Tracing", /* name of module */
- &systrace_ops, /* driver ops */
-};
-
-static struct modlinkage modlinkage = {
- MODREV_1,
- (void *)&modldrv,
- NULL
-};
-
-int
-_init(void)
-{
- return (mod_install(&modlinkage));
-}
-
-int
-_info(struct modinfo *modinfop)
-{
- return (mod_info(&modlinkage, modinfop));
-}
-
-int
-_fini(void)
-{
- return (mod_remove(&modlinkage));
-}
OpenPOWER on IntegriCloud