summaryrefslogtreecommitdiffstats
path: root/scripts/kprobes_test/gen_code.py
diff options
context:
space:
mode:
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)