diff options
Diffstat (limited to 'scripts/kprobes_test/gen_code.py')
-rwxr-xr-x | scripts/kprobes_test/gen_code.py | 80 |
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) |