diff options
-rw-r--r-- | tapset/conversions-guru.stp | 18 | ||||
-rw-r--r-- | tapset/conversions.stp | 20 | ||||
-rw-r--r-- | tapset/nfs.stp | 12 | ||||
-rwxr-xr-x | testsuite/buildok/conversions-embedded.stp | 3 | ||||
-rwxr-xr-x | testsuite/buildok/conversions.stp | 2 | ||||
-rwxr-xr-x | testsuite/buildok/nfs-embedded.stp | 1 | ||||
-rwxr-xr-x | testsuite/buildok/set_kernel.stp | 1 |
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) } |