149 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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)
 | |
| SYSTEMTAP_HOST_INSTALLDIR=$(echo "$BITBAKE_VARS" | grep ^STAGING_DIR_NATIVE \
 | |
|   | 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)
 | |
| 
 | |
| 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)?"
 | |
|     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
 | 
