#!/bin/bash
#
# SPDX-License-Identifier: Apache-2.0
# Copyright (C) 2018 IBM Corp.

set -eou pipefail

if [ $# -lt 2 ]
then
    echo Usage: $0 [USER@]HOST EVENTSET [EVENTSET...]
    echo
    echo Valid EVENTSETs: fsi, occ, sbefifo, timer, sched
    exit 1
fi

TRACE_TARGET="$1"
shift 1
TRACE_EVENT_SET="$@"

TRACESCRIPT_PATH="$(mktemp obmc-fsi-trace.XXXXXX)"
TRACESCRIPT="$(basename "${TRACESCRIPT_PATH}")"

function on_exit() {
    rm -f "${TRACESCRIPT_PATH}"
}

trap on_exit EXIT

cat > "${TRACESCRIPT_PATH}" <<-EOF
set -eou pipefail

set -x

# Look Ma! Associative arrays in ash!
EVENT_fsi="fsi fsi_master_gpio"
EVENT_occ="occ hwmon_occ"
EVENT_sbefifo="sbefifo"
EVENT_timer="timer/timer_start timer/timer_cancel timer/timer_expire_entry timer/timer_expire_exit"
EVENT_sched="sched/sched_switch sched/sched_wakeup sched/sched_wakeup_new sched/sched_waking"

on_exit() {
for elem in ${TRACE_EVENT_SET}
do
	# Abuse eval(1) to extract the list of tracepoints to enable from our
	# fake associative arrays
	eval 'trace=\\\${EVENT_\${elem}}'
	for event in \$(eval echo \${trace})
	do
		echo 0 > /sys/kernel/debug/tracing/events/\${event}/enable
	done
done
	echo 0 > /sys/kernel/debug/tracing/tracing_on
}

trap on_exit EXIT

cat /sys/kernel/debug/tracing/per_cpu/cpu0/trace_pipe &
CAT_PID=\$!

for elem in ${TRACE_EVENT_SET}
do
	# See comment in the disable path
	eval 'trace=\\\${EVENT_\${elem}}'
	for event in \$(eval echo \${trace})
	do
		echo 1 > /sys/kernel/debug/tracing/events/\${event}/enable
	done
done
echo 1 > /sys/kernel/debug/tracing/tracing_on

read

kill \${CAT_PID}
EOF

scp "${TRACESCRIPT_PATH}" "${TRACE_TARGET}":/tmp/"${TRACESCRIPT}"
ssh "${TRACE_TARGET}" "/bin/sh -x /tmp/'${TRACESCRIPT}'"
