1*d339a29bSBryan Cantrill#
2*d339a29bSBryan Cantrill# CDDL HEADER START
3*d339a29bSBryan Cantrill#
4*d339a29bSBryan Cantrill# The contents of this file are subject to the terms of the
5*d339a29bSBryan Cantrill# Common Development and Distribution License (the "License").
6*d339a29bSBryan Cantrill# You may not use this file except in compliance with the License.
7*d339a29bSBryan Cantrill#
8*d339a29bSBryan Cantrill# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*d339a29bSBryan Cantrill# or http://www.opensolaris.org/os/licensing.
10*d339a29bSBryan Cantrill# See the License for the specific language governing permissions
11*d339a29bSBryan Cantrill# and limitations under the License.
12*d339a29bSBryan Cantrill#
13*d339a29bSBryan Cantrill# When distributing Covered Code, include this CDDL HEADER in each
14*d339a29bSBryan Cantrill# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*d339a29bSBryan Cantrill# If applicable, add the following below this CDDL HEADER, with the
16*d339a29bSBryan Cantrill# fields enclosed by brackets "[]" replaced with your own identifying
17*d339a29bSBryan Cantrill# information: Portions Copyright [yyyy] [name of copyright owner]
18*d339a29bSBryan Cantrill#
19*d339a29bSBryan Cantrill# CDDL HEADER END
20*d339a29bSBryan Cantrill#
21*d339a29bSBryan Cantrill
22*d339a29bSBryan Cantrill#
23*d339a29bSBryan Cantrill# Copyright (c) 2012, Joyent, Inc. All rights reserved.
24*d339a29bSBryan Cantrill#
25*d339a29bSBryan Cantrill
26*d339a29bSBryan Cantrilllet j=8
27*d339a29bSBryan Cantrill
28*d339a29bSBryan Cantrillenable()
29*d339a29bSBryan Cantrill{
30*d339a29bSBryan Cantrill	prog=/var/tmp/dtest.$$.d
31*d339a29bSBryan Cantrill	err=/var/tmp/dtest.$$.err
32*d339a29bSBryan Cantrill
33*d339a29bSBryan Cantrill	nawk -v nprobes=$1 'BEGIN { \
34*d339a29bSBryan Cantrill		for (i = 0; i < nprobes - 1; i++) { 		\
35*d339a29bSBryan Cantrill			printf("dtrace:::BEGIN,\n");		\
36*d339a29bSBryan Cantrill		}						\
37*d339a29bSBryan Cantrill								\
38*d339a29bSBryan Cantrill		printf("dtrace:::BEGIN { exit(0); }\n");	\
39*d339a29bSBryan Cantrill	}' /dev/null > $prog
40*d339a29bSBryan Cantrill
41*d339a29bSBryan Cantrill	dtrace -qs $prog > /dev/null 2> $err
42*d339a29bSBryan Cantrill
43*d339a29bSBryan Cantrill	if [[ "$?" -eq 0 ]]; then
44*d339a29bSBryan Cantrill		return 0
45*d339a29bSBryan Cantrill	else
46*d339a29bSBryan Cantrill		if ! grep "DIF program exceeds maximum program size" $err \
47*d339a29bSBryan Cantrill		    1> /dev/null 2>&1 ; then
48*d339a29bSBryan Cantrill			echo "failed to enable $prog: `cat $err`"
49*d339a29bSBryan Cantrill			exit 1
50*d339a29bSBryan Cantrill		fi
51*d339a29bSBryan Cantrill
52*d339a29bSBryan Cantrill		return 1
53*d339a29bSBryan Cantrill	fi
54*d339a29bSBryan Cantrill}
55*d339a29bSBryan Cantrill
56*d339a29bSBryan Cantrill#
57*d339a29bSBryan Cantrill# First, establish an upper bound
58*d339a29bSBryan Cantrill#
59*d339a29bSBryan Cantrilllet upper=1
60*d339a29bSBryan Cantrill
61*d339a29bSBryan Cantrillwhile enable $upper ; do
62*d339a29bSBryan Cantrill	let lower=upper
63*d339a29bSBryan Cantrill	let upper=upper+upper
64*d339a29bSBryan Cantrill	echo success at $lower, raised to $upper
65*d339a29bSBryan Cantrilldone
66*d339a29bSBryan Cantrill
67*d339a29bSBryan Cantrill#
68*d339a29bSBryan Cantrill# Now search for the highest value that can be enabled
69*d339a29bSBryan Cantrill#
70*d339a29bSBryan Cantrillwhile [[ "$lower" -lt "$upper" ]]; do
71*d339a29bSBryan Cantrill	let guess=$(((lower + upper) / 2))
72*d339a29bSBryan Cantrill	echo "lower is $lower; upper is $upper; guess is $guess\c"
73*d339a29bSBryan Cantrill
74*d339a29bSBryan Cantrill	if enable $guess ; then
75*d339a29bSBryan Cantrill		if [[ $((upper - lower)) -le 2 ]]; then
76*d339a29bSBryan Cantrill			let upper=guess
77*d339a29bSBryan Cantrill		fi
78*d339a29bSBryan Cantrill
79*d339a29bSBryan Cantrill		echo " (success)"
80*d339a29bSBryan Cantrill		let lower=guess
81*d339a29bSBryan Cantrill	else
82*d339a29bSBryan Cantrill		echo " (failure)"
83*d339a29bSBryan Cantrill		let upper=guess
84*d339a29bSBryan Cantrill	fi
85*d339a29bSBryan Cantrilldone
86*d339a29bSBryan Cantrill
87*d339a29bSBryan Cantrilllet expected=10000
88*d339a29bSBryan Cantrill
89*d339a29bSBryan Cantrillif [[ "$lower" -lt "$expected" ]]; then
90*d339a29bSBryan Cantrill	echo "expected support for enablings of at least $expected probes; \c"
91*d339a29bSBryan Cantrill	echo "found $lower"
92*d339a29bSBryan Cantrill	exit 1
93*d339a29bSBryan Cantrillfi
94*d339a29bSBryan Cantrill
95*d339a29bSBryan Cantrillecho "maximum supported enabled probes found to be $lower"
96*d339a29bSBryan Cantrillexit 0
97*d339a29bSBryan Cantrill
98