summaryrefslogtreecommitdiffstats
path: root/tapset
diff options
context:
space:
mode:
Diffstat (limited to 'tapset')
-rw-r--r--tapset/aux_syscalls.stp2
-rw-r--r--tapset/context-symbols.stp4
-rw-r--r--tapset/i686/registers.stp10
-rw-r--r--tapset/inet_sock.stp50
-rw-r--r--tapset/networking.stp4
-rw-r--r--tapset/nfs.stp177
-rw-r--r--tapset/ppc64/registers.stp10
-rw-r--r--tapset/rpc.stp95
-rw-r--r--tapset/s390x/registers.stp12
-rw-r--r--tapset/scsi.stp10
-rw-r--r--tapset/signal.stp18
-rw-r--r--tapset/socket.stp68
-rw-r--r--tapset/task.stp54
-rw-r--r--tapset/vfs.stp198
-rw-r--r--tapset/x86_64/registers.stp10
15 files changed, 320 insertions, 402 deletions
diff --git a/tapset/aux_syscalls.stp b/tapset/aux_syscalls.stp
index 42b2abf8..d2e43903 100644
--- a/tapset/aux_syscalls.stp
+++ b/tapset/aux_syscalls.stp
@@ -1790,6 +1790,7 @@ function _struct_sigaction_u:string(uaddr:long)
function _struct_sigaction32_u:string(uaddr:long)
%{ /* pure */
+#ifdef CONFIG_COMPAT
#include <linux/compat.h>
// There seems to be no public cross arch header that defines this.
@@ -1831,4 +1832,5 @@ function _struct_sigaction32_u:string(uaddr:long)
else
strlcpy (THIS->__retvalue, "UNKNOWN", MAXSTRINGLEN);
}
+#endif
%}
diff --git a/tapset/context-symbols.stp b/tapset/context-symbols.stp
index 79645f4f..46eab841 100644
--- a/tapset/context-symbols.stp
+++ b/tapset/context-symbols.stp
@@ -12,14 +12,14 @@
#define STP_NEED_SYMBOL_DATA 1
#endif
%}
-
+// weirdness with print_stack, argument appears in build as undescribed
/**
* sfunction print_stack - Print out stack from string
* @stk: String with list of hexidecimal addresses. (FIXME)
*
* Perform a symbolic lookup of the addresses in the given string,
* which is assumed to be the result of a prior call to
- * backtrace().
+ * <command>backtrace()</command>.
* Print one line per address, including the address, the
* name of the function containing the address, and an estimate of
* its position within that function. Return nothing.
diff --git a/tapset/i686/registers.stp b/tapset/i686/registers.stp
index b9eaba5b..a6e5694e 100644
--- a/tapset/i686/registers.stp
+++ b/tapset/i686/registers.stp
@@ -26,6 +26,16 @@ function _stp_register_regs() {
function _stp_get_register_by_offset:long (offset:long) %{ /* pure */
long value;
+ if (!CONTEXT->regs) {
+ CONTEXT->last_error = "No registers available in this context";
+ return;
+ }
+ if (THIS->offset < 0 || THIS->offset > sizeof(struct pt_regs) - sizeof(long)) {
+ snprintf(CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
+ "Bad register offset: %lld", THIS->offset);
+ CONTEXT->last_error = CONTEXT->error_buffer;
+ return;
+ }
memcpy(&value, ((char *)CONTEXT->regs) + THIS->offset, sizeof(value));
THIS->__retvalue = value;
%}
diff --git a/tapset/inet_sock.stp b/tapset/inet_sock.stp
index 59ce7fea..33de9775 100644
--- a/tapset/inet_sock.stp
+++ b/tapset/inet_sock.stp
@@ -1,42 +1,42 @@
// inet_sock information tapset
// Copyright (C) 2006 IBM Corp.
// Copyright (C) 2006 Intel Corporation.
+// Copyright (C) 2009 Red Hat, Inc.
//
// This file is part of systemtap, and is free software. You can
// redistribute it and/or modify it under the terms of the GNU General
// Public License (GPL); either version 2, or (at your option) any
// later version.
-%{
-#include <linux/version.h>
-#include <net/sock.h>
-#include <net/tcp.h>
-#include <net/ip.h>
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11)
-#define LPORT (inet->inet.num)
-#define DADDR (&inet->inet.daddr)
-#else
-#define LPORT (inet->num)
-#define DADDR (&inet->daddr)
-#endif
-%}
-
-// Get local port number
+// Get local port number given a pointer to a kernel socket,
+// as for example kernel.function("tcp_accept").return will
+// return.
function inet_get_local_port:long(sock:long)
-%{ /* pure */
- struct inet_sock *inet = (struct inet_sock *) (long) THIS->sock;
- THIS->__retvalue = kread(&(LPORT));
- CATCH_DEREF_FAULT();
-%}
+{
+%(kernel_v < "2.6.11" %?
+ port = @cast(sock, "inet_sock", "kernel")->inet->num;
+%:
+ port = @cast(sock, "inet_sock", "kernel")->num;
+%)
+ return port;
+}
-// Get IP source address string
+// Get IP source address string given a pointer to a kernel socket.
function inet_get_ip_source:string(sock:long)
+{
+%(kernel_v < "2.6.11" %?
+ daddr = @cast(sock, "inet_sock", "kernel")->inet->daddr;
+%:
+ daddr = @cast(sock, "inet_sock", "kernel")->daddr;
+%)
+ return daddr_to_string(daddr);
+}
+
+// Turns a daddr as found in an inet_sock into a dotted ip string.
+function daddr_to_string:string(daddr:long)
%{ /* pure */
- struct inet_sock *inet = (struct inet_sock *) (long) THIS->sock;
union { __u32 d; unsigned char addr[4]; } u;
- u.d = kread(DADDR);
+ u.d = THIS->daddr;
sprintf(THIS->__retvalue, "%d.%d.%d.%d",
u.addr[0], u.addr[1], u.addr[2], u.addr[3]);
- CATCH_DEREF_FAULT();
%}
diff --git a/tapset/networking.stp b/tapset/networking.stp
index d6e90259..a147441a 100644
--- a/tapset/networking.stp
+++ b/tapset/networking.stp
@@ -6,10 +6,6 @@
// Public License (GPL); either version 2, or (at your option) any
// later version.
-%{
-#include <linux/netdevice.h>
-%}
-
/**
* probe netdev.receive - Data recieved from network device.
* @dev_name: The name of the device. e.g: eth0, ath1.
diff --git a/tapset/nfs.stp b/tapset/nfs.stp
index 474b091f..6752747f 100644
--- a/tapset/nfs.stp
+++ b/tapset/nfs.stp
@@ -135,69 +135,50 @@ function __nfs_wpages:long(inode:long) %{ /* pure */
%}
/*Get struct inode from struct page*/
-function __p2i :long(page:long) %{ /* pure */
- struct page *page = (struct page *)((long)THIS->page);
- struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
-
- if (mapping == NULL)
- THIS->__retvalue = 0;
- else
- THIS->__retvalue = (long)kread(&(mapping->host));
- CATCH_DEREF_FAULT();
-%}
+function __p2i :long(page:long)
+{
+ mapping = page? @cast(page, "page", "kernel:nfs")->mapping : 0
+ if (mapping == 0)
+ return 0
+ return @cast(mapping, "address_space", "kernel:nfs")->host
+}
/*Get i_flags from struct page*/
-function __p2i_flag : long (page:long) %{ /* pure */
- struct page *page = (struct page *)((long)THIS->page);
- struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
- struct inode *host = mapping? kread(&(mapping->host)) : NULL;
-
- if (host == NULL)
- THIS->__retvalue = -1;
- else
- THIS->__retvalue = kread(&(host->i_flags));
- CATCH_DEREF_FAULT();
-%}
+function __p2i_flag : long (page:long)
+{
+ host = __p2i(page)
+ if (host == 0)
+ return -1
+ return @cast(host, "inode", "kernel:nfs")->i_flags
+}
/*Get i_state from struct page*/
-function __p2i_state :long (page:long) %{ /* pure */
- struct page *page = (struct page *)((long)THIS->page);
- struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
- struct inode *host = mapping? kread(&(mapping->host)) : NULL;
-
- if (host == NULL)
- THIS->__retvalue = -1;
- else
- THIS->__retvalue = kread(&(host->i_state));
- CATCH_DEREF_FAULT();
-%}
+function __p2i_state :long (page:long)
+{
+ host = __p2i(page)
+ if (host == 0)
+ return -1
+ return @cast(host, "inode", "kernel:nfs")->i_state
+}
/*Get i_size from struct page*/
-function __p2i_size :long (page:long) %{ /* pure */
- struct page *page = (struct page *)((long)THIS->page);
- struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
- struct inode *host = mapping? kread(&(mapping->host)) : NULL;
-
- if (host == NULL)
- THIS->__retvalue = -1;
- else
- THIS->__retvalue = kread(&(host->i_size));
- CATCH_DEREF_FAULT();
-%}
+function __p2i_size :long (page:long)
+{
+ host = __p2i(page)
+ if (host == 0)
+ return -1
+ return @cast(host, "inode", "kernel:nfs")->i_size
+}
/*Get s_flags from struct page*/
-function __p2sb_flag:long (page:long) %{ /* pure */
- struct page *page = (struct page *)((long)THIS->page);
- struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
- struct inode *host = mapping? kread(&(mapping->host)) : NULL;
- struct super_block *i_sb = host? kread(&(host->i_sb)) : NULL;
-
- if (i_sb == NULL)
- THIS->__retvalue = -1;
- else
- THIS->__retvalue = kread(&(i_sb->s_flags));
- CATCH_DEREF_FAULT();
-%}
+function __p2sb_flag:long (page:long)
+{
+ host = __p2i(page)
+ i_sb = host? @cast(host, "inode", "kernel:nfs")->i_sb : 0
+ if (i_sb == 0)
+ return -1
+ 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);
@@ -209,53 +190,47 @@ function __d_loff_t :long (ppos :long) %{ /* pure */
CATCH_DEREF_FAULT();
%}
-function __file_inode:long (file:long) %{ /* pure */
- struct file *file = (struct file *)(long)THIS->file;
- struct dentry *dentry = file? kread(&(file->f_dentry)) : NULL;
- if (dentry == NULL)
- THIS->__retvalue = 0;
- else
- THIS->__retvalue = (long)kread(&(dentry->d_inode));
- CATCH_DEREF_FAULT();
-%}
+function __file_inode:long (file:long)
+{
+%( kernel_v >= "2.6.20" %?
+ dentry = file? @cast(file, "file", "kernel:nfs")->f_path->dentry : 0
+%:
+ dentry = file? @cast(file, "file", "kernel:nfs")->f_dentry : 0
+%)
+ if (dentry == 0)
+ return 0
+ return @cast(dentry, "dentry", "kernel:nfs")->d_inode
+}
-function __file_id:long (file:long) %{ /* pure */
- struct file *file = (struct file *)(long)THIS->file;
- struct dentry *dentry = file? kread(&(file->f_dentry)) : NULL;
- if (dentry == NULL)
- THIS->__retvalue = 0;
- else {
- struct inode *d_inode = kread(&(dentry->d_inode));
- struct super_block *i_sb = kread(&(d_inode->i_sb));
- THIS->__retvalue = (long)&(i_sb->s_id);
- }
- CATCH_DEREF_FAULT();
-%}
+function __file_id:long (file:long)
+{
+ d_inode = __file_inode(file)
+ if (d_inode == 0)
+ return 0
+ return @cast(d_inode, "inode", "kernel:nfs")->i_sb->s_id
+}
-function __file_mode:long (file:long) %{ /* pure */
- struct file *file = (struct file *)(long)THIS->file;
- struct dentry *dentry = file? kread(&(file->f_dentry)) : NULL;
- if (dentry == NULL)
- THIS->__retvalue = 0;
- else {
- struct inode *d_inode = kread(&(dentry->d_inode));
- THIS->__retvalue = kread(&(d_inode->i_mode));
- }
- CATCH_DEREF_FAULT();
-%}
+function __file_mode:long (file:long)
+{
+ d_inode = __file_inode(file)
+ if (d_inode == 0)
+ return 0
+ return @cast(d_inode, "inode", "kernel:nfs")->i_mode
+}
-function __file_parentname:string (file:long) %{ /* pure */
- struct file *file = (struct file *)(long)THIS->file;
- struct dentry *dentry = file? kread(&(file->f_dentry)) : NULL;
- struct dentry *d_parent = dentry? kread(&(dentry->d_parent)) : NULL;
- if (d_parent == NULL)
- strlcpy(THIS->__retvalue, "NULL", MAXSTRINGLEN);
- else {
- const unsigned char *name = kread(&(d_parent->d_name.name));
- deref_string(THIS->__retvalue, name, MAXSTRINGLEN);
- }
- CATCH_DEREF_FAULT();
-%}
+function __file_parentname:string (file:long)
+{
+%( kernel_v >= "2.6.20" %?
+ dentry = file? @cast(file, "file", "kernel:nfs")->f_path->dentry : 0
+%:
+ dentry = file? @cast(file, "file", "kernel:nfs")->f_dentry : 0
+%)
+ d_parent = dentry? @cast(dentry, "dentry", "kernel:nfs")->d_parent : 0
+ if (d_parent == 0)
+ return "NULL"
+ name = @cast(d_parent, "dentry", "kernel:nfs")->d_name->name
+ return kernel_string(name)
+}
/*
* Combination of generic_segment_checks and iov_length functions
@@ -349,8 +324,8 @@ probe nfs.fop.llseek = kernel.function ("nfs_file_llseek") !,
{
dev = __file_dev($filp)
ino = __file_ino($filp)
- s_id = __file_id($filp)
- devname = kernel_string(s_id)
+ s_id = __file_id($filp)
+ devname = kernel_string(s_id)
maxbyte = __file_maxbytes($filp)
offset = $offset
diff --git a/tapset/ppc64/registers.stp b/tapset/ppc64/registers.stp
index 6a8ae279..e5decd81 100644
--- a/tapset/ppc64/registers.stp
+++ b/tapset/ppc64/registers.stp
@@ -64,6 +64,16 @@ function probing_32bit_app() %{ /* pure */
function _stp_get_register_by_offset:long (offset:long) %{ /* pure */
long value;
+ if (!CONTEXT->regs) {
+ CONTEXT->last_error = "No registers available in this context";
+ return;
+ }
+ if (THIS->offset < 0 || THIS->offset > sizeof(struct pt_regs) - sizeof(long)) {
+ snprintf(CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
+ "Bad register offset: %lld", THIS->offset);
+ CONTEXT->last_error = CONTEXT->error_buffer;
+ return;
+ }
memcpy(&value, ((char *)CONTEXT->regs) + THIS->offset, sizeof(value));
THIS->__retvalue = value;
%}
diff --git a/tapset/rpc.stp b/tapset/rpc.stp
index f97117b5..1d47daed 100644
--- a/tapset/rpc.stp
+++ b/tapset/rpc.stp
@@ -877,60 +877,40 @@ probe sunrpc.sched.delay.return = kernel.function("rpc_delay").return !,
*****************************************************************/
function xid_from_clnt:long(clnt:long)
-%{ /* pure */
- struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
- if (clnt == NULL)
- THIS->__retvalue = 0;
- else {
- struct rpc_xprt *cl_xprt = kread(&(clnt->cl_xprt));
- THIS->__retvalue = kread(&(cl_xprt->xid));
- }
- CATCH_DEREF_FAULT();
-%}
+{
+ if (clnt == 0)
+ return 0
+ return @cast(clnt, "rpc_clnt", "kernel:sunrpc")->cl_xprt->xid
+}
function prog_from_clnt:long(clnt:long)
-%{ /* pure */
- struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
- if (clnt == NULL)
- THIS->__retvalue = 0;
- else {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
- THIS->__retvalue = kread(&(clnt->cl_prog));
-#else
- struct rpc_portmap *cl_pmap = kread(&(clnt->cl_pmap));
- THIS->__retvalue = kread(&(cl_pmap->pm_prog));
-#endif
- }
- CATCH_DEREF_FAULT();
-%}
+{
+ if (clnt == 0)
+ return 0
+%(kernel_v >= "2.6.19" %?
+ return @cast(clnt, "rpc_clnt", "kernel:sunrpc")->cl_prog
+%:
+ return @cast(clnt, "rpc_clnt", "kernel:sunrpc")->cl_pmap->pm_prog
+%)
+}
function vers_from_clnt:long(clnt:long)
-%{ /* pure */
- struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
- if (clnt == NULL)
- THIS->__retvalue = 0;
- else {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
- THIS->__retvalue = kread(&(clnt->cl_vers));
-#else
- struct rpc_portmap *cl_pmap = kread(&(clnt->cl_pmap));
- THIS->__retvalue = kread(&(cl_pmap->pm_vers));
-#endif
- }
- CATCH_DEREF_FAULT();
-%}
+{
+ if (clnt == 0)
+ return 0
+%(kernel_v >= "2.6.19" %?
+ return @cast(clnt, "rpc_clnt", "kernel:sunrpc")->cl_vers
+%:
+ return @cast(clnt, "rpc_clnt", "kernel:sunrpc")->cl_pmap->pm_vers
+%)
+}
function prot_from_clnt:long(clnt:long)
-%{ /* pure */
- struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
- if (clnt == NULL)
- THIS->__retvalue = 0;
- else {
- struct rpc_xprt *cl_xprt = kread(&(clnt->cl_xprt));
- THIS->__retvalue = kread(&(cl_xprt->prot));
- }
- CATCH_DEREF_FAULT();
-%}
+{
+ if (clnt == 0)
+ return 0
+ return @cast(clnt, "rpc_clnt", "kernel:sunrpc")->cl_xprt->prot
+}
function port_from_clnt:long(clnt:long)
%{ /* pure */
@@ -942,12 +922,14 @@ function port_from_clnt:long(clnt:long)
struct sockaddr_in *sap = (struct sockaddr_in *) &cl_xprt->addr;
THIS->__retvalue = ntohs(kread(&(sap->sin_port)));
+ }
#else
if (cl_xprt && kread(&(cl_xprt->addr.sin_family)) == AF_INET) {
/* Now consider ipv4 only */
THIS->__retvalue = ntohs(kread(&(cl_xprt->addr.sin_port)));
+ }
#endif
- } else
+ else
THIS->__retvalue = 0;
CATCH_DEREF_FAULT();
%}
@@ -975,16 +957,11 @@ function tasks_from_clnt:long(clnt:long)
%}
function proc_from_msg:long(msg:long)
-%{ /* pure */
- struct rpc_message *msg = (struct rpc_message *)(long)THIS->msg;
- if (msg == NULL)
- THIS->__retvalue = 0;
- else {
- struct rpc_procinfo *rpc_proc = kread(&(msg->rpc_proc));
- THIS->__retvalue = kread(&(rpc_proc->p_proc));
- }
- CATCH_DEREF_FAULT();
-%}
+{
+ if (msg == 0)
+ return 0
+ return @cast(msg, "rpc_message", "kernel:sunrpc")->rpc_proc->p_proc
+}
function vers_from_prog:long(program:long, vers:long)
%{ /* pure */
diff --git a/tapset/s390x/registers.stp b/tapset/s390x/registers.stp
index 84e28348..37218d14 100644
--- a/tapset/s390x/registers.stp
+++ b/tapset/s390x/registers.stp
@@ -56,8 +56,18 @@ function _stp_probing_kernel: long () %{ /* pure */
function _stp_get_register_by_offset:long (offset:long) %{ /* pure */
long value;
+ if (!CONTEXT->regs) {
+ CONTEXT->last_error = "No registers available in this context";
+ return;
+ }
+ if (THIS->offset < 0 || THIS->offset > sizeof(struct pt_regs) - sizeof(unsigned short)) {
+ snprintf(CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
+ "Bad register offset: %lld", THIS->offset);
+ CONTEXT->last_error = CONTEXT->error_buffer;
+ return;
+ }
- if (THIS->offset <= 152)
+ if (THIS->offset < sizeof(struct pt_regs) - 2 * sizeof(unsigned short))
memcpy(&value, ((char *)CONTEXT->regs) + THIS->offset,
sizeof(value));
else {
diff --git a/tapset/scsi.stp b/tapset/scsi.stp
index 76b9a114..6d332e8b 100644
--- a/tapset/scsi.stp
+++ b/tapset/scsi.stp
@@ -136,9 +136,7 @@ function scsi_timer_pending:long(var:long)
%}
function get_devstate_from_req:long(var:long)
-%{ /* pure */
- struct request_queue *q = (struct request_queue *)((long)THIS->var);
- struct scsi_device *sdev = (struct scsi_device *)kread(&(q->queuedata));
- THIS->__retvalue = kread(&(sdev->sdev_state));
- CATCH_DEREF_FAULT();
-%}
+{
+ sdev = @cast(var, "request_queue", "kernel:scsi_mod")->queuedata
+ return @cast(sdev, "scsi_device", "kernel:scsi_mod")->sdev_state
+}
diff --git a/tapset/signal.stp b/tapset/signal.stp
index f40958e6..8fb6fe57 100644
--- a/tapset/signal.stp
+++ b/tapset/signal.stp
@@ -608,17 +608,15 @@ probe signal.flush = kernel.function("flush_signals")
pid_name = kernel_string($t->comm)
}
-function get_sa_flags:long (act:long) %{ /* pure */
- struct k_sigaction *act = (struct k_sigaction *)((long)THIS->act);
- THIS->__retvalue = kread(&act->sa.sa_flags);
- CATCH_DEREF_FAULT();
-%}
+function get_sa_flags:long (act:long)
+{
+ return @cast(act, "k_sigaction", "kernel")->sa->sa_flags
+}
-function get_sa_handler:long (act:long) %{ /* pure */
- struct k_sigaction *act = (struct k_sigaction *)((long)THIS->act);
- THIS->__retvalue = (long)kread(&act->sa.sa_handler);
- CATCH_DEREF_FAULT();
-%}
+function get_sa_handler:long (act:long)
+{
+ return @cast(act, "k_sigaction", "kernel")->sa->sa_handler
+}
// sa_mask contains the set of signals to be blocked when executing the
// signal handler. This function returns a string, delimited by ",".
diff --git a/tapset/socket.stp b/tapset/socket.stp
index 842dbfc4..3271d4f7 100644
--- a/tapset/socket.stp
+++ b/tapset/socket.stp
@@ -922,53 +922,43 @@ function _get_sock_size:long (iov:long, nr_segs:long)
%}
function _sock_prot_num:long (sock:long)
-%{ /* pure */
- struct socket *sktp = (struct socket *)(long)(THIS->sock);
- struct sock *skp = sktp? kread(&(sktp->sk)) : NULL;
- if (skp == NULL)
- THIS->__retvalue = -1;
+{
+ skp = sock? @cast(sock, "socket", "kernel")->sk : 0
+ if (skp == 0)
+ return -1
else
- THIS->__retvalue = kread(&(skp->sk_protocol));
- CATCH_DEREF_FAULT();
-%}
+ return @cast(skp, "sock", "kernel")->sk_protocol
+}
function _sock_fam_num:long (sock:long)
-%{ /* pure */
- struct socket *sockp = (struct socket *)(long)(THIS->sock);
- const struct proto_ops *ops = sockp? kread(&(sockp->ops)) : NULL;
- if (ops == NULL)
- THIS->__retvalue = -1;
+{
+ ops = sock? @cast(sock, "socket", "kernel")->ops : 0
+ if (ops == 0)
+ return -1
else
- THIS->__retvalue = kread(&(ops->family));
- CATCH_DEREF_FAULT();
-%}
+ return @cast(ops, "proto_ops", "kernel")->family
+}
function _sock_state_num:long (sock:long)
-%{ /* pure */
- struct socket *sockp = (struct socket *)(long)(THIS->sock);
- if (sockp == NULL)
- THIS->__retvalue = -1;
+{
+ if (sock == 0)
+ return -1
else
- THIS->__retvalue = kread(&(sockp->state));
- CATCH_DEREF_FAULT();
-%}
+ return @cast(sock, "socket", "kernel")->state
+}
function _sock_type_num:long (sock:long)
-%{ /* pure */
- struct socket *sockp = (struct socket *)(long)(THIS->sock);
- if (sockp == NULL)
- THIS->__retvalue = -1;
- else
- THIS->__retvalue = kread(&(sockp->type));
- CATCH_DEREF_FAULT();
-%}
+{
+ if (sock == 0)
+ return -1
+ else
+ return @cast(sock, "socket", "kernel")->type
+}
function _sock_flags_num:long (sock:long)
-%{ /* pure */
- struct socket *sockp = (struct socket *)(long)(THIS->sock);
- if (sockp == NULL)
- THIS->__retvalue = -1;
- else
- THIS->__retvalue = kread(&(sockp->flags));
- CATCH_DEREF_FAULT();
-%}
+{
+ if (sock == 0)
+ return -1
+ else
+ return @cast(sock, "socket", "kernel")->flags
+}
diff --git a/tapset/task.stp b/tapset/task.stp
index 684cef93..07337156 100644
--- a/tapset/task.stp
+++ b/tapset/task.stp
@@ -43,35 +43,31 @@ function task_parent:long (task:long) %{ /* pure */
// TASK_TRACED 8
// EXIT_ZOMBIE 16
// EXIT_DEAD 32
-function task_state:long (task:long) %{ /* pure */
- struct task_struct *t = (struct task_struct *)(long)THIS->task;
- THIS->__retvalue = kread(&(t->state));
- CATCH_DEREF_FAULT();
-%}
+function task_state:long (task:long)
+{
+ return @cast(task, "task_struct", "kernel")->state
+}
// Return the name of the given task
-function task_execname:string (task:long) %{ /* pure */
- struct task_struct *t = (struct task_struct *)(long)THIS->task;
- deref_string(THIS->__retvalue, t->comm, MAXSTRINGLEN);
- CATCH_DEREF_FAULT();
-%}
+function task_execname:string (task:long)
+{
+ return kernel_string(@cast(task, "task_struct", "kernel")->comm)
+}
// Return the process id of the given task
-function task_pid:long (task:long) %{ /* pure */
- struct task_struct *t = (struct task_struct *)(long)THIS->task;
- THIS->__retvalue = kread(&(t->tgid));
- CATCH_DEREF_FAULT();
-%}
+function task_pid:long (task:long)
+{
+ return @cast(task, "task_struct", "kernel")->tgid
+}
// Return the thread id of the given task
-function task_tid:long (task:long) %{ /* pure */
- struct task_struct *t = (struct task_struct *)(long)THIS->task;
- THIS->__retvalue = kread(&(t->pid));
- CATCH_DEREF_FAULT();
-%}
+function task_tid:long (task:long)
+{
+ return @cast(task, "task_struct", "kernel")->pid
+}
// Return the group id of the given task
@@ -156,22 +152,14 @@ function task_nice:long (task:long) %{ /* pure */
// Return the scheduled cpu for the given task
function task_cpu:long (task:long)
+{
%( kernel_v >= "2.6.22" %?
-%{ /* pure */
- struct task_struct *t = (struct task_struct *)(long)THIS->task;
- struct thread_info *ti = kread(&(t->stack));
- THIS->__retvalue = kread(&(ti->cpu));
- CATCH_DEREF_FAULT();
-%}
+ ti = @cast(task, "task_struct", "kernel")->stack
%:
-%{ /* pure */
- struct task_struct *t = (struct task_struct *)(long)THIS->task;
- struct thread_info *ti = kread(&(t->thread_info));
- THIS->__retvalue = kread(&(ti->cpu));
- CATCH_DEREF_FAULT();
-%}
+ ti = @cast(task, "task_struct", "kernel")->thread_info
%)
-
+ return @cast(ti, "thread_info", "kernel")->cpu
+}
// Return the number of open file handlers for the given task
function task_open_file_handles:long (task:long)
diff --git a/tapset/vfs.stp b/tapset/vfs.stp
index 43603177..23d95098 100644
--- a/tapset/vfs.stp
+++ b/tapset/vfs.stp
@@ -51,139 +51,93 @@ function ppos_pos:long (ppos:long) %{ /* pure */
CATCH_DEREF_FAULT();
%}
-function __page_ino:long (page:long) %{ /* pure */
- struct page *page = (struct page *)(long)THIS->page;
- struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
- if (mapping == NULL) {
- THIS->__retvalue = -1;
- } else {
- struct inode *host = kread(&(mapping->host));
- THIS->__retvalue = kread(&(host->i_ino));
- }
- CATCH_DEREF_FAULT();
-%}
-
-function __address_inode:long (page:long) %{ /* pure */
- struct page *page = (struct page *)(long)THIS->page;
- struct address_space *mapping = kread(&(page->mapping));
- if (mapping == NULL) {
- THIS->__retvalue = -1;
- } else {
- THIS->__retvalue = (long)kread(&(mapping->host));
- }
- CATCH_DEREF_FAULT();
-%}
+function __address_inode:long (page:long)
+{
+ mapping = page? @cast(page, "page", "kernel")->mapping : 0
+ if (mapping == 0)
+ return -1
+ else
+ return @cast(mapping, "address_space", "kernel")->host
+}
-function __page_dev:long (page:long) %{ /* pure */
- struct page *page = (struct page *)(long)THIS->page;
- struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
- if (mapping == NULL) {
- THIS->__retvalue = -1;
- } else {
- struct inode *host = kread(&(mapping->host));
- struct super_block *i_sb = kread(&(host->i_sb));
- THIS->__retvalue = kread(&(i_sb->s_dev));
- }
- CATCH_DEREF_FAULT();
-%}
+function __page_ino:long (page:long)
+{
+ host = __address_inode(page)
+ if (host == -1)
+ return -1
+ else
+ return @cast(host, "inode", "kernel")->i_ino
+}
-function __page_bdev:long (page:long) %{ /* pure */
- struct page *page = (struct page *)(long)THIS->page;
- struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
- if (mapping == NULL) {
- THIS->__retvalue = 0;
- } else {
- struct inode *host = kread(&(mapping->host));
- struct super_block *i_sb = kread(&(host->i_sb));
- THIS->__retvalue = (long)kread(&(i_sb->s_bdev));
- }
- CATCH_DEREF_FAULT();
-%}
+function __page_dev:long (page:long)
+{
+ host = __address_inode(page)
+ if (host == -1)
+ return -1
+ return @cast(host, "inode", "kernel")->i_sb->s_dev
+}
-function __page_index:long (page:long) %{ /* pure */
- struct page *page = (struct page *)(long)THIS->page;
- THIS->__retvalue = (long)kread(&(page->index));
- CATCH_DEREF_FAULT();
-%}
+function __page_bdev:long (page:long)
+{
+ host = __address_inode(page)
+ if (host == -1)
+ return 0
+ return @cast(host, "inode", "kernel")->i_sb->s_bdev
+}
-function __file_dev:long (file:long) %{ /* pure */
- struct file *file = (struct file *)(long)THIS->file;
- struct dentry *dentry = file? kread(&(file->f_dentry)) : NULL;
- if (dentry == NULL) {
- THIS->__retvalue = 0;
- } else {
- struct inode *d_inode = kread(&(dentry->d_inode));
- struct super_block *i_sb = kread(&(d_inode->i_sb));
- THIS->__retvalue = kread(&(i_sb->s_dev));
- }
- CATCH_DEREF_FAULT();
-%}
+function __page_index:long (page:long)
+{
+ return @cast(page, "page", "kernel")->index
+}
-function __file_bdev:long (file:long) %{ /* pure */
- struct file *file = (struct file *)(long)THIS->file;
- struct dentry *dentry = file? kread(&(file->f_dentry)) : NULL;
- if (dentry == NULL) {
- THIS->__retvalue = 0;
- } else {
- struct inode *d_inode = kread(&(dentry->d_inode));
- struct super_block *i_sb = kread(&(d_inode->i_sb));
- THIS->__retvalue = (long)kread(&(i_sb->s_bdev));
- }
- CATCH_DEREF_FAULT();
-%}
+function __file_dev:long (file:long)
+{
+ d_inode = __file_inode(file)
+ if (d_inode == 0)
+ return 0
+ return @cast(d_inode, "inode", "kernel")->i_sb->s_dev
+}
-function __file_ino:long (file:long) %{ /* pure */
- struct file *file = (struct file *)(long)THIS->file;
- struct dentry *dentry = file? kread(&(file->f_dentry)) : NULL;
- if (dentry == NULL) {
- THIS->__retvalue = 0;
- } else {
- struct inode *d_inode = kread(&(dentry->d_inode));
- THIS->__retvalue = kread(&(d_inode->i_ino));
- }
- CATCH_DEREF_FAULT();
-%}
+function __file_bdev:long (file:long)
+{
+ d_inode = __file_inode(file)
+ if (d_inode == 0)
+ return 0
+ return @cast(d_inode, "inode", "kernel")->i_sb->s_bdev
+}
-function __file_maxbytes:long (file:long) %{ /* pure */
- struct file *file = (struct file *)(long)THIS->file;
- struct dentry *dentry = file? kread(&(file->f_dentry)) : NULL;
- if (dentry == NULL) {
- THIS->__retvalue = 0;
- } else {
- struct inode *d_inode = kread(&(dentry->d_inode));
- struct super_block *i_sb = kread(&(d_inode->i_sb));
- THIS->__retvalue = kread(&(i_sb->s_maxbytes));
- }
- CATCH_DEREF_FAULT();
-%}
+function __file_ino:long (file:long)
+{
+ d_inode = __file_inode(file)
+ if (d_inode == 0)
+ return 0
+ return @cast(d_inode, "inode", "kernel")->i_ino
+}
-function __file_filename:string (file:long) %{ /* pure */
- struct file *file = (struct file *)(long)THIS->file;
- struct dentry *dentry = file? kread(&(file->f_dentry)) : NULL;
- const unsigned char *name = dentry? kread(&(dentry->d_name.name)) : NULL;
- if (name == NULL) {
- strlcpy(THIS->__retvalue, "NULL", MAXSTRINGLEN);
- } else {
- deref_string(THIS->__retvalue, name, MAXSTRINGLEN);
- }
- CATCH_DEREF_FAULT();
-%}
+function __file_maxbytes:long (file:long)
+{
+ d_inode = __file_inode(file)
+ if (d_inode == 0)
+ return 0
+ return @cast(d_inode, "inode", "kernel")->i_sb->s_maxbytes
+}
-function __inode_num:long(file:long)
-%{
- struct file *file = NULL;
- struct dentry *dentry = NULL;
- struct inode *inode = NULL;
-
- file = (struct file *)(long)THIS->file;
- dentry = file? kread(&(file->f_dentry)) : NULL;
- inode = dentry? kread(&(dentry->d_inode)) : NULL;
- THIS->__retvalue = inode? (long)(kread(&(inode->i_ino))) : 0;
- CATCH_DEREF_FAULT();
-%}
+function __file_filename:string (file:long)
+{
+%( kernel_v >= "2.6.20" %?
+ dentry = file? @cast(file, "file", "kernel")->f_path->dentry : 0
+%:
+ dentry = file? @cast(file, "file", "kernel")->f_dentry : 0
+%)
+ name = dentry? @cast(dentry, "dentry", "kernel")->d_name->name : 0
+ if (name == 0)
+ return "NULL"
+ else
+ return kernel_string(name)
+}
function _get_fopv_size:long (iov:long, nr_segs:long)
-%{
+%{ /* pure */
struct iovec *iovp = (struct iovec *)(long)THIS->iov;
if (iovp) {
int i;
diff --git a/tapset/x86_64/registers.stp b/tapset/x86_64/registers.stp
index dd5eefb0..2e21f3eb 100644
--- a/tapset/x86_64/registers.stp
+++ b/tapset/x86_64/registers.stp
@@ -40,6 +40,16 @@ function _stp_register_regs() {
function _stp_get_register_by_offset:long (offset:long) %{ /* pure */
long value;
+ if (!CONTEXT->regs) {
+ CONTEXT->last_error = "No registers available in this context";
+ return;
+ }
+ if (THIS->offset < 0 || THIS->offset > sizeof(struct pt_regs) - sizeof(long)) {
+ snprintf(CONTEXT->error_buffer, sizeof(CONTEXT->error_buffer),
+ "Bad register offset: %lld", THIS->offset);
+ CONTEXT->last_error = CONTEXT->error_buffer;
+ return;
+ }
memcpy(&value, ((char *)CONTEXT->regs) + THIS->offset, sizeof(value));
THIS->__retvalue = value;
%}