blob: 58317cf91cc07e162b1ac37aea1ef48542d6f830 [file] [log] [blame]
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001#!/bin/bash
2#
3# Run a systemtap script on remote target
4#
5# Examples (run on build host, target is 192.168.1.xxx):
6# $ source oe-init-build-env"
7# $ cd ~/my/systemtap/scripts"
8#
9# $ crosstap root@192.168.1.xxx myscript.stp"
10# $ crosstap root@192.168.1.xxx myscript-with-args.stp 99 ninetynine"
11#
12# Copyright (c) 2012, Intel Corporation.
13# All rights reserved.
14#
15# This program is free software; you can redistribute it and/or modify
16# it under the terms of the GNU General Public License version 2 as
17# published by the Free Software Foundation.
18#
19# This program is distributed in the hope that it will be useful,
20# but WITHOUT ANY WARRANTY; without even the implied warranty of
21# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
22# See the GNU General Public License for more details.
23#
24# You should have received a copy of the GNU General Public License
25# along with this program; if not, write to the Free Software
26# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27
28function usage() {
29 echo "Usage: $0 <user@hostname> <sytemtap-script> [additional systemtap-script args]"
30}
31
32function setup_usage() {
33 echo ""
34 echo "'crosstap' requires a local sdk build of the target system"
35 echo "(or a build that includes 'tools-profile') in order to build"
36 echo "kernel modules that can probe the target system."
37 echo ""
38 echo "Practically speaking, that means you need to do the following:"
39 echo " - If you're running a pre-built image, download the release"
40 echo " and/or BSP tarballs used to build the image."
41 echo " - If you're working from git sources, just clone the metadata"
42 echo " and BSP layers needed to build the image you'll be booting."
43 echo " - Make sure you're properly set up to build a new image (see"
44 echo " the BSP README and/or the widely available basic documentation"
45 echo " that discusses how to build images)."
46 echo " - Build an -sdk version of the image e.g.:"
47 echo " $ bitbake core-image-sato-sdk"
48 echo " OR"
49 echo " - Build a non-sdk image but include the profiling tools:"
50 echo " [ edit local.conf and add 'tools-profile' to the end of"
51 echo " the EXTRA_IMAGE_FEATURES variable ]"
52 echo " $ bitbake core-image-sato"
53 echo ""
54 echo " [ NOTE that 'crosstap' needs to be able to ssh into the target"
55 echo " system, which isn't enabled by default in -minimal images. ]"
56 echo ""
57 echo "Once you've build the image on the host system, you're ready to"
58 echo "boot it (or the equivalent pre-built image) and use 'crosstap'"
59 echo "to probe it (you need to source the environment as usual first):"
60 echo ""
61 echo " $ source oe-init-build-env"
62 echo " $ cd ~/my/systemtap/scripts"
63 echo " $ crosstap root@192.168.1.xxx myscript.stp"
64 echo ""
65}
66
67function systemtap_target_arch() {
68 SYSTEMTAP_TARGET_ARCH=$1
69 case $SYSTEMTAP_TARGET_ARCH in
70 i?86)
71 SYSTEMTAP_TARGET_ARCH="i386"
72 ;;
73 x86?64*)
74 SYSTEMTAP_TARGET_ARCH="x86_64"
75 ;;
76 arm*)
77 SYSTEMTAP_TARGET_ARCH="arm"
78 ;;
79 powerpc*)
80 SYSTEMTAP_TARGET_ARCH="powerpc"
81 ;;
82 *)
83 ;;
84 esac
85}
86
87if [ $# -lt 2 ]; then
88 usage
89 exit 1
90fi
91
92if [ -z "$BUILDDIR" ]; then
93 echo "Error: Unable to find the BUILDDIR environment variable."
94 echo "Did you forget to source your build system environment setup script?"
95 exit 1
96fi
97
98pushd $PWD
99cd $BUILDDIR
100BITBAKE_VARS=`bitbake -e virtual/kernel`
101popd
102
103STAGING_BINDIR_TOOLCHAIN=$(echo "$BITBAKE_VARS" | grep ^STAGING_BINDIR_TOOLCHAIN \
104 | cut -d '=' -f2 | cut -d '"' -f2)
105STAGING_BINDIR_TOOLPREFIX=$(echo "$BITBAKE_VARS" | grep ^TARGET_PREFIX \
106 | cut -d '=' -f2 | cut -d '"' -f2)
107SYSTEMTAP_HOST_INSTALLDIR=$(echo "$BITBAKE_VARS" | grep ^STAGING_DIR_NATIVE \
108 | cut -d '=' -f2 | cut -d '"' -f2)
109TARGET_ARCH=$(echo "$BITBAKE_VARS" | grep ^TRANSLATED_TARGET_ARCH \
110 | cut -d '=' -f2 | cut -d '"' -f2)
111TARGET_KERNEL_BUILDDIR=$(echo "$BITBAKE_VARS" | grep ^B= \
112 | cut -d '=' -f2 | cut -d '"' -f2)
113
114systemtap_target_arch "$TARGET_ARCH"
115
116if [ ! -d $TARGET_KERNEL_BUILDDIR ] ||
117 [ ! -f $TARGET_KERNEL_BUILDDIR/vmlinux ]; then
118 echo -e "\nError: No target kernel build found."
119 echo -e "Did you forget to create a local build of your image?"
120 setup_usage
121 exit 1
122fi
123
124if [ ! -f $SYSTEMTAP_HOST_INSTALLDIR/usr/bin/stap ]; then
125 echo -e "\nError: Native (host) systemtap not found."
126 echo -e "Did you accidentally build a local non-sdk image? (or forget to"
127 echo -e "add 'tools-profile' to EXTRA_IMAGE_FEATURES in your local.conf)?"
128 setup_usage
129 exit 1
130fi
131
132target_user_hostname="$1"
133full_script_name="$2"
134script_name=$(basename "$2")
135script_base=${script_name%.*}
136shift 2
137
138${SYSTEMTAP_HOST_INSTALLDIR}/usr/bin/stap \
139 -a ${SYSTEMTAP_TARGET_ARCH} \
140 -B CROSS_COMPILE="${STAGING_BINDIR_TOOLCHAIN}/${STAGING_BINDIR_TOOLPREFIX}" \
141 -r ${TARGET_KERNEL_BUILDDIR} \
142 -I ${SYSTEMTAP_HOST_INSTALLDIR}/usr/share/systemtap/tapset \
143 -R ${SYSTEMTAP_HOST_INSTALLDIR}/usr/share/systemtap/runtime \
144 --remote=$target_user_hostname \
145 -m $script_base \
146 $full_script_name "$@"
147
148exit 0