18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#!/bin/sh
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# opcontrol is a script to control OProfile
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# opcontrol --help and opcontrol --list-events have info
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# Copyright 2002
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# Read the file COPYING
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# Authors: John Levon, Philippe Elie, Will Cohen, Jens Wilke, Daniel Hansel
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# Copyright IBM Corporation 2007
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# NOTE: This script should be as shell independent as possible
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddSYSCTL=do_sysctl
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# A replacement function for the sysctl (procps package) utility which is
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# missing on some distribution (e.g. slack 7.0).
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# Handles only the -w option of sysctl.
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_sysctl()
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$1" != "-w"; then
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "$0 unknown sysctl option" >&2
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 1
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	shift
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	arg=`echo $1 | awk -F= '{print $1}'`
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	val=`echo $1 | awk -F= '{print $2}'`
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	dev_name=`echo $arg | tr . /`
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test ! -f /proc/sys/$dev_name; then
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "/proc/sys/$dev_name does not exist or is not a regular file" >&2
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 1
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	echo $val > /proc/sys/$dev_name
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# check value is set
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodderror_if_empty()
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -z "$2"; then
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "No value given for option $1" >&2
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		do_help
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 1
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
527a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown# guess_number_base() checks if string is a valid octal(8), hexidecimal(16),
537a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown# or decimal number(10). The value is returned in $?. Returns 0, if string
547a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown# isn't a octal, hexidecimal, or decimal number.
557a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brownguess_number_base()
567a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown{
577a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown	if [[ "$1" =~ ^0[0-7]*$ ]] ; then 
587a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		return 8;
597a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown	elif [[ "$1" =~ ^0x[0-9a-fA-F]+$ ]] ; then
607a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		return 16;
617a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown	elif [[ "$1" =~ ^[1-9][0-9]*$ ]] ; then
627a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		return 10;
637a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown	else
647a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		return 0;
657a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown	fi
667a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown}
677a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown
687a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown# check value is a valid number
697a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brownerror_if_not_number()
707a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown{
717a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown	guess_number_base $2
727a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown	if test "$?" -eq 0 ; then
737a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		echo "Argument for $1, $2, is not a valid number." >&2
747a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		exit 1
757a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown	fi
767a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown}
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# rm_device arguments $1=file_name
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddrm_device()
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -c "$1"; then
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		vecho "Removing $1"
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		rm "$1"
848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# create_device arguments $1=file_name $2=MAJOR_NR $3=MINOR_NR
898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddcreate_device()
908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vecho "Doing mknod $1"
928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mknod "$1" c $2 $3
938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$?" != "0"; then
948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Couldn't mknod $1" >&2
958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 1
968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	chmod 700 "$1"
988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddmove_and_remove()
1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -e $1; then
1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		mv $1 $SAMPLES_DIR/.tmp_reset.$$
1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		rm -rf $SAMPLES_DIR/.tmp_reset.$$
1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# verbose echo
1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvecho()
1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -n "$VERBOSE"; then
1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo $@
1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddis_tool_available()
1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if which $1 &>/dev/null; then
1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test -x `which $1`; then
1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return 1
1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
1258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
1268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return 0
1288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
1298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# print help message
1328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_help()
1338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
1348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    cat >&2 <<EOF
1358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddopcontrol: usage:
1368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   -l/--list-events list event types and unit masks
1378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   -?/--help        this message
1388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   -v/--version     show version
1398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   --init           loads the oprofile module and oprofilefs
1408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   --setup          give setup arguments (may be omitted)
1418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   --status         show configuration
1428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   --start-daemon   start daemon without starting profiling
1438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   -s/--start       start data collection
1448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   -d/--dump        flush the collected profiling data
1458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   -t/--stop        stop data collection
1468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   -h/--shutdown    stop data collection and kill daemon
1478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   -V/--verbose[=all,sfile,arcs,samples,module,misc,ext]
1488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd                    be verbose in the daemon log
1498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   --reset          clears out data from current session
1508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   --save=name      save data from current session to session_name
1518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   --deinit         unload the oprofile module and oprofilefs
1528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   -e/--event=eventspec
1548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      Choose an event. May be specified multiple times. Of the form
1568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      "default" or "name:count:unitmask:kernel:user", where :
1578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      name:     event name, e.g. CPU_CLK_UNHALTED or RTC_INTERRUPTS
1598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      count:    reset counter value e.g. 100000
1608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      unitmask: hardware unit mask e.g. 0x0f
1618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      kernel:   whether to profile kernel: 0 or 1
1628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd      user:     whether to profile userspace: 0 or 1
1638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   -p/--separate=type,[types]
1658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd       Separate profiles as follows :
1678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd       none:     no profile separation
1698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd       library:  separate shared library profiles per-application
1708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd       kernel:   same as library, plus kernel profiles
1718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd       thread:   per-thread/process profiles
1728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd       cpu:      per CPU profiles
1738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd       all:      all of the above
1748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1757a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown   -c/--callgraph=#depth         enable callgraph sample collection with a
1767a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown                                 maximum depth. Use '0' to disable callgraph
1777a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown                                 profiling.
1788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   --session-dir=dir             place sample database in dir instead of
1798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd                                 default location (/var/lib/oprofile)
1808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   -i/--image=name[,names]       list of binaries to profile (default is "all")
1818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   --vmlinux=file                vmlinux kernel image
1828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   --no-vmlinux                  no kernel image (vmlinux) available
1838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   --kernel-range=start,end      kernel range vma address in hexadecimal
1847a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown   --buffer-size=num             kernel buffer size in sample units.
1857a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown                                 Rules: A non-zero value goes into effect after
1867a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown                                 a '--shutdown/start' sequence.  A value of
1877a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown                                 zero sets this parameter back to default value
1887a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown                                 but does not go into effect until after a
1897a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown                                 '--deinit/init' sequence.
1907a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown   --buffer-watershed            kernel buffer watershed in sample units (2.6
1917a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown                                 kernel). Same rules as defined for
1927a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown                                 buffer-size.
1937a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown   --cpu-buffer-size=num         per-cpu buffer size in units (2.6 kernel)
1947a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown                                 Same rules as defined for buffer-size.
1957a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown   --note-table-size             kernel notes buffer size in notes units (2.4
1967a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown                                 kernel)
1978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd   --xen                         Xen image (for Xen only)
1997a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown   --active-domains=<list>       List of domains in profiling session (for Xen)
2008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd                                 (list contains domain ids separated by commas)
2018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddEOF
2028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
2038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# load the module and mount oprofilefs
2068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddload_module_26()
2078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
2088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	grep oprofilefs /proc/filesystems >/dev/null
2098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$?" -ne 0; then
2108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		modprobe oprofile
2118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$?" != "0"; then
2128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			# couldn't load the module
2138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return
2148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
2158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		grep oprofile /proc/modules >/dev/null
2168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$?" != "0"; then
2178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			# didn't find module
2188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return
2198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
2208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		grep oprofilefs /proc/filesystems >/dev/null
2218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$?" -ne 0; then
2228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			# filesystem still not around
2238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return
2248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
2258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
2268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mkdir /dev/oprofile >/dev/null 2>&1
2278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	grep oprofilefs /etc/mtab >/dev/null
2288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$?" -ne 0; then
2298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		mount -t oprofilefs nodev /dev/oprofile >/dev/null
2308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
2318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	KERNEL_SUPPORT=yes
2328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	OPROFILE_AVAILABLE=yes
2338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
2348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddload_module_24()
2378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
2388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	grep oprof /proc/devices >/dev/null
2398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$?" -ne 0; then
2408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		modprobe oprofile
2418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$?" != "0"; then
2428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			# couldn't load a module
2438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return
2448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
2458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		grep oprofile /proc/modules >/dev/null
2468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$?" != "0"; then
2478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			# didn't find module
2488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return
2498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
2508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
2518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	KERNEL_SUPPORT=no
2528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	OPROFILE_AVAILABLE=yes
2538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
2548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddload_module()
2578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
2588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	OPROFILE_AVAILABLE=no
2598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	load_module_26
2608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$OPROFILE_AVAILABLE" != "yes"; then
2618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		load_module_24
2628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
2638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$OPROFILE_AVAILABLE" != "yes"; then
2648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Kernel doesn't support oprofile" >&2
2658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 1
2668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
2678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
2688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# setup variables related to path or daemon. Set vars according to following
2708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# relationship: command-line-option > config-file-settings > defaults.
2718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# Note that upon entry SESSION_DIR may be set by command-line option.
2728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_init_daemon_vars()
2738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
2748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# load settings from config file, keeping command-line value
2758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# of SESSION_DIR if necessary.
2768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -n "$SESSION_DIR"; then
2778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		SAVED=$SESSION_DIR
2788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
2798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	do_load_setup
2808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -n "$SAVED"; then
2818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		SESSION_DIR=$SAVED
2828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
2838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# daemon parameters (as in op_config.h).  Note that we preserve
2858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# any previous value of SESSION_DIR
2868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -z "$SESSION_DIR"; then
2878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		SESSION_DIR="/var/lib/oprofile"
2888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
2898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	LOCK_FILE="$SESSION_DIR/lock"
2908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	SAMPLES_DIR="$SESSION_DIR/samples"
2918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	LOG_FILE="$SAMPLES_DIR/oprofiled.log"
2928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	CURRENT_SAMPLES_DIR="$SAMPLES_DIR/current"
2938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
2948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# pick the appropriate device mount based on kernel
2978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddecide_oprofile_device_mount()
2988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
2998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$KERNEL_SUPPORT" = "yes"; then
3008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		MOUNT="/dev/oprofile"
3018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
3028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		MOUNT="/proc/sys/dev/oprofile"
3038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
3048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
3058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# pick the appropriate locations device for oprofile based on kernel
3088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddecide_oprofile_device()
3098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
3108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$KERNEL_SUPPORT" = "yes"; then
3118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		DEVICE_FILE="$MOUNT/buffer"
3128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
3138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		DEVICE_FILE="$SESSION_DIR/opdev"
3148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		NOTE_DEVICE_FILE="$SESSION_DIR/opnotedev"
3158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		HASH_MAP_DEVICE_FILE="$SESSION_DIR/ophashmapdev"
3168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
3178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
3188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# initialise parameters
3208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_init()
3218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
3228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# for these three buffer size == 0 means use the default value
3238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# hard-coded in op_user.h
3248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	BUF_SIZE=0
3258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	BUF_WATERSHED=0
3268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	CPU_BUF_SIZE=0
3278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	NOTE_SIZE=0
3288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	VMLINUX=
3298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	XENIMAGE="none"
3308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	VERBOSE=""
3318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	SEPARATE_LIB=0
3328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	SEPARATE_KERNEL=0
3338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	SEPARATE_THREAD=0
3348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	SEPARATE_CPU=0
3358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	CALLGRAPH=0
3368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	IBS_FETCH_EVENTS=""
3378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	IBS_FETCH_COUNT=0
3388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	IBS_FETCH_UNITMASK=0
3398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	IBS_OP_EVENTS=""
3408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	IBS_OP_COUNT=0
3418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	IBS_OP_UNITMASK=0
3428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	OPROFILED="$OPDIR/oprofiled"
3448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# location for daemon setup information
3468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	SETUP_DIR="/root/.oprofile"
3478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	SETUP_FILE="$SETUP_DIR/daemonrc"
3488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# initialize daemon vars
3508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	decide_oprofile_device_mount
3518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	CPUTYPE=`cat $MOUNT/cpu_type`
3528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	OP_COUNTERS=`ls $MOUNT/ | grep "^[0-9]\+\$" | tr "\n" " "`
3538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	NR_CHOSEN=0
3548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	do_init_daemon_vars
3568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	decide_oprofile_device
3578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	DEFAULT_EVENT=`$OPHELP --get-default-event`
3598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	IS_TIMER=0
3618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	IS_PERFMON=0
3628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$CPUTYPE" = "timer"; then
3638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		IS_TIMER=1
3648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
3658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		case "$CPUTYPE" in
3668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			ia64/*)
3678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				IS_PERFMON=$KERNEL_SUPPORT
3688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
3698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		esac
3708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
3718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
3728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddcreate_dir()
3758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
3768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test ! -d "$1"; then
3778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		mkdir -p "$1"
3788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$?" != "0"; then
3798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "Couldn't mkdir -p $1" >&2
3808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			exit 1
3818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
3828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		chmod 755 "$1"
3838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
3848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
3858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddget_event()
3878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
3888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	GOTEVENT=`eval "echo \\$CHOSEN_EVENTS_$1"`
3898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
3908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddset_event()
3928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
3938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	eval "CHOSEN_EVENTS_$1=$2"
3948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
3958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
3978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# save all the setup related information
3988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_save_setup()
3998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
4008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	create_dir "$SETUP_DIR"
4018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	touch $SETUP_FILE
4038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	chmod 644 $SETUP_FILE
4048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	>$SETUP_FILE
4058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	echo "SESSION_DIR=$SESSION_DIR" >>$SETUP_FILE
4078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$NR_CHOSEN" != "0"; then
4098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		for f in `seq 0 $((NR_CHOSEN - 1))`; do
4108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			get_event $f
4118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "CHOSEN_EVENTS_${f}=$GOTEVENT" >>$SETUP_FILE
4128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		done
4138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
4148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	echo "NR_CHOSEN=$NR_CHOSEN" >>$SETUP_FILE
4168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	echo "SEPARATE_LIB=$SEPARATE_LIB" >> $SETUP_FILE
4188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	echo "SEPARATE_KERNEL=$SEPARATE_KERNEL" >> $SETUP_FILE
4198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	echo "SEPARATE_THREAD=$SEPARATE_THREAD" >> $SETUP_FILE
4208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	echo "SEPARATE_CPU=$SEPARATE_CPU" >> $SETUP_FILE
4218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	echo "VMLINUX=$VMLINUX" >> $SETUP_FILE
4228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	echo "IMAGE_FILTER=$IMAGE_FILTER" >> $SETUP_FILE
4238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# write the actual information to file
4248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$BUF_SIZE" != "0"; then
4258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "BUF_SIZE=$BUF_SIZE" >> $SETUP_FILE
4268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
4278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$BUF_WATERSHED" != "0"; then
4288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "BUF_WATERSHED=$BUF_WATERSHED" >> $SETUP_FILE
4298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
4308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$KERNEL_SUPPORT" = "yes"; then
4318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "CPU_BUF_SIZE=$CPU_BUF_SIZE" >> $SETUP_FILE
4328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
4338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$KERNEL_SUPPORT" != "yes"; then
4348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "NOTE_SIZE=$NOTE_SIZE" >> $SETUP_FILE
4358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
4368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	echo "CALLGRAPH=$CALLGRAPH" >> $SETUP_FILE
4378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$KERNEL_RANGE"; then
4388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "KERNEL_RANGE=$KERNEL_RANGE" >> $SETUP_FILE
4398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
4408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	echo "XENIMAGE=$XENIMAGE" >> $SETUP_FILE
4418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$XEN_RANGE"; then
4428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "XEN_RANGE=$XEN_RANGE" >> $SETUP_FILE
4438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
4448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
4458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# reload all the setup-related information
4488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_load_setup()
4498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
4508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -f "$SETUP_FILE"; then
4518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# load the actual information from file
4528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# FIXME this is insecure, arbitrary commands could be added to
4538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# $SETUP_FILE and be executed as root
4548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		. $SETUP_FILE
4558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
4568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
4578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddcheck_valid_args()
4608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
4618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -z "$VMLINUX"; then
4628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "No vmlinux file specified. You must specify the correct vmlinux file, e.g." >&2
4638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "opcontrol --vmlinux=/path/to/vmlinux" >&2
4648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "If you do not have a vmlinux file, use " >&2
4658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "opcontrol --no-vmlinux" >&2
4668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Enter opcontrol --help for full options" >&2
4678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 1
4688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
4698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -f "$VMLINUX"; then
4718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return
4728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
4738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$VMLINUX" = "none"; then
4758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return
4768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
4778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	echo "The specified vmlinux file \"$VMLINUX\" doesn't exist." >&2
4798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	exit 1
4808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# similar check for Xen image
4828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -f "$XENIMAGE"; then
4838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return
4848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
4858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$XENIMAGE" = "none"; then
4878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return
4888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
4898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	echo "The specified XenImage file \"$XENIMAGE\" does not exist." >&2
4918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	exit 1
4928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
4938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
4958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# get start and end points of a file image (linux kernel or xen)
4968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# get_image_range parameter: $1=type_of_image (linux or xen)
4978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddget_image_range()
4988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
4998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$1" = "xen"; then
5008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test ! -z "$XEN_RANGE"; then
5018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return;
5028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
5038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		FILE_IMAGE="$XENIMAGE"
5048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
5058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test ! -z "$KERNEL_RANGE"; then
5068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return;
5078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
5088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		FILE_IMAGE="$VMLINUX"
5098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
5108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$FILE_IMAGE" = "none"; then
5128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return;
5138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
5148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if is_tool_available objdump; then
5168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "objdump is not installed on this system, use opcontrol --kernel-range=start,end or opcontrol --xen-range= or install objdump"
5178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 1
5188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
5198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# start at the start of .text, and end at _etext
5218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	range_info=`objdump -h $FILE_IMAGE 2>/dev/null | grep " .text "`
5228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	tmp1=`echo $range_info | awk '{print $4}'`
5238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	tmp2=`objdump -t $FILE_IMAGE 2>/dev/null | grep "_etext$" | awk '{ print $1 }'`
5248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -z "$tmp1" -o -z "$tmp2"; then
5268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "The specified file $FILE_IMAGE does not seem to be valid" >&2
5278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Make sure you are using the non-compressed image file (e.g. vmlinux not vmlinuz)" >&2
5288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		vecho "found start as \"$tmp1\", end as \"$tmp2\"" >&2
5298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 1
5308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
5318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$1" = "xen"; then
5338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		XEN_RANGE="`echo $tmp1`,`echo $tmp2`"
5348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		vecho "XEN_RANGE $XEN_RANGE"
5358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
5368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		KERNEL_RANGE="`echo $tmp1`,`echo $tmp2`"
5378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		vecho "KERNEL_RANGE $KERNEL_RANGE"
5388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
5398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
5408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# validate --separate= parameters. This function is called with IFS=,
5438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# so on each argument is splitted
5448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvalidate_separate_args()
5458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
5468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	error_if_empty $1 $2	# we need at least one argument
5478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	local i=1
5488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	SEPARATE_LIB=0
5498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	SEPARATE_KERNEL=0
5508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	SEPARATE_THREAD=0
5518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	SEPARATE_CPU=0
5528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	while [ "$i" -lt "$#" ]; do
5538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		shift
5548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		case "$1" in
5558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			lib|library)
5568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				SEPARATE_LIB=1
5578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
5588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			kernel)
5598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				# first implied by second
5608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				SEPARATE_LIB=1
5618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				SEPARATE_KERNEL=1
5628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
5638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			thread)
5648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				SEPARATE_THREAD=1
5658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
5668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			cpu)
5678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				SEPARATE_CPU=1
5688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
5698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			all)
5708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				SEPARATE_LIB=1
5718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				SEPARATE_KERNEL=1
5728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				SEPARATE_THREAD=1
5738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				SEPARATE_CPU=1
5748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
5758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			none)
5768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				SEPARATE_LIB=0
5778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				SEPARATE_KERNEL=0
5788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				SEPARATE_THREAD=0
5798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				SEPARATE_CPU=0
5808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
5818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			*)
5828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				echo "invalid --separate= argument: $1"
5838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				exit 1
5848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		esac
5858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	done
5868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
5878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
5898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# check the counters make sense, and resolve the hardware allocation
5908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddverify_counters()
5918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
5928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$IS_TIMER" = 1; then
5938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$NR_CHOSEN" != 0; then
5948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "You cannot specify any performance counter events" >&2
5958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "because OProfile is in timer mode." >&2
5968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			exit 1
5978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
5988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return
5998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
6008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	OPHELP_ARGS=
6028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$NR_CHOSEN" != 0; then
6048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		for f in `seq 0 $((NR_CHOSEN - 1))`; do
6058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			get_event $f
6068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if test "$GOTEVENT" != ""; then
6078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				verify_ibs $GOTEVENT
6088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				OPHELP_ARGS="$OPHELP_ARGS $GOTEVENT"
6098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
6108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		done
6118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test ! -z "$OPHELP_ARGS" ; then
6138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			HW_CTRS=`$OPHELP --check-events $OPHELP_ARGS --callgraph=$CALLGRAPH`
6148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if test "$?" != 0; then
6158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				exit 1
6168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
6178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
6188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
6198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
6208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# setup any needed default value in chosen events
6238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddnormalise_events()
6248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
6258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$NR_CHOSEN" -le 0 || test "$IS_TIMER" = 1; then
6268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return
6278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
6288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for f in `seq 0 $((NR_CHOSEN - 1))`; do
6308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		get_event $f
6318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$GOTEVENT" != ""; then
6328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			EVENT=`echo $GOTEVENT | awk -F: '{print $1}'`
6338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			EVENT_VAL=`$OPHELP $EVENT`
6348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if test "$?" != 0; then
6358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				exit 1
6368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
6378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			COUNT=`echo $GOTEVENT | awk -F: '{print $2}'`
6388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			UNIT_MASK=`echo $GOTEVENT | awk -F: '{print $3}'`
6398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			KERNEL=`echo $GOTEVENT | awk -F: '{print $4}'`
6408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			USER=`echo $GOTEVENT | awk -F: '{print $5}'`
6418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if test -z "$UNIT_MASK"; then
6428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				TMPEVENT="$EVENT:$COUNT"
6438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				UNIT_MASK=`$OPHELP --unit-mask $TMPEVENT`
6448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				if test "$?" != 0; then
6458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					exit 1
6468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				fi
6478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
6488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if test -z "$KERNEL"; then
6498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				KERNEL=1
6508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
6518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if test -z "$USER"; then
6528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				USER=1
6538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
6548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			set_event $f "$EVENT:$COUNT:$UNIT_MASK:$KERNEL:$USER"
6568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
6578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	done
6588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
6598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# get and check specified options
6628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_options()
6638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
6648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	EXCLUSIVE_ARGC=0
6658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	SETUP=no
6668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	NEED_SETUP=no
6678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	SEEN_EVENT=0
6688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# note: default settings have already been loaded
6708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	while [ "$#" -ne 0 ]
6728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	do
6738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		arg=`printf %s $1 | awk -F= '{print $1}'`
6748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		val=`printf %s $1 | awk -F= '{print $2}'`
6758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		shift
6768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test -z "$val"; then
6778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			local possibleval=$1
6788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			printf %s $1 "$possibleval" | grep ^- >/dev/null 2>&1
6798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if test "$?" != "0"; then
6808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				val=$possibleval
6818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				if [ "$#" -ge 1 ]; then
6828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					shift
6838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				fi
6848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
6858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
6868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		case "$arg" in
6888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			--init)
6908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				# this is already done in load_module
6918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				# because need to know the processor type
6928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				# and number of registers
6938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				INIT=yes;
6948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EXCLUSIVE_ARGC=`expr $EXCLUSIVE_ARGC + 1`
6958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EXCLUSIVE_ARGV="$arg"
6968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
6978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
6988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			--setup)
6998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				SETUP=yes
7008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
7018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			--start-daemon)
7038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				if test "$KERNEL_SUPPORT" != "yes"; then
7048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					echo "$arg unsupported. use \"--start\"" >&2
7058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					exit 1
7068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				fi
7078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				START_DAEMON=yes
7088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EXCLUSIVE_ARGC=`expr $EXCLUSIVE_ARGC + 1`
7098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EXCLUSIVE_ARGV="$arg"
7108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
7118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			-s|--start)
7138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				START=yes
7148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EXCLUSIVE_ARGC=`expr $EXCLUSIVE_ARGC + 1`
7158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EXCLUSIVE_ARGV="$arg"
7168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
7178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			-d|--dump)
7198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DUMP=yes
7208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				ONLY_DUMP=yes
7218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EXCLUSIVE_ARGC=`expr $EXCLUSIVE_ARGC + 1`
7228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EXCLUSIVE_ARGV="$arg"
7238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
7248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			-t|--stop)
7268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				if test "$KERNEL_SUPPORT" != "yes"; then
7278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					echo "$arg unsupported. use \"--shutdown\"" >&2
7288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					exit 1
7298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				fi
7308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DUMP=yes
7318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				STOP=yes
7328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EXCLUSIVE_ARGC=`expr $EXCLUSIVE_ARGC + 1`
7338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EXCLUSIVE_ARGV="$arg"
7348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
7358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			-h|--shutdown)
7378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DUMP=yes
7388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				STOP=yes
7398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				KILL_DAEMON=yes
7408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EXCLUSIVE_ARGC=`expr $EXCLUSIVE_ARGC + 1`
7418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EXCLUSIVE_ARGV="$arg"
7428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
7438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			--status)
7458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				STATUS=yes
7468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
7478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			--reset)
7498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DUMP=yes
7508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				RESET=yes
7518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EXCLUSIVE_ARGC=`expr $EXCLUSIVE_ARGC + 1`
7528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EXCLUSIVE_ARGV="$arg"
7538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
7548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			--save)
7568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				error_if_empty $arg $val
7578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DUMP=yes
7588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				SAVE_SESSION=yes
7598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				SAVE_NAME=$val
7608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EXCLUSIVE_ARGC=`expr $EXCLUSIVE_ARGC + 1`
7618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EXCLUSIVE_ARGV="$arg"
7628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
7638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			--deinit)
7658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DUMP=yes
7668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				test ! -f "$LOCK_FILE" || {
7678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					STOP=yes
7688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					KILL_DAEMON=yes
7698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				}
7708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DEINIT=yes
7718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EXCLUSIVE_ARGC=`expr $EXCLUSIVE_ARGC + 1`
7728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EXCLUSIVE_ARGV="$arg"
7738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
7748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			# --setup options
7768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
7778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			--session-dir)
7788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				# already processed
7798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
7808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			--buffer-size)
7818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				error_if_empty $arg $val
7827a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown				error_if_not_number $arg $val
7838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				BUF_SIZE=$val
7848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DO_SETUP=yes
7858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
7868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			--buffer-watershed)
7878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				if test "$KERNEL_SUPPORT" != "yes"; then
7888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					echo "$arg unsupported for this kernel version"
7898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					exit 1
7908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				fi
7918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				error_if_empty $arg $val
7927a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown				error_if_not_number $arg $val
7938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				BUF_WATERSHED=$val
7948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DO_SETUP=yes
7958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
7968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			--cpu-buffer-size)
7978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				if test "$KERNEL_SUPPORT" != "yes"; then
7988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					echo "$arg unsupported for this kernel version"
7998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					exit 1
8008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				fi
8018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				error_if_empty $arg $val
8027a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown				error_if_not_number $arg $val
8038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				CPU_BUF_SIZE=$val
8048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DO_SETUP=yes
8058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
8068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			-e|--event)
8078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				error_if_empty $arg $val
8088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				# reset any read-in defaults from daemonrc
8098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				if test "$SEEN_EVENT" = "0"; then
8108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					NR_CHOSEN=0
8118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					SEEN_EVENT=1
8128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				fi
8138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				if test "$val" = "default"; then
8148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					val=$DEFAULT_EVENT
8158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				fi
8168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				set_event $NR_CHOSEN "$val"
8178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				NR_CHOSEN=`expr $NR_CHOSEN + 1`
8188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DO_SETUP=yes
8198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
8208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			-p|--separate)
8218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				OLD_IFS=$IFS
8228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				IFS=,
8238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				validate_separate_args $arg $val
8248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				IFS=$OLD_IFS
8258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DO_SETUP=yes
8268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
8278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			-c|--callgraph)
8288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				error_if_empty $arg $val
8298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				if test ! -f $MOUNT/backtrace_depth; then
8308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					echo "Call-graph profiling unsupported on this kernel/hardware" >&2
8318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					exit 1
8328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				fi
8337a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown				error_if_not_number $arg $val
8348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				CALLGRAPH=$val
8358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DO_SETUP=yes
8368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
8378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			--vmlinux)
8388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				error_if_empty $arg $val
8398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				VMLINUX=$val
8408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DO_SETUP=yes
8418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
8428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			--no-vmlinux)
8438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				VMLINUX=none
8448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DO_SETUP=yes
8458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
8468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			--kernel-range)
8478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				error_if_empty $arg $val
8488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				KERNEL_RANGE=$val
8498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DO_SETUP=yes
8508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
8518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			--xen)
8528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				error_if_empty $arg $val
8538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				XENIMAGE=$val
8548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DO_SETUP=yes
8558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
8568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			--active-domains)
8578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				error_if_empty $arg $val
8588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				ACTIVE_DOMAINS=$val
8598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DO_SETUP=yes
8608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
8618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			--note-table-size)
8628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				error_if_empty $arg $val
8638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				if test "$KERNEL_SUPPORT" = "yes"; then
8648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					echo "\"$arg\" meaningless on this kernel" >&2
8658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					exit 1
8668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				else
8678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					NOTE_SIZE=$val
8688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				fi
8698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DO_SETUP=yes
8708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
8718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			-i|--image)
8728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				error_if_empty $arg $val
8738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				if test "$val" = "all"; then
8748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					IMAGE_FILTER=
8758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				else
8768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					IMAGE_FILTER=$val
8778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				fi
8788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DO_SETUP=yes
8798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
8808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			-V|--verbose)
8828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				if test -z "$val"; then
8838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					VERBOSE="all"
8848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				else
8858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					VERBOSE=$val
8868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				fi
8878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
8888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			-l|--list-events)
8908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EXCLUSIVE_ARGC=`expr $EXCLUSIVE_ARGC + 1`
8918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EXCLUSIVE_ARGV="$arg"
8928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				exec $OPHELP
8938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
8948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
8958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			*)
8968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				echo "Unknown option \"$arg\". See opcontrol --help" >&2
8978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				exit 1
8988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
8998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		esac
9008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	done
9018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	normalise_events
9038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	verify_counters
9048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# error checking to make sure options make sense
9068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$EXCLUSIVE_ARGC" -gt 1; then
9078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Option \"$EXCLUSIVE_ARGV\" not valid with other options." >&2
9088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 1
9098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
9108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$SETUP" = "yes" -a "$DO_SETUP" != "yes"; then
9128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "No options specified for --setup." >&2
9138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 1
9148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
9158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -n "$VERBOSE"; then
9178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$START" != "yes" -a "$START_DAEMON" != "yes"; then
9188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "Option --verbose may only be used with --start or --start-daemon" >&2
9198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			exit 1
9208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
9218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
9228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$DO_SETUP" = "yes"; then
9248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		SETUP="$DO_SETUP"
9258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
9268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$EXCLUSIVE_ARGC" -eq 1 -a "$SETUP" = "yes"; then
9288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$EXCLUSIVE_ARGV" != "--start-daemon" -a "$EXCLUSIVE_ARGV" != "--start"; then
9298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "Option \"--setup\" not valid with \"$EXCLUSIVE_ARGV\"." >&2
9308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			exit 1
9318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
9328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
9338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vecho "Parameters used:"
9358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vecho "SESSION_DIR $SESSION_DIR"
9368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vecho "LOCK_FILE   $LOCK_FILE"
9378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vecho "SAMPLES_DIR $SAMPLES_DIR"
9388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vecho "CURRENT_SAMPLES_DIR $CURRENT_SAMPLES_DIR"
9398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vecho "CPUTYPE $CPUTYPE"
9408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$BUF_SIZE" != "0"; then
9418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		vecho "BUF_SIZE $BUF_SIZE"
9428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
9438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		vecho "BUF_SIZE default value"
9448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
9458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$BUF_WATERSHED" != "0"; then
9468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		vecho "BUF_WATERSHED $BUF_WATERSHED"
9478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
9488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		vecho "BUF_WATERSHED default value"
9498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
9508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$KERNEL_SUPPORT" = "yes"; then
9518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$CPU_BUF_SIZE" != "0"; then
9528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			vecho "CPU_BUF_SIZE $CPU_BUF_SIZE"
9538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
9548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			vecho "CPU_BUF_SIZE default value"
9558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
9568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
9578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vecho "SEPARATE_LIB $SEPARATE_LIB"
9598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vecho "SEPARATE_KERNEL $SEPARATE_KERNEL"
9608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vecho "SEPARATE_THREAD $SEPARATE_THREAD"
9618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vecho "SEPARATE_CPU $SEPARATE_CPU"
9628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vecho "CALLGRAPH $CALLGRAPH"
9638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vecho "VMLINUX $VMLINUX"
9648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vecho "KERNEL_RANGE $KERNEL_RANGE"
9658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vecho "XENIMAGE $XENIMAGE"
9668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vecho "XEN_RANGE $XEN_RANGE"
9678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
9688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# stop any existing daemon
9718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_stop()
9728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
9738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test ! -f "$LOCK_FILE"; then
9748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Daemon not running" >&2
9758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return
9768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
9778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	kill -0 `cat $LOCK_FILE` 2>/dev/null
9798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$?" -ne 0; then
9808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Detected stale lock file. Removing." >&2
9818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		rm -f "$LOCK_FILE"
9828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return
9838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
9848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test $KERNEL_SUPPORT = "yes" \
9868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    && test 0 != $(cat /dev/oprofile/enable); then
9878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Stopping profiling."
9888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo 0 >/dev/oprofile/enable
9898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
9908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	kill -USR2 `cat $LOCK_FILE` 2>/dev/null
9918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
9928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
9948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# kill the daemon process(es)
9958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_kill_daemon()
9968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
9978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test ! -f "$LOCK_FILE"; then
9988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# no error message, do_kill_daemon imply stop and stop already
9998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# output "Daemon not running"
10008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return
10018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
10028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	kill -0 `cat $LOCK_FILE` 2>/dev/null
10048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$?" -ne 0; then
10058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Detected stale lock file. Removing." >&2
10068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		rm -f "$LOCK_FILE"
10078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return
10088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
10098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	echo "Killing daemon."
10118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test $KERNEL_SUPPORT = "yes"; then
10138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		kill -TERM `cat $LOCK_FILE`
10148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
10158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo 1 >/proc/sys/dev/oprofile/dump_stop
10168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
10178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	COUNT=0
10198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	while test -n "`pidof oprofiled`"
10208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	do
10218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		sleep 1
10228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# because oprofiled only sets a variable inside the
10248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# signal handler itself, it's possible to miss a
10258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# signal just before it goes to sleep waiting for
10268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# data from the kernel that never arrives. So we
10278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# remind it it needs to die - this works because
10288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# the signal will bring oprofiled out of the kernel
10298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# back into userspace
10308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test $KERNEL_SUPPORT = "yes"; then
10318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			pid=`cat $LOCK_FILE 2>/dev/null`
10328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			kill -TERM "$pid" 2>/dev/null
10338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
10348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		COUNT=`expr $COUNT + 1`
10368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# IBS can generate a large number of samples/events.
10388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# Therefore, extend the delay before killing
10398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$IBS_FETCH_COUNT" != "0" \
10408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		     -o "$IBS_OP_COUNT" != "0" ; then
10418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			DELAY_KILL=60
10428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
10438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			DELAY_KILL=15
10448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
10458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$COUNT" -eq "$DELAY_KILL"; then
10468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "Daemon stuck shutting down; killing !"
10478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			kill -9 `cat $LOCK_FILE`
10488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
10498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	done
10508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	sleep 1
10518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# already removed unless we forced the kill
10528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	rm -f "$SESSION_DIR/lock"
10538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
10548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddrm_devices_24()
10578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
10588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	rm_device "$DEVICE_FILE"
10598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	rm_device "$NOTE_DEVICE_FILE"
10608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	rm_device "$HASH_MAP_DEVICE_FILE"
10618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
10628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddcreate_devices_24()
10658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
10668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	MAJOR_NR=`grep oprof /proc/devices | awk '{print $1}'`
10678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	create_device $DEVICE_FILE $MAJOR_NR 0
10698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	create_device $NOTE_DEVICE_FILE $MAJOR_NR 2
10708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	create_device $HASH_MAP_DEVICE_FILE $MAJOR_NR 1
10718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
10728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# create jitdump directory and remove any old files from
10748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# a previous run
10758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprep_jitdump() {
10768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	local dumpdir=$SESSION_DIR/jitdump
10778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	test -d $dumpdir || {
10788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		mkdir -p $dumpdir;
10798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		chmod 777 $dumpdir;
10808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return;
10818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
10828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# VMs may already be running when profiling is started, so
10838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# remove only dump files that are not in use
10848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for I in $dumpdir/*; do
10858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		test -f $I || continue;
10868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		local pid=`basename $I .dump`;
10878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test -d /proc/$pid; then
10888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			local files=`find /proc/$pid/fd -lname $I`;
10898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			test -n "$files" && continue;
10908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
10918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		rm -f $I;
10928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	done
10938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
10948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
10958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# setup and start module
10968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_setup()
10978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
10988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	create_dir "$SESSION_DIR"
10998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
11008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$KERNEL_SUPPORT" != "yes"; then
11018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		rm_devices_24
11028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		create_devices_24
11038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
11048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
11058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	create_dir "$CURRENT_SAMPLES_DIR"
11068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
11078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	prep_jitdump;
11088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
11098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
11108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
11118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# set a sysctl/oprofilefs parameter
11128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddset_param()
11138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
11148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$KERNEL_SUPPORT" = "yes"; then
11158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo $2 >$MOUNT/$1
11168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
11178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		$SYSCTL -w dev.oprofile.$1=$2
11188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
11198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
11208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
11218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
11228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# set a sysctl/oprofilefs counter parameter
11238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddset_ctr_param()
11248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
11258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# no such thing for perfmon
11268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$IS_PERFMON" = "yes"; then
11278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return
11288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
11298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
11308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$KERNEL_SUPPORT" = "yes"; then
11318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test -e $MOUNT/$1; then
11328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo $3 >$MOUNT/$1/$2
11338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
11348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo -n "Error: counter $1 not available"
11358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if test -e /proc/sys/kernel/nmi_watchdog; then
11368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				echo " nmi_watchdog using this resource ? Try:"
11378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				echo "opcontrol --deinit"
11388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				echo "echo 0 > /proc/sys/kernel/nmi_watchdog"
11398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
11408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			exit 1
11418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
11428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
11438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		$SYSCTL -w dev.oprofile.$1.$2=$3
11448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
11458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
11468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
11478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
11488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# returns 1 if $CPUTYPE is a PPC64 variant
11498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddis_non_cell_ppc64_variant()
11508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
11518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case "$1" in
11528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		ppc64/*)
11538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			tmp="${1/cell/CELL}"
11548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if test "$1" = "$tmp"; then
11558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			#No substituion occurred, so cputype is not cell
11568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				return 1
11578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			else
11588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				return 0
11598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
11608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			;;
11618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		*)
11628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return 0;
11638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			;;
11648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	esac
11658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
11668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
11678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
11688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# The check_event_mapping_data procedure gives the
11698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# opportunity to validate events and enforce any
11708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# arch-specific restritions, etc.
11718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddcheck_event_mapping_data()
11728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
11738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
11748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	is_non_cell_ppc64_variant $CPUTYPE
11758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test $? -ne 0 ; then
11768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# For PPC64 architectures, the values required to program
11778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# MMCRs for the given event are returned along with the event.
11788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# Here we use those values to ensure that all chosen events
11798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# are from the same group.
11808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		MMCR0=`echo $EVENT_STR | awk '{print $2}'`
11818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		MMCR1=`echo $EVENT_STR | awk '{print $3}'`
11828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		MMCRA=`echo $EVENT_STR | awk '{print $4}'`
11838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		MMCR0_VAL=`echo $MMCR0 | awk -F: '{print $2}'`
11848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		MMCR1_VAL=`echo $MMCR1 | awk -F: '{print $2}'`
11858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		MMCRA_VAL=`echo $MMCRA | awk -F: '{print $2}'`
11868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
11878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		## mmcr0, mmcr1, mmcra are for all ppc64 counters
11888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# Save first event mmcr settings to compare with additional
11898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# events.  All events must have the same mmcrx values i.e. be in
11908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# the same group.  Only one event is assigned per counter,
11918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# hence there will not be a conflict on the counters
11928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if [ "$MMCR0_CK_VAL" = "" ] ; then
11938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			MMCR0_CK_VAL=$MMCR0_VAL
11948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			MMCR1_CK_VAL=$MMCR1_VAL
11958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			MMCRA_CK_VAL=$MMCRA_VAL
11968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
11978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			# make sure all events are from the same group
11988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if test $MMCR0_CK_VAL != $MMCR0_VAL \
11998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				-o $MMCR1_CK_VAL != $MMCR1_VAL \
12008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				-o $MMCRA_CK_VAL != $MMCRA_VAL ; then
12018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				echo "ERROR: The specified events are not from the same group."
12028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				echo "       Use 'opcontrol --list-events' to see event groupings."
12038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				exit 1
12048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
12058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
12068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
12078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# Check if all user/kernel flags per-counter are matching.
12088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if [ "$USER_CK" = "" ] ; then
12098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			USER_CK=$USER
12108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			KERNEL_CK=$KERNEL
12118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
12128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if test $USER_CK != $USER \
12138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				-o $KERNEL_CK != $KERNEL ; then
12148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				echo "ERROR: All kernel/user event flags must match."
12158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				exit 1
12168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
12178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
12188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
12198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if [ "$CPUTYPE" = "ppc64/cell-be" ]; then
12208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		event_num=`echo $EVENT_STR | awk '{print $1}'`
12218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# PPU event and cycle events can be measured at
12228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# the same time.  SPU event can not be measured
12238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# at the same time as any other event.  Similarly for
12248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# SPU Cycles
12258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
12268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# We use EVNT_MSK to track what events have already
12278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# been seen.  Valid values are:
12288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		#    NULL string -  no events seen yet
12298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		#    1 - PPU CYCLES or PPU Event seen
12308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		#    2 - SPU CYCLES seen
12318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		#    3 - SPU EVENT seen
12328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
12338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# check if event is PPU_CYCLES
12348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if [ "$event_num" = "1" ]; then
12358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if [ "$EVNT_MSK" = "1" ] || [ "$EVNT_MSK" = "" ]; then
12368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EVNT_MSK=1
12378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			else
12388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				echo "PPU CYCLES not compatible with previously specified event"
12398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				exit 1
12408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
12418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
12428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# check if event is SPU_CYCLES
12438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		elif [ "$event_num" = "2" ]; then
12448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if [ "$EVNT_MSK" = "" ]; then
12458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EVNT_MSK=2
12468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			else
12478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				echo "SPU CYCLES not compatible with any other event"
12488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				exit 1
12498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
12508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
12518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# check if event is SPU Event profiling
12528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		elif [ "$event_num" -ge "4100" ] && [ "$event_num" -le "4163" ] ; then
12538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if [ "$EVNT_MSK" = "" ]; then
12548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EVNT_MSK=3
12558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			else
12568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				echo "SPU event profiling not compatible with any other event"
12578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				exit 1
12588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
12598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
12608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			# Check to see that the kernel supports SPU event
12618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			# profiling.  Note, if the file exits it should have
12628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			# the LSB bit set to 1 indicating SPU event profiling
12638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			# support. For now, it is sufficient to test that the
12648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			# file exists.
12658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if test ! -f /dev/oprofile/cell_support; then
12668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				echo "Kernel does not support SPU event profiling"
12678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				exit 1
12688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
12698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
12708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			# check if event is PPU Event profiling (all other
12718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			# events are PPU events)
12728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
12738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if [ "$EVNT_MSK" = "1" ] || [ "$EVNT_MSK" = "" ]; then
12748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				EVNT_MSK=1
12758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			else
12768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				echo "PPU profiling not compatible with previously specified event"
12778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				exit 1
12788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
12798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
12808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
12818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	len=`echo -n $event_num | wc -m`
12828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	num_chars_in_grpid=`expr $len - 2`
12838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	GRP_NUM_VAL=`echo | awk '{print substr("'"${event_num}"'",1,"'"${num_chars_in_grpid}"'")}'`
12848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if [ "$GRP_NUM_CK_VAL" = "" ] ; then
12858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		GRP_NUM_CK_VAL=$GRP_NUM_VAL
12868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
12878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test $GRP_NUM_CK_VAL != $GRP_NUM_VAL ; then
12888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "ERROR: The specified events are not from the same group." >&2
12898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "       Use 'opcontrol --list-events' to see event groupings." >&2
12908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			exit 1
12918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
12928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
12938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
12948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
12958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
12968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_param_setup()
12978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
12988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# different names
12998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test $BUF_SIZE != 0; then
13008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$KERNEL_SUPPORT" = "yes"; then
13018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo $BUF_SIZE >$MOUNT/buffer_size
13028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
13038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			$SYSCTL -w dev.oprofile.bufsize=$BUF_SIZE
13048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
13058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
13068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
13078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test $BUF_WATERSHED != 0; then
13088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$KERNEL_SUPPORT" = "yes"; then
13098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo $BUF_WATERSHED >$MOUNT/buffer_watershed
13108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
13118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "buffer-watershed not supported - ignored" >&2
13128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
13138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
13148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
13158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test $CPU_BUF_SIZE != 0; then
13168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$KERNEL_SUPPORT" = "yes"; then
13178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo $CPU_BUF_SIZE >$MOUNT/cpu_buffer_size
13188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
13198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "cpu-buffer-size not supported - ignored" >&2
13208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
13218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
13228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
13238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -n "$ACTIVE_DOMAINS"; then
13248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$KERNEL_SUPPORT" = "yes"; then
13258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo $ACTIVE_DOMAINS >$MOUNT/active_domains
13268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
13278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "active-domains not supported - ignored" >&2
13288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
13298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
13308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
13318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test $NOTE_SIZE != 0; then
13328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		set_param notesize $NOTE_SIZE
13338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
13348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
13358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$KERNEL_SUPPORT" = "yes" -a -f $MOUNT/backtrace_depth; then
13368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		set_param backtrace_depth $CALLGRAPH
13378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	elif test "$CALLGRAPH" != "0"; then
13388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Call-graph profiling not supported - ignored" >&2
13398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
13408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
13418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$IS_TIMER" = 1; then
13428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return
13438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
13448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
13458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# use the default setup if none set
13468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$NR_CHOSEN" = 0; then
13478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		set_event 0 $DEFAULT_EVENT
13488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		NR_CHOSEN=1
13498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		HW_CTRS=`$OPHELP --check-events $DEFAULT_EVENT --callgraph=$CALLGRAPH`
13508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Using default event: $DEFAULT_EVENT"
13518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
13528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
13538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# Necessary in this case :
13548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# opcontrol ctr0-on ctr1-on then opcontrol ctr0-on
13558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for f in $OP_COUNTERS ; do
13568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		set_ctr_param $f enabled 0
13578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		set_ctr_param $f event 0
13588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		set_ctr_param $f count 0
13598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	done
13608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
13618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# Check if driver has IBS support
13628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -d $MOUNT/ibs_fetch; then
13638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# Reset driver's IBS fetch setting
13648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		set_param ibs_fetch/enable 0
13658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
13668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	
13678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -d $MOUNT/ibs_op ; then
13688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# Reset driver's IBS op setting
13698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		set_param ibs_op/enable 0
13708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi	
13718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
13728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	verify_counters
13738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
13748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	OPROFILED_EVENTS=
13758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for f in `seq 0 $((NR_CHOSEN - 1))`; do
13768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		get_event $f
13778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$GOTEVENT" != ""; then
13788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			EVENT=`echo $GOTEVENT | awk -F: '{print $1}'`
13798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			EVENT_STR=`$OPHELP $EVENT`
13808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			EVENT_VAL=`echo $EVENT_STR | awk '{print $1}'`
13818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			COUNT=`echo $GOTEVENT | awk -F: '{print $2}'`
13828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			UNIT_MASK=`echo $GOTEVENT | awk -F: '{print $3}'`
13838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			KERNEL=`echo $GOTEVENT | awk -F: '{print $4}'`
13848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			USER=`echo $GOTEVENT | awk -F: '{print $5}'`
13858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			CTR=`echo $HW_CTRS | awk "{print \\$$((f + 1))}"`
13868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			check_event_mapping_data
13878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
13888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if test "$EVENT" = "SPU_CYCLES"; then
13898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				if test "$SEPARATE_KERNEL" = "1"; then
13908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					SEPARATE_KERNEL=0
13918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					echo "Ignoring --separate=kernel option with SPU_CYCLES"
13928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				fi
13938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				if test "$SEPARATE_LIB" = "0"; then
13948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					SEPARATE_LIB=1
13958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					echo "Forcing required option --separate=lib with SPU_CYCLES"
13968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				fi
13978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
13988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				# It is possible for a single application to be
13998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				# running on all SPUs simultaneously.  Without
14008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				# SEPARATE_CPU, the resulting sample data would
14018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				# consist of a single sample file.  If all SPUs
14028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				# were truly running the same code, the merging
14038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				# of sample data would be fine.  However, an
14048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				# application file may have multiple SPU images
14058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				# embedded within it, resulting in different
14068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				# code running on different SPUs.  Therefore,
14078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				# we force SEPARATE_CPU in order to properly
14088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				# handle this case.
14098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				if test "$SEPARATE_CPU" = "0"; then
14108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					SEPARATE_CPU=1
14118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					echo "Forcing required option --separate=cpu with SPU_CYCLES"
14128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
14138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				fi
14148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
14158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
14168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if [ "$CTR" = "ibs_fetch" -o "$CTR" = "ibs_op" ] ; then
14178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				# Handle IBS events setup
14188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				do_param_setup_ibs
14198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				continue
14208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
14218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
14228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if test "$EVENT" = "RTC_INTERRUPTS"; then
14238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				set_param rtc_value $COUNT
14248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				$SYSCTL -w dev.oprofile.rtc_value=$COUNT
14258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			else
14268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				set_ctr_param $CTR enabled 1
14278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				set_ctr_param $CTR event $EVENT_VAL
14288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				loop_count=1
14298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				for i in ${EVENT_STR}; do
14308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					#Skip first argument of EVENT_STR (event val) since we've already
14318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					#processed that value.
14328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					if test "$loop_count" -gt 1; then
14338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd						KEY=`echo $i | awk -F: '{print $1}'`
14348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd						VAL=`echo $i | awk -F: '{print $2}'`
14358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd						set_ctr_param "" $KEY $VAL
14368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					fi
14378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd					loop_count=$((loop_count+1))
14388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				done
14398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				set_ctr_param $CTR count $COUNT
14408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				set_ctr_param $CTR kernel $KERNEL
14418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				set_ctr_param $CTR user $USER
14428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				set_ctr_param $CTR unit_mask $UNIT_MASK
14438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
14448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			OPROFILED_EVENTS=${OPROFILED_EVENTS}$EVENT:$EVENT_VAL:
14458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			OPROFILED_EVENTS=${OPROFILED_EVENTS}$CTR:$COUNT:$UNIT_MASK:
14468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			OPROFILED_EVENTS=${OPROFILED_EVENTS}$KERNEL:$USER,
14478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
14488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	done
14498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
14508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# For PPC64 architectures we need to set the enable_kernel and
14518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# enable_user flags for enabling/disabling user/kernel domain
14528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# profiling. All per-counter user/kernel flags must match.
14538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# This condition is checked previously by check_event_mapping_data.
14548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# This statement uses the last event's user/kernel flags to set
14558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# /dev/oprofile/enable_kernel and /dev/oprofile/enable_user.
14568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	is_non_cell_ppc64_variant $CPUTYPE
14578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test $? -ne 0 ; then
14588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		set_param "enable_kernel" $KERNEL
14598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		set_param "enable_user" $USER
14608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
14618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
14628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
14638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
14648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
14658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_start_daemon()
14668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
14678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
14688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -f "$LOCK_FILE"; then
14698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		kill -0 `cat $LOCK_FILE` 2>/dev/null
14708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$?" -eq 0; then
14718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return;
14728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
14738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "Detected stale lock file. Removing." >&2
14748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			rm -f "$LOCK_FILE"
14758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
14768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
14778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
14788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	do_setup
14798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	check_valid_args
14808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	get_image_range "linux"
14818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	get_image_range "xen"
14828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	do_param_setup
14838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
14848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	OPD_ARGS=" \
14858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		--session-dir=$SESSION_DIR \
14868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		--separate-lib=$SEPARATE_LIB \
14878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		--separate-kernel=$SEPARATE_KERNEL \
14888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		--separate-thread=$SEPARATE_THREAD \
14898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		--separate-cpu=$SEPARATE_CPU"
14908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
14918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$IS_TIMER" = 1; then
14928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		OPD_ARGS="$OPD_ARGS --events="
14938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
14948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if ! test -z "$OPROFILED_EVENTS"; then
14958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			OPD_ARGS="$OPD_ARGS --events=$OPROFILED_EVENTS"
14968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
14978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
14988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
14998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$VMLINUX" = "none"; then
15008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		OPD_ARGS="$OPD_ARGS --no-vmlinux"
15018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
15028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		OPD_ARGS="$OPD_ARGS --vmlinux=$VMLINUX --kernel-range=$KERNEL_RANGE"
15038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
15048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
15058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if ! test "$XENIMAGE" = "none"; then
15068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		OPD_ARGS="$OPD_ARGS --xen-image=$XENIMAGE --xen-range=$XEN_RANGE"
15078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
15088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
15098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if ! test -z "$IMAGE_FILTER"; then
15108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		OPD_ARGS="$OPD_ARGS --image=$IMAGE_FILTER"
15118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
15128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
15138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -n "$VERBOSE"; then
15148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		OPD_ARGS="$OPD_ARGS --verbose=$VERBOSE"
15158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
15168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
15178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	help_start_daemon_with_ibs
15188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
15198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	vecho "executing oprofiled $OPD_ARGS"
15208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
15218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	$OPROFILED $OPD_ARGS
15228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
15238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	COUNT=0
15248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	while ! test -f "$SESSION_DIR/lock"
15258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	do
15268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		sleep 1
15278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		COUNT=`expr $COUNT + 1`
15288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$COUNT" -eq 10; then
15298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "Couldn't start oprofiled." >&2
15308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "Check the log file \"$LOG_FILE\" and kernel syslog" >&2
15318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			exit 1
15328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
15338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	done
15348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
15358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	echo "Daemon started."
15368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
15378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
15388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_start()
15398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
15408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	prep_jitdump;
15418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$KERNEL_SUPPORT" = "yes"; then
15428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo 1 >$MOUNT/enable
15438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
15448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	kill -USR1 `cat $LOCK_FILE` 2>/dev/null
15458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	echo "Profiler running."
15468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
15478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
15488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
15498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# print status
15508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_status()
15518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
15528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	OPROFILED_PID=`cat $SESSION_DIR/lock 2>/dev/null`
15538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -n "$OPROFILED_PID" -a -d "/proc/$OPROFILED_PID"; then
15548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Daemon running: pid $OPROFILED_PID"
15558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
15568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Daemon not running"
15578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
15588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
15598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$NR_CHOSEN" != "0"; then
15608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		for f in `seq 0 $((NR_CHOSEN - 1))`; do
15618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			get_event $f
15628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "Event $f: $GOTEVENT"
15638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		done
15648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
15658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
15668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	SEPARATE=""
15678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$SEPARATE_LIB" = "1"; then
15688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		SEPARATE="library";
15698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
15708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$SEPARATE_KERNEL" = "1"; then
15718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		SEPARATE="$SEPARATE kernel";
15728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
15738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$SEPARATE_THREAD" = "1"; then
15748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		SEPARATE="$SEPARATE thread";
15758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
15768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$SEPARATE_CPU" = "1"; then
15778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		SEPARATE="$SEPARATE cpu";
15788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
15798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
15808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -z "$SEPARATE"; then
15818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		SEPARATE=none
15828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
15838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
15848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	echo "Separate options: $SEPARATE"
15858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	echo "vmlinux file: $VMLINUX"
15868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
15878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -z "$IMAGE_FILTER"; then
15888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Image filter: none"
15898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
15908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Image filter: $IMAGE_FILTER"
15918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
15928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
15938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	echo "Call-graph depth: $CALLGRAPH"
15948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$BUF_SIZE" != "0"; then
15958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Buffer size: $BUF_SIZE"
15968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
15978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$KERNEL_SUPPORT" != "yes"; then
15988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$NOTE_SIZE" != "0"; then
15998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "Note buffer size: $NOTE_SIZE"
16008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
16018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
16028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$BUF_WATERSHED" != "0"; then
16038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "CPU buffer watershed: $BUF_WATERSHED"
16048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
16058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$CPU_BUF_SIZE" != "0"; then
16068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "CPU buffer size: $CPU_BUF_SIZE"
16078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
16088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
16098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
16108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	exit 0
16118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
16128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
16138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
16148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# do_dump_data
16158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# returns 0 if successful
16168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# returns 1 if the daemon is unable to dump data
16178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# exit 1 if we need to be root to dump
16188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_dump_data()
16198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
16208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# make sure that the daemon is not dead and gone
16218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -e "$SESSION_DIR/lock"; then
16228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		OPROFILED_PID=`cat $SESSION_DIR/lock`
16238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test ! -d "/proc/$OPROFILED_PID"; then
16248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "dump fail: daemon died during last run ?" >&2
16258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return 1;
16268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
16278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
16288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return 1;
16298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
16308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
16318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$KERNEL_SUPPORT" = "yes"; then
16328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if ! test -w $MOUNT/dump; then
16338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if test `id -u` != "0"; then
16348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				echo "You must be root to dump with this kernel version"
16358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				exit 1
16368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
16378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
16388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# trigger oprofiled to execute opjitconv
16397a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		echo do_jitconv >> $SESSION_DIR/opd_pipe
16408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		rm -f "$SESSION_DIR/complete_dump"
16418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo 1 > $MOUNT/dump
16428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# loop until the complete_dump file is created to
16438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# signal that the dump has been completed
16448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		while [ \( ! -e "$SESSION_DIR/complete_dump" \) ]
16458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		do
16468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if test ! -d "/proc/$OPROFILED_PID"; then
16478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				echo "dump fail: either daemon died during last run or dies during dump" >&2
16488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				return 1
16498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
16508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			sleep 1;
16518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		done
16528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	else
16538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo 1 > $MOUNT/dump
16548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# HACK !
16558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		sleep 2
16568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
16577a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown	cp -r /dev/oprofile/stats "$SAMPLES_DIR/current"
16587a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown
16598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return 0;
16608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
16618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
16628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
16638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# do_dump
16648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# returns 0 if successful
16658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# exits if unsuccessful
16668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_dump()
16678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
16688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	do_dump_data
16698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test $? -ne 0 -a "$ONLY_DUMP" = "yes"; then
16708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Unable to complete dump of oprofile data: is the oprofile daemon running?" >& 2
16718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 1;
16728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
16738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return 0;
16748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
16758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
16768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# tell daemon to re-open the sample files
16778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddhup_daemon()
16788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
16798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -f "$LOCK_FILE"; then
16808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo -n "Signalling daemon... "
16818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		kill -HUP `cat $LOCK_FILE`
16828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "done"
16838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
16848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
16858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
16868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
16878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# move all the sample files to a sample directory
16888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_save_session()
16898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
16908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	SAVE_DIR="${SAMPLES_DIR}/${SAVE_NAME}"
16918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
16928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -e "$SAVE_DIR"; then
16938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "session $SAVE_DIR already exists" >&2
16948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 1
16958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
16968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
16978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if ! test -e $CURRENT_SAMPLES_DIR; then
16988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "$CURRENT_SAMPLES_DIR doesn't exist: nothing to save" >&2
16998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 0
17008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
17018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# FIXME: I don't think it's worth checking for empty current directory
17038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mv $CURRENT_SAMPLES_DIR $SAVE_DIR
17058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$?" != "0"; then
17068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Couldn't move $CURRENT_SAMPLES_DIR to $SAVE_DIR" >&2
17078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 1
17088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
17098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	hup_daemon
17118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
17128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# remove all the sample files
17158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_reset()
17168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
17178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -z "$SAMPLES_DIR"; then
17188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "opcontrol:do_reset() SAMPLES_DIR is empty!"
17198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 1;
17208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
17218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# daemon use {kern} and {root} subdir, it's not a typo to not use ${}
17238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	move_and_remove $SAMPLES_DIR/current/{kern}
17248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	move_and_remove $SAMPLES_DIR/current/{root}
17258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	move_and_remove $SAMPLES_DIR/current/stats
17268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# clear temp directory for jitted code
17288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	prep_jitdump;
17298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	hup_daemon
17318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
17328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_deinit()
17358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
17368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# unmount /dev/oprofile if it is mounted
17378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	OPROF_FS=`grep /dev/oprofile /etc/mtab`
17388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -n "$OPROF_FS"; then
17398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		umount /dev/oprofile
17408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
17418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# unload the oprofile module if it is around
17428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	OPROF_MOD=`lsmod | grep oprofile`
17438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -n "$OPROF_MOD"; then
17448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Unloading oprofile module" >& 2
17458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		rmmod oprofile
17468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
17478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
17488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# The function that calls the appropriate operations
17518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_operations()
17528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
17538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# INIT always done by load_module to get access to cputype
17548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# thus INIT is a noop
17558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$STATUS" = "yes"; then
17578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		do_status
17588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
17598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$SETUP" = "yes"; then
17618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		check_valid_args
17628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		do_save_setup
17638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
17648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$START_DAEMON" = "yes"; then
17668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		do_start_daemon
17678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
17688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$START" = "yes"; then
17708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		do_start_daemon
17718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		do_start
17728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
17738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$DUMP" = "yes"; then
17758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		do_dump
17768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
17778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$SAVE_SESSION" = "yes"; then
17798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		do_save_session
17808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
17818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$STOP" = "yes"; then
17838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		do_stop
17848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
17858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$KILL_DAEMON" = "yes"; then
17878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		do_kill_daemon
17888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
17898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$RESET" = "yes"; then
17918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		do_reset
17928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
17938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$DEINIT" = "yes"; then
17958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		do_deinit
17968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
17978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
17988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
17998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# early check for --version, --help and --session-dir
18008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddcheck_options_early()
18018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
18028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
18038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	OPHELP="$OPDIR/ophelp"
18048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
18058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for i in $@; do
18068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# added to handle arg=val parameters
18078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		arg=`printf %s $i | awk -F= '{print $1}'`
18088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		val=`printf %s $i | awk -F= '{print $2}'`
18098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		case "$arg" in
18108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			-\?|--help)
18118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				do_help
18128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				exit 0
18138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
18148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
18158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			-v|--version)
18168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				echo -n "`basename $0`: "
18178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				$OPHELP --version | cut -d' ' -f2-
18188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				exit 0
18198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
18208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			--session-dir)
18218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				error_if_empty $arg $val
18228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				SESSION_DIR="$val"
18238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				DO_SETUP=yes
18248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				# do not exit early
18258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				;;
18268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
18278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		esac
18288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	done
18298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
18308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
18318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
18328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# determine which module is loaded
18338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddcheck_version()
18348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
18358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	OPROFILE_AVAILABLE=no
18368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	grep oprofilefs /etc/mtab >/dev/null
18378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$?" -eq 0; then
18388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# need to have oprofilefs mounted for this to work on 2.6
18398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		KERNEL_SUPPORT=yes
18408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		OPROFILE_AVAILABLE=yes
18418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return
18428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
18438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# need to have /proc/oprof available for this to work on 2.4
18448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	grep oprof /proc/devices >/dev/null
18458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$?" -eq 0; then
18468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		KERNEL_SUPPORT=no
18478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		OPROFILE_AVAILABLE=yes
18488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return
18498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
18508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
18518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
18528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# error out if the module is not loaded
18538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddcheck_oprofile_available()
18548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
18558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$OPROFILE_AVAILABLE" != "yes"; then
18568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Kernel support not available, missing opcontrol --init as root ?"
18578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 1
18588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
18598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
18608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
18618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
18628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddtry_reset_sample_file()
18638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
18648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# special case to avoid loading the module, it works only if the
18658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# daemon is not running because --reset imply --dump. Rather to check
18668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# if the daemon is running we check if the module is loaded because
18678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# we are only trying to avoid its load, if the check fails we fallback
18688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# to the normal dump / reset sequence.
18698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test -z "$2" -a "$1" = "--reset"; then
18708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		check_version
18718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$OPROFILE_AVAILABLE" != "yes"; then
18728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			do_init_daemon_vars
18738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			do_reset
18748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			exit 0
18758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
18768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
18778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
18788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
18798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#
18808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# Begin IBS Specific Functions
18818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#
18828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddverify_ibs()
18838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
18848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	IBS_EVENT=`echo $1| awk -F: '{print $1}'`
18858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	IBS_COUNT=`echo $1 | awk -F: '{print $2}'`
18868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	IBS_MASK=`echo $1 | awk -F: '{print $3}'`
18878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	
18888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	IBS_TYPE=`$OPHELP --check-events $1`
18898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$?" != "0" ; then
18908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 1
18918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
18928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			
18938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if [ "$IBS_TYPE" = "ibs_fetch " ] ; then
18948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# Check IBS_COUNT consistency
18958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$IBS_FETCH_COUNT" = "0" ; then 
18968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			IBS_FETCH_COUNT=$IBS_COUNT
18978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			IBS_FETCH_MASK=$IBS_MASK
18988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		elif test "$IBS_FETCH_COUNT" != "$IBS_COUNT" ; then
18997a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			echo "ERROR: All IBS Fetch must have the same count."
19008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			exit 1
19018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
19028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
19038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# Check IBS_MASK consistency
19048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$IBS_FETCH_MASK" != "$IBS_MASK" ; then
19057a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			echo "ERROR: All IBS Fetch must have the same unitmask."
19067a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			exit 1
19077a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		fi
19087a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown
19097a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		# Check IBS_FETCH_COUNT within range
19107a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		if test "$IBS_FETCH_COUNT" -gt 1048575 ; then 
19117a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			echo "ERROR: IBS Fetch count is too large."
19127a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			echo "       The maximum IBS-fetch count is 1048575."
19138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			exit 1
19148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
19158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
19168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	elif [ "$IBS_TYPE" = "ibs_op " ] ; then
19178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# Check IBS_COUNT consistency
19188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$IBS_OP_COUNT" = "0" ; then 
19198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			IBS_OP_COUNT=$IBS_COUNT
19208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			IBS_OP_MASK=$IBS_MASK
19218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		elif test "$IBS_OP_COUNT" != "$IBS_COUNT" ; then
19228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "All IBS Op must have the same count."
19238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			exit 1
19248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
19258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
19268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		# Check IBS_MASK consistency
19278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$IBS_OP_MASK" != "$IBS_MASK" ; then
19288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			echo "All IBS Op must have the same unitmask."
19298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			exit 1
19308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
19317a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		
19327a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		# Check IBS_OP_COUNT within range
19337a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		case "$CPUTYPE" in
19347a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			x86-64/family10)
19357a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown				if test "$IBS_OP_COUNT" -gt 1048575 ; then 
19367a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown					echo "ERROR: IBS Op count is too large."
19377a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown					echo "       The maximum IBS-fetch count is 1048575."
19387a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown					exit 1
19397a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown				fi
19407a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown				;;
19417a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown
19427a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			x86-64/family12h|\
19437a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			x86-64/family14h|\
19447a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			x86-64/family15h)
19457a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown				if test "$IBS_OP_COUNT" -gt 134217727 ; then 
19467a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown					echo "ERROR: IBS Op count is too large."
19477a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown					echo "       The maximum IBS-Op count is 134217727."
19487a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown					exit 1
19497a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown				fi
19507a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown				;;
19517a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			*)
19527a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		esac
19538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
19548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
19558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return
19568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
19578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
19588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
19598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_param_setup_ibs()
19608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
19618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$KERNEL_SUPPORT" != "yes" ; then
19628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "ERROR: No kernel support for IBS profiling."
19638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 1	
19648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
19658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
19668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	# Check if driver has IBS support
19678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test ! -d $MOUNT/ibs_fetch -o ! -d $MOUNT/ibs_op ; then
19688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "ERROR: No kernel support for IBS profiling."
19698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 1	
19708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi	
19718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
19728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test `echo $EVENT |  \
19738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	awk '{ print substr($0, 1, 10)}'` = "IBS_FETCH_" ; then
19748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$COUNT" != "0"; then
19758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if [ "$IBS_FETCH_EVENTS" = "" ] ; then
19768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				IBS_FETCH_EVENTS="$EVENT"
19778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			else
19788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				IBS_FETCH_EVENTS="$IBS_FETCH_EVENTS,$EVENT"
19798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
19808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			IBS_FETCH_COUNT=$COUNT
19818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			set_param ibs_fetch/max_count $COUNT
19828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			set_param ibs_fetch/rand_enable 1
19838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			set_param ibs_fetch/enable 1
19848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
19858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			set_param ibs_fetch/enable 0
19868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
19878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
19888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	elif test `echo $EVENT |  \
19898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	awk '{ print substr($0, 1, 7)}'` = "IBS_OP_" ; then
19908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$COUNT" != "0"; then
19918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if [ "$IBS_OP_EVENTS" = "" ] ; then
19928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				IBS_OP_EVENTS="$EVENT"
19938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			else
19948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				IBS_OP_EVENTS="$IBS_OP_EVENTS,$EVENT"
19958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
19968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			IBS_OP_COUNT=$COUNT
19978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			IBS_OP_UNITMASK=$UNIT_MASK
19988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
19998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			set_param ibs_op/max_count $COUNT
20008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			set_param ibs_op/enable 1
20018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
20028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			# NOTE: We default to use dispatched_op if available. 
20038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			#       Some of the older family10 system does not have
20048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			#       dispatched_ops feature.
20057a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			#       Dispatched op is enabled by bit 0 of the unitmask
20067a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			IBS_OP_DISPATCHED_OP=$(( IBS_OP_UNITMASK & 0x1 ))
20078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if test -f $MOUNT/ibs_op/dispatched_ops ; then
20088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				set_param ibs_op/dispatched_ops $IBS_OP_DISPATCHED_OP
20097a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			else
20107a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown				if test $IBS_OP_DISPATCHED_OP -eq 1 ; then
20117a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown					echo "ERROR: IBS Op dispatched ops is not supported."
20127a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown					exit 1
20137a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown				fi
20147a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			fi
20157a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		
20167a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			# NOTE: BTA is enabled by bit 2 of the unitmask
20177a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			IBS_OP_BTA=$(( IBS_OP_UNITMASK & 0x4 ))
20187a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			if test -f $MOUNT/ibs_op/branch_target; then
20197a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown				if [ "$IBS_OP_BTA" = "4" ] ; then
20207a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown					set_param ibs_op/branch_target 1
20217a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown				else
20227a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown					set_param ibs_op/branch_target 0
20237a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown				fi
20247a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown
20257a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown				# TODO: Check if write successful
20267a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			else
20277a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown				if test $IBS_OP_BTA -eq 1 ; then
20287a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown					echo "ERROR: IBS Op Branch Target Address is not supported."
20297a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown					exit 1
20307a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown				fi
20318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			fi
20328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		else
20338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			set_param ibs_op/enable 0
20348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
20358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
20368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
20378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
20388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
20398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddhelp_start_daemon_with_ibs()
20408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
20418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if test "$IBS_FETCH_COUNT" != "0" -o "$IBS_OP_COUNT" != "0" ; then
20428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		OPD_ARGS="${OPD_ARGS} --ext-feature=ibs:"
20438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$IBS_FETCH_COUNT" != "0"; then
20448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			OPD_ARGS="${OPD_ARGS}fetch:$IBS_FETCH_EVENTS:$IBS_FETCH_COUNT:$IBS_FETCH_UNITMASK|"
20458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
20468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
20478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if test "$IBS_OP_COUNT" != "0"; then
20488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			OPD_ARGS="${OPD_ARGS}op:$IBS_OP_EVENTS:$IBS_OP_COUNT:$IBS_OP_UNITMASK"
20498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		fi
20508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	fi
20518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
20528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
20538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#
20548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# End IBS Specific Functions
20558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#
20568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
20578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# main
20588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
20598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# determine the location of opcontrol and related programs
20608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddif test -z "$OPDIR"; then
20618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	BINDIR="/usr/bin"
20628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	OPCONTROL=`$BINDIR/which $0`
20638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	OPDIR=`$BINDIR/dirname $OPCONTROL`
20648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddfi
20658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
20668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddPATH=$OPDIR:/usr/local/bin:/usr/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin
20678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
20688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddcheck_options_early $@
20698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
20708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddif test -z "$1"; then
20718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	do_help
20728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	exit 0
20738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddfi
20748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
20758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddif test `id -u` = "0"; then
20768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	try_reset_sample_file $@
20778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
20788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	load_module
20798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddfi
20808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddcheck_version
20818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
20828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# Except --reset, even the few operations allowed as non root needs the
20838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd# kernel support, if we don't error out now the error message will be obscure
20848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddcheck_oprofile_available
20858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
20868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_init
20878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddif test `id -u` != "0"; then
20888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    if test -z "$2"; then
20898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	case "$1" in
20908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    --dump|-d)
20918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		ONLY_DUMP=yes
20928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		do_dump
20938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 0;
20948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		;;
20958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    --list-events|-l)
20968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exec $OPHELP
20978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 0;
20988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		;;
20998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    *)
21008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		echo "Normal users are limited to either '--dump' or '--list-events'." >&2
21018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		exit 1
21028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		;;
21038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	esac
21048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    else
21058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	echo "Normal users are limited to either '--dump' or '--list-events'." >&2
21068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	exit 1
21078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd    fi
21088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddfi
21098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
21108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_options $@
21118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodddo_operations
2112