MFV OpenSolaris DTrace userland bits.

This commit is contained in:
Rui Paulo 2010-08-02 13:40:53 +00:00
commit 1670a1c2a4
112 changed files with 4421 additions and 252 deletions

View File

@ -20,12 +20,10 @@
*/ */
/* /*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/stat.h> #include <sys/stat.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -162,7 +160,7 @@ main(int argc, char **argv)
FILE *fp; FILE *fp;
unsigned char *dof, *copy; unsigned char *dof, *copy;
if (argc < 1) if (argc < 2)
fatal("expected D script as argument\n"); fatal("expected D script as argument\n");
if ((fp = fopen(filename, "r")) == NULL) if ((fp = fopen(filename, "r")) == NULL)

View File

@ -20,12 +20,10 @@
*/ */
/* /*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI"
#include <strings.h> #include <strings.h>
#include <unistd.h> #include <unistd.h>
#include <dtrace.h> #include <dtrace.h>
@ -35,6 +33,7 @@ static int g_errs;
static int g_fd; static int g_fd;
static int g_verbose; static int g_verbose;
static int g_errexit; static int g_errexit;
static char *g_progname;
static int static int
probe(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp, void *data) probe(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp, void *data)
@ -91,9 +90,11 @@ main(int argc, char *argv[])
int err, c; int err, c;
char *p; char *p;
g_progname = argv[0];
if ((dtp = dtrace_open(DTRACE_VERSION, 0, &err)) == NULL) { if ((dtp = dtrace_open(DTRACE_VERSION, 0, &err)) == NULL) {
(void) fprintf(stderr, "%s: failed to open dtrace: %s\n", (void) fprintf(stderr, "%s: failed to open dtrace: %s\n",
argv[0], dtrace_errmsg(dtp, err)); g_progname, dtrace_errmsg(dtp, err));
return (1); return (1);
} }
@ -111,7 +112,7 @@ main(int argc, char *argv[])
if (dtrace_setopt(dtp, optarg, p) != 0) { if (dtrace_setopt(dtp, optarg, p) != 0) {
(void) fprintf(stderr, "%s: failed to set " (void) fprintf(stderr, "%s: failed to set "
"option -x %s: %s\n", argv[0], optarg, "option -x %s: %s\n", g_progname, optarg,
dtrace_errmsg(dtp, dtrace_errno(dtp))); dtrace_errmsg(dtp, dtrace_errno(dtp)));
return (2); return (2);
} }
@ -119,7 +120,7 @@ main(int argc, char *argv[])
default: default:
(void) fprintf(stderr, "Usage: %s [-ev] " (void) fprintf(stderr, "Usage: %s [-ev] "
"[-x opt[=arg]] [probedesc]\n", argv[0]); "[-x opt[=arg]] [probedesc]\n", g_progname);
return (2); return (2);
} }
} }
@ -128,9 +129,9 @@ main(int argc, char *argv[])
argc -= optind; argc -= optind;
if (argc > 0) { if (argc > 0) {
if (dtrace_str2desc(dtp, DTRACE_PROBESPEC_NAME, argv[1], &pd)) { if (dtrace_str2desc(dtp, DTRACE_PROBESPEC_NAME, argv[0], &pd)) {
(void) fprintf(stderr, "%s: invalid probe description " (void) fprintf(stderr, "%s: invalid probe description "
"%s: %s\n", argv[0], argv[1], "%s: %s\n", g_progname, argv[0],
dtrace_errmsg(dtp, dtrace_errno(dtp))); dtrace_errmsg(dtp, dtrace_errno(dtp)));
return (2); return (2);
} }

View File

@ -21,12 +21,11 @@
# #
# #
# Copyright 2006 Sun Microsystems, Inc. All rights reserved. # Copyright 2008 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms. # Use is subject to license terms.
# #
#pragma ident "%Z%%M% %I% %E% SMI"
require 5.6.1; require 5.8.4;
$PNAME = $0; $PNAME = $0;
$PNAME =~ s:.*/::; $PNAME =~ s:.*/::;

View File

@ -24,9 +24,8 @@
# Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Copyright 2008 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms. # Use is subject to license terms.
# #
# ident "%Z%%M% %I% %E% SMI"
require 5.6.1; require 5.8.4;
use File::Find; use File::Find;
use File::Basename; use File::Basename;
@ -40,6 +39,7 @@ $OPTSTR = 'abd:fghi:jlnqsx:';
$USAGE = "Usage: $PNAME [-abfghjlnqs] [-d dir] [-i isa] " $USAGE = "Usage: $PNAME [-abfghjlnqs] [-d dir] [-i isa] "
. "[-x opt[=arg]] [file | dir ...]\n"; . "[-x opt[=arg]] [file | dir ...]\n";
($MACH = `uname -p`) =~ s/\W*\n//; ($MACH = `uname -p`) =~ s/\W*\n//;
($PLATFORM = `uname -i`) =~ s/\W*\n//;
@dtrace_argv = (); @dtrace_argv = ();
@ -215,17 +215,17 @@ sub is_exception {
} }
# #
# Iterate over the set of test files specified on the command-line or by # Iterate over the set of test files specified on the command-line or by a find
# a find on "$defdir/common" and "$defdir/$MACH" and execute each one. # on "$defdir/common", "$defdir/$MACH" and "$defdir/$PLATFORM" and execute each
# If the test file is executable, we fork and exec it. If the test is a # one. If the test file is executable, we fork and exec it. If the test is a
# .ksh file, we run it with $ksh_path. Otherwise we run dtrace -s on it. # .ksh file, we run it with $ksh_path. Otherwise we run dtrace -s on it. If
# If the file is named tst.* we assume it should return exit status 0. # the file is named tst.* we assume it should return exit status 0. If the
# If the file is named err.* we assume it should return exit status 1. # file is named err.* we assume it should return exit status 1. If the file is
# If the file is named err.D_[A-Z0-9]+[.*].d we use dtrace -xerrtags and # named err.D_[A-Z0-9]+[.*].d we use dtrace -xerrtags and examine stderr to
# examine stderr to ensure that a matching error tag was produced. # ensure that a matching error tag was produced. If the file is named
# If the file is named drp.[A-Z0-9]+[.*].d we use dtrace -xdroptags and # drp.[A-Z0-9]+[.*].d we use dtrace -xdroptags and examine stderr to ensure
# examine stderr to ensure that a matching drop tag was produced. # that a matching drop tag was produced. If any *.out or *.err files are found
# If any *.out or *.err files are found we perform output comparisons. # we perform output comparisons.
# #
# run_tests takes two arguments: The first is the pathname of the dtrace # run_tests takes two arguments: The first is the pathname of the dtrace
# command to invoke when running the tests. The second is the pathname # command to invoke when running the tests. The second is the pathname
@ -548,6 +548,7 @@ $bindir = -d $dt_bin ? $dt_bin : '.';
find(\&wanted, "$defdir/common") if (scalar(@ARGV) == 0); find(\&wanted, "$defdir/common") if (scalar(@ARGV) == 0);
find(\&wanted, "$defdir/$MACH") if (scalar(@ARGV) == 0); find(\&wanted, "$defdir/$MACH") if (scalar(@ARGV) == 0);
find(\&wanted, "$defdir/$PLATFORM") if (scalar(@ARGV) == 0);
die $USAGE if (scalar(@files) == 0); die $USAGE if (scalar(@files) == 0);
$dtrace_path = '/usr/sbin/dtrace'; $dtrace_path = '/usr/sbin/dtrace';

View File

@ -0,0 +1,41 @@
/*
* 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 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* ASSERTION:
* stddev() should not accept a non-scalar value
*
* SECTION: Aggregations/Aggregations
*
*/
#pragma D option quiet
BEGIN
{
@a[pid] = stddev(probefunc);
}

View File

@ -0,0 +1,41 @@
/*
* 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 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* ASSERTION:
* stddev() should not accept a call with no arguments
*
* SECTION: Aggregations/Aggregations
*
*/
#pragma D option quiet
BEGIN
{
@a[1] = stddev();
}

View File

@ -0,0 +1,41 @@
/*
* 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 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* ASSERTION:
* stddev() should not have more than one argument
*
* SECTION: Aggregations/Aggregations
*
*/
#pragma D option quiet
BEGIN
{
@a[1] = stddev(1, 2);
}

View File

@ -0,0 +1,57 @@
/*
* 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 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* ASSERTION:
* Positive stddev() test
*
* SECTION: Aggregations/Aggregations
*
* NOTES:
* Verifies that printing a clear()'d aggregation with an stddev()
* aggregation function doesn't cause problems.
*
*/
#pragma D option quiet
tick-10ms
/i++ < 5/
{
@a = stddev(timestamp);
}
tick-10ms
/i == 5/
{
exit(2);
}
END
{
clear(@a);
exit(0);
}

View File

@ -20,15 +20,13 @@
*/ */
/* /*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI"
/* /*
* ASSERTION: * ASSERTION:
* Multiple aggregates can be used within the same D script. * Multiple aggregates can be used within the same D script.
* *
* SECTION: Aggregations/Aggregations * SECTION: Aggregations/Aggregations
* *
@ -52,9 +50,11 @@ tick-10ms
@c[pid] = avg(new_time); @c[pid] = avg(new_time);
@d[pid] = sum(new_time); @d[pid] = sum(new_time);
@e[pid] = quantize(new_time); @e[pid] = quantize(new_time);
@f[timestamp] = max(new_time); @f[pid] = stddev(new_time);
@g[timestamp] = quantize(new_time); @g[timestamp] = max(new_time);
@h[timestamp] = lquantize(new_time, 0, 10000, 1000); @h[timestamp] = quantize(new_time);
@i[timestamp] = lquantize(new_time, 0, 10000, 1000);
time_1 = time_2; time_1 = time_2;
i++; i++;
} }

View File

@ -20,18 +20,16 @@
*/ */
/* /*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI"
/* /*
* ASSERTION: * ASSERTION:
* Test multiple aggregations and the default output order * Test multiple aggregations and the default output order
* *
* SECTION: Aggregations/Aggregations; * SECTION: Aggregations/Aggregations;
* Aggregations/Output * Aggregations/Output
* *
*/ */
@ -51,6 +49,7 @@ tick-10ms
@d = max(i); @d = max(i);
@e = quantize(i); @e = quantize(i);
@f = lquantize(i, 0, 1000, 100); @f = lquantize(i, 0, 1000, 100);
@g = stddev(i);
i += 100; i += 100;
} }

View File

@ -34,3 +34,4 @@
900 |@@@@ 1 900 |@@@@ 1
>= 1000 | 0 >= 1000 | 0
287

View File

@ -20,19 +20,17 @@
*/ */
/* /*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI"
/* /*
* ASSERTION: * ASSERTION:
* Test multiple aggregations and overriding default order with * Test multiple aggregations and overriding default order with
* printa() statements. * printa() statements.
* *
* SECTION: Aggregations/Aggregations; * SECTION: Aggregations/Aggregations;
* Aggregations/Output * Aggregations/Output
* *
* NOTES: This is a simple verifiable test. * NOTES: This is a simple verifiable test.
* *
@ -55,6 +53,7 @@ tick-10ms
@e = max(i); @e = max(i);
@f = quantize(i); @f = quantize(i);
@g = lquantize(i, 0, 1000, 100); @g = lquantize(i, 0, 1000, 100);
@h = stddev(i);
i += 100; i += 100;
} }
@ -62,6 +61,7 @@ tick-10ms
tick-10ms tick-10ms
/i == 1000/ /i == 1000/
{ {
printa("%@d\n", @h);
printa("%@d\n", @g); printa("%@d\n", @g);
printa("%@d\n", @f); printa("%@d\n", @f);
printa("%@d\n", @e); printa("%@d\n", @e);

View File

@ -1,3 +1,4 @@
287
value ------------- Distribution ------------- count value ------------- Distribution ------------- count
< 0 | 0 < 0 | 0

View File

@ -20,20 +20,19 @@
*/ */
/* /*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI"
/* /*
* ASSERTION: * ASSERTION:
* Positive stddev() test * Positive stddev() test
* *
* SECTION: Aggregations/Aggregations * SECTION: Aggregations/Aggregations
* *
* NOTES: This is a simple verifiable positive test of the stddev() function. * NOTES: This is a simple verifiable positive test of the stddev() function.
* printa() for one aggregation, default printing behavior for the other
* so that we exercise both code paths.
*/ */
#pragma D option quiet #pragma D option quiet
@ -60,5 +59,6 @@ BEGIN
@b = stddev(-5000000700); @b = stddev(-5000000700);
@b = stddev(-5000000800); @b = stddev(-5000000800);
@b = stddev(-5000000900); @b = stddev(-5000000900);
printa("%@d\n", @a);
exit(0); exit(0);
} }

View File

@ -0,0 +1,45 @@
/*
* 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 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* Test to check that attempting to enable a valid event with a frequency
* lower than the default platform limit will fail.
*
* This test will fail if:
* 1) The system under test does not define the 'PAPI_tot_ins' event.
* 2) The 'dcpc-min-overflow' variable in dcpc.conf has been modified.
*/
#pragma D option quiet
BEGIN
{
exit(0);
}
cpc:::PAPI_tot_ins-all-100
{
}

View File

@ -0,0 +1,40 @@
/*
* 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 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* Tests that specifying an overflow value containing extraneous characters
* (only digits are allowed) will fail.
*/
BEGIN
{
exit(0);
}
cpc:::PAPI_tot_ins-all-10000bonehead
{
@[probename] = count();
}

View File

@ -0,0 +1,40 @@
/*
* 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 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* Tests that attempting to enable a probe containing a non existent event
* will fail.
*/
BEGIN
{
exit(0);
}
cpc:::PAPI_cpc_bad-all-10000
{
@[probename] = count();
}

View File

@ -0,0 +1,78 @@
#!/bin/ksh
#
# 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 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#
# This tests that cpustat(1) should fail to start if the cpc provider
# is already calling the shots.
#
# This script will fail if:
# 1) The system under test does not define the 'PAPI_tot_ins'
# generic event.
script()
{
$dtrace -o $dtraceout -s /dev/stdin <<EOF
#pragma D option bufsize=128k
cpc:::PAPI_tot_ins-all-10000
{
@[probename] = count();
}
EOF
}
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
dtraceout=/tmp/dtrace.out.$$
script 2>/dev/null &
timeout=15
#
# Sleep while the above script fires into life. To guard against dtrace dying
# and us sleeping forever we allow 15 secs for this to happen. This should be
# enough for even the slowest systems.
#
while [ ! -f $dtraceout ]; do
sleep 1
timeout=$(($timeout-1))
if [ $timeout -eq 0 ]; then
echo "dtrace failed to start. Exiting."
exit 1
fi
done
cpustat -c PAPI_tot_ins 1 5
status=$?
rm $dtraceout
exit $status

View File

@ -0,0 +1,70 @@
#!/bin/ksh -p
#
# 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 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#
# This tests that enablings from the cpc provider will fail if cpustat(1) is
# already master of the universe.
#
# This script will fail if:
# 1) The system under test does not define the 'PAPI_tot_ins'
# generic event.
script()
{
$dtrace -s /dev/stdin <<EOF
#pragma D option bufsize=128k
BEGIN
{
exit(0);
}
cpc:::PAPI_tot_ins-all-10000
{
@[probename] = count();
}
EOF
}
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
dtraceout=/tmp/dtrace.out.$$
cpustat -c PAPI_tot_ins 1 20 &
pid=$!
sleep 5
script 2>/dev/null
status=$?
kill $pid
exit $status

View File

@ -0,0 +1,77 @@
#!/bin/ksh
#
# 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 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# This script ensures that cputrack(1M) will fail to start when the cpc
# provider has active enablings.
#
# The script will fail if:
# 1) The system under test does not define the 'PAPI_tot_ins' event.
#
script()
{
$dtrace -o $dtraceout -s /dev/stdin <<EOF
#pragma D option bufsize=128k
cpc:::PAPI_tot_ins-all-10000
{
@[probename] = count();
}
EOF
}
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
dtraceout=/tmp/dtrace.out.$$
script 2>/dev/null &
timeout=15
#
# Sleep while the above script fires into life. To guard against dtrace dying
# and us sleeping forever we allow 15 secs for this to happen. This should be
# enough for even the slowest systems.
#
while [ ! -f $dtraceout ]; do
sleep 1
timeout=$(($timeout-1))
if [ $timeout -eq 0 ]; then
echo "dtrace failed to start. Exiting."
exit 1
fi
done
cputrack -c PAPI_tot_ins sleep 10
status=$?
rm $dtraceout
exit $status

View File

@ -0,0 +1,70 @@
#!/bin/ksh
#
# 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 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# This script ensures that cputrack(1) will terminate when the cpc provider
# kicks into life.
#
# The script will fail if:
# 1) The system under test does not define the 'PAPI_tot_ins' event.
#
script()
{
$dtrace -s /dev/stdin <<EOF
#pragma D option bufsize=128k
cpc:::PAPI_tot_ins-all-10000
{
@[probename] = count();
}
tick-1s
/n++ > 10/
{
exit(0);
}
EOF
}
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
cputrack -c PAPI_tot_ins sleep 20 &
cputrack_pid=$!
sleep 5
script 2>/dev/null &
wait $cputrack_pid
status=$?
rm $dtraceout
exit $status

View File

@ -0,0 +1,55 @@
/*
* 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 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* Test to check that attempting to enable too many probes will fail.
*
* This test will fail if:
* 1) We ever execute on a platform which is capable of programming 10
* 'PAPI_tot_ins' events simultaneously (which no current platforms are
* capable of doing).
* 2) The system under test does not define the 'PAPI_tot_ins' event.
*/
#pragma D option quiet
BEGIN
{
exit(0);
}
cpc:::PAPI_tot_ins-all-10000,
cpc:::PAPI_tot_ins-all-10001,
cpc:::PAPI_tot_ins-all-10002,
cpc:::PAPI_tot_ins-all-10003,
cpc:::PAPI_tot_ins-all-10004,
cpc:::PAPI_tot_ins-all-10005,
cpc:::PAPI_tot_ins-all-10006,
cpc:::PAPI_tot_ins-all-10007,
cpc:::PAPI_tot_ins-all-10008,
cpc:::PAPI_tot_ins-all-10009
{
}

View File

@ -0,0 +1,107 @@
#!/bin/ksh
#
# 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 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#
# This script verifies that we can fire a probe on each CPU that is in
# an online state.
#
# The script will fail if:
# 1) The system under test does not define the 'PAPI_tot_ins' event.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
numproc=`psrinfo | tail -1 | cut -f1`
cpu=0
dtraceout=/var/tmp/dtrace.out.$$
scriptout=/var/tmp/script.out.$$
spin()
{
while [ 1 ]; do
:
done
}
script()
{
$dtrace -o $dtraceout -s /dev/stdin <<EOF
#pragma D option bufsize=128k
#pragma D option quiet
cpc:::PAPI_tot_ins-user-10000
/cpus[cpu] != 1/
{
cpus[cpu] = 1;
@a[cpu] = count();
}
tick-1s
/n++ > 10/
{
printa(@a);
exit(0);
}
EOF
}
echo "" > $scriptout
while [ $cpu -le $numproc ]
do
if [ "`psrinfo -s $cpu 2> /dev/null`" -eq 1 ]; then
printf "%9d %16d\n" $cpu 1 >> $scriptout
spin &
allpids[$cpu]=$!
pbind -b $cpu $!
fi
cpu=$(($cpu+1))
done
echo "" >> $scriptout
script
diff $dtraceout $scriptout >/dev/null 2>&1
status=$?
# kill off the spinner processes
cpu=0
while [ $cpu -le $numproc ]
do
if [ "`psrinfo -s $cpu 2> /dev/null`" -eq 1 ]; then
kill ${allpids[$cpu]}
fi
cpu=$(($cpu+1))
done
rm $dtraceout
rm $scriptout
exit $status

View File

@ -0,0 +1,48 @@
/*
* 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 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* Test that we can successfully enable a probe using a generic event.
* Currently, all platforms implement 'PAPI_tot_ins' so we'll use that.
* Note that this test will fail if the system under test does not
* implement that event.
*
* This test will fail if:
* 1) The system under test does not define the 'PAPI_tot_ins' event.
*/
#pragma D option quiet
#pragma D option bufsize=128k
cpc:::PAPI_tot_ins-all-10000
{
@[probename] = count();
}
tick-1s
/n++ > 10/
{
exit(0);
}

View File

@ -0,0 +1,81 @@
#!/bin/ksh
#
# 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 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#
# This script ensures that we can enable a probe which specifies a platform
# specific event.
#
if [ $# != 1 ]; then
print -u2 "expected one argument: <dtrace-path>"
exit 2
fi
dtrace=$1
get_event()
{
perl /dev/stdin /dev/stdout << EOF
open CPUSTAT, '/usr/sbin/cpustat -h |'
or die "Couldn't run cpustat: \$!\n";
while (<CPUSTAT>) {
if (/(\s+)event\[*[0-9]-*[0-9]*\]*:/ && !/PAPI/) {
@a = split(/ /, \$_);
\$event = \$a[\$#a-1];
}
}
close CPUSTAT;
print "\$event\n";
EOF
}
script()
{
$dtrace -s /dev/stdin << EOD
#pragma D option quiet
#pragma D option bufsize=128k
cpc:::$1-all-10000
{
@[probename] = count();
}
tick-1s
/n++ > 5/
{
exit(0);
}
EOD
}
event=$(get_event)
script $event
status=$?
exit $status

View File

@ -0,0 +1,104 @@
#!/usr/bin/perl -w
#
# 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 2008 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#pragma ident "%Z%%M% %I% %E% SMI"
#
# get.ipv4remote.pl [tcpport]
#
# Find an IPv4 reachable remote host using both ifconfig(1M) and ping(1M).
# If a tcpport is specified, return a host that is also listening on this
# TCP port. Print the local address and the remote address, or an
# error message if no suitable remote host was found. Exit status is 0 if
# a host was found.
#
use strict;
use IO::Socket;
my $MAXHOSTS = 32; # max hosts to port scan
my $TIMEOUT = 3; # connection timeout
my $tcpport = @ARGV == 1 ? $ARGV[0] : 0;
#
# Determine local IP address
#
my $local = "";
my $remote = "";
my %Broadcast;
my $up;
open IFCONFIG, '/usr/sbin/ifconfig -a |' or die "Couldn't run ifconfig: $!\n";
while (<IFCONFIG>) {
next if /^lo/;
# "UP" is always printed first (see print_flags() in ifconfig.c):
$up = 1 if /^[a-z].*<UP,/;
$up = 0 if /^[a-z].*<,/;
# assume output is "inet X ... broadcast Z":
if (/inet (\S+) .* broadcast (\S+)/) {
my ($addr, $bcast) = ($1, $2);
$Broadcast{$addr} = $bcast;
$local = $addr if $up and $local eq "";
$up = 0;
}
}
close IFCONFIG;
die "Could not determine local IP address" if $local eq "";
#
# Find the first remote host that responds to an icmp echo,
# which isn't a local address.
#
open PING, "/usr/sbin/ping -ns $Broadcast{$local} 56 $MAXHOSTS |" or
die "Couldn't run ping: $!\n";
while (<PING>) {
if (/bytes from (.*): / and not defined $Broadcast{$1}) {
my $addr = $1;
if ($tcpport != 0) {
#
# Test TCP
#
my $socket = IO::Socket::INET->new(
Proto => "tcp",
PeerAddr => $addr,
PeerPort => $tcpport,
Timeout => $TIMEOUT,
);
next unless $socket;
close $socket;
}
$remote = $addr;
last;
}
}
close PING;
die "Can't find a remote host for testing: No suitable response from " .
"$Broadcast{$local}\n" if $remote eq "";
print "$local $remote\n";

View File

@ -0,0 +1,88 @@
#!/usr/bin/perl -w
#
# 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 2008 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#pragma ident "%Z%%M% %I% %E% SMI"
#
# get.ipv6remote.pl
#
# Find an IPv6 reachable remote host using both ifconfig(1M) and ping(1M).
# Print the local address and the remote address, or print nothing if either
# no IPv6 interfaces or remote hosts were found. (Remote IPv6 testing is
# considered optional, and so not finding another IPv6 host is not an error
# state we need to log.) Exit status is 0 if a host was found.
#
use strict;
use IO::Socket;
my $MAXHOSTS = 32; # max hosts to scan
my $TIMEOUT = 3; # connection timeout
my $MULTICAST = "FF02::1"; # IPv6 multicast address
#
# Determine local IP address
#
my $local = "";
my $remote = "";
my %Local;
my $up;
open IFCONFIG, '/usr/sbin/ifconfig -a inet6 |'
or die "Couldn't run ifconfig: $!\n";
while (<IFCONFIG>) {
next if /^lo/;
# "UP" is always printed first (see print_flags() in ifconfig.c):
$up = 1 if /^[a-z].*<UP,/;
$up = 0 if /^[a-z].*<,/;
# assume output is "inet6 ...":
if (m:inet6 (\S+)/:) {
my $addr = $1;
$Local{$addr} = 1;
$local = $addr if $up and $local eq "";
$up = 0;
}
}
close IFCONFIG;
exit 1 if $local eq "";
#
# Find the first remote host that responds to an icmp echo,
# which isn't a local address.
#
open PING, "/usr/sbin/ping -ns -A inet6 $MULTICAST 56 $MAXHOSTS |" or
die "Couldn't run ping: $!\n";
while (<PING>) {
if (/bytes from (.*): / and not defined $Local{$1}) {
$remote = $1;
last;
}
}
close PING;
exit 2 if $remote eq "";
print "$local $remote\n";

View File

@ -0,0 +1,70 @@
#!/usr/bin/ksh
#
# 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 2008 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#pragma ident "%Z%%M% %I% %E% SMI"
#
# Test ip:::{send,receive} of IPv4 ICMP to a local address.
#
# This may fail due to:
#
# 1. A change to the ip stack breaking expected probe behavior,
# which is the reason we are testing.
# 2. The lo0 interface missing or not up.
# 3. Unrelated ICMP on lo0 traced by accident.
#
if (( $# != 1 )); then
print -u2 "expected one argument: <dtrace-path>"
exit 2
fi
dtrace=$1
local=127.0.0.1
$dtrace -c "/usr/sbin/ping $local 3" -qs /dev/stdin <<EOF | sort -n
ip:::send
/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
args[4]->ipv4_protocol == IPPROTO_ICMP/
{
printf("1 ip:::send (");
printf("args[2]: %d %d, ", args[2]->ip_ver, args[2]->ip_plength);
printf("args[4]: %d %d %d %d %d)\n",
args[4]->ipv4_ver, args[4]->ipv4_length, args[4]->ipv4_flags,
args[4]->ipv4_offset, args[4]->ipv4_ttl);
}
ip:::receive
/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
args[4]->ipv4_protocol == IPPROTO_ICMP/
{
printf("2 ip:::receive (");
printf("args[2]: %d %d, ", args[2]->ip_ver, args[2]->ip_plength);
printf("args[4]: %d %d %d %d %d)\n",
args[4]->ipv4_ver, args[4]->ipv4_length, args[4]->ipv4_flags,
args[4]->ipv4_offset, args[4]->ipv4_ttl);
}
EOF

View File

@ -0,0 +1,6 @@
1 ip:::send (args[2]: 4 64, args[4]: 4 84 0 0 255)
1 ip:::send (args[2]: 4 64, args[4]: 4 84 0 0 255)
2 ip:::receive (args[2]: 4 64, args[4]: 4 84 0 0 255)
2 ip:::receive (args[2]: 4 64, args[4]: 4 84 0 0 255)
127.0.0.1 is alive

View File

@ -0,0 +1,125 @@
#!/usr/bin/ksh
#
# 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 (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
#
#
# Test {ip,tcp}:::{send,receive} of IPv4 TCP to local host.
#
# This may fail due to:
#
# 1. A change to the ip stack breaking expected probe behavior,
# which is the reason we are testing.
# 2. The lo0 interface missing or not up.
# 3. The local ssh service is not online.
# 4. An unlikely race causes the unlocked global send/receive
# variables to be corrupted.
#
# This test performs a TCP connection and checks that at least the
# following packet counts were traced:
#
# 3 x ip:::send (2 during the TCP handshake, then a FIN)
# 3 x tcp:::send (2 during the TCP handshake, then a FIN)
# 2 x ip:::receive (1 during the TCP handshake, then the FIN ACK)
# 2 x tcp:::receive (1 during the TCP handshake, then the FIN ACK)
# The actual count tested is 5 each way, since we are tracing both
# source and destination events.
#
# For this test to work, we are assuming that the TCP handshake and
# TCP close will enter the IP code path and not use tcp fusion.
#
if (( $# != 1 )); then
print -u2 "expected one argument: <dtrace-path>"
exit 2
fi
dtrace=$1
local=127.0.0.1
tcpport=22
DIR=/var/tmp/dtest.$$
mkdir $DIR
cd $DIR
cat > test.pl <<-EOPERL
use IO::Socket;
my \$s = IO::Socket::INET->new(
Proto => "tcp",
PeerAddr => "$local",
PeerPort => $tcpport,
Timeout => 3);
die "Could not connect to host $local port $tcpport" unless \$s;
close \$s;
EOPERL
$dtrace -c '/usr/bin/perl test.pl' -qs /dev/stdin <<EODTRACE
BEGIN
{
ipsend = tcpsend = ipreceive = tcpreceive = 0;
}
ip:::send
/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
args[4]->ipv4_protocol == IPPROTO_TCP/
{
ipsend++;
}
tcp:::send
/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local"/
{
tcpsend++;
}
ip:::receive
/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
args[4]->ipv4_protocol == IPPROTO_TCP/
{
ipreceive++;
}
tcp:::receive
/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local"/
{
tcpreceive++;
}
END
{
printf("Minimum TCP events seen\n\n");
printf("ip:::send - %s\n", ipsend >= 5 ? "yes" : "no");
printf("ip:::receive - %s\n", ipreceive >= 5 ? "yes" : "no");
printf("tcp:::send - %s\n", tcpsend >= 5 ? "yes" : "no");
printf("tcp:::receive - %s\n", tcpreceive >= 5 ? "yes" : "no");
}
EODTRACE
status=$?
cd /
/usr/bin/rm -rf $DIR
exit $status

View File

@ -0,0 +1,7 @@
Minimum TCP events seen
ip:::send - yes
ip:::receive - yes
tcp:::send - yes
tcp:::receive - yes

View File

@ -0,0 +1,93 @@
#!/usr/bin/ksh
#
# 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 (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
#
#
# Test ip:::{send,receive} of IPv4 UDP to a local address.
#
# This may fail due to:
#
# 1. A change to the ip stack breaking expected probe behavior,
# which is the reason we are testing.
# 2. No physical network interface is plumbed and up.
# 3. No other hosts on this subnet are reachable and listening on rpcbind.
# 4. An unlikely race causes the unlocked global send/receive
# variables to be corrupted.
#
# This test sends a UDP message using ping and checks that at least the
# following counts were traced:
#
# 1 x ip:::send (UDP sent to ping's base UDP port)
# 1 x udp:::send (UDP sent to ping's base UDP port)
# 1 x ip:::receive (UDP received)
#
# No udp:::receive event is expected as the response ping -U elicits is
# an ICMP PORT_UNREACHABLE response rather than a UDP packet, and locally
# the echo request UDP packet only reaches IP, so the udp:::receive probe
# is not triggered by it.
#
if (( $# != 1 )); then
print -u2 "expected one argument: <dtrace-path>"
exit 2
fi
dtrace=$1
local=127.0.0.1
$dtrace -c "/usr/sbin/ping -U $local" -qs /dev/stdin <<EOF | grep -v 'is alive'
BEGIN
{
ipsend = udpsend = ipreceive = 0;
}
ip:::send
/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
args[4]->ipv4_protocol == IPPROTO_UDP/
{
ipsend++;
}
udp:::send
/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local"/
{
udpsend++;
}
ip:::receive
/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
args[4]->ipv4_protocol == IPPROTO_UDP/
{
ipreceive++;
}
END
{
printf("Minimum UDP events seen\n\n");
printf("ip:::send - %s\n", ipsend >= 1 ? "yes" : "no");
printf("ip:::receive - %s\n", ipreceive >= 1 ? "yes" : "no");
printf("udp:::send - %s\n", udpsend >= 1 ? "yes" : "no");
}
EOF

View File

@ -0,0 +1,6 @@
Minimum UDP events seen
ip:::send - yes
ip:::receive - yes
udp:::send - yes

View File

@ -0,0 +1,81 @@
#!/usr/bin/ksh
#
# 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 2008 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#pragma ident "%Z%%M% %I% %E% SMI"
#
# Test ip:::{send,receive} of IPv4 ICMP to a remote host.
#
# This may fail due to:
#
# 1. A change to the ip stack breaking expected probe behavior,
# which is the reason we are testing.
# 2. No physical network interface is plumbed and up.
# 3. No other hosts on this subnet are reachable.
# 4. An unrelated ICMP between these hosts was traced by accident.
#
if (( $# != 1 )); then
print -u2 "expected one argument: <dtrace-path>"
exit 2
fi
dtrace=$1
getaddr=./get.ipv4remote.pl
if [[ ! -x $getaddr ]]; then
print -u2 "could not find or execute sub program: $getaddr"
exit 3
fi
$getaddr | read source dest
if (( $? != 0 )); then
exit 4
fi
$dtrace -c "/usr/sbin/ping $dest 3" -qs /dev/stdin <<EOF | \
grep -v 'is alive' | sort -n
ip:::send
/args[2]->ip_saddr == "$source" && args[2]->ip_daddr == "$dest" &&
args[4]->ipv4_protocol == IPPROTO_ICMP/
{
printf("1 ip:::send (");
printf("args[2]: %d %d, ", args[2]->ip_ver, args[2]->ip_plength);
printf("args[4]: %d %d %d %d %d)\n",
args[4]->ipv4_ver, args[4]->ipv4_length, args[4]->ipv4_flags,
args[4]->ipv4_offset, args[4]->ipv4_ttl);
}
ip:::receive
/args[2]->ip_saddr == "$dest" && args[2]->ip_daddr == "$source" &&
args[4]->ipv4_protocol == IPPROTO_ICMP/
{
printf("2 ip:::receive (");
printf("args[2]: %d %d, ", args[2]->ip_ver, args[2]->ip_plength);
printf("args[4]: %d %d %d %d %d)\n",
args[4]->ipv4_ver, args[4]->ipv4_length, args[4]->ipv4_flags,
args[4]->ipv4_offset, args[4]->ipv4_ttl);
}
EOF

View File

@ -0,0 +1,3 @@
1 ip:::send (args[2]: 4 64, args[4]: 4 84 0 0 255)
2 ip:::receive (args[2]: 4 64, args[4]: 4 84 4 0 255)

View File

@ -0,0 +1,128 @@
#!/usr/bin/ksh
#
# 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 (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
#
#
# Test {tcp,ip}:::{send,receive} of IPv4 TCP to a remote host.
#
# This may fail due to:
#
# 1. A change to the ip stack breaking expected probe behavior,
# which is the reason we are testing.
# 2. No physical network interface is plumbed and up.
# 3. No other hosts on this subnet are reachable and listening on ssh.
# 4. An unlikely race causes the unlocked global send/receive
# variables to be corrupted.
#
# This test performs a TCP connection and checks that at least the
# following packet counts were traced:
#
# 3 x ip:::send (2 during the TCP handshake, then a FIN)
# 3 x tcp:::send (2 during the TCP handshake, then a FIN)
# 2 x ip:::receive (1 during the TCP handshake, then the FIN ACK)
# 2 x tcp:::receive (1 during the TCP handshake, then the FIN ACK)
#
if (( $# != 1 )); then
print -u2 "expected one argument: <dtrace-path>"
exit 2
fi
dtrace=$1
getaddr=./get.ipv4remote.pl
tcpport=22
DIR=/var/tmp/dtest.$$
if [[ ! -x $getaddr ]]; then
print -u2 "could not find or execute sub program: $getaddr"
exit 3
fi
$getaddr $tcpport | read source dest
if (( $? != 0 )); then
exit 4
fi
mkdir $DIR
cd $DIR
cat > test.pl <<-EOPERL
use IO::Socket;
my \$s = IO::Socket::INET->new(
Proto => "tcp",
PeerAddr => "$dest",
PeerPort => $tcpport,
Timeout => 3);
die "Could not connect to host $dest port $tcpport" unless \$s;
close \$s;
EOPERL
$dtrace -c '/usr/bin/perl test.pl' -qs /dev/stdin <<EODTRACE
BEGIN
{
ipsend = tcpsend = ipreceive = tcpreceive = 0;
}
ip:::send
/args[2]->ip_saddr == "$source" && args[2]->ip_daddr == "$dest" &&
args[4]->ipv4_protocol == IPPROTO_TCP/
{
ipsend++;
}
tcp:::send
/args[2]->ip_saddr == "$source" && args[2]->ip_daddr == "$dest"/
{
tcpsend++;
}
ip:::receive
/args[2]->ip_saddr == "$dest" && args[2]->ip_daddr == "$source" &&
args[4]->ipv4_protocol == IPPROTO_TCP/
{
ipreceive++;
}
tcp:::receive
/args[2]->ip_saddr == "$dest" && args[2]->ip_daddr == "$source"/
{
tcpreceive++;
}
END
{
printf("Minimum TCP events seen\n\n");
printf("ip:::send - %s\n", ipsend >= 3 ? "yes" : "no");
printf("ip:::receive - %s\n", ipreceive >= 2 ? "yes" : "no");
printf("tcp:::send - %s\n", tcpsend >= 3 ? "yes" : "no");
printf("tcp:::receive - %s\n", tcpreceive >= 2 ? "yes" : "no");
}
EODTRACE
status=$?
cd /
/usr/bin/rm -rf $DIR
exit $?

View File

@ -0,0 +1,7 @@
Minimum TCP events seen
ip:::send - yes
ip:::receive - yes
tcp:::send - yes
tcp:::receive - yes

View File

@ -0,0 +1,88 @@
#!/usr/bin/ksh
#
# 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 (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
#
#
# Test {udp,ip}:::{send,receive} of IPv4 UDP to a remote host.
#
# This may fail due to:
#
# 1. A change to the ip stack breaking expected probe behavior,
# which is the reason we are testing.
# 2. No physical network interface is plumbed and up.
# 3. No other hosts on this subnet are reachable and listening on rpcbind.
# 4. An unlikely race causes the unlocked global send/receive
# variables to be corrupted.
#
# This test sends a UDP message using ping and checks that at least the
# following counts were traced:
#
# 1 x ip:::send (UDP sent to ping's base UDP port)
# 1 x udp:::send (UDP sent to ping's base UDP port)
#
if (( $# != 1 )); then
print -u2 "expected one argument: <dtrace-path>"
exit 2
fi
dtrace=$1
getaddr=./get.ipv4remote.pl
if [[ ! -x $getaddr ]]; then
print -u2 "could not find or execute sub program: $getaddr"
exit 3
fi
$getaddr | read source dest
if (( $? != 0 )); then
exit 4
fi
$dtrace -c "/usr/sbin/ping -U $dest" -qs /dev/stdin <<EOF | grep -v 'is alive'
BEGIN
{
ipsend = udpsend = 0;
}
ip:::send
/args[2]->ip_saddr == "$source" && args[2]->ip_daddr == "$dest" &&
args[4]->ipv4_protocol == IPPROTO_UDP/
{
ipsend++;
}
udp:::send
/args[2]->ip_saddr == "$source" && args[2]->ip_daddr == "$dest"/
{
udpsend++;
}
END
{
printf("Minimum UDP events seen\n\n");
printf("ip:::send - %s\n", ipsend >= 1 ? "yes" : "no");
printf("udp:::send - %s\n", udpsend >= 1 ? "yes" : "no");
}
EOF

View File

@ -0,0 +1,5 @@
Minimum UDP events seen
ip:::send - yes
udp:::send - yes

View File

@ -0,0 +1,82 @@
#!/usr/bin/ksh
#
# 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 2008 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#pragma ident "%Z%%M% %I% %E% SMI"
#
# Test ip:::{send,receive} of IPv6 ICMP to a local address. This creates a
# temporary lo0/inet6 interface if one doesn't already exist.
#
# This may fail due to:
#
# 1. A change to the ip stack breaking expected probe behavior,
# which is the reason we are testing.
# 2. Unrelated ICMPv6 on lo0 traced by accident.
#
if (( $# != 1 )); then
print -u2 "expected one argument: <dtrace-path>"
exit 2
fi
dtrace=$1
local=::1
if ! ifconfig lo0 inet6 > /dev/null 2>&1; then
if ! ifconfig lo0 inet6 plumb up; then
print -u2 "could not plumb lo0 inet6 for testing"
exit 3
fi
removeinet6=1
else
removeinet6=0
fi
$dtrace -c "/usr/sbin/ping -A inet6 $local 3" -qs /dev/stdin <<EOF | sort -n
ip:::send
/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
args[5]->ipv6_nexthdr == IPPROTO_ICMPV6/
{
printf("1 ip:::send (");
printf("args[2]: %d %d, ", args[2]->ip_ver, args[2]->ip_plength);
printf("args[5]: %d %d %d)\n",
args[5]->ipv6_ver, args[5]->ipv6_tclass, args[5]->ipv6_plen);
}
ip:::receive
/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
args[5]->ipv6_nexthdr == IPPROTO_ICMPV6/
{
printf("2 ip:::receive (");
printf("args[2]: %d %d, ", args[2]->ip_ver, args[2]->ip_plength);
printf("args[5]: %d %d %d)\n",
args[5]->ipv6_ver, args[5]->ipv6_tclass, args[5]->ipv6_plen);
}
EOF
if (( removeinet6 )); then
ifconfig lo0 inet6 unplumb
fi

View File

@ -0,0 +1,6 @@
::1 is alive
1 ip:::send (args[2]: 6 64, args[5]: 6 0 64)
1 ip:::send (args[2]: 6 64, args[5]: 6 0 64)
2 ip:::receive (args[2]: 6 64, args[5]: 6 0 64)
2 ip:::receive (args[2]: 6 64, args[5]: 6 0 64)

View File

@ -0,0 +1,88 @@
#!/usr/bin/ksh
#
# 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 2008 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#pragma ident "%Z%%M% %I% %E% SMI"
#
# Test ip:::{send,receive} of IPv6 ICMP to a remote host. This test is
# skipped if there are no physical interfaces configured with IPv6, or no
# other IPv6 hosts are reachable.
#
# This may fail due to:
#
# 1. A change to the ip stack breaking expected probe behavior,
# which is the reason we are testing.
# 2. An unrelated ICMPv6 between these hosts was traced by accident.
#
if (( $# != 1 )); then
print -u2 "expected one argument: <dtrace-path>"
exit 2
fi
dtrace=$1
getaddr=./get.ipv6remote.pl
if [[ ! -x $getaddr ]]; then
print -u2 "could not find or execute sub program: $getaddr"
exit 3
fi
$getaddr | read source dest
if (( $? != 0 )); then
print -nu2 "Could not find a local IPv6 interface and a remote IPv6 "
print -u2 "host. Aborting test.\n"
print -nu2 "For this test to continue, a \"ping -ns -A inet6 FF02::1\" "
print -u2 "must respond with a\nremote IPv6 host."
exit 3
fi
#
# Shake loose any ICMPv6 Neighbor advertisement messages before tracing.
#
/usr/sbin/ping $dest 3 > /dev/null 2>&1
$dtrace -c "/usr/sbin/ping $dest 3" -qs /dev/stdin <<EOF | \
grep -v 'is alive' | sort -n
ip:::send
/args[2]->ip_saddr == "$source" && args[2]->ip_daddr == "$dest" &&
args[5]->ipv6_nexthdr == IPPROTO_ICMPV6/
{
printf("1 ip:::send (");
printf("args[2]: %d %d, ", args[2]->ip_ver, args[2]->ip_plength);
printf("args[5]: %d %d %d)\n",
args[5]->ipv6_ver, args[5]->ipv6_tclass, args[5]->ipv6_plen);
}
ip:::receive
/args[2]->ip_saddr == "$dest" && args[2]->ip_daddr == "$source" &&
args[5]->ipv6_nexthdr == IPPROTO_ICMPV6/
{
printf("2 ip:::receive (");
printf("args[2]: %d %d, ", args[2]->ip_ver, args[2]->ip_plength);
printf("args[5]: %d %d %d)\n",
args[5]->ipv6_ver, args[5]->ipv6_tclass, args[5]->ipv6_plen);
}
EOF

View File

@ -0,0 +1,3 @@
1 ip:::send (args[2]: 6 64, args[5]: 6 0 64)
2 ip:::receive (args[2]: 6 64, args[5]: 6 0 64)

View File

@ -0,0 +1,182 @@
#!/usr/bin/ksh
#
# 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 (c) 2010, Oracle and/or its affiliates. All rights reserved.
#
#
# Test tcp:::state-change and tcp:::{send,receive} by connecting to
# the local ssh service and sending a test message. This should result
# in a "Protocol mismatch" response and a close of the connection.
# A number of state transition events along with tcp fusion send and
# receive events for the message should result.
#
# This may fail due to:
#
# 1. A change to the ip stack breaking expected probe behavior,
# which is the reason we are testing.
# 2. The lo0 interface missing or not up.
# 3. The local ssh service is not online.
# 4. An unlikely race causes the unlocked global send/receive
# variables to be corrupted.
#
# This test performs a TCP connection to the ssh service (port 22) and
# checks that at least the following packet counts were traced:
#
# 3 x ip:::send (2 during the TCP handshake, then a FIN)
# 4 x tcp:::send (2 during the TCP handshake, 1 message then a FIN)
# 2 x ip:::receive (1 during the TCP handshake, then the FIN ACK)
# 3 x tcp:::receive (1 during the TCP handshake, 1 message then the FIN ACK)
#
# The actual ip count tested is 5 each way, since we are tracing both
# source and destination events. The actual tcp count tested is 7
# each way, since the TCP fusion send/receive events will not reach IP.
#
# For this test to work, we are assuming that the TCP handshake and
# TCP close will enter the IP code path and not use tcp fusion.
#
if (( $# != 1 )); then
print -u2 "expected one argument: <dtrace-path>"
exit 2
fi
dtrace=$1
local=127.0.0.1
tcpport=22
DIR=/var/tmp/dtest.$$
mkdir $DIR
cd $DIR
cat > test.pl <<-EOPERL
use IO::Socket;
my \$s = IO::Socket::INET->new(
Proto => "tcp",
PeerAddr => "$local",
PeerPort => $tcpport,
Timeout => 3);
die "Could not connect to host $local port $tcpport" unless \$s;
print \$s "testing state machine transitions";
close \$s;
EOPERL
$dtrace -c '/usr/bin/perl test.pl' -qs /dev/stdin <<EODTRACE
BEGIN
{
ipsend = tcpsend = ipreceive = tcpreceive = 0;
connreq = connest = connaccept = 0;
}
ip:::send
/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
args[4]->ipv4_protocol == IPPROTO_TCP/
{
ipsend++;
}
tcp:::send
/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
(args[4]->tcp_sport == $tcpport || args[4]->tcp_dport == $tcpport)/
{
tcpsend++;
}
ip:::receive
/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
args[4]->ipv4_protocol == IPPROTO_TCP/
{
ipreceive++;
}
tcp:::receive
/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
(args[4]->tcp_sport == $tcpport || args[4]->tcp_dport == $tcpport)/
{
tcpreceive++;
}
tcp:::state-change
{
state_event[args[3]->tcps_state]++;
}
tcp:::connect-request
/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
args[4]->tcp_dport == $tcpport/
{
connreq++;
}
tcp:::connect-established
/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
args[4]->tcp_sport == $tcpport/
{
connest++;
}
tcp:::accept-established
/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
args[4]->tcp_dport == $tcpport/
{
connaccept++;
}
END
{
printf("Minimum TCP events seen\n\n");
printf("ip:::send - %s\n", ipsend >= 5 ? "yes" : "no");
printf("ip:::receive - %s\n", ipreceive >= 5 ? "yes" : "no");
printf("tcp:::send - %s\n", tcpsend >= 7 ? "yes" : "no");
printf("tcp:::receive - %s\n", tcpreceive >= 7 ? "yes" : "no");
printf("tcp:::state-change to syn-sent - %s\n",
state_event[TCP_STATE_SYN_SENT] >=1 ? "yes" : "no");
printf("tcp:::state-change to syn-received - %s\n",
state_event[TCP_STATE_SYN_RECEIVED] >=1 ? "yes" : "no");
printf("tcp:::state-change to established - %s\n",
state_event[TCP_STATE_ESTABLISHED] >= 2 ? "yes" : "no");
printf("tcp:::state-change to fin-wait-1 - %s\n",
state_event[TCP_STATE_FIN_WAIT_1] >= 1 ? "yes" : "no");
printf("tcp:::state-change to close-wait - %s\n",
state_event[TCP_STATE_CLOSE_WAIT] >= 1 ? "yes" : "no");
printf("tcp:::state-change to fin-wait-2 - %s\n",
state_event[TCP_STATE_FIN_WAIT_2] >= 1 ? "yes" : "no");
printf("tcp:::state-change to last-ack - %s\n",
state_event[TCP_STATE_LAST_ACK] >= 1 ? "yes" : "no");
printf("tcp:::state-change to time-wait - %s\n",
state_event[TCP_STATE_TIME_WAIT] >= 1 ? "yes" : "no");
printf("tcp:::connect-request - %s\n",
connreq >=1 ? "yes" : "no");
printf("tcp:::connect-established - %s\n",
connest >=1 ? "yes" : "no");
printf("tcp:::accept-established - %s\n",
connaccept >=1 ? "yes" : "no");
}
EODTRACE
status=$?
cd /
/usr/bin/rm -rf $DIR
exit $status

View File

@ -0,0 +1,18 @@
Minimum TCP events seen
ip:::send - yes
ip:::receive - yes
tcp:::send - yes
tcp:::receive - yes
tcp:::state-change to syn-sent - yes
tcp:::state-change to syn-received - yes
tcp:::state-change to established - yes
tcp:::state-change to fin-wait-1 - yes
tcp:::state-change to close-wait - yes
tcp:::state-change to fin-wait-2 - yes
tcp:::state-change to last-ack - yes
tcp:::state-change to time-wait - yes
tcp:::connect-request - yes
tcp:::connect-established - yes
tcp:::accept-established - yes

View File

@ -0,0 +1,172 @@
#!/usr/bin/ksh
#
# 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 (c) 2010, Oracle and/or its affiliates. All rights reserved.
#
#
# Test tcp:::state-change and tcp:::{send,receive} by connecting to
# the remote ssh service and sending a test message. This should result
# in a "Protocol mismatch" response and a close of the connection.
# A number of state transition events along with tcp send and receive
# events for the message should result.
#
# This may fail due to:
#
# 1. A change to the ip stack breaking expected probe behavior,
# which is the reason we are testing.
# 2. The lo0 interface missing or not up.
# 3. The remote ssh service is not online.
# 4. An unlikely race causes the unlocked global send/receive
# variables to be corrupted.
#
# This test performs a TCP connection to the ssh service (port 22) and
# checks that at least the following packet counts were traced:
#
# 4 x ip:::send (2 during the TCP handshake, the message, then a FIN)
# 4 x tcp:::send (2 during the TCP handshake, the messages, then a FIN)
# 3 x ip:::receive (1 during the TCP handshake, the response, then the FIN ACK)
# 3 x tcp:::receive (1 during the TCP handshake, the response, then the FIN ACK)
#
# For this test to work, we are assuming that the TCP handshake and
# TCP close will enter the IP code path and not use tcp fusion.
#
if (( $# != 1 )); then
print -u2 "expected one argument: <dtrace-path>"
exit 2
fi
dtrace=$1
getaddr=./get.ipv4remote.pl
tcpport=22
DIR=/var/tmp/dtest.$$
if [[ ! -x $getaddr ]]; then
print -u2 "could not find or execute sub program: $getaddr"
exit 3
fi
$getaddr $tcpport | read source dest
if (( $? != 0 )); then
exit 4
fi
mkdir $DIR
cd $DIR
cat > test.pl <<-EOPERL
use IO::Socket;
my \$s = IO::Socket::INET->new(
Proto => "tcp",
PeerAddr => "$dest",
PeerPort => $tcpport,
Timeout => 3);
die "Could not connect to host $dest port $tcpport" unless \$s;
print \$s "testing state machine transitions";
close \$s;
EOPERL
$dtrace -c '/usr/bin/perl test.pl' -qs /dev/stdin <<EODTRACE
BEGIN
{
ipsend = tcpsend = ipreceive = tcpreceive = 0;
connreq = connest = 0;
}
ip:::send
/args[2]->ip_saddr == "$source" && args[2]->ip_daddr == "$dest" &&
args[4]->ipv4_protocol == IPPROTO_TCP/
{
ipsend++;
}
tcp:::send
/args[2]->ip_saddr == "$source" && args[2]->ip_daddr == "$dest" &&
args[4]->tcp_dport == $tcpport/
{
tcpsend++;
}
ip:::receive
/args[2]->ip_saddr == "$dest" && args[2]->ip_daddr == "$source" &&
args[4]->ipv4_protocol == IPPROTO_TCP/
{
ipreceive++;
}
tcp:::receive
/args[2]->ip_saddr == "$dest" && args[2]->ip_daddr == "$source" &&
args[4]->tcp_sport == $tcpport/
{
tcpreceive++;
}
tcp:::state-change
{
state_event[args[3]->tcps_state]++;
}
tcp:::connect-request
/args[2]->ip_saddr == "$source" && args[2]->ip_daddr == "$dest" &&
args[4]->tcp_dport == $tcpport/
{
connreq++;
}
tcp:::connect-established
/args[2]->ip_saddr == "$dest" && args[2]->ip_daddr == "$source" &&
args[4]->tcp_sport == $tcpport/
{
connest++;
}
END
{
printf("Minimum TCP events seen\n\n");
printf("ip:::send - %s\n", ipsend >= 4 ? "yes" : "no");
printf("ip:::receive - %s\n", ipreceive >= 3 ? "yes" : "no");
printf("tcp:::send - %s\n", tcpsend >= 4 ? "yes" : "no");
printf("tcp:::receive - %s\n", tcpreceive >= 3 ? "yes" : "no");
printf("tcp:::state-change to syn-sent - %s\n",
state_event[TCP_STATE_SYN_SENT] >=1 ? "yes" : "no");
printf("tcp:::state-change to established - %s\n",
state_event[TCP_STATE_ESTABLISHED] >= 1 ? "yes" : "no");
printf("tcp:::state-change to fin-wait-1 - %s\n",
state_event[TCP_STATE_FIN_WAIT_1] >= 1 ? "yes" : "no");
printf("tcp:::state-change to fin-wait-2 - %s\n",
state_event[TCP_STATE_FIN_WAIT_2] >= 1 ? "yes" : "no");
printf("tcp:::state-change to time-wait - %s\n",
state_event[TCP_STATE_TIME_WAIT] >= 1 ? "yes" : "no");
printf("tcp:::connect-request - %s\n",
connreq >=1 ? "yes" : "no");
printf("tcp:::connect-established - %s\n",
connest >=1 ? "yes" : "no");
}
EODTRACE
status=$?
cd /
/usr/bin/rm -rf $DIR
exit $status

View File

@ -0,0 +1,15 @@
Minimum TCP events seen
ip:::send - yes
ip:::receive - yes
tcp:::send - yes
tcp:::receive - yes
tcp:::state-change to syn-sent - yes
tcp:::state-change to established - yes
tcp:::state-change to fin-wait-1 - yes
tcp:::state-change to close-wait - yes
tcp:::state-change to fin-wait-2 - yes
tcp:::state-change to time-wait - yes
tcp:::connect-request - yes
tcp:::connect-established - yes

View File

@ -20,10 +20,8 @@
*/ */
/* /*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*
* ident "%Z%%M% %I% %E% SMI"
*/ */
import org.opensolaris.os.dtrace.*; import org.opensolaris.os.dtrace.*;
@ -70,7 +68,7 @@ public class TestFunctionLookup {
long addr = (Long)address; long addr = (Long)address;
f = consumer.lookupKernelFunction(addr); f = consumer.lookupKernelFunction(addr);
} }
if (f.equals("genunix`setrun")) { if (f.equals("genunix`cv_wakeup")) {
System.out.println(f); System.out.println(f);
done = true; done = true;
} }

View File

@ -0,0 +1,252 @@
/*
* 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 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
import org.opensolaris.os.dtrace.*;
import java.util.*;
/**
* Assert getAggregate() can explicitly specify the anonymous aggregation.
*/
public class TestGetAggregate {
static final String programString =
"profile:::tick-50ms" +
"{" +
" @ = count();" +
" @a = count();" +
"}";
static final String ANONYMOUS_AGGREGATION = "";
static final int TICK = 50;
static final int EXPECTED_TICKS = 3;
static final int INTERVALS = 4;
static void
testIncluded(Consumer consumer, String ... aggregationNames)
throws DTraceException, InterruptedException
{
Aggregate aggregate;
Set <String> included = new HashSet <String> ();
int n = 1;
for (String name : aggregationNames) {
included.add(name);
}
// Wait up to a full second to obtain aggregate data. Without a
// time limit, we'll loop forever if no aggregation was
// successfully included.
do {
Thread.sleep(TICK);
aggregate = consumer.getAggregate(included, null);
} while (aggregate.asMap().isEmpty() && n++ < (1000 / TICK));
for (String name : included) {
if (aggregate.getAggregation(name) == null) {
throw new IllegalStateException("@" + name +
" was explicitly included but did not appear " +
"in the aggregate");
}
}
for (Aggregation a : aggregate.getAggregations()) {
if (!included.contains(a.getName())) {
throw new IllegalStateException("@" + a.getName() +
" was not explicitly included but appeared " +
"in the aggregate anyway");
}
}
if (!consumer.isRunning()) {
throw new IllegalStateException("consumer exited");
}
}
static void
testCleared(Consumer consumer, String ... aggregationNames)
throws DTraceException, InterruptedException
{
Aggregate aggregate;
AggregationRecord rec;
long value;
Long firstValue;
int n = 1;
Map <String, Long> firstValues = new HashMap <String, Long> ();
Set <String> cleared = new HashSet <String> ();
for (String name : aggregationNames) {
cleared.add(name);
}
do {
Thread.sleep(TICK);
aggregate = consumer.getAggregate(null, cleared);
} while (aggregate.asMap().isEmpty() && n++ < (1000 / TICK));
n = 1;
do {
Thread.sleep(TICK * EXPECTED_TICKS);
aggregate = consumer.getAggregate(null, cleared);
for (Aggregation a : aggregate.getAggregations()) {
if (!firstValues.containsKey(a.getName())) {
rec = a.getRecord(Tuple.EMPTY);
value = rec.getValue().getValue().longValue();
firstValues.put(a.getName(), value);
}
}
} while (consumer.isRunning() && n++ < INTERVALS);
for (Aggregation a : aggregate.getAggregations()) {
rec = a.getRecord(Tuple.EMPTY);
value = rec.getValue().getValue().longValue();
firstValue = firstValues.get(a.getName());
if (cleared.contains(a.getName())) {
// last value should be about the same as first value
if (value > (firstValue * 2)) {
throw new IllegalStateException(
"@" + a.getName() + " should have " +
"been cleared but instead grew from " +
firstValue + " to " + value);
}
} else {
// last value should be about (INTERVALS * firstValue)
if (value < (firstValue * 2)) {
throw new IllegalStateException(
"@" + a.getName() + " should have " +
"accumulated a running total but " +
"instead went from " +
firstValue + " to " + value);
}
}
}
if (!consumer.isRunning()) {
throw new IllegalStateException("consumer exited");
}
}
static Integer includedStatus;
static Integer clearedStatus;
static void
startIncludedTest()
{
final Consumer consumer = new LocalConsumer();
consumer.addConsumerListener(new ConsumerAdapter() {
public void consumerStarted(ConsumerEvent e) {
new Thread(new Runnable() {
public void run() {
try {
testIncluded(consumer, ANONYMOUS_AGGREGATION);
includedStatus = 0;
} catch (Exception e) {
includedStatus = 1;
e.printStackTrace();
} finally {
consumer.abort();
}
}
}).start();
}
});
try {
consumer.open();
consumer.setOption(Option.aggrate, Option.millis(TICK));
consumer.compile(programString);
consumer.enable();
consumer.go();
} catch (Exception e) {
includedStatus = 1;
e.printStackTrace();
}
}
static void
startClearedTest()
{
final Consumer consumer = new LocalConsumer();
consumer.addConsumerListener(new ConsumerAdapter() {
public void consumerStarted(ConsumerEvent e) {
new Thread(new Runnable() {
public void run() {
try {
testCleared(consumer, ANONYMOUS_AGGREGATION);
clearedStatus = 0;
} catch (Exception e) {
clearedStatus = 1;
e.printStackTrace();
} finally {
consumer.abort();
}
}
}).start();
}
});
try {
consumer.open();
consumer.setOption(Option.aggrate, Option.millis(TICK));
consumer.compile(programString);
consumer.enable();
consumer.go();
} catch (Exception e) {
clearedStatus = 1;
e.printStackTrace();
}
}
public static void
main(String[] args)
{
startIncludedTest();
do {
try {
Thread.sleep(TICK);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (includedStatus == null);
startClearedTest();
do {
try {
Thread.sleep(TICK);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (clearedStatus == null);
if (includedStatus != 0 || clearedStatus != 0) {
System.out.println("Failure");
System.exit(1);
}
System.out.println("Success");
}
}

View File

@ -1,3 +1,3 @@
genunix`setrun genunix`cv_wakeup
3 3
tst.FunctionLookup.exe`f1 tst.FunctionLookup.exe`f1

View File

@ -0,0 +1,36 @@
#!/bin/ksh -p
#
# 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 2008 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
############################################################################
# ASSERTION:
# getAggregate() can explicitly specify the anonymous aggregation
#
# SECTION: Java API
#
############################################################################
java -cp test.jar TestGetAggregate

View File

@ -0,0 +1,41 @@
#
# 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 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
$dtrace -ln 'syscall::*$1:entry' read | awk '{print $(NF-1),$NF}' | sort
$dtrace -ln 'syscall::$1*:entry' read | awk '{print $(NF-1),$NF}' | sort
$dtrace -ln 'syscall::re$1*:entry' ad | awk '{print $(NF-1),$NF}' | sort
$dtrace -ln 'syscall::$1l*:entry' read | awk '{print $(NF-1),$NF}' | sort
$dtrace -ln 'syscall::p$1[0-9][0-9]:entry' read | awk '{print $(NF-1),$NF}' | \
sort
exit $status

View File

@ -0,0 +1,15 @@
FUNCTION NAME
pread entry
read entry
FUNCTION NAME
read entry
readlink entry
readv entry
FUNCTION NAME
read entry
readlink entry
readv entry
FUNCTION NAME
readlink entry
FUNCTION NAME
pread64 entry

View File

@ -0,0 +1,29 @@
#!/bin/ksh
#
# 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.
#
#ident "%Z%%M% %I% %E% SMI"
sleep 1000000

View File

@ -0,0 +1,29 @@
#!/bin/bash
#
# 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.
#
#ident "%Z%%M% %I% %E% SMI"
sleep 1000000

View File

@ -0,0 +1,29 @@
#!/bin/ksh
#
# 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.
#
#ident "%Z%%M% %I% %E% SMI"
sleep 1000000

View File

@ -0,0 +1,29 @@
#!/bin/ksh
#
# 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.
#
#ident "%Z%%M% %I% %E% SMI"
sleep 1000000

View File

@ -0,0 +1,29 @@
#!/bin/ksh
#
# 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.
#
#ident "%Z%%M% %I% %E% SMI"
sleep 1000000

View File

@ -0,0 +1,29 @@
#!/bin/ksh
#
# 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.
#
#ident "%Z%%M% %I% %E% SMI"
sleep 1000000

View File

@ -0,0 +1,29 @@
#!/bin/ksh
#
# 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.
#
#ident "%Z%%M% %I% %E% SMI"
sleep 1000000

View File

@ -0,0 +1,29 @@
#!/bin/ksh
#
# 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.
#
#ident "%Z%%M% %I% %E% SMI"
sleep 1000000

View File

@ -0,0 +1,29 @@
#!/usr/bin/ksh
#
# 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.
#
#ident "%Z%%M% %I% %E% SMI"
while true; do env > /dev/null; done

View File

@ -0,0 +1,29 @@
#!/usr/bin/ksh
#
# 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.
#
#ident "%Z%%M% %I% %E% SMI"
exec find / > /dev/null 2>&1

View File

@ -0,0 +1,41 @@
#!/bin/ksh -p
#
# 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 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
#
# Make sure we kill a process if the dtrace(1M) command fails.
#
rc=`$dtrace -c date -n jarod 2>/dev/null | /usr/bin/wc -l`
exit $rc

View File

@ -21,11 +21,9 @@
# #
# #
# Copyright 2006 Sun Microsystems, Inc. All rights reserved. # Copyright 2008 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms. # Use is subject to license terms.
# #
# ident "%Z%%M% %I% %E% SMI"
#
if [ $# != 1 ]; then if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>' echo expected one argument: '<'dtrace-path'>'
@ -40,7 +38,7 @@ dtrace=$1
# (and therefore 'libc' and 'libc.so') as it's definitely there. # (and therefore 'libc' and 'libc.so') as it's definitely there.
# #
for lib in libc libc.so libc.so.1; do for lib in libc libc.so libc.so.1 'lib[c]*'; do
sleep 60 & sleep 60 &
pid=$! pid=$!
dtrace -n "pid$pid:$lib::entry" -n 'tick-2s{exit(0);}' dtrace -n "pid$pid:$lib::entry" -n 'tick-2s{exit(0);}'

View File

@ -0,0 +1,29 @@
#!/usr/bin/ksh
#
# 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.
#
#ident "%Z%%M% %I% %E% SMI"
sleep 100000000

View File

@ -0,0 +1,29 @@
#!/usr/bin/ksh
#
# 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.
#
#ident "%Z%%M% %I% %E% SMI"
sleep 100000000

View File

@ -20,15 +20,13 @@
*/ */
/* /*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI"
/* /*
* ASSERTION: * ASSERTION:
* Test the basic formatting of all the supported kinds of aggregations. * Test the basic formatting of all the supported kinds of aggregations.
* *
* SECTION: Output Formatting/printa() * SECTION: Output Formatting/printa()
* *
@ -45,6 +43,7 @@ BEGIN
@e = min(1); @e = min(1);
@f = sum(1); @f = sum(1);
@g = quantize(1); @g = quantize(1);
@h = stddev(1);
printa("@a = %@u\n", @a); printa("@a = %@u\n", @a);
printa("@b = %@u\n", @b); printa("@b = %@u\n", @b);
@ -53,6 +52,7 @@ BEGIN
printa("@e = %@u\n", @e); printa("@e = %@u\n", @e);
printa("@f = %@u\n", @f); printa("@f = %@u\n", @f);
printa("@g = %@d\n", @g); printa("@g = %@d\n", @g);
printa("@h = %@d\n", @h);
exit(0); exit(0);
} }

View File

@ -15,4 +15,5 @@
1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
2 | 0 2 | 0
@h = 0

View File

@ -0,0 +1,83 @@
#
# 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 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
DIR=/var/tmp/dtest.$$
mkdir $DIR
cd $DIR
cat > test.c <<EOF
void
thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog(void)
{
while (1)
;
}
int
main(int argc, char *argv[])
{
thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog();
}
EOF
cc -o test test.c
if [ $? -ne 0 ]; then
print -u2 "failed to compile test.c"
exit 1
fi
script()
{
$dtrace -c ./test -qs /dev/stdin <<EOF
profile:::profile-1001hz
/pid == \$target/
{
@[arg1] = count();
}
tick-1s
/n++ > 10/
{
printa("%A %@d\n", @);
exit(0);
}
EOF
}
script
status=$?
cd /
/usr/bin/rm -rf $DIR
exit $status

View File

@ -20,12 +20,10 @@
*/ */
/* /*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI"
/* /*
* ASSERTION: * ASSERTION:
* Test printf() with a simple string argument. * Test printf() with a simple string argument.
@ -38,6 +36,6 @@
BEGIN BEGIN
{ {
printf("rootfs = %s", `rootfs.bo_fstype); printf("sysname = %s", `utsname.sysname);
exit(0); exit(0);
} }

View File

@ -1 +1 @@
rootfs = ufs sysname = SunOS

View File

@ -0,0 +1,45 @@
/*
* 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 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
#include <unistd.h>
#include <sys/uadmin.h>
int
main(int argc, char **argv)
{
while (1) {
if (uadmin(A_SDTTEST, 0, 0) < 0) {
perror("uadmin");
return (1);
}
sleep(1);
}
return (0);
}

View File

@ -0,0 +1,67 @@
/*
* 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 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
/*
* ASSERTION: Verify that argN (1..7) variables are properly remapped.
*/
BEGIN
{
/* Timeout after 5 seconds */
timeout = timestamp + 5000000000;
ignore = $1;
}
ERROR
{
printf("sdt:::test failed.\n");
exit(1);
}
sdt:::test
/arg0 != 1 || arg1 != 2 || arg2 != 3 || arg3 != 4 || arg4 != 5 || arg5 != 6 ||
arg6 != 7/
{
printf("sdt arg mismatch\n\n");
printf("args are : %d, %d, %d, %d, %d, %d, %d\n", arg0, arg1, arg2,
arg3, arg4, arg5, arg6);
printf("should be : 1, 2, 3, 4, 5, 6, 7\n");
exit(1);
}
sdt:::test
{
exit(0);
}
profile:::tick-1
/timestamp > timeout/
{
trace("test timed out");
exit(1);
}

View File

@ -0,0 +1,65 @@
/*
* 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 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* ASSERTION:
* Aggregating actions may never be speculative.
*
* SECTION: Speculative Tracing/Using a Speculation
*
*/
#pragma D option quiet
BEGIN
{
i = 0;
}
profile:::tick-1sec
/i < 1/
{
var = speculation();
speculate(var);
printf("Speculation ID: %d", var);
@sdev["speculate"] = stddev(i);
i++;
}
profile:::tick-1sec
/1 == i/
{
exit(0);
}
ERROR
{
exit(0);
}
END
{
exit(0);
}

View File

@ -19,12 +19,10 @@
* CDDL HEADER END * CDDL HEADER END
*/ */
/* /*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI"
#include <libsysevent.h> #include <libsysevent.h>
#include <stdio.h> #include <stdio.h>
@ -42,7 +40,7 @@ main(int argc, char **argv)
for (;;) { for (;;) {
if (sysevent_evc_publish(ch, "class_dtest", "subclass_dtest", if (sysevent_evc_publish(ch, "class_dtest", "subclass_dtest",
"vendor_dtest", "publisher_dtest", NULL, EVCH_SLEEP) != 0) { "vendor_dtest", "publisher_dtest", NULL, EVCH_SLEEP) != 0) {
sysevent_evc_unbind(ch); (void) sysevent_evc_unbind(ch);
(void) fprintf(stderr, "failed to publisth sysevent\n"); (void) fprintf(stderr, "failed to publisth sysevent\n");
return (1); return (1);
} }

View File

@ -0,0 +1,107 @@
#!/usr/bin/ksh
#
# 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 2008 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#
# This test verifies that a program that corrupts its own environment
# without inducing a crash does not crash solely due to drti.o's use of
# getenv(3C).
#
PATH=/usr/bin:/usr/sbin:$PATH
if (( $# != 1 )); then
print -u2 'expected one argument: <dtrace-path>'
exit 2
fi
#
# jdtrace does not implement the -h option that is required to generate
# C header files.
#
if [[ "$1" == */jdtrace ]]; then
exit 0
fi
dtrace="$1"
startdir="$PWD"
dir=$(mktemp -td drtiXXXXXX)
if (( $? != 0 )); then
print -u2 'Could not create safe temporary directory'
exit 2
fi
cd "$dir"
cat > Makefile <<EOF
all: main
main: main.o prov.o
\$(CC) -o main main.o prov.o
main.o: main.c prov.h
\$(CC) -c main.c
prov.h: prov.d
$dtrace -h -s prov.d
prov.o: prov.d main.o
$dtrace -G -32 -s prov.d main.o
EOF
cat > prov.d <<EOF
provider tester {
probe entry();
};
EOF
cat > main.c <<EOF
#include <stdlib.h>
#include <sys/sdt.h>
#include "prov.h"
int
main(int argc, char **argv, char **envp)
{
envp[0] = (char*)0xff;
TESTER_ENTRY();
return 0;
}
EOF
make > /dev/null
status=$?
if (( $status != 0 )) ; then
print -u2 "failed to build"
else
./main
status=$?
fi
cd "$startdir"
rm -rf "$dir"
exit $status

View File

@ -0,0 +1,113 @@
#
# 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 2008 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#ident "%Z%%M% %I% %E% SMI"
#
# This test is primarily intended to verify a fix for SPARC, but there's no
# harm in running it on other platforms. Here, we verify that is-enabled
# probes don't interfere with return values from previously invoked functions.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
DIR=/var/tmp/dtest.$$
mkdir $DIR
cd $DIR
cat > prov.d <<EOF
provider test_prov {
probe go();
};
EOF
$dtrace -h -s prov.d
if [ $? -ne 0 ]; then
print -u2 "failed to generate header file"
exit 1
fi
cat > test.c <<EOF
#include <stdio.h>
#include "prov.h"
int
foo(void)
{
return (24);
}
int
main(int argc, char **argv)
{
int a = foo();
if (TEST_PROV_GO_ENABLED()) {
TEST_PROV_GO();
}
(void) printf("%d %d %d\n", a, a, a);
return (0);
}
EOF
cc -c -xO2 test.c
if [ $? -ne 0 ]; then
print -u2 "failed to compile test.c"
exit 1
fi
$dtrace -G -32 -s prov.d test.o
if [ $? -ne 0 ]; then
print -u2 "failed to create DOF"
exit 1
fi
cc -o test test.o prov.o
if [ $? -ne 0 ]; then
print -u2 "failed to link final executable"
exit 1
fi
script()
{
./test
$dtrace -c ./test -qs /dev/stdin <<EOF
test_prov\$target:::
{
}
EOF
}
script
status=$?
cd /
/usr/bin/rm -rf $DIR
exit $status

View File

@ -0,0 +1,3 @@
24 24 24
24 24 24

View File

@ -20,12 +20,10 @@
*/ */
/* /*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI"
/* /*
* ASSERTION: * ASSERTION:
* On IA/32, there is a single 32-bit address space that is partitioned * On IA/32, there is a single 32-bit address space that is partitioned
@ -43,11 +41,12 @@
BEGIN BEGIN
{ {
lbolt = copyin((uintptr_t)&`lbolt, sizeof (int)); dtrace_zero = copyin((uintptr_t)&`dtrace_zero, sizeof (int));
exit(1); exit(1);
} }
ERROR ERROR
{ {
exit(arg4 == DTRACEFLT_BADADDR && arg5 == (uint64_t)&`lbolt ? 0 : 1); exit(arg4 == DTRACEFLT_BADADDR &&
arg5 == (uint64_t)&`dtrace_zero ? 0 : 1);
} }

View File

@ -0,0 +1,77 @@
#
# 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 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#
# ASSERTION: Make sure that we can map in and read the Xen trace buffers.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
#
# Do not fail the test in a domU
#
if [ ! -c /dev/xen/privcmd ]; then
exit 0
fi
dtrace=$1
script()
{
$dtrace -qs /dev/stdin <<EOF
xdt:sched::on-cpu
/arg0 == 0/
{
self->on++;
}
xdt:sched::off-cpu
/arg0 == 0 && self->on/
{
self->off++;
}
xdt:sched::off-cpu
/self->on > 50 && self->off > 50/
{
exit(0);
}
profile:::tick-1sec
/n++ > 10/
{
exit(1);
}
EOF
}
script
status=$?
exit $status

View File

@ -0,0 +1,64 @@
#
# 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 2008 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# ident "%Z%%M% %I% %E% SMI"
#
#
# ASSERTION: HVM probes should enable successfully.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
#
# Do not fail the test in a domU
#
if [ ! -c /dev/xen/privcmd ]; then
exit 0
fi
dtrace=$1
script()
{
$dtrace -qs /dev/stdin <<EOF
dtrace:::BEGIN
{
exit(0);
}
xdt:hvm::vmentry,
xdt:hvm::vmexit
{}
EOF
}
script
status=$?
exit $status

View File

@ -0,0 +1,65 @@
#
# 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 2008 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# ident "%Z%%M% %I% %E% SMI"
#
#
# ASSERTION: Mem probes should enable successfully.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
#
# Do not fail the test in a domU
#
if [ ! -c /dev/xen/privcmd ]; then
exit 0
fi
dtrace=$1
script()
{
$dtrace -qs /dev/stdin <<EOF
dtrace:::BEGIN
{
exit(0);
}
xdt:mem::page-grant-map,
xdt:mem::page-grant-unmap,
xdt:mem::page-grant-transfer
{}
EOF
}
script
status=$?
exit $status

View File

@ -0,0 +1,121 @@
#
# 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 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#
# ASSERTION: Sched probe arguments should be valid.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
#
# do not fail test in a domU
#
if [ ! -c /dev/xen/privcmd ]; then
exit 0
fi
dtrace=$1
outf=/tmp/sched.args.$$
script()
{
$dtrace -c '/usr/bin/sleep 10' -o $outf -qs /dev/stdin <<EOF
xdt:sched::off-cpu,
xdt:sched::on-cpu,
xdt:sched::block,
xdt:sched::sleep,
xdt:sched::wake,
xdt:sched::yield
{
/* print domid vcpu pcpu probename */
printf("%d %d %d %s\n", arg0, arg1, \`xdt_curpcpu, probename);
}
EOF
}
validate()
{
/usr/bin/nawk '
BEGIN {
while (("/usr/sbin/xm vcpu-list" | getline)) {
if ($1 != "Name") {
domid = $2
vcpu = $3
vcpumap[domid, vcpu] = 1
split($7, affinity, ",")
for (i in affinity) {
if (split(affinity[i], p, "-") > 1) {
for (pcpu = p[1]; pcpu <= p[2];\
pcpu++) {
cpumap[domid, vcpu,
pcpu] = 1
}
} else {
cpumap[domid, vcpu,
affinity[i]] = 1
}
}
}
}
}
/^$/ { next }
/wake/ {
if (vcpumap[$1, $2]) {
next
} else {
print "error: " $0
exit 1
}
}
{
if (cpumap[$1, $2, "any"] || cpumap[$1, $2, $3]) {
next
} else {
print "error: " $0
exit 1
}
}
' $outf
}
script
status=$?
if [ $status == 0 ]; then
validate
status=$?
fi
rm $outf
exit $status

View File

@ -0,0 +1,74 @@
#
# 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 2008 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# ident "%Z%%M% %I% %E% SMI"
#
#
# ASSERTION: Sched probes should enable successfully.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
#
# do not fail test in a domU
#
if [ ! -c /dev/xen/privcmd ]; then
exit 0
fi
dtrace=$1
script()
{
$dtrace -qs /dev/stdin <<EOF
dtrace:::BEGIN
{
exit(0);
}
xdt:sched::off-cpu,
xdt:sched::on-cpu,
xdt:sched::idle-off-cpu,
xdt:sched::idle-on-cpu,
xdt:sched::block,
xdt:sched::sleep,
xdt:sched::wake,
xdt:sched::yield,
xdt:sched::shutdown-poweroff,
xdt:sched::shutdown-reboot,
xdt:sched::shutdown-suspend,
xdt:sched::shutdown-crash
{}
EOF
}
script
status=$?
exit $status

View File

@ -0,0 +1,29 @@
#!/bin/ksh
#
# 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.
#
#ident "%Z%%M% %I% %E% SMI"
sleep 1000000

View File

@ -19,13 +19,10 @@
* CDDL HEADER END * CDDL HEADER END
*/ */
/* /*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI"
/* /*
* AVL - generic AVL tree implementation for kernel use * AVL - generic AVL tree implementation for kernel use
* *
@ -243,7 +240,7 @@ avl_nearest(avl_tree_t *tree, avl_index_t where, int direction)
* "void *" of the found tree node * "void *" of the found tree node
*/ */
void * void *
avl_find(avl_tree_t *tree, void *value, avl_index_t *where) avl_find(avl_tree_t *tree, const void *value, avl_index_t *where)
{ {
avl_node_t *node; avl_node_t *node;
avl_node_t *prev = NULL; avl_node_t *prev = NULL;
@ -808,6 +805,64 @@ avl_remove(avl_tree_t *tree, void *data)
} while (parent != NULL); } while (parent != NULL);
} }
#define AVL_REINSERT(tree, obj) \
avl_remove((tree), (obj)); \
avl_add((tree), (obj))
boolean_t
avl_update_lt(avl_tree_t *t, void *obj)
{
void *neighbor;
ASSERT(((neighbor = AVL_NEXT(t, obj)) == NULL) ||
(t->avl_compar(obj, neighbor) <= 0));
neighbor = AVL_PREV(t, obj);
if ((neighbor != NULL) && (t->avl_compar(obj, neighbor) < 0)) {
AVL_REINSERT(t, obj);
return (B_TRUE);
}
return (B_FALSE);
}
boolean_t
avl_update_gt(avl_tree_t *t, void *obj)
{
void *neighbor;
ASSERT(((neighbor = AVL_PREV(t, obj)) == NULL) ||
(t->avl_compar(obj, neighbor) >= 0));
neighbor = AVL_NEXT(t, obj);
if ((neighbor != NULL) && (t->avl_compar(obj, neighbor) > 0)) {
AVL_REINSERT(t, obj);
return (B_TRUE);
}
return (B_FALSE);
}
boolean_t
avl_update(avl_tree_t *t, void *obj)
{
void *neighbor;
neighbor = AVL_PREV(t, obj);
if ((neighbor != NULL) && (t->avl_compar(obj, neighbor) < 0)) {
AVL_REINSERT(t, obj);
return (B_TRUE);
}
neighbor = AVL_NEXT(t, obj);
if ((neighbor != NULL) && (t->avl_compar(obj, neighbor) > 0)) {
AVL_REINSERT(t, obj);
return (B_TRUE);
}
return (B_FALSE);
}
/* /*
* initialize a new AVL tree * initialize a new AVL tree
*/ */
@ -853,6 +908,12 @@ avl_numnodes(avl_tree_t *tree)
return (tree->avl_numnodes); return (tree->avl_numnodes);
} }
boolean_t
avl_is_empty(avl_tree_t *tree)
{
ASSERT(tree);
return (tree->avl_numnodes == 0);
}
#define CHILDBIT (1L) #define CHILDBIT (1L)

View File

@ -2,9 +2,8 @@
* CDDL HEADER START * CDDL HEADER START
* *
* The contents of this file are subject to the terms of the * The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only * Common Development and Distribution License (the "License").
* (the "License"). You may not use this file except in compliance * You may not use this file except in compliance with the License.
* with the License.
* *
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing. * or http://www.opensolaris.org/os/licensing.
@ -20,12 +19,10 @@
* CDDL HEADER END * CDDL HEADER END
*/ */
/* /*
* Copyright 2005 Sun Microsystems, Inc. All rights reserved. * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI"
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#include <dlfcn.h> #include <dlfcn.h>
@ -61,13 +58,14 @@ static const char *olddevname = "/devices/pseudo/dtrace@0:helper";
static const char *modname; /* Name of this load object */ static const char *modname; /* Name of this load object */
static int gen; /* DOF helper generation */ static int gen; /* DOF helper generation */
extern dof_hdr_t __SUNW_dof; /* DOF defined in the .SUNW_dof section */ extern dof_hdr_t __SUNW_dof; /* DOF defined in the .SUNW_dof section */
static boolean_t dof_init_debug = B_FALSE; /* From DTRACE_DOF_INIT_DEBUG */
static void static void
dprintf(int debug, const char *fmt, ...) dprintf(int debug, const char *fmt, ...)
{ {
va_list ap; va_list ap;
if (debug && getenv("DTRACE_DOF_INIT_DEBUG") == NULL) if (debug && !dof_init_debug)
return; return;
va_start(ap, fmt); va_start(ap, fmt);
@ -114,6 +112,9 @@ dtrace_dof_init(void)
if (getenv("DTRACE_DOF_INIT_DISABLE") != NULL) if (getenv("DTRACE_DOF_INIT_DISABLE") != NULL)
return; return;
if (getenv("DTRACE_DOF_INIT_DEBUG") != NULL)
dof_init_debug = B_TRUE;
if (dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &lmp) == -1 || lmp == NULL) { if (dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &lmp) == -1 || lmp == NULL) {
dprintf(1, "couldn't discover module name or address\n"); dprintf(1, "couldn't discover module name or address\n");
return; return;

View File

@ -20,12 +20,9 @@
*/ */
/* /*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI"
/* /*
* DTrace D Language Compiler * DTrace D Language Compiler
* *
@ -2165,11 +2162,11 @@ dt_compile(dtrace_hdl_t *dtp, int context, dtrace_probespec_t pspec, void *arg,
if (dt_list_next(&dtp->dt_lib_path) != NULL && dt_load_libs(dtp) != 0) if (dt_list_next(&dtp->dt_lib_path) != NULL && dt_load_libs(dtp) != 0)
return (NULL); /* errno is set for us */ return (NULL); /* errno is set for us */
(void) ctf_discard(dtp->dt_cdefs->dm_ctfp); if (dtp->dt_globals->dh_nelems != 0)
(void) ctf_discard(dtp->dt_ddefs->dm_ctfp); (void) dt_idhash_iter(dtp->dt_globals, dt_idreset, NULL);
(void) dt_idhash_iter(dtp->dt_globals, dt_idreset, NULL); if (dtp->dt_tls->dh_nelems != 0)
(void) dt_idhash_iter(dtp->dt_tls, dt_idreset, NULL); (void) dt_idhash_iter(dtp->dt_tls, dt_idreset, NULL);
if (fp && (cflags & DTRACE_C_CPP) && (fp = dt_preproc(dtp, fp)) == NULL) if (fp && (cflags & DTRACE_C_CPP) && (fp = dt_preproc(dtp, fp)) == NULL)
return (NULL); /* errno is set for us */ return (NULL); /* errno is set for us */

View File

@ -19,12 +19,10 @@
* CDDL HEADER END * CDDL HEADER END
*/ */
/* /*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI"
#include <stdlib.h> #include <stdlib.h>
#include <strings.h> #include <strings.h>
#include <errno.h> #include <errno.h>
@ -1085,7 +1083,7 @@ dt_print_usym(dtrace_hdl_t *dtp, FILE *fp, caddr_t addr, dtrace_actkind_t act)
do { do {
n = len; n = len;
s = alloca(n); s = alloca(n);
} while ((len = dtrace_uaddr2str(dtp, pid, pc, s, n)) >= n); } while ((len = dtrace_uaddr2str(dtp, pid, pc, s, n)) > n);
return (dt_printf(dtp, fp, format, s)); return (dt_printf(dtp, fp, format, s));
} }

View File

@ -20,12 +20,9 @@
*/ */
/* /*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/types.h> #include <sys/types.h>
#if defined(sun) #if defined(sun)
#include <sys/sysmacros.h> #include <sys/sysmacros.h>
@ -838,7 +835,6 @@ dtrace_dof_create(dtrace_hdl_t *dtp, dtrace_prog_t *pgp, uint_t flags)
*/ */
h.dofh_secnum = ddo->ddo_nsecs; h.dofh_secnum = ddo->ddo_nsecs;
ssize = sizeof (h) + dt_buf_len(&ddo->ddo_secs); ssize = sizeof (h) + dt_buf_len(&ddo->ddo_secs);
assert(ssize == sizeof (h) + sizeof (dof_sec_t) * ddo->ddo_nsecs);
h.dofh_loadsz = ssize + h.dofh_loadsz = ssize +
dt_buf_len(&ddo->ddo_ldata) + dt_buf_len(&ddo->ddo_ldata) +
@ -864,6 +860,7 @@ dtrace_dof_create(dtrace_hdl_t *dtp, dtrace_prog_t *pgp, uint_t flags)
sp = dt_buf_ptr(&ddo->ddo_secs); sp = dt_buf_ptr(&ddo->ddo_secs);
assert(sp[ddo->ddo_strsec].dofs_type == DOF_SECT_STRTAB); assert(sp[ddo->ddo_strsec].dofs_type == DOF_SECT_STRTAB);
assert(ssize == sizeof (h) + sizeof (dof_sec_t) * ddo->ddo_nsecs);
sp[ddo->ddo_strsec].dofs_offset = ssize + dt_buf_len(&ddo->ddo_ldata); sp[ddo->ddo_strsec].dofs_offset = ssize + dt_buf_len(&ddo->ddo_ldata);
sp[ddo->ddo_strsec].dofs_size = dt_buf_len(&ddo->ddo_strs); sp[ddo->ddo_strsec].dofs_size = dt_buf_len(&ddo->ddo_strs);

View File

@ -19,12 +19,10 @@
* CDDL HEADER END * CDDL HEADER END
*/ */
/* /*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI"
#include <string.h> #include <string.h>
#include <strings.h> #include <strings.h>
#include <dt_impl.h> #include <dt_impl.h>
@ -106,7 +104,8 @@ static const struct {
{ EDT_BADSETOPT, "Invalid setopt() library action" }, { EDT_BADSETOPT, "Invalid setopt() library action" },
{ EDT_BADSTACKPC, "Invalid stack program counter size" }, { EDT_BADSTACKPC, "Invalid stack program counter size" },
{ EDT_BADAGGVAR, "Invalid aggregation variable identifier" }, { EDT_BADAGGVAR, "Invalid aggregation variable identifier" },
{ EDT_OVERSION, "Client requested deprecated version of library" } { EDT_OVERSION, "Client requested deprecated version of library" },
{ EDT_ENABLING_ERR, "Failed to enable probe" }
}; };
static const int _dt_nerr = sizeof (_dt_errlist) / sizeof (_dt_errlist[0]); static const int _dt_nerr = sizeof (_dt_errlist) / sizeof (_dt_errlist[0]);

View File

@ -20,15 +20,13 @@
*/ */
/* /*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*/ */
#ifndef _DT_IMPL_H #ifndef _DT_IMPL_H
#define _DT_IMPL_H #define _DT_IMPL_H
#pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/param.h> #include <sys/param.h>
#include <sys/objfs.h> #include <sys/objfs.h>
#if !defined(sun) #if !defined(sun)
@ -42,6 +40,9 @@
#include <libctf.h> #include <libctf.h>
#include <dtrace.h> #include <dtrace.h>
#include <gelf.h> #include <gelf.h>
#if defined(sun)
#include <synch.h>
#endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@ -519,7 +520,8 @@ enum {
EDT_BADSETOPT, /* invalid setopt library action */ EDT_BADSETOPT, /* invalid setopt library action */
EDT_BADSTACKPC, /* invalid stack program counter size */ EDT_BADSTACKPC, /* invalid stack program counter size */
EDT_BADAGGVAR, /* invalid aggregation variable identifier */ EDT_BADAGGVAR, /* invalid aggregation variable identifier */
EDT_OVERSION /* client is requesting deprecated version */ EDT_OVERSION, /* client is requesting deprecated version */
EDT_ENABLING_ERR /* failed to enable probe */
}; };
/* /*
@ -599,17 +601,8 @@ extern int dt_buffered_flush(dtrace_hdl_t *, dtrace_probedata_t *,
extern void dt_buffered_disable(dtrace_hdl_t *); extern void dt_buffered_disable(dtrace_hdl_t *);
extern void dt_buffered_destroy(dtrace_hdl_t *); extern void dt_buffered_destroy(dtrace_hdl_t *);
extern int dt_rw_read_held(pthread_rwlock_t *);
extern int dt_rw_write_held(pthread_rwlock_t *);
extern int dt_mutex_held(pthread_mutex_t *);
extern uint64_t dt_stddev(uint64_t *, uint64_t); extern uint64_t dt_stddev(uint64_t *, uint64_t);
#define DT_RW_READ_HELD(x) dt_rw_read_held(x)
#define DT_RW_WRITE_HELD(x) dt_rw_write_held(x)
#define DT_RW_LOCK_HELD(x) (DT_RW_READ_HELD(x) || DT_RW_WRITE_HELD(x))
#define DT_MUTEX_HELD(x) dt_mutex_held(x)
extern int dt_options_load(dtrace_hdl_t *); extern int dt_options_load(dtrace_hdl_t *);
extern void dt_dprintf(const char *, ...); extern void dt_dprintf(const char *, ...);

View File

@ -18,12 +18,11 @@
* information: Portions Copyright [yyyy] [name of copyright owner] * information: Portions Copyright [yyyy] [name of copyright owner]
* *
* CDDL HEADER END * CDDL HEADER END
*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI" /*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
*/
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
@ -839,7 +838,7 @@ input(void)
else if (yypcb->pcb_fileptr != NULL) else if (yypcb->pcb_fileptr != NULL)
c = fgetc(yypcb->pcb_fileptr); c = fgetc(yypcb->pcb_fileptr);
else if (yypcb->pcb_strptr < yypcb->pcb_string + yypcb->pcb_strlen) else if (yypcb->pcb_strptr < yypcb->pcb_string + yypcb->pcb_strlen)
c = *yypcb->pcb_strptr++; c = *(unsigned char *)(yypcb->pcb_strptr++);
else else
c = EOF; c = EOF;

View File

@ -18,12 +18,10 @@
* *
* CDDL HEADER END * CDDL HEADER END
*/ */
/*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#pragma ident "%Z%%M% %I% %E% SMI" /*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
*/
#include <sys/types.h> #include <sys/types.h>
#if defined(sun) #if defined(sun)
@ -77,6 +75,10 @@ dt_module_symhash_insert(dt_module_t *dmp, const char *name, uint_t id)
static uint_t static uint_t
dt_module_syminit32(dt_module_t *dmp) dt_module_syminit32(dt_module_t *dmp)
{ {
#if STT_NUM != (STT_TLS + 1)
#error "STT_NUM has grown. update dt_module_syminit32()"
#endif
Elf32_Sym *sym = dmp->dm_symtab.cts_data; Elf32_Sym *sym = dmp->dm_symtab.cts_data;
const char *base = dmp->dm_strtab.cts_data; const char *base = dmp->dm_strtab.cts_data;
size_t ss_size = dmp->dm_strtab.cts_size; size_t ss_size = dmp->dm_strtab.cts_size;
@ -123,6 +125,10 @@ dt_module_syminit32(dt_module_t *dmp)
static uint_t static uint_t
dt_module_syminit64(dt_module_t *dmp) dt_module_syminit64(dt_module_t *dmp)
{ {
#if STT_NUM != (STT_TLS + 1)
#error "STT_NUM has grown. update dt_module_syminit64()"
#endif
Elf64_Sym *sym = dmp->dm_symtab.cts_data; Elf64_Sym *sym = dmp->dm_symtab.cts_data;
const char *base = dmp->dm_strtab.cts_data; const char *base = dmp->dm_strtab.cts_data;
size_t ss_size = dmp->dm_strtab.cts_size; size_t ss_size = dmp->dm_strtab.cts_size;
@ -512,7 +518,7 @@ dt_module_load_sect(dtrace_hdl_t *dtp, dt_module_t *dmp, ctf_sect_t *ctsp)
Elf_Data *dp; Elf_Data *dp;
Elf_Scn *sp; Elf_Scn *sp;
if (elf_getshstrndx(dmp->dm_elf, &shstrs) == 0) if (elf_getshdrstrndx(dmp->dm_elf, &shstrs) == -1)
return (dt_set_errno(dtp, EDT_NOTLOADED)); return (dt_set_errno(dtp, EDT_NOTLOADED));
for (sp = NULL; (sp = elf_nextscn(dmp->dm_elf, sp)) != NULL; ) { for (sp = NULL; (sp = elf_nextscn(dmp->dm_elf, sp)) != NULL; ) {
@ -778,10 +784,25 @@ dt_module_unload(dtrace_hdl_t *dtp, dt_module_t *dmp)
void void
dt_module_destroy(dtrace_hdl_t *dtp, dt_module_t *dmp) dt_module_destroy(dtrace_hdl_t *dtp, dt_module_t *dmp)
{ {
uint_t h = dt_strtab_hash(dmp->dm_name, NULL) % dtp->dt_modbuckets;
dt_module_t **dmpp = &dtp->dt_mods[h];
dt_list_delete(&dtp->dt_modlist, dmp); dt_list_delete(&dtp->dt_modlist, dmp);
assert(dtp->dt_nmods != 0); assert(dtp->dt_nmods != 0);
dtp->dt_nmods--; dtp->dt_nmods--;
/*
* Now remove this module from its hash chain. We expect to always
* find the module on its hash chain, so in this loop we assert that
* we don't run off the end of the list.
*/
while (*dmpp != dmp) {
dmpp = &((*dmpp)->dm_next);
assert(*dmpp != NULL);
}
*dmpp = dmp->dm_next;
dt_module_unload(dtp, dmp); dt_module_unload(dtp, dmp);
free(dmp); free(dmp);
} }
@ -903,7 +924,7 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat)
(void) close(fd); (void) close(fd);
if (dmp->dm_elf == NULL || err == -1 || if (dmp->dm_elf == NULL || err == -1 ||
elf_getshstrndx(dmp->dm_elf, &shstrs) == 0) { elf_getshdrstrndx(dmp->dm_elf, &shstrs) == -1) {
dt_dprintf("failed to load %s: %s\n", dt_dprintf("failed to load %s: %s\n",
fname, elf_errmsg(elf_errno())); fname, elf_errmsg(elf_errno()));
dt_module_destroy(dtp, dmp); dt_module_destroy(dtp, dmp);

View File

@ -20,12 +20,9 @@
*/ */
/* /*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/types.h> #include <sys/types.h>
#if defined(sun) #if defined(sun)
#include <sys/modctl.h> #include <sys/modctl.h>
@ -116,8 +113,9 @@
#define DT_VERS_1_6 DT_VERSION_NUMBER(1, 6, 0) #define DT_VERS_1_6 DT_VERSION_NUMBER(1, 6, 0)
#define DT_VERS_1_6_1 DT_VERSION_NUMBER(1, 6, 1) #define DT_VERS_1_6_1 DT_VERSION_NUMBER(1, 6, 1)
#define DT_VERS_1_6_2 DT_VERSION_NUMBER(1, 6, 2) #define DT_VERS_1_6_2 DT_VERSION_NUMBER(1, 6, 2)
#define DT_VERS_LATEST DT_VERS_1_6_2 #define DT_VERS_1_6_3 DT_VERSION_NUMBER(1, 6, 3)
#define DT_VERS_STRING "Sun D 1.6.2" #define DT_VERS_LATEST DT_VERS_1_6_3
#define DT_VERS_STRING "Sun D 1.6.3"
const dt_version_t _dtrace_versions[] = { const dt_version_t _dtrace_versions[] = {
DT_VERS_1_0, /* D API 1.0.0 (PSARC 2001/466) Solaris 10 FCS */ DT_VERS_1_0, /* D API 1.0.0 (PSARC 2001/466) Solaris 10 FCS */
@ -132,6 +130,7 @@ const dt_version_t _dtrace_versions[] = {
DT_VERS_1_6, /* D API 1.6 */ DT_VERS_1_6, /* D API 1.6 */
DT_VERS_1_6_1, /* D API 1.6.1 */ DT_VERS_1_6_1, /* D API 1.6.1 */
DT_VERS_1_6_2, /* D API 1.6.2 */ DT_VERS_1_6_2, /* D API 1.6.2 */
DT_VERS_1_6_3, /* D API 1.6.3 */
0 0
}; };

View File

@ -20,12 +20,10 @@
*/ */
/* /*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI"
#include <assert.h> #include <assert.h>
#include <strings.h> #include <strings.h>
#include <stdlib.h> #include <stdlib.h>
@ -443,7 +441,12 @@ dt_pid_mod_filt(void *arg, const prmap_t *pmp, const char *obj)
else else
pp->dpp_obj++; pp->dpp_obj++;
dt_pid_objname(name, sizeof (name), pp->dpp_lmid, obj); if (gmatch(pp->dpp_obj, pp->dpp_mod))
return (dt_pid_per_mod(pp, pmp, obj));
(void) Plmid(pp->dpp_pr, pmp->pr_vaddr, &pp->dpp_lmid);
dt_pid_objname(name, sizeof (name), pp->dpp_lmid, pp->dpp_obj);
if (gmatch(name, pp->dpp_mod)) if (gmatch(name, pp->dpp_mod))
return (dt_pid_per_mod(pp, pmp, obj)); return (dt_pid_per_mod(pp, pmp, obj));
@ -673,7 +676,7 @@ dt_pid_create_usdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
struct ps_prochandle *P = dpr->dpr_proc; struct ps_prochandle *P = dpr->dpr_proc;
int ret = 0; int ret = 0;
assert(DT_MUTEX_HELD(&dpr->dpr_lock)); assert(MUTEX_HELD(&dpr->dpr_lock));
#ifdef DOODAD #ifdef DOODAD
(void) Pupdate_maps(P); (void) Pupdate_maps(P);

View File

@ -20,12 +20,9 @@
*/ */
/* /*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI"
#if defined(sun) #if defined(sun)
#include <sys/sysmacros.h> #include <sys/sysmacros.h>
#else #else
@ -41,6 +38,11 @@
#include <ctype.h> #include <ctype.h>
#include <errno.h> #include <errno.h>
#include <limits.h> #include <limits.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include <dt_printf.h> #include <dt_printf.h>
#include <dt_string.h> #include <dt_string.h>
@ -339,7 +341,7 @@ pfprint_addr(dtrace_hdl_t *dtp, FILE *fp, const char *format,
do { do {
n = len; n = len;
s = alloca(n); s = alloca(n);
} while ((len = dtrace_addr2str(dtp, val, s, n)) >= n); } while ((len = dtrace_addr2str(dtp, val, s, n)) > n);
return (dt_printf(dtp, fp, format, s)); return (dt_printf(dtp, fp, format, s));
} }
@ -392,7 +394,7 @@ pfprint_uaddr(dtrace_hdl_t *dtp, FILE *fp, const char *format,
do { do {
n = len; n = len;
s = alloca(n); s = alloca(n);
} while ((len = dtrace_uaddr2str(dtp, pid, val, s, n)) >= n); } while ((len = dtrace_uaddr2str(dtp, pid, val, s, n)) > n);
return (dt_printf(dtp, fp, format, s)); return (dt_printf(dtp, fp, format, s));
} }
@ -505,6 +507,58 @@ pfprint_time822(dtrace_hdl_t *dtp, FILE *fp, const char *format,
return (dt_printf(dtp, fp, format, buf)); return (dt_printf(dtp, fp, format, buf));
} }
/*ARGSUSED*/
static int
pfprint_port(dtrace_hdl_t *dtp, FILE *fp, const char *format,
const dt_pfargd_t *pfd, const void *addr, size_t size, uint64_t normal)
{
uint16_t port = htons(*((uint16_t *)addr));
char buf[256];
struct servent *sv, res;
#if defined(sun)
if ((sv = getservbyport_r(port, NULL, &res, buf, sizeof (buf))) != NULL)
#else
if (getservbyport_r(port, NULL, &res, buf, sizeof (buf), &sv) > 0)
#endif
return (dt_printf(dtp, fp, format, sv->s_name));
(void) snprintf(buf, sizeof (buf), "%d", *((uint16_t *)addr));
return (dt_printf(dtp, fp, format, buf));
}
/*ARGSUSED*/
static int
pfprint_inetaddr(dtrace_hdl_t *dtp, FILE *fp, const char *format,
const dt_pfargd_t *pfd, const void *addr, size_t size, uint64_t normal)
{
char *s = alloca(size + 1);
struct hostent *host, res;
char inetaddr[NS_IN6ADDRSZ];
char buf[1024];
int e;
bcopy(addr, s, size);
s[size] = '\0';
if (strchr(s, ':') == NULL && inet_pton(AF_INET, s, inetaddr) != -1) {
#if defined(sun)
if ((host = gethostbyaddr_r(inetaddr, NS_INADDRSZ,
AF_INET, &res, buf, sizeof (buf), &e)) != NULL)
#else
if (gethostbyaddr_r(inetaddr, NS_INADDRSZ,
AF_INET, &res, buf, sizeof (buf), &host, &e) > 0)
#endif
return (dt_printf(dtp, fp, format, host->h_name));
} else if (inet_pton(AF_INET6, s, inetaddr) != -1) {
if ((host = getipnodebyaddr(inetaddr, NS_IN6ADDRSZ,
AF_INET6, &e)) != NULL)
return (dt_printf(dtp, fp, format, host->h_name));
}
return (dt_printf(dtp, fp, format, s));
}
/*ARGSUSED*/ /*ARGSUSED*/
static int static int
pfprint_cstr(dtrace_hdl_t *dtp, FILE *fp, const char *format, pfprint_cstr(dtrace_hdl_t *dtp, FILE *fp, const char *format,
@ -610,6 +664,7 @@ static const dt_pfconv_t _dtrace_conversions[] = {
{ "hx", "x", "short", pfcheck_xshort, pfprint_uint }, { "hx", "x", "short", pfcheck_xshort, pfprint_uint },
{ "hX", "X", "short", pfcheck_xshort, pfprint_uint }, { "hX", "X", "short", pfcheck_xshort, pfprint_uint },
{ "i", "i", pfproto_xint, pfcheck_dint, pfprint_dint }, { "i", "i", pfproto_xint, pfcheck_dint, pfprint_dint },
{ "I", "s", pfproto_cstr, pfcheck_str, pfprint_inetaddr },
{ "k", "s", "stack", pfcheck_stack, pfprint_stack }, { "k", "s", "stack", pfcheck_stack, pfprint_stack },
{ "lc", "lc", "int", pfcheck_type, pfprint_sint }, /* a.k.a. wint_t */ { "lc", "lc", "int", pfcheck_type, pfprint_sint }, /* a.k.a. wint_t */
{ "ld", "d", "long", pfcheck_type, pfprint_sint }, { "ld", "d", "long", pfcheck_type, pfprint_sint },
@ -632,6 +687,7 @@ static const dt_pfconv_t _dtrace_conversions[] = {
{ "LG", "G", "long double", pfcheck_type, pfprint_fp }, { "LG", "G", "long double", pfcheck_type, pfprint_fp },
{ "o", "o", pfproto_xint, pfcheck_xint, pfprint_uint }, { "o", "o", pfproto_xint, pfcheck_xint, pfprint_uint },
{ "p", "x", pfproto_addr, pfcheck_addr, pfprint_uint }, { "p", "x", pfproto_addr, pfcheck_addr, pfprint_uint },
{ "P", "s", "uint16_t", pfcheck_type, pfprint_port },
{ "s", "s", "char [] or string (or use stringof)", pfcheck_str, pfprint_cstr }, { "s", "s", "char [] or string (or use stringof)", pfcheck_str, pfprint_cstr },
{ "S", "s", pfproto_cstr, pfcheck_str, pfprint_estr }, { "S", "s", pfproto_cstr, pfcheck_str, pfprint_estr },
{ "T", "s", "int64_t", pfcheck_time, pfprint_time822 }, { "T", "s", "int64_t", pfcheck_time, pfprint_time822 },
@ -1236,6 +1292,20 @@ pfprint_average(dtrace_hdl_t *dtp, FILE *fp, const char *format,
data[0] ? data[1] / normal / data[0] : 0)); data[0] ? data[1] / normal / data[0] : 0));
} }
/*ARGSUSED*/
static int
pfprint_stddev(dtrace_hdl_t *dtp, FILE *fp, const char *format,
const dt_pfargd_t *pfd, const void *addr, size_t size, uint64_t normal)
{
const uint64_t *data = addr;
if (size != sizeof (uint64_t) * 4)
return (dt_set_errno(dtp, EDT_DMISMATCH));
return (dt_printf(dtp, fp, format,
dt_stddev((uint64_t *)data, normal)));
}
/*ARGSUSED*/ /*ARGSUSED*/
static int static int
pfprint_quantize(dtrace_hdl_t *dtp, FILE *fp, const char *format, pfprint_quantize(dtrace_hdl_t *dtp, FILE *fp, const char *format,
@ -1428,6 +1498,9 @@ dt_printf_format(dtrace_hdl_t *dtp, FILE *fp, const dt_pfargv_t *pfv,
case DTRACEAGG_AVG: case DTRACEAGG_AVG:
func = pfprint_average; func = pfprint_average;
break; break;
case DTRACEAGG_STDDEV:
func = pfprint_stddev;
break;
case DTRACEAGG_QUANTIZE: case DTRACEAGG_QUANTIZE:
func = pfprint_quantize; func = pfprint_quantize;
break; break;

Some files were not shown because too many files have changed in this diff Show More