summaryrefslogtreecommitdiffstats
path: root/tapset/conversions.stp
diff options
context:
space:
mode:
authorfche <fche>2005-09-03 17:24:49 +0000
committerfche <fche>2005-09-03 17:24:49 +0000
commitf9eba66ef3ec406f883caebed75cdeaa042f6b33 (patch)
treeee5996857ff254f209742df2ad9ed54e50b4e157 /tapset/conversions.stp
parent6a505121fc997e6f21d26f8c8656f99e58faaaab (diff)
downloadsystemtap-steved-f9eba66ef3ec406f883caebed75cdeaa042f6b33.tar.gz
systemtap-steved-f9eba66ef3ec406f883caebed75cdeaa042f6b33.tar.xz
systemtap-steved-f9eba66ef3ec406f883caebed75cdeaa042f6b33.zip
2005-09-03 Frank Ch. Eigler <fche@elastic.org>
PR 1187 prime * tapset.cxx (literal_stmt_for_local): Don't automgaically copy target char*'s to systemtap strings. * tapset/conversions.stp (user_string, kernel_string): New functions. * stapfuncs.5.in: Document new functions.
Diffstat (limited to 'tapset/conversions.stp')
-rw-r--r--tapset/conversions.stp28
1 files changed, 28 insertions, 0 deletions
diff --git a/tapset/conversions.stp b/tapset/conversions.stp
index 901f26a4..50dbfeb0 100644
--- a/tapset/conversions.stp
+++ b/tapset/conversions.stp
@@ -6,3 +6,31 @@ function string:string (num:long) %{
sprintf (THIS->__retvalue, "%lld", (long long) THIS->num);
%}
+
+function kernel_string:string (addr:long) %{
+ char *destination = THIS->__retvalue;
+ deref_string (destination, THIS->addr, MAXSTRINGLEN);
+ goto success;
+deref_fault: /* branched to from deref() */
+ {
+ static char errmsg[40];
+ snprintf (errmsg, 40, "kernel string copy fault at 0x%p",
+ (void *) (uintptr_t) THIS->addr);
+ CONTEXT->last_error = errmsg;
+ }
+success: ;
+%}
+
+# NB: accessing user space is hazardous from certain kernel contexts.
+function user_string:string (addr:long) %{
+ long rc = _stp_strncpy_from_user (THIS->__retvalue,
+ (const char __user*) (uintptr_t) THIS->addr,
+ MAXSTRINGLEN);
+ if (rc < 0)
+ {
+ static char errmsg[40];
+ snprintf (errmsg, 40, "user string copy fault at 0x%p",
+ (void *) (uintptr_t) THIS->addr);
+ CONTEXT->last_error = errmsg;
+ }
+%}