summaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
authorFrank Ch. Eigler <fche@elastic.org>2009-12-20 12:16:33 -0500
committerFrank Ch. Eigler <fche@elastic.org>2009-12-20 12:17:07 -0500
commitbe00414012df13c2eddf98909b3cdfe21c2a94d8 (patch)
treec9151e2dcd0a9ed880d3ce1c007b5a0517a0bc2b /runtime
parentb5a0dd413a3e4f521df7febca6b88f0ec6b9ff36 (diff)
downloadsystemtap-steved-be00414012df13c2eddf98909b3cdfe21c2a94d8.tar.gz
systemtap-steved-be00414012df13c2eddf98909b3cdfe21c2a94d8.tar.xz
systemtap-steved-be00414012df13c2eddf98909b3cdfe21c2a94d8.zip
PR10601 cont'd, RHEL5 backward compatibility with more runtime/autoconf*
Diffstat (limited to 'runtime')
-rw-r--r--runtime/autoconf-regset.c7
-rw-r--r--runtime/autoconf-utrace-regset.c8
-rw-r--r--runtime/loc2c-runtime.h25
3 files changed, 35 insertions, 5 deletions
diff --git a/runtime/autoconf-regset.c b/runtime/autoconf-regset.c
new file mode 100644
index 00000000..9d994b03
--- /dev/null
+++ b/runtime/autoconf-regset.c
@@ -0,0 +1,7 @@
+#include <linux/regset.h>
+
+int foobar(int n) {
+ const struct user_regset_view *rsv = task_user_regset_view(current);
+ const struct user_regset *rs = & rsv->regsets[0];
+ return rsv->n + n + (rs->get)(current, rs, 0, 0, NULL, NULL);
+}
diff --git a/runtime/autoconf-utrace-regset.c b/runtime/autoconf-utrace-regset.c
new file mode 100644
index 00000000..1728f239
--- /dev/null
+++ b/runtime/autoconf-utrace-regset.c
@@ -0,0 +1,8 @@
+#include <linux/tracehook.h>
+
+/* old rhel5 utrace regset */
+int foobar(int n) {
+ const struct utrace_regset_view *rsv = utrace_native_view(current);
+ const struct utrace_regset *rs = & rsv->regsets[0];
+ return rsv->n + n + (rs->get)(current, rs, 0, 0, NULL, NULL);
+}
diff --git a/runtime/loc2c-runtime.h b/runtime/loc2c-runtime.h
index d23df7f2..c89d5b2c 100644
--- a/runtime/loc2c-runtime.h
+++ b/runtime/loc2c-runtime.h
@@ -82,9 +82,20 @@
})
#endif
-
-/* PR 10601: user-space (user_regset) register access. Needs porting to each architecture. */
+/* PR 10601: user-space (user_regset) register access. */
+#if defined(STAPCONF_REGSET)
#include <linux/regset.h>
+#endif
+
+#if defined(STAPCONF_UTRACE_REGSET)
+#include <linux/tracehook.h>
+/* adapt new names to old decls */
+#define user_regset_view utrace_regset_view
+#define user_regset utrace_regset
+#define task_user_regset_view utrace_native_view
+#endif
+
+#if defined(STAPCONF_REGSET) || defined(STAPCONF_UTRACE_REGSET)
struct usr_regset_lut {
char *name;
@@ -122,7 +133,7 @@ static const struct usr_regset_lut url_x86_64[] = {
{ "r14", NT_PRSTATUS, 1*8 },
{ "r15", NT_PRSTATUS, 0*8 },
};
-
+/* XXX: insert other architectures here. */
static u32 ursl_fetch32 (const struct usr_regset_lut* lut, unsigned lutsize, int e_machine, unsigned regno)
@@ -279,8 +290,6 @@ static void ursl_store64 (const struct usr_regset_lut* lut,unsigned lutsize, in
#else
-#error "no can do"
-
/* Some other architecture; downgrade to kernel register access. */
#define u_fetch_register(regno) k_fetch_register(regno)
#define u_store_register(regno,value) k_store_register(regno,value)
@@ -288,6 +297,12 @@ static void ursl_store64 (const struct usr_regset_lut* lut,unsigned lutsize, in
#endif
+#else /* ! STAPCONF_REGSET */
+/* Downgrade to kernel register access. */
+#define u_fetch_register(regno) k_fetch_register(regno)
+#define u_store_register(regno,value) k_store_register(regno,value)
+#endif
+
#if defined (STAPCONF_X86_UNIREGS) && defined (__i386__)