blob: 39739bba3a2c9ce0bbd5b968ffa557762470d443 [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)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500107TARGET_ARCH=$(echo "$BITBAKE_VARS" | grep ^TRANSLATED_TARGET_ARCH \
108 | cut -d '=' -f2 | cut -d '"' -f2)
109TARGET_KERNEL_BUILDDIR=$(echo "$BITBAKE_VARS" | grep ^B= \
110 | cut -d '=' -f2 | cut -d '"' -f2)
111
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500112# Build and populate the recipe-sysroot-native with systemtap-native
113pushd $PWD
114cd $BUILDDIR
115BITBAKE_VARS=`bitbake -e systemtap-native`
116popd
117SYSTEMTAP_HOST_INSTALLDIR=$(echo "$BITBAKE_VARS" | grep ^STAGING_DIR_NATIVE \
118 | cut -d '=' -f2 | cut -d '"' -f2)
119
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500120systemtap_target_arch "$TARGET_ARCH"
121
122if [ ! -d $TARGET_KERNEL_BUILDDIR ] ||
123 [ ! -f $TARGET_KERNEL_BUILDDIR/vmlinux ]; then
124 echo -e "\nError: No target kernel build found."
125 echo -e "Did you forget to create a local build of your image?"
126 setup_usage
127 exit 1
128fi
129
130if [ ! -f $SYSTEMTAP_HOST_INSTALLDIR/usr/bin/stap ]; then
131 echo -e "\nError: Native (host) systemtap not found."
132 echo -e "Did you accidentally build a local non-sdk image? (or forget to"
133 echo -e "add 'tools-profile' to EXTRA_IMAGE_FEATURES in your local.conf)?"
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500134 echo -e "You can also: bitbake -c addto_recipe_sysroot systemtap-native"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500135 setup_usage
136 exit 1
137fi
138
139target_user_hostname="$1"
140full_script_name="$2"
141script_name=$(basename "$2")
142script_base=${script_name%.*}
143shift 2
144
145${SYSTEMTAP_HOST_INSTALLDIR}/usr/bin/stap \
146 -a ${SYSTEMTAP_TARGET_ARCH} \
147 -B CROSS_COMPILE="${STAGING_BINDIR_TOOLCHAIN}/${STAGING_BINDIR_TOOLPREFIX}" \
148 -r ${TARGET_KERNEL_BUILDDIR} \
149 -I ${SYSTEMTAP_HOST_INSTALLDIR}/usr/share/systemtap/tapset \
150 -R ${SYSTEMTAP_HOST_INSTALLDIR}/usr/share/systemtap/runtime \
151 --remote=$target_user_hostname \
152 -m $script_base \
153 $full_script_name "$@"
154
155exit 0