summaryrefslogtreecommitdiffstats
path: root/scripts/kprobes_test/gen_code.py
diff options
context:
space:
mode:
authorMark Wielaard <mjw@redhat.com>2009-01-23 14:28:47 +0100
committerMark Wielaard <mjw@redhat.com>2009-01-23 14:28:47 +0100
commitc3bad3042df505a3470f1e20b09822a9df1d4761 (patch)
tree6842e8eaa705e406379d34cf07a85431b6d71344 /scripts/kprobes_test/gen_code.py
parent750b1f2f5c84acaf0776de5239dc81e2e95c1dec (diff)
parentf120873cb40cfc16cc94f06fd722abc927b96227 (diff)
downloadsystemtap-steved-c3bad3042df505a3470f1e20b09822a9df1d4761.tar.gz
systemtap-steved-c3bad3042df505a3470f1e20b09822a9df1d4761.tar.xz
systemtap-steved-c3bad3042df505a3470f1e20b09822a9df1d4761.zip
Merge branch 'master' into pr6866.
Diffstat (limited to 'scripts/kprobes_test/gen_code.py')
-rwxr-xr-xscripts/kprobes_test/gen_code.py80
1 files changed, 80 insertions, 0 deletions
diff --git a/scripts/kprobes_test/gen_code.py b/scripts/kprobes_test/gen_code.py
new file mode 100755
index 00000000..1361f98e
--- /dev/null
+++ b/scripts/kprobes_test/gen_code.py
@@ -0,0 +1,80 @@
+#!/usr/bin/python
+
+# Copyright (C) 2008 Red Hat Inc.
+#
+# This file is part of systemtap, and is free software. You can
+# redistribute it and/or modify it under the terms of the GNU General
+# Public License (GPL); either version 2, or (at your option) any
+# later version.
+
+import os
+import sys
+from config_opts import config_opts
+
+def gen_files(dir, subset):
+ f = open('%s/kprobe_defs.h' % dir, 'w')
+
+ # Output the array of kp_data structs
+ print >>f, "static struct kp_data kp_data[] = {"
+ i = 0
+ while i < len(subset):
+ print >>f, ("\t{ .kp={ .symbol_name=\"%s\", .pre_handler=&handler_pre, }, .use_count=ATOMIC_INIT(0) },"
+ % (subset[i]))
+ i += 1
+ print >>f, "};"
+ print >>f
+ f.close()
+
+ # Generate the Makefile
+ f = open('Makefile', 'w')
+ print >>f, """
+EXTRA_CFLAGS :=
+EXTRA_CFLAGS += -freorder-blocks
+EXTRA_CFLAGS += -Wno-unused -Werror
+obj-m := kprobe_module.o"""
+ f.close()
+
+def run_make_cmd(cmd):
+ # Before running make, fix up the environment a bit. Clean out a
+ # few variables that /lib/modules/${KVER}/build/Makefile uses.
+ os.unsetenv("ARCH")
+ os.unsetenv("KBUILD_EXTMOD")
+ os.unsetenv("CROSS_COMPILE")
+ os.unsetenv("KBUILD_IMAGE")
+ os.unsetenv("KCONFIG_CONFIG")
+ os.unsetenv("INSTALL_PATH");
+
+ print "Running", cmd
+ return os.system(cmd)
+
+def gen_module():
+ f = open(config_opts['probes_current'])
+ probes = f.readlines()
+ f.close()
+ if len(probes) == 0:
+ print >>sys.stderr, ("Error: no probe points in %s"
+ % config_opts['probes_current'])
+ return -1
+
+ # Cleanup each probe by stripping whitespace
+ i = 0
+ while i < len(probes):
+ probes[i] = probes[i].rstrip()
+ i += 1
+
+ # Generate necessary files
+ gen_files(os.getcwd(), probes)
+
+ # Try to build the module - add "V=1" at the end for more verbosity
+ os.system('rm -f ./kprobe_module.ko')
+ (sysname, nodename, release, version, machine) = os.uname()
+ cmd = ("make -C \"/lib/modules/%s/build\" M=\"%s\" modules >build.log 2>&1"
+ % (release, os.getcwd()))
+ rc = run_make_cmd(cmd)
+ if os.WEXITSTATUS(rc) != 0:
+ print >>sys.stderr, "Error: Make failed, see build.log for details"
+ return -1
+ return 0
+
+rc = gen_module()
+sys.exit(rc)