summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/mdb/sun4u/modules/unix/unix.c2
-rw-r--r--usr/src/cmd/trapstat/sun4/trapstat.c10
-rw-r--r--usr/src/lib/libdtrace/amd64/Makefile11
-rw-r--r--usr/src/lib/libdtrace/i386/Makefile11
-rw-r--r--usr/src/lib/libdtrace/i386/dt_asmsubr.s49
-rw-r--r--usr/src/lib/libdtrace/sparc/Makefile10
-rw-r--r--usr/src/lib/libdtrace/sparc/dt_asmsubr.s48
-rw-r--r--usr/src/lib/libdtrace/sparcv9/Makefile10
-rw-r--r--usr/src/lib/libdtrace/spec/dtrace.spec4
-rw-r--r--usr/src/uts/common/dtrace/dtrace.c8
-rw-r--r--usr/src/uts/common/dtrace/fasttrap.c283
-rw-r--r--usr/src/uts/common/sys/dtrace.h1
-rw-r--r--usr/src/uts/common/sys/fasttrap_impl.h4
-rw-r--r--usr/src/uts/i86pc/io/pcplusmp/apic.c3
-rw-r--r--usr/src/uts/i86pc/os/dtrace_subr.c16
-rw-r--r--usr/src/uts/intel/dtrace/fasttrap_isa.c34
-rw-r--r--usr/src/uts/intel/ia32/ml/exception.s5
-rw-r--r--usr/src/uts/intel/ia32/os/desctbls.c8
-rw-r--r--usr/src/uts/intel/ia32/sys/trap.h6
-rw-r--r--usr/src/uts/intel/sys/segments.h2
-rw-r--r--usr/src/uts/sparc/dtrace/fasttrap_isa.c15
-rw-r--r--usr/src/uts/sun4/os/dtrace_subr.c26
-rw-r--r--usr/src/uts/sun4u/ml/trap_table.s13
-rw-r--r--usr/src/uts/sun4v/ml/trap_table.s14
24 files changed, 176 insertions, 417 deletions
diff --git a/usr/src/cmd/mdb/sun4u/modules/unix/unix.c b/usr/src/cmd/mdb/sun4u/modules/unix/unix.c
index ada87a6ef5..e4803b8d26 100644
--- a/usr/src/cmd/mdb/sun4u/modules/unix/unix.c
+++ b/usr/src/cmd/mdb/sun4u/modules/unix/unix.c
@@ -310,7 +310,7 @@ static const char *const ttdescr[] = {
BAD, BAD, BAD4, /* 12A - 12F unused */
BAD4, BAD4, /* 130 - 137 unused */
"dtrace-pid", /* 138 DTrace pid provider */
- "dtrace-fasttrap", /* 139 DTrace pid provider */
+ BAD, /* 139 unused */
"dtrace-return", /* 13A DTrace pid provider */
BAD, BAD4, /* 13B - 13F unused */
"syscall-64", /* 140 LP64 system call */
diff --git a/usr/src/cmd/trapstat/sun4/trapstat.c b/usr/src/cmd/trapstat/sun4/trapstat.c
index 335ea13cdb..ec78a7f380 100644
--- a/usr/src/cmd/trapstat/sun4/trapstat.c
+++ b/usr/src/cmd/trapstat/sun4/trapstat.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * 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.
@@ -19,8 +18,9 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -554,7 +554,7 @@ static tstat_ent_t g_traps[] = {
{ NULL, NULL, TSTAT_ENT_UNUSED },
{ NULL, NULL, TSTAT_ENT_UNUSED },
{ "dtrace-pid", "DTrace pid provider" },
- { "dtrace-fasttrap", "DTrace fasttrap provider" },
+ { NULL, NULL, TSTAT_ENT_UNUSED },
{ "dtrace-return", "DTrace pid provider return" },
{ NULL, NULL, TSTAT_ENT_UNUSED },
{ NULL, NULL, TSTAT_ENT_UNUSED },
diff --git a/usr/src/lib/libdtrace/amd64/Makefile b/usr/src/lib/libdtrace/amd64/Makefile
index 1cf21e7bc2..3805f674b5 100644
--- a/usr/src/lib/libdtrace/amd64/Makefile
+++ b/usr/src/lib/libdtrace/amd64/Makefile
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# 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.
@@ -20,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# ident "%Z%%M% %I% %E% SMI"
@@ -29,12 +28,12 @@
ASFLAGS += $(AS_PICFLAGS) -P -D_ASM
MAPDIR = ../spec/amd64
-MACHOBJS = dis_tables.o dt_asmsubr.o
+MACHOBJS = dis_tables.o
include ../Makefile.com
include ../../Makefile.lib.64
-SRCS += $(SRC)/common/dis/i386/dis_tables.c ../$(MACH)/dt_asmsubr.s
+SRCS += $(SRC)/common/dis/i386/dis_tables.c
CPPFLAGS += -I$(SRC)/common/dis/i386
CPPFLAGS += -D_ELF64
diff --git a/usr/src/lib/libdtrace/i386/Makefile b/usr/src/lib/libdtrace/i386/Makefile
index 6da800ae56..7f0a5f1bcf 100644
--- a/usr/src/lib/libdtrace/i386/Makefile
+++ b/usr/src/lib/libdtrace/i386/Makefile
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# 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.
@@ -20,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#ident "%Z%%M% %I% %E% SMI"
@@ -28,12 +27,12 @@
ASFLAGS += $(AS_PICFLAGS) -P -D_ASM
MAPDIR = ../spec/i386
-MACHOBJS = dis_tables.o dt_asmsubr.o
+MACHOBJS = dis_tables.o
DLIBSRCS = regs.d
include ../Makefile.com
-SRCS += $(SRC)/common/dis/i386/dis_tables.c dt_asmsubr.s
+SRCS += $(SRC)/common/dis/i386/dis_tables.c
CPPFLAGS += -I$(SRC)/common/dis/i386
LINTFLAGS += -erroff=E_BAD_PTR_CAST_ALIGN
diff --git a/usr/src/lib/libdtrace/i386/dt_asmsubr.s b/usr/src/lib/libdtrace/i386/dt_asmsubr.s
deleted file mode 100644
index 4b26b36e27..0000000000
--- a/usr/src/lib/libdtrace/i386/dt_asmsubr.s
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (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 2004 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#include <sys/asm_linkage.h>
-#include <sys/trap.h>
-
-#ifdef lint
-
-#include <dtrace.h>
-
-/*ARGSUSED*/
-int
-dtrace_probe(uintptr_t arg0, ...)
-{ return (0); }
-
-#else
-
- ENTRY(dtrace_probe)
- int $T_DTRACE_PROBE
- xorl %eax, %eax
- ret
- SET_SIZE(dtrace_probe)
-
-#endif
diff --git a/usr/src/lib/libdtrace/sparc/Makefile b/usr/src/lib/libdtrace/sparc/Makefile
index 35dfb3dce2..7b0e768522 100644
--- a/usr/src/lib/libdtrace/sparc/Makefile
+++ b/usr/src/lib/libdtrace/sparc/Makefile
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# 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.
@@ -20,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#ident "%Z%%M% %I% %E% SMI"
@@ -30,8 +29,5 @@ ASFLAGS += -D_ASM -K PIC -P
MAPDIR = ../spec/sparc
include ../Makefile.com
-SRCS += dt_asmsubr.s
-OBJECTS += dt_asmsubr.o
-
install yydebug: all $(ROOTLIBS) $(ROOTLINKS) $(ROOTLINT) \
$(ROOTDLIBS) $(ROOTDOBJS)
diff --git a/usr/src/lib/libdtrace/sparc/dt_asmsubr.s b/usr/src/lib/libdtrace/sparc/dt_asmsubr.s
deleted file mode 100644
index 6ffba4c5da..0000000000
--- a/usr/src/lib/libdtrace/sparc/dt_asmsubr.s
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (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 2004 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#include <sys/asm_linkage.h>
-
-#ifdef lint
-
-#include <dtrace.h>
-
-/*ARGSUSED*/
-int
-dtrace_probe(uintptr_t arg0, ...)
-{ return (0); }
-
-#else
-
- ENTRY(dtrace_probe)
- ta ST_DTRACE_PROBE
- retl
- clr %o0
- SET_SIZE(dtrace_probe)
-
-#endif
diff --git a/usr/src/lib/libdtrace/sparcv9/Makefile b/usr/src/lib/libdtrace/sparcv9/Makefile
index 617f48f8aa..1db72d9e67 100644
--- a/usr/src/lib/libdtrace/sparcv9/Makefile
+++ b/usr/src/lib/libdtrace/sparcv9/Makefile
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# 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.
@@ -20,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#ident "%Z%%M% %I% %E% SMI"
@@ -33,8 +32,5 @@ include ../../Makefile.lib.64
CPPFLAGS += -D_ELF64
-SRCS += ../sparc/dt_asmsubr.s
-OBJECTS += dt_asmsubr.o
-
install yydebug: all $(ROOTLIBS64) $(ROOTLINKS64) $(ROOTLINT64) \
$(ROOTDLIBS) $(ROOTDOBJS64)
diff --git a/usr/src/lib/libdtrace/spec/dtrace.spec b/usr/src/lib/libdtrace/spec/dtrace.spec
index f3a965eb68..86fe4ec44c 100644
--- a/usr/src/lib/libdtrace/spec/dtrace.spec
+++ b/usr/src/lib/libdtrace/spec/dtrace.spec
@@ -215,10 +215,6 @@ function dtrace_printf_format
version SUNWprivate_1.1
end
-function dtrace_probe
-version SUNWprivate_1.1
-end
-
function dtrace_probe_info
version SUNWprivate_1.1
end
diff --git a/usr/src/uts/common/dtrace/dtrace.c b/usr/src/uts/common/dtrace/dtrace.c
index 7f0ae6b2ff..fb834d3c8c 100644
--- a/usr/src/uts/common/dtrace/dtrace.c
+++ b/usr/src/uts/common/dtrace/dtrace.c
@@ -428,6 +428,7 @@ static intptr_t dtrace_buffer_reserve(dtrace_buffer_t *, size_t, size_t,
static int dtrace_state_option(dtrace_state_t *, dtrace_optid_t,
dtrace_optval_t);
static int dtrace_ecb_create_enable(dtrace_probe_t *, void *);
+static void dtrace_helper_provider_destroy(dtrace_helper_provider_t *);
/*
* DTrace Probe Context Functions
@@ -12334,7 +12335,10 @@ dtrace_helper_destroygen(int gen)
dtrace_helper_provider_t *prov;
/*
- * Look for a helper provider with the right generation.
+ * Look for a helper provider with the right generation. We
+ * have to start back at the beginning of the list each time
+ * because we drop dtrace_lock. It's unlikely that we'll make
+ * more than two passes.
*/
for (i = 0; i < help->dthps_nprovs; i++) {
prov = help->dthps_provs[i];
@@ -12369,6 +12373,8 @@ dtrace_helper_destroygen(int gen)
}
mutex_exit(&dtrace_meta_lock);
+ dtrace_helper_provider_destroy(prov);
+
mutex_enter(&dtrace_lock);
}
diff --git a/usr/src/uts/common/dtrace/fasttrap.c b/usr/src/uts/common/dtrace/fasttrap.c
index 2e3b6c1f06..5536bf3b24 100644
--- a/usr/src/uts/common/dtrace/fasttrap.c
+++ b/usr/src/uts/common/dtrace/fasttrap.c
@@ -106,10 +106,37 @@
* function are visible. Return probes must be fired _after_ we have
* single-stepped the instruction whereas all other probes are fired
* beforehand.
+ *
+ *
+ * Lock Ordering
+ * -------------
+ *
+ * The lock ordering below -- both internally and with respect to the DTrace
+ * framework -- is a little tricky and bears some explanation. Each provider
+ * has a lock (ftp_mtx) that protects its members including reference counts
+ * for enabled probes (ftp_rcount), consumers actively creating probes
+ * (ftp_ccount) and USDT consumers (ftp_mcount); all three prevent a provider
+ * from being freed. A provider is looked up by taking the bucket lock for the
+ * provider hash table, and is returned with its lock held. The provider lock
+ * may be taken in functions invoked by the DTrace framework, but may not be
+ * held while calling functions in the DTrace framework.
+ *
+ * To ensure consistency over multiple calls to the DTrace framework, the
+ * creation lock (ftp_cmtx) should be held. Naturally, the creation lock may
+ * not be taken when holding the provider lock as that would create a cyclic
+ * lock ordering. In situations where one would naturally take the provider
+ * lock and then the creation lock, we instead up a reference count to prevent
+ * the provider from disappearing, drop the provider lock, and acquire the
+ * creation lock.
+ *
+ * Briefly:
+ * bucket lock before provider lock
+ * DTrace before provider lock
+ * creation lock before DTrace
+ * never hold the provider lock and creation lock simultaneously
*/
static dev_info_t *fasttrap_devi;
-static dtrace_provider_id_t fasttrap_id;
static dtrace_meta_provider_id_t fasttrap_meta_id;
static timeout_id_t fasttrap_timeout;
@@ -143,9 +170,7 @@ fasttrap_hash_t fasttrap_tpoints;
static fasttrap_hash_t fasttrap_provs;
static fasttrap_hash_t fasttrap_procs;
-dtrace_id_t fasttrap_probe_id;
-static int fasttrap_count; /* ref count */
-static int fasttrap_pid_count; /* pid ref count */
+static uint64_t fasttrap_pid_count; /* pid ref count */
static kmutex_t fasttrap_count_mtx; /* lock on ref count */
#define FASTTRAP_ENABLE_FAIL 1
@@ -293,10 +318,10 @@ fasttrap_pid_cleanup_cb(void *data)
mutex_enter(&fp->ftp_mtx);
/*
- * If this provider is referenced either
- * because it is a USDT provider or is being
- * modified, we can't unregister or even
- * condense.
+ * If this provider has consumers actively
+ * creating probes (ftp_ccount) or is a USDT
+ * provider (ftp_mcount), we can't unregister
+ * or even condense.
*/
if (fp->ftp_ccount != 0 ||
fp->ftp_mcount != 0) {
@@ -464,15 +489,6 @@ fasttrap_pid_provide(void *arg, const dtrace_probedesc_t *desc)
*/
}
-/*ARGSUSED*/
-static void
-fasttrap_provide(void *arg, const dtrace_probedesc_t *desc)
-{
- if (dtrace_probe_lookup(fasttrap_id, NULL, "fasttrap", "fasttrap") == 0)
- fasttrap_probe_id = dtrace_probe_create(fasttrap_id, NULL,
- "fasttrap", "fasttrap", FASTTRAP_AFRAMES, NULL);
-}
-
static int
fasttrap_tracepoint_enable(proc_t *p, fasttrap_probe_t *probe, uint_t index)
{
@@ -805,11 +821,8 @@ fasttrap_tracepoint_disable(proc_t *p, fasttrap_probe_t *probe, uint_t index)
probe->ftp_gen = fasttrap_mod_gen;
}
-typedef int fasttrap_probe_f(struct regs *);
-
static void
-fasttrap_enable_common(int *count, fasttrap_probe_f **fptr, fasttrap_probe_f *f,
- fasttrap_probe_f **fptr2, fasttrap_probe_f *f2)
+fasttrap_enable_callbacks(void)
{
/*
* We don't have to play the rw lock game here because we're
@@ -818,28 +831,27 @@ fasttrap_enable_common(int *count, fasttrap_probe_f **fptr, fasttrap_probe_f *f,
* function pointer yet.
*/
mutex_enter(&fasttrap_count_mtx);
- if (*count == 0) {
- ASSERT(*fptr == NULL);
- *fptr = f;
- if (fptr2 != NULL)
- *fptr2 = f2;
+ if (fasttrap_pid_count == 0) {
+ ASSERT(dtrace_pid_probe_ptr == NULL);
+ ASSERT(dtrace_return_probe_ptr == NULL);
+ dtrace_pid_probe_ptr = &fasttrap_pid_probe;
+ dtrace_return_probe_ptr = &fasttrap_return_probe;
}
- ASSERT(*fptr == f);
- ASSERT(fptr2 == NULL || *fptr2 == f2);
- (*count)++;
+ ASSERT(dtrace_pid_probe_ptr == &fasttrap_pid_probe);
+ ASSERT(dtrace_return_probe_ptr == &fasttrap_return_probe);
+ fasttrap_pid_count++;
mutex_exit(&fasttrap_count_mtx);
}
static void
-fasttrap_disable_common(int *count, fasttrap_probe_f **fptr,
- fasttrap_probe_f **fptr2)
+fasttrap_disable_callbacks(void)
{
ASSERT(MUTEX_HELD(&cpu_lock));
mutex_enter(&fasttrap_count_mtx);
- (*count)--;
- ASSERT(*count >= 0);
- if (*count == 0) {
+ ASSERT(fasttrap_pid_count > 0);
+ fasttrap_pid_count--;
+ if (fasttrap_pid_count == 0) {
cpu_t *cur, *cpu = CPU;
for (cur = cpu->cpu_next_onln; cur != cpu;
@@ -847,9 +859,8 @@ fasttrap_disable_common(int *count, fasttrap_probe_f **fptr,
rw_enter(&cur->cpu_ft_lock, RW_WRITER);
}
- *fptr = NULL;
- if (fptr2 != NULL)
- *fptr2 = NULL;
+ dtrace_pid_probe_ptr = NULL;
+ dtrace_return_probe_ptr = NULL;
for (cur = cpu->cpu_next_onln; cur != cpu;
cur = cur->cpu_next_onln) {
@@ -861,23 +872,6 @@ fasttrap_disable_common(int *count, fasttrap_probe_f **fptr,
/*ARGSUSED*/
static void
-fasttrap_enable(void *arg, dtrace_id_t id, void *parg)
-{
- /*
- * Enable the probe that corresponds to statically placed trace
- * points which have not explicitly been placed in the process's text
- * by the fasttrap provider.
- */
- ASSERT(arg == NULL);
- ASSERT(id == fasttrap_probe_id);
-
- fasttrap_enable_common(&fasttrap_count,
- &dtrace_fasttrap_probe_ptr, fasttrap_probe, NULL, NULL);
-}
-
-
-/*ARGSUSED*/
-static void
fasttrap_pid_enable(void *arg, dtrace_id_t id, void *parg)
{
fasttrap_probe_t *probe = parg;
@@ -937,13 +931,11 @@ fasttrap_pid_enable(void *arg, dtrace_id_t id, void *parg)
mutex_exit(&p->p_lock);
/*
- * We have to enable the trap entry before any user threads have
+ * We have to enable the trap entry point before any user threads have
* the chance to execute the trap instruction we're about to place
* in their process's text.
*/
- fasttrap_enable_common(&fasttrap_pid_count,
- &dtrace_pid_probe_ptr, fasttrap_pid_probe,
- &dtrace_return_probe_ptr, fasttrap_return_probe);
+ fasttrap_enable_callbacks();
/*
* Enable all the tracepoints and add this probe's id to each
@@ -977,8 +969,7 @@ fasttrap_pid_enable(void *arg, dtrace_id_t id, void *parg)
* Since we're not actually enabling this probe,
* drop our reference on the trap table entry.
*/
- fasttrap_disable_common(&fasttrap_pid_count,
- &dtrace_pid_probe_ptr, &dtrace_return_probe_ptr);
+ fasttrap_disable_callbacks();
return;
}
}
@@ -989,22 +980,6 @@ fasttrap_pid_enable(void *arg, dtrace_id_t id, void *parg)
probe->ftp_enabled = 1;
}
-
-/*ARGSUSED*/
-static void
-fasttrap_disable(void *arg, dtrace_id_t id, void *parg)
-{
- /*
- * Disable the probe the corresponds to statically placed trace
- * points.
- */
- ASSERT(arg == NULL);
- ASSERT(id == fasttrap_probe_id);
- ASSERT(MUTEX_HELD(&cpu_lock));
- fasttrap_disable_common(&fasttrap_count, &dtrace_fasttrap_probe_ptr,
- NULL);
-}
-
/*ARGSUSED*/
static void
fasttrap_pid_disable(void *arg, dtrace_id_t id, void *parg)
@@ -1075,8 +1050,7 @@ fasttrap_pid_disable(void *arg, dtrace_id_t id, void *parg)
probe->ftp_enabled = 0;
ASSERT(MUTEX_HELD(&cpu_lock));
- fasttrap_disable_common(&fasttrap_pid_count, &dtrace_pid_probe_ptr,
- &dtrace_return_probe_ptr);
+ fasttrap_disable_callbacks();
}
/*ARGSUSED*/
@@ -1125,14 +1099,6 @@ fasttrap_pid_getargdesc(void *arg, dtrace_id_t id, void *parg,
/*ARGSUSED*/
static void
-fasttrap_destroy(void *arg, dtrace_id_t id, void *parg)
-{
- ASSERT(arg == NULL);
- ASSERT(id == fasttrap_probe_id);
-}
-
-/*ARGSUSED*/
-static void
fasttrap_pid_destroy(void *arg, dtrace_id_t id, void *parg)
{
fasttrap_probe_t *probe = parg;
@@ -1158,27 +1124,6 @@ fasttrap_pid_destroy(void *arg, dtrace_id_t id, void *parg)
}
-static const dtrace_pattr_t fasttrap_attr = {
-{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_ISA },
-{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN },
-{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN },
-{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_ISA },
-{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_ISA },
-};
-
-static dtrace_pops_t fasttrap_pops = {
- fasttrap_provide,
- NULL,
- fasttrap_enable,
- fasttrap_disable,
- NULL,
- NULL,
- NULL,
- fasttrap_getarg,
- NULL,
- fasttrap_destroy
-};
-
static const dtrace_pattr_t pid_attr = {
{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_ISA },
{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN },
@@ -1195,7 +1140,7 @@ static dtrace_pops_t pid_pops = {
NULL,
NULL,
fasttrap_pid_getargdesc,
- fasttrap_getarg,
+ fasttrap_pid_getarg,
NULL,
fasttrap_pid_destroy
};
@@ -1572,49 +1517,23 @@ fasttrap_add_probe(fasttrap_probe_spec_t *pdata)
/*
* Increment this reference count to indicate that a consumer is
- * actively adding a new probe associated with this provider.
+ * actively adding a new probe associated with this provider. This
+ * prevents the provider from being deleted -- we'll need to check
+ * for pending deletions when we drop this reference count.
*/
provider->ftp_ccount++;
mutex_exit(&provider->ftp_mtx);
- if (name != NULL) {
- if (dtrace_probe_lookup(provider->ftp_provid,
- pdata->ftps_mod, pdata->ftps_func, name) != 0)
- goto done;
-
- atomic_add_32(&fasttrap_total, pdata->ftps_noffs);
-
- if (fasttrap_total > fasttrap_max) {
- atomic_add_32(&fasttrap_total, -pdata->ftps_noffs);
- goto no_mem;
- }
-
- ASSERT(pdata->ftps_noffs > 0);
- pp = kmem_zalloc(offsetof(fasttrap_probe_t,
- ftp_tps[pdata->ftps_noffs]), KM_SLEEP);
-
- pp->ftp_prov = provider;
- pp->ftp_faddr = pdata->ftps_pc;
- pp->ftp_fsize = pdata->ftps_size;
- pp->ftp_pid = pdata->ftps_pid;
- pp->ftp_ntps = pdata->ftps_noffs;
-
- for (i = 0; i < pdata->ftps_noffs; i++) {
- tp = kmem_zalloc(sizeof (fasttrap_tracepoint_t),
- KM_SLEEP);
-
- tp->ftt_proc = provider->ftp_proc;
- tp->ftt_pc = pdata->ftps_offs[i] + pdata->ftps_pc;
- tp->ftt_pid = pdata->ftps_pid;
-
- pp->ftp_tps[i].fit_tp = tp;
- pp->ftp_tps[i].fit_id.fti_probe = pp;
- pp->ftp_tps[i].fit_id.fti_ptype = pdata->ftps_type;
- }
+ /*
+ * Grab the creation lock to ensure consistency between calls to
+ * dtrace_probe_lookup() and dtrace_probe_create() in the face of
+ * other threads creating probes. We must drop the provider lock
+ * before taking this lock to avoid a three-way deadlock with the
+ * DTrace framework.
+ */
+ mutex_enter(&provider->ftp_cmtx);
- pp->ftp_id = dtrace_probe_create(provider->ftp_provid,
- pdata->ftps_mod, pdata->ftps_func, name, aframes, pp);
- } else {
+ if (name == NULL) {
for (i = 0; i < pdata->ftps_noffs; i++) {
char name_str[17];
@@ -1655,14 +1574,50 @@ fasttrap_add_probe(fasttrap_probe_spec_t *pdata)
pdata->ftps_mod, pdata->ftps_func, name_str,
FASTTRAP_OFFSET_AFRAMES, pp);
}
+
+ } else if (dtrace_probe_lookup(provider->ftp_provid, pdata->ftps_mod,
+ pdata->ftps_func, name) == 0) {
+ atomic_add_32(&fasttrap_total, pdata->ftps_noffs);
+
+ if (fasttrap_total > fasttrap_max) {
+ atomic_add_32(&fasttrap_total, -pdata->ftps_noffs);
+ goto no_mem;
+ }
+
+ ASSERT(pdata->ftps_noffs > 0);
+ pp = kmem_zalloc(offsetof(fasttrap_probe_t,
+ ftp_tps[pdata->ftps_noffs]), KM_SLEEP);
+
+ pp->ftp_prov = provider;
+ pp->ftp_faddr = pdata->ftps_pc;
+ pp->ftp_fsize = pdata->ftps_size;
+ pp->ftp_pid = pdata->ftps_pid;
+ pp->ftp_ntps = pdata->ftps_noffs;
+
+ for (i = 0; i < pdata->ftps_noffs; i++) {
+ tp = kmem_zalloc(sizeof (fasttrap_tracepoint_t),
+ KM_SLEEP);
+
+ tp->ftt_proc = provider->ftp_proc;
+ tp->ftt_pc = pdata->ftps_offs[i] + pdata->ftps_pc;
+ tp->ftt_pid = pdata->ftps_pid;
+
+ pp->ftp_tps[i].fit_tp = tp;
+ pp->ftp_tps[i].fit_id.fti_probe = pp;
+ pp->ftp_tps[i].fit_id.fti_ptype = pdata->ftps_type;
+ }
+
+ pp->ftp_id = dtrace_probe_create(provider->ftp_provid,
+ pdata->ftps_mod, pdata->ftps_func, name, aframes, pp);
}
-done:
+ mutex_exit(&provider->ftp_cmtx);
+
/*
* We know that the provider is still valid since we incremented the
- * reference count. If someone tried to free this provider while we
- * were using it (e.g. because the process called exec(2) or exit(2)),
- * take note of that and try to free it now.
+ * creation reference count. If someone tried to clean up this provider
+ * while we were using it (e.g. because the process called exec(2) or
+ * exit(2)), take note of that and try to clean it up now.
*/
mutex_enter(&provider->ftp_mtx);
provider->ftp_ccount--;
@@ -1681,6 +1636,7 @@ no_mem:
* the user has accidentally created many more probes than was
* intended (e.g. pid123:::).
*/
+ mutex_exit(&provider->ftp_cmtx);
mutex_enter(&provider->ftp_mtx);
provider->ftp_ccount--;
provider->ftp_marked = 1;
@@ -1763,11 +1719,22 @@ fasttrap_meta_create_probe(void *arg, void *parg,
int i, j;
uint32_t ntps;
- mutex_enter(&provider->ftp_mtx);
+ /*
+ * Since the meta provider count is non-zero we don't have to worry
+ * about this provider disappearing.
+ */
+ ASSERT(provider->ftp_mcount > 0);
+
+ /*
+ * Grab the creation lock to ensure consistency between calls to
+ * dtrace_probe_lookup() and dtrace_probe_create() in the face of
+ * other threads creating probes.
+ */
+ mutex_enter(&provider->ftp_cmtx);
if (dtrace_probe_lookup(provider->ftp_provid, dhpb->dthpb_mod,
dhpb->dthpb_func, dhpb->dthpb_name) != 0) {
- mutex_exit(&provider->ftp_mtx);
+ mutex_exit(&provider->ftp_cmtx);
return;
}
@@ -1778,7 +1745,7 @@ fasttrap_meta_create_probe(void *arg, void *parg,
if (fasttrap_total > fasttrap_max) {
atomic_add_32(&fasttrap_total, -ntps);
- mutex_exit(&provider->ftp_mtx);
+ mutex_exit(&provider->ftp_cmtx);
return;
}
@@ -1843,7 +1810,7 @@ fasttrap_meta_create_probe(void *arg, void *parg,
pp->ftp_id = dtrace_probe_create(provider->ftp_provid, dhpb->dthpb_mod,
dhpb->dthpb_func, dhpb->dthpb_name, FASTTRAP_OFFSET_AFRAMES, pp);
- mutex_exit(&provider->ftp_mtx);
+ mutex_exit(&provider->ftp_cmtx);
}
/*ARGSUSED*/
@@ -2078,9 +2045,7 @@ fasttrap_attach(dev_info_t *devi, ddi_attach_cmd_t cmd)
}
if (ddi_create_minor_node(devi, "fasttrap", S_IFCHR, 0,
- DDI_PSEUDO, NULL) == DDI_FAILURE ||
- dtrace_register("fasttrap", &fasttrap_attr, DTRACE_PRIV_USER, NULL,
- &fasttrap_pops, NULL, &fasttrap_id) != 0) {
+ DDI_PSEUDO, NULL) == DDI_FAILURE) {
ddi_remove_minor_node(devi, NULL);
return (DDI_FAILURE);
}
@@ -2229,7 +2194,7 @@ fasttrap_detach(dev_info_t *devi, ddi_detach_cmd_t cmd)
mutex_exit(&bucket->ftb_mtx);
}
- if (fail || dtrace_unregister(fasttrap_id) != 0) {
+ if (fail) {
uint_t work;
/*
* If we're failing to detach, we need to unblock timeouts
@@ -2252,7 +2217,7 @@ fasttrap_detach(dev_info_t *devi, ddi_detach_cmd_t cmd)
#ifdef DEBUG
mutex_enter(&fasttrap_count_mtx);
- ASSERT(fasttrap_count == 0);
+ ASSERT(fasttrap_pid_count == 0);
mutex_exit(&fasttrap_count_mtx);
#endif
diff --git a/usr/src/uts/common/sys/dtrace.h b/usr/src/uts/common/sys/dtrace.h
index 48d876a651..059609df41 100644
--- a/usr/src/uts/common/sys/dtrace.h
+++ b/usr/src/uts/common/sys/dtrace.h
@@ -2142,7 +2142,6 @@ extern void dtrace_vtime_disable(void);
struct regs;
extern int (*dtrace_pid_probe_ptr)(struct regs *);
-extern int (*dtrace_fasttrap_probe_ptr)(struct regs *);
extern int (*dtrace_return_probe_ptr)(struct regs *);
extern void (*dtrace_fasttrap_fork_ptr)(proc_t *, proc_t *);
extern void (*dtrace_fasttrap_exec_ptr)(proc_t *);
diff --git a/usr/src/uts/common/sys/fasttrap_impl.h b/usr/src/uts/common/sys/fasttrap_impl.h
index 4bd9e8f091..280951e741 100644
--- a/usr/src/uts/common/sys/fasttrap_impl.h
+++ b/usr/src/uts/common/sys/fasttrap_impl.h
@@ -83,6 +83,7 @@ typedef struct fasttrap_provider {
uint_t ftp_marked; /* mark for possible removal */
uint_t ftp_retired; /* mark when retired */
kmutex_t ftp_mtx; /* provider lock */
+ kmutex_t ftp_cmtx; /* lock on creating probes */
uint64_t ftp_rcount; /* enabled probes ref count */
uint64_t ftp_ccount; /* consumers creating probes */
uint64_t ftp_mcount; /* meta provider count */
@@ -176,11 +177,10 @@ extern int fasttrap_tracepoint_init(proc_t *, fasttrap_tracepoint_t *,
extern int fasttrap_tracepoint_install(proc_t *, fasttrap_tracepoint_t *);
extern int fasttrap_tracepoint_remove(proc_t *, fasttrap_tracepoint_t *);
-extern int fasttrap_probe(struct regs *);
extern int fasttrap_pid_probe(struct regs *);
extern int fasttrap_return_probe(struct regs *);
-extern uint64_t fasttrap_getarg(void *, dtrace_id_t, void *, int, int);
+extern uint64_t fasttrap_pid_getarg(void *, dtrace_id_t, void *, int, int);
extern uint64_t fasttrap_usdt_getarg(void *, dtrace_id_t, void *, int, int);
#ifdef __cplusplus
diff --git a/usr/src/uts/i86pc/io/pcplusmp/apic.c b/usr/src/uts/i86pc/io/pcplusmp/apic.c
index 7504af2256..2052f1b085 100644
--- a/usr/src/uts/i86pc/io/pcplusmp/apic.c
+++ b/usr/src/uts/i86pc/io/pcplusmp/apic.c
@@ -3978,8 +3978,7 @@ apic_allocate_vector(int ipl, int irq, int pri)
for (i = lowest; i < highest; i++) {
if ((i == T_FASTTRAP) || (i == APIC_SPUR_INTR) ||
- (i == T_SYSCALLINT) || (i == T_DTRACE_PROBE) ||
- (i == T_DTRACE_RET))
+ (i == T_SYSCALLINT) || (i == T_DTRACE_RET))
continue;
if (apic_vector_to_irq[i] == APIC_RESV_IRQ) {
apic_vector_to_irq[i] = (uchar_t)irq;
diff --git a/usr/src/uts/i86pc/os/dtrace_subr.c b/usr/src/uts/i86pc/os/dtrace_subr.c
index 5fd9f9b811..00da457012 100644
--- a/usr/src/uts/i86pc/os/dtrace_subr.c
+++ b/usr/src/uts/i86pc/os/dtrace_subr.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * 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.
@@ -19,8 +18,9 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -169,7 +169,6 @@ dtrace_sync(void)
dtrace_xcall(DTRACE_CPUALL, (dtrace_xcall_t)dtrace_sync_func, NULL);
}
-int (*dtrace_fasttrap_probe_ptr)(struct regs *);
int (*dtrace_pid_probe_ptr)(struct regs *);
int (*dtrace_return_probe_ptr)(struct regs *);
@@ -240,13 +239,6 @@ dtrace_user_probe(struct regs *rp, caddr_t addr, processorid_t cpuid)
rw_exit(rwp);
rp->r_pc = npc;
- } else if (rp->r_trapno == T_DTRACE_PROBE) {
- rwp = &CPU->cpu_ft_lock;
- rw_enter(rwp, RW_READER);
- if (dtrace_fasttrap_probe_ptr != NULL)
- (void) (*dtrace_fasttrap_probe_ptr)(rp);
- rw_exit(rwp);
-
} else if (rp->r_trapno == T_BPTFLT) {
uint8_t instr;
rwp = &CPU->cpu_ft_lock;
diff --git a/usr/src/uts/intel/dtrace/fasttrap_isa.c b/usr/src/uts/intel/dtrace/fasttrap_isa.c
index 4be5fab23e..b64be9243f 100644
--- a/usr/src/uts/intel/dtrace/fasttrap_isa.c
+++ b/usr/src/uts/intel/dtrace/fasttrap_isa.c
@@ -589,37 +589,6 @@ fasttrap_fuword32_noerr(const void *uaddr)
return (0);
}
-/*ARGSUSED*/
-int
-fasttrap_probe(struct regs *rp)
-{
-#ifdef __amd64
- proc_t *p = curproc;
-#endif
-
-#ifdef __amd64
- if (p->p_model == DATAMODEL_LP64) {
- dtrace_probe(fasttrap_probe_id, rp->r_rdi, rp->r_rsi,
- rp->r_rdx, rp->r_rcx, rp->r_r8);
- } else {
-#endif
- uint32_t *stack = (uint32_t *)rp->r_sp;
- uintptr_t s0, s1, s2, s3, s4;
-
- s0 = fasttrap_fuword32_noerr(&stack[1]);
- s1 = fasttrap_fuword32_noerr(&stack[2]);
- s2 = fasttrap_fuword32_noerr(&stack[3]);
- s3 = fasttrap_fuword32_noerr(&stack[4]);
- s4 = fasttrap_fuword32_noerr(&stack[5]);
-
- dtrace_probe(fasttrap_probe_id, s0, s1, s2, s3, s4);
-#ifdef __amd64
- }
-#endif
-
- return (0);
-}
-
static void
fasttrap_return_common(struct regs *rp, uintptr_t pc, pid_t pid,
uintptr_t new_pc)
@@ -1511,7 +1480,8 @@ fasttrap_return_probe(struct regs *rp)
/*ARGSUSED*/
uint64_t
-fasttrap_getarg(void *arg, dtrace_id_t id, void *parg, int argno, int aframes)
+fasttrap_pid_getarg(void *arg, dtrace_id_t id, void *parg, int argno,
+ int aframes)
{
return (fasttrap_anarg(ttolwp(curthread)->lwp_regs, 1, argno));
}
diff --git a/usr/src/uts/intel/ia32/ml/exception.s b/usr/src/uts/intel/ia32/ml/exception.s
index be8a251727..11d38dc542 100644
--- a/usr/src/uts/intel/ia32/ml/exception.s
+++ b/usr/src/uts/intel/ia32/ml/exception.s
@@ -1052,11 +1052,6 @@ check_for_user_address:
#endif /* __i386 */
- ENTRY_NP(dtrace_fasttrap)
- TRAP_NOERR(T_DTRACE_PROBE)
- jmp dtrace_trap
- SET_SIZE(dtrace_fasttrap)
-
ENTRY_NP(dtrace_ret)
TRAP_NOERR(T_DTRACE_RET)
jmp dtrace_trap
diff --git a/usr/src/uts/intel/ia32/os/desctbls.c b/usr/src/uts/intel/ia32/os/desctbls.c
index c4052031b3..f53563eae3 100644
--- a/usr/src/uts/intel/ia32/os/desctbls.c
+++ b/usr/src/uts/intel/ia32/os/desctbls.c
@@ -592,10 +592,8 @@ init_idt(void)
SDT_SYSIGT, SEL_UPL);
/*
- * Install the DTrace interrupt handlers for the fasttrap provider.
+ * Install the DTrace interrupt handler for the pid provider.
*/
- set_gatesegd(&idt0[T_DTRACE_PROBE], &dtrace_fasttrap, KCS_SEL, 0,
- SDT_SYSIGT, SEL_UPL);
set_gatesegd(&idt0[T_DTRACE_RET], &dtrace_ret, KCS_SEL, 0,
SDT_SYSIGT, SEL_UPL);
@@ -720,10 +718,8 @@ init_idt(void)
SDT_SYSIGT, SEL_UPL);
/*
- * Install the DTrace interrupt handlers for the fasttrap provider.
+ * Install the DTrace interrupt handler for the pid provider.
*/
- set_gatesegd(&idt0[T_DTRACE_PROBE], &dtrace_fasttrap, KCS_SEL, 0,
- SDT_SYSIGT, SEL_UPL);
set_gatesegd(&idt0[T_DTRACE_RET], &dtrace_ret, KCS_SEL, 0,
SDT_SYSIGT, SEL_UPL);
diff --git a/usr/src/uts/intel/ia32/sys/trap.h b/usr/src/uts/intel/ia32/sys/trap.h
index 9eafa6b197..b03f947fe8 100644
--- a/usr/src/uts/intel/ia32/sys/trap.h
+++ b/usr/src/uts/intel/ia32/sys/trap.h
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * 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.
@@ -65,7 +64,6 @@ extern "C" {
#define T_ENOEXTFLT 0x20 /* emulated ext not present */
#define T_FASTTRAP 0xd2 /* fast system call */
#define T_SYSCALLINT 0x91 /* general system call */
-#define T_DTRACE_PROBE 0x7e /* DTrace fasttrap probe */
#define T_DTRACE_RET 0x7f /* DTrace pid return */
#define T_SOFTINT 0x50fd /* pseudo softint trap type */
diff --git a/usr/src/uts/intel/sys/segments.h b/usr/src/uts/intel/sys/segments.h
index c9c2ba7e52..b17b300cd6 100644
--- a/usr/src/uts/intel/sys/segments.h
+++ b/usr/src/uts/intel/sys/segments.h
@@ -551,7 +551,7 @@ extern void _start(), cmnint();
extern void achktrap(), mcetrap();
extern void xmtrap();
extern void fasttrap();
-extern void dtrace_fasttrap(), dtrace_ret();
+extern void dtrace_ret();
#if !defined(__amd64)
extern void pentium_pftrap();
diff --git a/usr/src/uts/sparc/dtrace/fasttrap_isa.c b/usr/src/uts/sparc/dtrace/fasttrap_isa.c
index 93d627adb7..9b50b1b52a 100644
--- a/usr/src/uts/sparc/dtrace/fasttrap_isa.c
+++ b/usr/src/uts/sparc/dtrace/fasttrap_isa.c
@@ -225,18 +225,6 @@ fasttrap_anarg(struct regs *rp, int argno)
static ulong_t fasttrap_getreg(struct regs *, uint_t);
static void fasttrap_putreg(struct regs *, uint_t, ulong_t);
-int
-fasttrap_probe(struct regs *rp)
-{
- dtrace_probe(fasttrap_probe_id,
- rp->r_o0, rp->r_o1, rp->r_o2, rp->r_o3, rp->r_o4);
-
- rp->r_pc = rp->r_npc;
- rp->r_npc = rp->r_pc + 4;
-
- return (0);
-}
-
static void
fasttrap_usdt_args(fasttrap_probe_t *probe, struct regs *rp, int argc,
uintptr_t *argv)
@@ -1335,7 +1323,8 @@ fasttrap_tracepoint_init(proc_t *p, fasttrap_tracepoint_t *tp, uintptr_t pc,
/*ARGSUSED*/
uint64_t
-fasttrap_getarg(void *arg, dtrace_id_t id, void *parg, int argno, int aframes)
+fasttrap_pid_getarg(void *arg, dtrace_id_t id, void *parg, int argno,
+ int aframes)
{
return (fasttrap_anarg(ttolwp(curthread)->lwp_regs, argno));
}
diff --git a/usr/src/uts/sun4/os/dtrace_subr.c b/usr/src/uts/sun4/os/dtrace_subr.c
index b59b0d9e75..d1afbe29b0 100644
--- a/usr/src/uts/sun4/os/dtrace_subr.c
+++ b/usr/src/uts/sun4/os/dtrace_subr.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * 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.
@@ -19,8 +18,9 @@
*
* CDDL HEADER END
*/
+
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -72,24 +72,6 @@ dtrace_toxic_ranges(void (*func)(uintptr_t base, uintptr_t limit))
(*func)((uintptr_t)hole_start, (uintptr_t)hole_end);
}
-int (*dtrace_fasttrap_probe_ptr)(struct regs *);
-
-void
-dtrace_fasttrap_probe(struct regs *rp)
-{
- krwlock_t *rwp = &CPU->cpu_ft_lock;
-
- rw_enter(rwp, RW_READER);
- if (dtrace_fasttrap_probe_ptr == NULL) {
- rw_exit(rwp);
- rp->r_pc = rp->r_npc;
- rp->r_npc = rp->r_pc + 4;
- } else {
- (void) (*dtrace_fasttrap_probe_ptr)(rp);
- rw_exit(rwp);
- }
-}
-
int (*dtrace_pid_probe_ptr)(struct regs *);
void
diff --git a/usr/src/uts/sun4u/ml/trap_table.s b/usr/src/uts/sun4u/ml/trap_table.s
index 981749e8ee..d25ab51179 100644
--- a/usr/src/uts/sun4u/ml/trap_table.s
+++ b/usr/src/uts/sun4u/ml/trap_table.s
@@ -237,17 +237,6 @@
/*
* DTrace traps.
*/
-#define DTRACE_FASTTRAP \
- .global dtrace_fasttrap_probe ;\
- .global dtrace_fasttrap_probe_ptr ;\
- sethi %hi(dtrace_fasttrap_probe_ptr), %g4 ;\
- ldn [%g4 + %lo(dtrace_fasttrap_probe_ptr)], %g4 ;\
- set dtrace_fasttrap_probe, %g1 ;\
- brnz,pn %g4, user_trap ;\
- sub %g0, 1, %g4 ;\
- FAST_TRAP_DONE ;\
- .align 32
-
#define DTRACE_PID \
.global dtrace_pid_probe ;\
set dtrace_pid_probe, %g1 ;\
@@ -1468,7 +1457,7 @@ trap_table0:
BAD; BAD; BAD4; /* 12A - 12F unused */
BAD4; BAD4; /* 130 - 137 unused */
DTRACE_PID; /* 138 dtrace pid tracing provider */
- DTRACE_FASTTRAP; /* 139 dtrace fasttrap provider */
+ BAD; /* 139 unused */
DTRACE_RETURN; /* 13A dtrace pid return probe */
BAD; BAD4; /* 13B - 13F unused */
SYSCALL(syscall_trap) /* 140 LP64 system call */
diff --git a/usr/src/uts/sun4v/ml/trap_table.s b/usr/src/uts/sun4v/ml/trap_table.s
index 24fb20058c..54eaa49462 100644
--- a/usr/src/uts/sun4v/ml/trap_table.s
+++ b/usr/src/uts/sun4v/ml/trap_table.s
@@ -18,6 +18,7 @@
*
* CDDL HEADER END
*/
+
/*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
@@ -231,17 +232,6 @@
/*
* DTrace traps.
*/
-#define DTRACE_FASTTRAP \
- .global dtrace_fasttrap_probe ;\
- .global dtrace_fasttrap_probe_ptr ;\
- sethi %hi(dtrace_fasttrap_probe_ptr), %g4 ;\
- ldn [%g4 + %lo(dtrace_fasttrap_probe_ptr)], %g4 ;\
- set dtrace_fasttrap_probe, %g1 ;\
- brnz,pn %g4, user_trap ;\
- sub %g0, 1, %g4 ;\
- FAST_TRAP_DONE ;\
- .align 32
-
#define DTRACE_PID \
.global dtrace_pid_probe ;\
set dtrace_pid_probe, %g1 ;\
@@ -1263,7 +1253,7 @@ trap_table0:
BAD; BAD; BAD4; /* 12A - 12F unused */
BAD4; BAD4; /* 130 - 137 unused */
DTRACE_PID; /* 138 dtrace pid tracing provider */
- DTRACE_FASTTRAP; /* 139 dtrace fasttrap provider */
+ BAD; /* 139 unused */
DTRACE_RETURN; /* 13A dtrace pid return probe */
BAD; BAD4; /* 13B - 13F unused */
SYSCALL(syscall_trap) /* 140 LP64 system call */