1#
2# CDDL HEADER START
3#
4# The contents of this file are subject to the terms of the
5# Common Development and Distribution License (the "License").
6# You may not use this file except in compliance with the License.
7#
8# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9# or http://www.opensolaris.org/os/licensing.
10# See the License for the specific language governing permissions
11# and limitations under the License.
12#
13# When distributing Covered Code, include this CDDL HEADER in each
14# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15# If applicable, add the following below this CDDL HEADER, with the
16# fields enclosed by brackets "[]" replaced with your own identifying
17# information: Portions Copyright [yyyy] [name of copyright owner]
18#
19# CDDL HEADER END
20#
21
22#
23# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24# Use is subject to license terms.
25#
26# ident	"%Z%%M%	%I%	%E% SMI"
27
28#
29# ASSERTION: Make sure USDT probes work as tail-calls on SPARC.
30#
31
32if [ $# != 1 ]; then
33	echo expected one argument: '<'dtrace-path'>'
34	exit 2
35fi
36
37dtrace=$1
38DIR=/var/tmp/dtest.$$
39
40mkdir $DIR
41cd $DIR
42
43cat > test.s <<EOF
44#include <sys/asm_linkage.h>
45
46	DGDEF(__fsr_init_value)
47	.word 0
48
49	ENTRY(test)
50	save	%sp, -SA(MINFRAME + 4), %sp
51	mov	9, %i0
52	mov	19, %i1
53	mov	2006, %i2
54	call	__dtrace_test___fire
55	restore
56	SET_SIZE(test)
57
58	ENTRY(main)
59	save	%sp, -SA(MINFRAME + 4), %sp
60
611:
62	call	test
63	nop
64
65	ba	1b
66	nop
67
68	ret
69	restore	%g0, %g0, %o0
70	SET_SIZE(main)
71EOF
72
73cat > prov.d <<EOF
74provider test {
75	probe fire(int, int, int);
76};
77EOF
78
79/usr/bin/as -xregsym=no -P -D_ASM -o test.o test.s
80if [ $? -ne 0 ]; then
81	print -u2 "failed to compile test.s"
82	exit 1
83fi
84
85$dtrace -G -32 -s prov.d test.o
86if [ $? -ne 0 ]; then
87	print -u2 "failed to create DOF"
88	exit 1
89fi
90
91cc -o test test.o prov.o
92if [ $? -ne 0 ]; then
93	print -u2 "failed to link final executable"
94	exit 1
95fi
96
97$dtrace -c ./test -s /dev/stdin <<EOF
98test\$target:::fire
99/arg0 == 9 && arg1 == 19 && arg2 == 2006/
100{
101	printf("%d/%d/%d", arg0, arg1, arg2);
102	exit(0);
103}
104
105test\$target:::fire
106{
107	printf("%d/%d/%d", arg0, arg1, arg2);
108	exit(1);
109}
110
111BEGIN
112{
113	/*
114	 * Let's just do this for 5 seconds.
115	 */
116	timeout = timestamp + 5000000000;
117}
118
119profile:::tick-4
120/timestamp > timeout/
121{
122	trace("test timed out");
123	exit(1);
124}
125EOF
126
127status=$?
128
129cd /
130/bin/rm -rf $DIR
131
132exit $status
133