summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStan Cox <scox@redhat.com>2009-06-26 16:34:00 -0400
committerStan Cox <scox@redhat.com>2009-06-26 16:34:00 -0400
commit2fd285e65eb8e1f77cb5b70a1f81377896ad6b2c (patch)
tree6c5c5e3328b671c71d484d5b1a8742fa77c456f3
parent0c3bfb1ef9f5415ec92afac94a72db5a827fa634 (diff)
downloadsystemtap-steved-2fd285e65eb8e1f77cb5b70a1f81377896ad6b2c.tar.gz
systemtap-steved-2fd285e65eb8e1f77cb5b70a1f81377896ad6b2c.tar.xz
systemtap-steved-2fd285e65eb8e1f77cb5b70a1f81377896ad6b2c.zip
An i386 kprobe needs regparm(0) to access args.
* tapsets.cxx (probe_table::convert_probe): Add regparm for kprobe.
-rw-r--r--tapsets.cxx17
1 files changed, 17 insertions, 0 deletions
diff --git a/tapsets.cxx b/tapsets.cxx
index 9d8dd51e..765c2cd3 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -887,6 +887,23 @@ dwarf_builder::probe_table::convert_probe (probe *new_base)
be->right = new literal_string(mark_name);
is->condition = be;
b->statements.insert(b->statements.begin(),(statement*) is);
+
+#ifdef __i386__
+ if (probe_type == kprobe_type)
+ {
+ functioncall *rp = new functioncall;
+ rp->tok = new_base->body->tok;
+ rp->function = "regparm";
+ rp->tok = new_base->body->tok;
+ literal_number* littid = new literal_number(0);
+ littid->tok = new_base->body->tok;
+ rp->args.push_back(littid);
+ expr_statement* es = new expr_statement;
+ es->tok = new_base->body->tok;
+ es->value = rp;
+ b->statements.insert(b->statements.begin(),(statement*) es);
+ }
+#endif
}