summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tapset/conversions-guru.stp18
-rw-r--r--tapset/conversions.stp20
-rw-r--r--tapset/nfs.stp12
-rwxr-xr-xtestsuite/buildok/conversions-embedded.stp3
-rwxr-xr-xtestsuite/buildok/conversions.stp2
-rwxr-xr-xtestsuite/buildok/nfs-embedded.stp1
-rwxr-xr-xtestsuite/buildok/set_kernel.stp1
7 files changed, 44 insertions, 13 deletions
diff --git a/tapset/conversions-guru.stp b/tapset/conversions-guru.stp
index f914bb31..9d662ce3 100644
--- a/tapset/conversions-guru.stp
+++ b/tapset/conversions-guru.stp
@@ -115,3 +115,21 @@ deref_fault: /* branched to from kwrite() */
CONTEXT->last_error = CONTEXT->error_buffer;
}
%}
+
+/**
+ * sfunction set_kernel_pointer - Writes a pointer value to kernel memory.
+ * @addr: The kernel address to write the pointer to.
+ * @val: The pointer which is to be written.
+ *
+ * Description: Writes the pointer value to a given kernel memory address.
+ * Reports an error when writing to the given address fails.
+ */
+function set_kernel_pointer (addr:long, val:long) %{ /* guru */
+ kwrite((void **) (intptr_t) THIS->addr, THIS->val);
+ if (0) {
+deref_fault: /* branched to from kwrite() */
+ snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
+ "kernel pointer copy fault at 0x%p", (void *) (uintptr_t) THIS->addr);
+ CONTEXT->last_error = CONTEXT->error_buffer;
+ }
+%}
diff --git a/tapset/conversions.stp b/tapset/conversions.stp
index 3bbbb725..fbaba6e4 100644
--- a/tapset/conversions.stp
+++ b/tapset/conversions.stp
@@ -1,5 +1,5 @@
// conversions tapset
-// Copyright (C) 2005-2009 Red Hat Inc.
+// Copyright (C) 2005-2010 Red Hat Inc.
// Copyright (C) 2007 Intel Corporation.
//
// This file is part of systemtap, and is free software. You can
@@ -113,6 +113,24 @@ deref_fault: /* branched to from kread() */
}
%}
+/**
+ * sfunction kernel_pointer - Retrieves a pointer value stored in
+ * kernel memory.
+ * @addr: The kernel address to retrieve the pointer from.
+ *
+ * Description: Returns the pointer value from a given kernel memory
+ * address. Reports an error when reading from the given address
+ * fails.
+ */
+function kernel_pointer:long (addr:long) %{ /* pure */
+ THIS->__retvalue = (int64_t) kread((void **) (intptr_t) THIS->addr);
+ if (0) {
+deref_fault: /* branched to from kread() */
+ snprintf (CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
+ "kernel pointer copy fault at 0x%p", (void *) (uintptr_t) THIS->addr);
+ CONTEXT->last_error = CONTEXT->error_buffer;
+ }
+%}
/**
* sfunction user_string - Retrieves string from user space.
diff --git a/tapset/nfs.stp b/tapset/nfs.stp
index 2fc05128..e80ba0de 100644
--- a/tapset/nfs.stp
+++ b/tapset/nfs.stp
@@ -134,16 +134,6 @@ function __p2sb_flag:long (page:long)
return @cast(i_sb, "super_block", "kernel:nfs")->s_flags
}
-function __d_loff_t :long (ppos :long) %{ /* pure */
- loff_t *ppos = (loff_t *)((long)THIS->ppos);
-
- if (ppos == NULL)
- THIS->__retvalue = -1;
- else
- THIS->__retvalue = kread(ppos);
- CATCH_DEREF_FAULT();
-%}
-
function __file_inode:long (file:long)
{
%( kernel_v >= "2.6.20" %?
@@ -718,7 +708,7 @@ probe nfs.fop.sendfile = kernel.function("nfs_file_sendfile") !,
devname = kernel_string(s_id)
count = $count
- ppos = __d_loff_t($ppos)
+ ppos = $ppos ? kernel_pointer($ppos) : -1
cache_valid = __nfsi_cache_valid(__file_inode($filp))
cache_time = __nfsi_rcache_time(__file_inode($filp))
diff --git a/testsuite/buildok/conversions-embedded.stp b/testsuite/buildok/conversions-embedded.stp
index 55f6cdb7..fd36e4c5 100755
--- a/testsuite/buildok/conversions-embedded.stp
+++ b/testsuite/buildok/conversions-embedded.stp
@@ -6,6 +6,9 @@ probe begin {
print (kernel_int (0))
print (kernel_short (0))
print (kernel_char (0))
+ print (kernel_pointer(0))
+
+ print (user_string(0))
print (user_string2 (0, ""))
print (user_string_warn (0))
print (user_string_quoted (0))
diff --git a/testsuite/buildok/conversions.stp b/testsuite/buildok/conversions.stp
index 5f151f1d..01e520c7 100755
--- a/testsuite/buildok/conversions.stp
+++ b/testsuite/buildok/conversions.stp
@@ -8,10 +8,12 @@ probe begin {
print (kernel_int(2342))
print (kernel_short(2342))
print (kernel_char(2342))
+ print (kernel_pointer(2342))
print (user_string(2342))
print (user_string2(2342,"foobar"))
print (user_string_warn(2342))
+ print (user_string_quoted (2342))
print (user_string_n(2342, 5))
print (user_string_n2(2342, 5, "foobar"))
diff --git a/testsuite/buildok/nfs-embedded.stp b/testsuite/buildok/nfs-embedded.stp
index cbb887f1..d85dc084 100755
--- a/testsuite/buildok/nfs-embedded.stp
+++ b/testsuite/buildok/nfs-embedded.stp
@@ -15,7 +15,6 @@ probe begin {
__p2i_state (0) +
__p2i_size (0) +
__p2sb_flag (0) +
- __d_loff_t (0) +
__file_inode (0) +
__file_id (0) +
__file_mode (0) +
diff --git a/testsuite/buildok/set_kernel.stp b/testsuite/buildok/set_kernel.stp
index 9134b907..4eeb387e 100755
--- a/testsuite/buildok/set_kernel.stp
+++ b/testsuite/buildok/set_kernel.stp
@@ -9,6 +9,7 @@ probe begin
set_kernel_int(addr, 42)
set_kernel_short(addr, 42)
set_kernel_char(addr, 42)
+ set_kernel_pointer(addr, 42)
}