aboutsummaryrefslogtreecommitdiff
path: root/scripts/crosstap
blob: 39739bba3a2c9ce0bbd5b968ffa557762470d443 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#!/bin/bash
#
# Run a systemtap script on remote target
#
# Examples (run on build host, target is 192.168.1.xxx):
#   $ source oe-init-build-env"
#   $ cd ~/my/systemtap/scripts"
#
#   $ crosstap root@192.168.1.xxx myscript.stp"
#   $ crosstap root@192.168.1.xxx myscript-with-args.stp 99 ninetynine"
#
# Copyright (c) 2012, Intel Corporation.
# All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

function usage() {
    echo "Usage: $0 <user@hostname> <sytemtap-script> [additional systemtap-script args]"
}

function setup_usage() {
    echo ""
    echo "'crosstap' requires a local sdk build of the target system"
    echo "(or a build that includes 'tools-profile') in order to build"
    echo "kernel modules that can probe the target system."
    echo ""
    echo "Practically speaking, that means you need to do the following:"
    echo "  - If you're running a pre-built image, download the release"
    echo "    and/or BSP tarballs used to build the image."
    echo "  - If you're working from git sources, just clone the metadata"
    echo "    and BSP layers needed to build the image you'll be booting."
    echo "  - Make sure you're properly set up to build a new image (see"
    echo "    the BSP README and/or the widely available basic documentation"
    echo "    that discusses how to build images)."
    echo "  - Build an -sdk version of the image e.g.:"
    echo "      $ bitbake core-image-sato-sdk"
    echo "  OR"
    echo "  - Build a non-sdk image but include the profiling tools:"
    echo "      [ edit local.conf and add 'tools-profile' to the end of"
    echo "        the EXTRA_IMAGE_FEATURES variable ]"
    echo "      $ bitbake core-image-sato"
    echo ""
    echo "  [ NOTE that 'crosstap' needs to be able to ssh into the target"
    echo "    system, which isn't enabled by default in -minimal images. ]"
    echo ""
    echo "Once you've build the image on the host system, you're ready to"
    echo "boot it (or the equivalent pre-built image) and use 'crosstap'"
    echo "to probe it (you need to source the environment as usual first):"
    echo ""
    echo "    $ source oe-init-build-env"
    echo "    $ cd ~/my/systemtap/scripts"
    echo "    $ crosstap root@192.168.1.xxx myscript.stp"
    echo ""
}

function systemtap_target_arch() {
    SYSTEMTAP_TARGET_ARCH=$1
    case $SYSTEMTAP_TARGET_ARCH in
        i?86)
            SYSTEMTAP_TARGET_ARCH="i386"
            ;;
        x86?64*)
            SYSTEMTAP_TARGET_ARCH="x86_64"
            ;;
        arm*)
            SYSTEMTAP_TARGET_ARCH="arm"
            ;;
        powerpc*)
            SYSTEMTAP_TARGET_ARCH="powerpc"
            ;;
        *)
            ;;
    esac
}

if [ $# -lt 2 ]; then
	usage
	exit 1
fi

if [ -z "$BUILDDIR" ]; then
    echo "Error: Unable to find the BUILDDIR environment variable."
    echo "Did you forget to source your build system environment setup script?"
    exit 1
fi

pushd $PWD
cd $BUILDDIR
BITBAKE_VARS=`bitbake -e virtual/kernel`
popd

STAGING_BINDIR_TOOLCHAIN=$(echo "$BITBAKE_VARS" | grep ^STAGING_BINDIR_TOOLCHAIN \
  | cut -d '=' -f2 | cut -d '"' -f2)
STAGING_BINDIR_TOOLPREFIX=$(echo "$BITBAKE_VARS" | grep ^TARGET_PREFIX \
  | cut -d '=' -f2 | cut -d '"' -f2)
TARGET_ARCH=$(echo "$BITBAKE_VARS" | grep ^TRANSLATED_TARGET_ARCH \
  | cut -d '=' -f2 | cut -d '"' -f2)
TARGET_KERNEL_BUILDDIR=$(echo "$BITBAKE_VARS" | grep ^B= \
  | cut -d '=' -f2 | cut -d '"' -f2)

# Build and populate the recipe-sysroot-native with systemtap-native
pushd $PWD
cd $BUILDDIR
BITBAKE_VARS=`bitbake -e systemtap-native`
popd
SYSTEMTAP_HOST_INSTALLDIR=$(echo "$BITBAKE_VARS" | grep ^STAGING_DIR_NATIVE \
  | cut -d '=' -f2 | cut -d '"' -f2)

systemtap_target_arch "$TARGET_ARCH"

if [ ! -d $TARGET_KERNEL_BUILDDIR ] ||
   [ ! -f $TARGET_KERNEL_BUILDDIR/vmlinux ]; then
    echo -e "\nError: No target kernel build found."
    echo -e "Did you forget to create a local build of your image?"
    setup_usage
    exit 1
fi

if [ ! -f $SYSTEMTAP_HOST_INSTALLDIR/usr/bin/stap ]; then
    echo -e "\nError: Native (host) systemtap not found."
    echo -e "Did you accidentally build a local non-sdk image? (or forget to"
    echo -e "add 'tools-profile' to EXTRA_IMAGE_FEATURES in your local.conf)?"
    echo -e "You can also: bitbake -c addto_recipe_sysroot systemtap-native"
    setup_usage
    exit 1
fi

target_user_hostname="$1"
full_script_name="$2"
script_name=$(basename "$2")
script_base=${script_name%.*}
shift 2

${SYSTEMTAP_HOST_INSTALLDIR}/usr/bin/stap \
  -a ${SYSTEMTAP_TARGET_ARCH} \
  -B CROSS_COMPILE="${STAGING_BINDIR_TOOLCHAIN}/${STAGING_BINDIR_TOOLPREFIX}" \
  -r ${TARGET_KERNEL_BUILDDIR} \
  -I ${SYSTEMTAP_HOST_INSTALLDIR}/usr/share/systemtap/tapset \
  -R ${SYSTEMTAP_HOST_INSTALLDIR}/usr/share/systemtap/runtime \
  --remote=$target_user_hostname \
  -m $script_base \
   $full_script_name "$@"

exit 0