xref: /illumos-gate/usr/src/cmd/dtrace/test/tst/sparc/usdt/tst.tailcall.ksh (revision 7ab4e62e3b5c454f248a38bec0d489e8f5543324)
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
27#
28# ASSERTION: Make sure USDT probes work as tail-calls on SPARC.
29#
30
31if [ $# != 1 ]; then
32	echo expected one argument: '<'dtrace-path'>'
33	exit 2
34fi
35
36dtrace=$1
37DIR=/var/tmp/dtest.$$
38
39mkdir $DIR
40cd $DIR
41
42cat > test.s <<EOF
43#include <sys/asm_linkage.h>
44
45	DGDEF(__fsr_init_value)
46	.word 0
47
48	ENTRY(test)
49	save	%sp, -SA(MINFRAME + 4), %sp
50	mov	9, %i0
51	mov	19, %i1
52	mov	2006, %i2
53	call	__dtrace_test___fire
54	restore
55	SET_SIZE(test)
56
57	ENTRY(main)
58	save	%sp, -SA(MINFRAME + 4), %sp
59
601:
61	call	test
62	nop
63
64	ba	1b
65	nop
66
67	ret
68	restore	%g0, %g0, %o0
69	SET_SIZE(main)
70EOF
71
72cat > prov.d <<EOF
73provider test {
74	probe fire(int, int, int);
75};
76EOF
77
78/usr/ccs/bin/as -xregsym=no -P -D_ASM -o test.o test.s
79if [ $? -ne 0 ]; then
80	print -u2 "failed to compile test.s"
81	exit 1
82fi
83
84$dtrace -G -32 -s prov.d test.o
85if [ $? -ne 0 ]; then
86	print -u2 "failed to create DOF"
87	exit 1
88fi
89
90gcc -m32 -o test test.o prov.o
91if [ $? -ne 0 ]; then
92	print -u2 "failed to link final executable"
93	exit 1
94fi
95
96$dtrace -c ./test -s /dev/stdin <<EOF
97test\$target:::fire
98/arg0 == 9 && arg1 == 19 && arg2 == 2006/
99{
100	printf("%d/%d/%d", arg0, arg1, arg2);
101	exit(0);
102}
103
104test\$target:::fire
105{
106	printf("%d/%d/%d", arg0, arg1, arg2);
107	exit(1);
108}
109
110BEGIN
111{
112	/*
113	 * Let's just do this for 5 seconds.
114	 */
115	timeout = timestamp + 5000000000;
116}
117
118profile:::tick-4
119/timestamp > timeout/
120{
121	trace("test timed out");
122	exit(1);
123}
124EOF
125
126status=$?
127
128cd /
129/usr/bin/rm -rf $DIR
130
131exit $status
132