#!/bin/bash
#
# OProfile host setup script for hybrid application use.
#
# -----------------------------------------------------------------------------
# Licensed Materials - Property of IBM
# 5724-S84
# (C) Copyright IBM Corp. 2007,2007 All Rights Reserved
# US Government Users Restricted Rights - Use, duplication or
# disclosure restricted by GSA ADP Schedule Contract with
# IBM Corp.
#

if [ `uname -m` != "x86_64" ] ; then
	echo "This program must run on an Opteron node of a hybrid system."
	exit 1
fi

# Global Declarations
declare -rx opcontrol="/usr/bin/opcontrol"

export RUNID
export CELL_VM="--no-vmlinux"
export CELL_EVENT=""
export CELL_OPTIONS
export LD_LIBRARY_PATH
export ACCEL_LD_LIBRARY_PATH64
HOST_VM="--no-vmlinux"
HOST_EVENT=""

TEMP=`getopt -o lh --long listenv,help,cell-vm:,host-vm:,cell-event:,host-event:,cell-options:,host-options:,runid: -n '$SCRIPT' -- "$@"`

if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

eval set -- "$TEMP"

while true ; do
	case "$1" in
		-h|--help)
			printf "%s\n" "usage: oprofileh [options] <appname> [<appargs>]"
			printf "%s\n" "  -h,--help		print this help"
			printf "%s\n" "  -l, --listenv		Prints out trace environment variable information"
			printf "%s\n" "  --cell-vm=VM		--no-vmlinux,--vmlinux=... (prestart options)"
			printf "%s\n" "  --host-vm=VM		--no-vmlinux,--vmlinux=... (prestart options)"
			printf "%s\n" "  --cell-event=EVT	cell event, may specify option more than once"
			printf "%s\n" "  --host-event=EVT	host event, may specify option more than once"
			printf "%s\n" "  --cell-options=OPTS	options for cell opcontrol --start command"
			printf "%s\n" "  --host-options=OPTS	options for host opcontrol --start command"
			printf "%s\n" "  --runid=ID		run ID, default is a timestamp"
			exit 0 ;;
		-l|--listenv)
			export SCRIPT_DEBUG=true
			shift 1 ;;
		--cell-vm)
			CELL_VM=$2
			shift 2 ;;
		--host-vm)
			HOST_VM=$2
			shift 2 ;;
		--cell-event)
			CELL_EVENT="--event=$2 $CELL_EVENT"
			shift 2 ;;
		--host-event)
			HOST_EVENT="--event=$2 $HOST_EVENT"
			shift 2 ;;
		--cell-options)
			CELL_OPTIONS=$2
			shift 2 ;;
		--host-options)
			HOST_OPTIONS=$2
			shift 2 ;;
		--runid)
			RUNID=$2
			shift 2 ;;
		--)
			shift ; break ;;
		*) 
			echo "Internal error" ; exit 1 ;;
	esac
done
echo "Remaining arguments:"
for arg do
	echo '-->'"\`$arg'"
	PROGRAM="$PROGRAM $arg" 
done

if [ "$PROGRAM" = "" ] ;	then 
	echo "Must specify a program to run on the command line."
	exit 1
fi

if [ "$CELL_EVENT" = "" ] ; 	then CELL_EVENT="none" ; fi
if [ "$HOST_EVENT" = "" ] ; 	then
	HOST_EVENT="none" ; 
else
	if test ! -x  "$opcontrol" ;  then
	  printf "$SCRIPT:$LINENO: the command $opcontrol is not available - aborting.\n"
	  exit 192
	fi
fi
if [ "$RUNID" = "" ] ; 		then RUNID=`date +%Y%m%d%H%M%S` ; fi

# Set up the common environment variables, etc.
if [ ! "$SDK_PROTOTYPE_ROOT" ] ; then
  export SDK_PROTOTYPE_ROOT=/opt/cell/sdk/prototype
fi
if [ ! "$HYBRID_PERF_TOOLS_DIR" ] ; then
  export HYBRID_PERF_TOOLS_DIR=$SDK_PROTOTYPE_ROOT/usr/bin
fi
source $HYBRID_PERF_TOOLS_DIR/perfToolHostSetup

# Not necessary to add anything to the paths at this time.
#export LD_LIBRARY_PATH=$SDK_ROOT/usr/lib64/oprofile:$SDK_PROTOTYPE_ROOT/usr/lib64/oprofile:$LD_LIBRARY_PATH

#export ACCEL_LD_LIBRARY_PATH32=/usr/lib/oprofile:/opt/cell/sdk/prototype/usr/lib/
#export ACCEL_LD_LIBRARY_PATH64=/$SDK_ROOT/usr/lib64/oprofile:$SDK_PROTOTYPE_ROOT/usr/lib64/oprofile

# Environment variables to be made visible to the accelerator script.
DACS_START_ENV_LIST="LD_LIBRARY_PATH;CELL_VM;CELL_EVENT;RUNID;$DACS_START_ENV_LIST"
#DACS_START_ENV_LIST="$DACS_START_ENV_LIST;LD_LIBRARY_PATH;CELL_VM;CELL_EVENT;RUNID"

if [ "$CELL_OPTIONS" ] ; then
	DACS_START_ENV_LIST="$DACS_START_ENV_LIST;CELL_OPTIONS"
fi
if [ "$ACCEL_LD_LIBRARY_PATH64" ] ; then
	DACS_START_ENV_LIST="$DACS_START_ENV_LIST;ACCEL_LD_LIBRARY_PATH64"
fi

if [ "$CELL_EVENT" != "none" ] ; then
	DACS_START_PARENT="/bin/bash $HYBRID_PERF_TOOLS_DIR/oprofilea %e %a"
fi
export DACS_START_PARENT

if [ "$SCRIPT_DEBUG" ] ; then
	echo "oprofileh environment:"
	echo "PROGRAM     = $PROGRAM"
	echo "RUNID       = $RUNID"
	echo "CELL_VM     = $CELL_VM"
	echo "CELL_EVENT  = $CELL_EVENT"
	echo "CELL_OPTIONS= $CELL_OPTIONS"
	echo "HOST_VM     = $HOST_VM"
	echo "HOST_EVENT  = $HOST_EVENT"
	echo "HOST_OPTIONS= $HOST_OPTIONS"
        echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
	echo "DACS_START_ENV_LIST = $DACS_START_ENV_LIST"
	echo "DACS_START_PARENT = $DACS_START_PARENT"
fi

if [ "$HOST_EVENT" != "none" ] ; then
        HOST_DATA_DIR=$PERF_DATA_DIR/oprofile/$RUNID/x86_64/`hostname`
	echo "OProfile x86_64 data directory: $HOST_DATA_DIR"
	sudo opcontrol --init
#	sudo opcontrol --reset --session-dir=$HOST_DATA_DIR
	sudo opcontrol --reset
	sudo opcontrol $HOST_VM $HOST_EVENT
#	sudo opcontrol $HOST_VM $HOST_EVENT --session-dir=$HOST_DATA_DIR
	sudo opcontrol --start $HOST_OPTIONS
fi

echo "Starting application (in oprofileh)."
$PROGRAM
echo "Returned from application (in oprofileh)."

if [ "$HOST_EVENT" != "none" ] ; then
	sudo opcontrol --stop
#	sudo opcontrol --stop --session-dir=$HOST_DATA_DIR
	sudo opcontrol --dump
	sudo opcontrol --deinit
fi

echo "$result"
exit $result

