1#!/bin/ksh
2#
3# CDDL HEADER START
4#
5# The contents of this file are subject to the terms of the
6# Common Development and Distribution License (the "License").
7# You may not use this file except in compliance with the License.
8#
9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10# or http://www.opensolaris.org/os/licensing.
11# See the License for the specific language governing permissions
12# and limitations under the License.
13#
14# When distributing Covered Code, include this CDDL HEADER in each
15# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16# If applicable, add the following below this CDDL HEADER, with the
17# fields enclosed by brackets "[]" replaced with your own identifying
18# information: Portions Copyright [yyyy] [name of copyright owner]
19#
20# CDDL HEADER END
21#
22
23#
24# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
25# Use is subject to license terms.
26#
27
28#
29# This script verifies that we can fire a probe on each CPU that is in
30# an online state.
31#
32# The script will fail if:
33#       1) The system under test does not define the 'PAPI_tot_ins' event.
34#
35
36if [ $# != 1 ]; then
37        echo expected one argument: '<'dtrace-path'>'
38        exit 2
39fi
40
41dtrace=$1
42numproc=`psrinfo | tail -1 | cut -f1`
43cpu=0
44dtraceout=/var/tmp/dtrace.out.$$
45scriptout=/var/tmp/script.out.$$
46
47spin()
48{
49	while [ 1 ]; do
50		:
51	done
52}
53
54script()
55{
56        $dtrace -o $dtraceout -s /dev/stdin <<EOF
57	#pragma D option bufsize=128k
58	#pragma D option quiet
59
60        cpc:::PAPI_tot_ins-user-10000
61	/cpus[cpu] != 1/
62        {
63		cpus[cpu] = 1;
64		@a[cpu] = count();
65        }
66
67	tick-1s
68	/n++ > 10/
69	{
70		printa(@a);
71		exit(0);
72	}
73EOF
74}
75
76echo "" > $scriptout
77while [ $cpu -le $numproc ]
78do
79	if [ "`psrinfo -s $cpu 2> /dev/null`" -eq 1 ]; then
80		printf "%9d %16d\n" $cpu 1 >> $scriptout
81		spin &
82		allpids[$cpu]=$!
83		pbind -b $cpu $!
84	fi
85	cpu=$(($cpu+1))
86done
87echo "" >> $scriptout
88
89script
90
91diff $dtraceout $scriptout >/dev/null 2>&1
92status=$?
93
94# kill off the spinner processes
95cpu=0
96while [ $cpu -le $numproc ]
97do
98	if [ "`psrinfo -s $cpu 2> /dev/null`" -eq 1 ]; then
99		kill ${allpids[$cpu]}
100	fi
101	cpu=$(($cpu+1))
102done
103
104rm $dtraceout
105rm $scriptout
106
107exit $status
108