summaryrefslogtreecommitdiffstats
path: root/tapset/conversions.stp
diff options
context:
space:
mode:
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;
+ }
+%}