1210753Srpaulo#
2210753Srpaulo# CDDL HEADER START
3210753Srpaulo#
4210753Srpaulo# The contents of this file are subject to the terms of the
5210753Srpaulo# Common Development and Distribution License (the "License").
6210753Srpaulo# You may not use this file except in compliance with the License.
7210753Srpaulo#
8210753Srpaulo# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9210753Srpaulo# or http://www.opensolaris.org/os/licensing.
10210753Srpaulo# See the License for the specific language governing permissions
11210753Srpaulo# and limitations under the License.
12210753Srpaulo#
13210753Srpaulo# When distributing Covered Code, include this CDDL HEADER in each
14210753Srpaulo# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15210753Srpaulo# If applicable, add the following below this CDDL HEADER, with the
16210753Srpaulo# fields enclosed by brackets "[]" replaced with your own identifying
17210753Srpaulo# information: Portions Copyright [yyyy] [name of copyright owner]
18210753Srpaulo#
19210753Srpaulo# CDDL HEADER END
20210753Srpaulo#
21210753Srpaulo
22210753Srpaulo#
23210753Srpaulo# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24210753Srpaulo# Use is subject to license terms.
25210753Srpaulo#
26210753Srpaulo
27210753Srpaulo#
28210753Srpaulo# ASSERTION: Sched probe arguments should be valid. 
29210753Srpaulo#
30210753Srpaulo
31210753Srpauloif [ $# != 1 ]; then
32210753Srpaulo	echo expected one argument: '<'dtrace-path'>'
33210753Srpaulo	exit 2
34210753Srpaulofi
35210753Srpaulo
36210753Srpaulo#
37210753Srpaulo# do not fail test in a domU
38210753Srpaulo#
39210753Srpauloif [ ! -c /dev/xen/privcmd ]; then
40210753Srpaulo	exit 0
41210753Srpaulofi
42210753Srpaulo
43210753Srpaulodtrace=$1
44210753Srpaulooutf=/tmp/sched.args.$$
45210753Srpaulo
46210753Srpauloscript()
47210753Srpaulo{
48210753Srpaulo	$dtrace -c '/usr/bin/sleep 10' -o $outf -qs /dev/stdin <<EOF
49210753Srpaulo	xdt:sched::off-cpu,
50210753Srpaulo	xdt:sched::on-cpu,
51210753Srpaulo	xdt:sched::block,
52210753Srpaulo	xdt:sched::sleep,
53210753Srpaulo	xdt:sched::wake,
54210753Srpaulo	xdt:sched::yield
55210753Srpaulo	{
56210753Srpaulo		/* print domid vcpu pcpu probename */
57210753Srpaulo		printf("%d %d %d %s\n", arg0, arg1, \`xdt_curpcpu, probename);
58210753Srpaulo	}
59210753SrpauloEOF
60210753Srpaulo}
61210753Srpaulo
62210753Srpaulovalidate()
63210753Srpaulo{
64210753Srpaulo	/usr/bin/nawk '
65210753Srpaulo	BEGIN {
66210753Srpaulo		while (("/usr/sbin/xm vcpu-list" | getline)) {
67210753Srpaulo			if ($1 != "Name") {
68210753Srpaulo				domid = $2
69210753Srpaulo				vcpu = $3
70210753Srpaulo
71210753Srpaulo				vcpumap[domid, vcpu] = 1
72210753Srpaulo
73210753Srpaulo				split($7, affinity, ",")
74210753Srpaulo				for (i in affinity) {
75210753Srpaulo					if (split(affinity[i], p, "-") > 1) {
76210753Srpaulo						for (pcpu = p[1]; pcpu <= p[2];\
77210753Srpaulo						    pcpu++) {
78210753Srpaulo							cpumap[domid, vcpu,
79210753Srpaulo							    pcpu] = 1
80210753Srpaulo						}
81210753Srpaulo					} else {
82210753Srpaulo						cpumap[domid, vcpu,
83210753Srpaulo						    affinity[i]] = 1
84210753Srpaulo					}
85210753Srpaulo				}
86210753Srpaulo			}
87210753Srpaulo		}
88210753Srpaulo	}
89210753Srpaulo
90210753Srpaulo	/^$/ { next }
91210753Srpaulo
92210753Srpaulo	/wake/ {
93210753Srpaulo		if (vcpumap[$1, $2]) {
94210753Srpaulo			next
95210753Srpaulo		} else {
96210753Srpaulo			print "error: " $0
97210753Srpaulo			exit 1
98210753Srpaulo		}
99210753Srpaulo	}
100210753Srpaulo
101210753Srpaulo	{
102210753Srpaulo		if (cpumap[$1, $2, "any"] || cpumap[$1, $2, $3]) {
103210753Srpaulo			next
104210753Srpaulo		} else {
105210753Srpaulo			print "error: " $0
106210753Srpaulo			exit 1
107210753Srpaulo		}
108210753Srpaulo	}
109210753Srpaulo	' $outf
110210753Srpaulo}
111210753Srpaulo
112210753Srpauloscript
113210753Srpaulostatus=$?
114210753Srpaulo
115210753Srpauloif [ $status == 0 ]; then
116210753Srpaulo	validate
117210753Srpaulo	status=$?
118210753Srpaulofi
119210753Srpaulo
120210753Srpaulorm $outf
121210753Srpauloexit $status
122