summaryrefslogtreecommitdiffstats
path: root/tapset
diff options
context:
space:
mode:
authorFrank Ch. Eigler <fche@elastic.org>2008-05-14 14:35:48 -0400
committerFrank Ch. Eigler <fche@elastic.org>2008-05-14 14:35:48 -0400
commit0fe2b97c7b967d833b5588dbf1ef763bb4440ed3 (patch)
treefcce9345c9ebacb7d5bc1f510f155bfdcea08dc4 /tapset
parenta007b4068d20af2d4488d54bf3ef2edbf47f2f06 (diff)
parentc3799d720b60bd74a60de4addcd0d77a90f7842a (diff)
downloadsystemtap-steved-0fe2b97c7b967d833b5588dbf1ef763bb4440ed3.tar.gz
systemtap-steved-0fe2b97c7b967d833b5588dbf1ef763bb4440ed3.tar.xz
systemtap-steved-0fe2b97c7b967d833b5588dbf1ef763bb4440ed3.zip
Merge commit 'origin/master' into pr6429-comp-unwindsyms
* commit 'origin/master': PR 5955 - Accept ; terminated globals Factored returnval() out of returnstr(), for use in dwarfless probing. Converted more aliases to use arg numbers instead of names. In particular, Revert "PR6487: extend blacklist with relay/timer subsystem" Add syscalls_by_pid.meta, syscalls_by_proc.meta, PR6487: extend blacklist with relay/timer subsystem Adjust iotime.meta description. * iotime.meta: New. Fix for PR 6500. Update ChangeLog * sleeptime.meta, wait4time.meta: New. systemtap.examples futexes.meta change futex.stp to futexes.stp. In ioblock.stp ioblock.end set bytes_done depending on kernel version. PR6492: make listing mode warning-free PR5648: Fix unaligned access warning in stp_print_flush on ia64 PR5648: Fix memcpy's endianess issue. futexes.meta, nettop.meta, pf2.meta: New. Clean up output.
Diffstat (limited to 'tapset')
-rw-r--r--tapset/ChangeLog6
-rw-r--r--tapset/errno.stp44
-rw-r--r--tapset/i686/registers.stp69
-rw-r--r--tapset/ioblock.stp2
-rw-r--r--tapset/nd_syscalls.stp369
-rw-r--r--tapset/x86_64/registers.stp99
6 files changed, 452 insertions, 137 deletions
diff --git a/tapset/ChangeLog b/tapset/ChangeLog
index cf41c9cb..70d75b83 100644
--- a/tapset/ChangeLog
+++ b/tapset/ChangeLog
@@ -1,3 +1,9 @@
+2008-05-08 Ananth N Mavinakayanahalli <ananth@in.ibm.com>
+
+ PR 5231
+ * ioblock.stp (ioblock.end): Set bytes_done depending on kernel
+ version.
+
2008-04-29 Frank Ch. Eigler <fche@elastic.org>
PR 6466
diff --git a/tapset/errno.stp b/tapset/errno.stp
index 550e5d4f..2523d846 100644
--- a/tapset/errno.stp
+++ b/tapset/errno.stp
@@ -351,33 +351,45 @@ function errno_str:string (err:long) %{ /* pure */
strlcpy (THIS->__retvalue, errlist[e], MAXSTRINGLEN);
%}
-/* for syscall tapset. set returnp = 1 for decimal, 2 for hex */
-function returnstr:string (returnp:long) %{ /* pure */
- long ret;
-
- /* XXX: unfortunate duplication with return.stp:retval() */
-
- if (CONTEXT->regs) {
+%{
+static long _stp_returnval(struct pt_regs *regs) {
+ if (regs) {
#if defined (STAPCONF_X86_UNIREGS) && (defined (__x86_64__) || defined (__i386__))
- ret = CONTEXT->regs->ax;
+ return regs->ax;
#elif defined (__i386__)
- ret = CONTEXT->regs->eax;
+ return regs->eax;
#elif defined (__x86_64__)
- ret = CONTEXT->regs->rax;
+ // TODO: Handle -m32 apps.
+ return regs->rax;
#elif defined (__powerpc64__)
- ret = CONTEXT->regs->gpr[3];
+ return regs->gpr[3];
#elif defined (__ia64__)
- ret = CONTEXT->regs->r8;
+ return regs->r8;
#elif defined (__sparc64__)
- ret = CONTEXT->regs->u_regs[UREG_RETPC];
+ return regs->u_regs[UREG_RETPC];
#elif defined (__s390x__)
- ret = CONTEXT->regs->gprs[2];
+ return regs->gprs[2];
#elif defined (__arm__)
- ret = CONTEXT->regs->ARM_r0;
+ return regs->ARM_r0;
#else
- goto no_ret;
+ _stp_error("returnval() not defined for this architecture");
+ return 0;
#endif
+ } else {
+ _stp_error("returnval() not defined in this context");
+ return 0;
+ }
+}
+%}
+
+function returnval:long () %{ /* pure */
+ THIS->__retvalue = _stp_returnval(CONTEXT->regs);
+%}
+/* for syscall tapset. set returnp = 1 for decimal, 2 for hex */
+function returnstr:string (returnp:long) %{ /* pure */
+ if (CONTEXT->regs) {
+ long ret = _stp_returnval(CONTEXT->regs);
if (ret < 0 && ret > -Maxerrno && errlist[-ret])
snprintf (THIS->__retvalue, MAXSTRINGLEN, "%ld (%s)", ret, errlist[-ret]);
else if (THIS->returnp == 2)
diff --git a/tapset/i686/registers.stp b/tapset/i686/registers.stp
index 85aa7a7f..db532f7a 100644
--- a/tapset/i686/registers.stp
+++ b/tapset/i686/registers.stp
@@ -1,9 +1,70 @@
-/* Return the named register value as a signed value. */
-function register:long (name:string) %{ /* pure */
- THIS->__retvalue = (int64_t)
- _stp_get_reg32_by_name(THIS->name, CONTEXT->regs);
+global _reg_offsets, _stp_regs_registered
+
+function _stp_register_regs() {
+ /* Same order as pt_regs */
+ _reg_offsets["ebx"] = 0 _reg_offsets["bx"] = 0
+ _reg_offsets["ecx"] = 4 _reg_offsets["cx"] = 4
+ _reg_offsets["edx"] = 8 _reg_offsets["dx"] = 8
+ _reg_offsets["esi"] = 12 _reg_offsets["si"] = 12
+ _reg_offsets["edi"] = 16 _reg_offsets["di"] = 16
+ _reg_offsets["ebp"] = 20 _reg_offsets["bp"] = 20
+ _reg_offsets["eax"] = 24 _reg_offsets["ax"] = 24
+ _reg_offsets["xds"] = 28 _reg_offsets["ds"] = 28
+ _reg_offsets["xes"] = 32 _reg_offsets["es"] = 32
+ _reg_offsets["xfs"] = 36 _reg_offsets["fs"] = 36
+ _reg_offsets["orig_eax"] = 40 _reg_offsets["orig_ax"] = 40
+ _reg_offsets["eip"] = 44 _reg_offsets["ip"] = 44
+ _reg_offsets["xcs"] = 48 _reg_offsets["cs"] = 48
+ _reg_offsets["eflags"] = 52 _reg_offsets["flags"] = 52
+ _reg_offsets["esp"] = 56 _reg_offsets["sp"] = 56 sp_offset = 56
+ _reg_offsets["xss"] = 60 _reg_offsets["ss"] = 60 ss_offset = 60
+
+ _stp_regs_registered = 1
+}
+
+function _stp_get_register_by_offset:long (offset:long) %{
+ long value;
+ memcpy(&value, ((char *)CONTEXT->regs) + THIS->offset, sizeof(value));
+ THIS->__retvalue = value;
+%}
+
+function _stp_probing_kernel:long () %{
+ THIS->__retvalue = !user_mode(CONTEXT->regs);
+%}
+
+/*
+ * esp and ss aren't saved on a breakpoint in kernel mode, so
+ * the pre-trap stack pointer is &regs->sp.
+ */
+function _stp_kernel_sp:long (sp_offset:long) %{
+ THIS->__retvalue = ((long) CONTEXT->regs) + THIS->sp_offset;
+%}
+
+/* Assume ss register hasn't changed since we took the trap. */
+function _stp_kernel_ss:long () %{
+ unsigned short ss;
+ asm volatile("movw %%ss, %0" : : "m" (ss));
+ THIS->__retvalue = ss;
%}
+/* Return the named register value as a signed value. */
+function register:long (name:string) {
+ if (!_stp_regs_registered)
+ _stp_register_regs()
+ offset = _reg_offsets[name]
+ if (offset == 0 && !(name in _reg_offsets)) {
+ error("Unknown register: " . name)
+ return 0
+ }
+ if (_stp_probing_kernel()) {
+ if (offset == sp_offset)
+ return _stp_kernel_sp(sp_offset)
+ else if (offset == ss_offset)
+ return _stp_kernel_ss()
+ }
+ return _stp_get_register_by_offset(offset)
+}
+
/*
* Return the named register value as an unsigned value. Specifically,
* don't sign-extend the register value when promoting it to 64 bits.
diff --git a/tapset/ioblock.stp b/tapset/ioblock.stp
index 94781c04..14ce3f6b 100644
--- a/tapset/ioblock.stp
+++ b/tapset/ioblock.stp
@@ -167,7 +167,7 @@ probe ioblock.end = kernel.function("bio_endio")
devname = __bio_devname($bio)
ino = __bio_ino($bio)
- bytes_done = $bytes_done
+ bytes_done = %( kernel_vr < "2.6.24" %? $bytes_done %: $bio->bi_size %)
error = $error
sector = $bio->bi_sector
diff --git a/tapset/nd_syscalls.stp b/tapset/nd_syscalls.stp
index eb5efda0..5697cd21 100644
--- a/tapset/nd_syscalls.stp
+++ b/tapset/nd_syscalls.stp
@@ -8,6 +8,15 @@
// Public License (GPL); either version 2, or (at your option) any
// later version.
+/*
+ * nd_syscalls.stp is a copy of syscalls.stp, modified to refer to
+ * function arguments by number rather than name, so that this tapset
+ * can be used even when the probed kernel lacks debugging information.
+ *
+ * So far, the names-to-numbers conversion covers only syscall.a*
+ * through syscall.c*, plus a few others.
+ */
+
/* Each syscall returns the calls parameters. In addition, the following
* variables are set:
@@ -88,16 +97,27 @@ probe nd_syscall.acct.return = kernel.function("sys_acct").return ? {
#
probe nd_syscall.add_key = kernel.function("sys_add_key") ? {
name = "add_key"
- type_uaddr = $_type
- description_auddr = $_description
- payload_uaddr = $_payload
- plen = $plen
- ringid = $ringid
+ // type_uaddr = $_type
+ // description_auddr = $_description
+ // payload_uaddr = $_payload
+ // plen = $plen
+ // ringid = $ringid
+ // argstr = sprintf("%s, %s, %s, %d, %d",
+ // user_string_quoted($_type),
+ // user_string_quoted($_description),
+ // text_strn(user_string($_payload),syscall_string_trunc,1),
+ // $plen, $ringid)
+ asmlinkage()
+ type_uaddr = pointer_arg(1)
+ description_uaddr = pointer_arg(2)
+ payload_uaddr = pointer_arg(3)
+ plen = ulong_arg(4)
+ ringid = int_arg(5)
argstr = sprintf("%s, %s, %s, %d, %d",
- user_string_quoted($_type),
- user_string_quoted($_description),
- text_strn(user_string($_payload),syscall_string_trunc,1),
- $plen, $ringid)
+ user_string_quoted(type_uaddr),
+ user_string_quoted(description_uaddr),
+ text_strn(user_string(payload_uaddr),syscall_string_trunc,1),
+ plen, ringid)
}
probe nd_syscall.add_key.return = kernel.function("sys_add_key").return ? {
name = "add_key"
@@ -122,16 +142,21 @@ probe nd_syscall.adjtimex = kernel.function("sys_adjtimex") {
* buf_time_tv_usec = __uget_timex_m($txc_p,10)
* buf_tick = __uget_timex_m($txc_p,11)
*/
- argstr = sprintf("%p", $txc_p)
+ // argstr = sprintf("%p", $txc_p)
+ asmlinkage()
+ argstr = sprintf("%p", pointer_arg(1))
}
probe nd_syscall.adjtimex.return = kernel.function("sys_adjtimex").return {
name = "adjtimex"
- retstr = _adjtimex_return_str($return)
+ // retstr = _adjtimex_return_str($return)
+ retstr = _adjtimex_return_str(returnval())
}
# long compat_sys_adjtimex(struct compat_timex __user *utp)
probe nd_syscall.compat_adjtimex = kernel.function("compat_sys_adjtimex") ? {
name = "compat_adjtimex"
- argstr = sprintf("%p", $utp)
+ // argstr = sprintf("%p", $utp)
+ asmlinkage()
+ argstr = sprintf("%p", pointer_arg(1))
}
probe nd_syscall.compat_adjtimex.return = kernel.function("compat_sys_adjtimex").return ? {
name = "compat_adjtimex"
@@ -147,8 +172,11 @@ probe nd_syscall.alarm =
kernel.function("sys32_alarm") ?
{
name = "alarm"
- seconds = $seconds
- argstr = sprint($seconds)
+ // seconds = $seconds
+ // argstr = sprint($seconds)
+ asmlinkage()
+ seconds = uint_arg(1)
+ argstr = sprint(seconds)
}
probe nd_syscall.alarm.return =
kernel.function("sys_alarm").return ?,
@@ -162,12 +190,19 @@ probe nd_syscall.alarm.return =
# long sys_bdflush(int func,long data)
probe nd_syscall.bdflush = kernel.function("sys_bdflush") ? {
name = "bdflush"
- func = $func
- data = $data
- if (($func>=2)&&($func%2==0))
- data_str = sprintf("%p", $data)
+ // func = $func
+ // data = $data
+ // if (($func>=2)&&($func%2==0))
+ // data_str = sprintf("%p", $data)
+ // else
+ // data_str = sprintf("%d", $data)
+ asmlinkage()
+ func = int_arg(1)
+ data = long_arg(2)
+ if ((func>=2)&&(func%2==0))
+ data_str = sprintf("%p", data)
else
- data_str = sprintf("%d", $data)
+ data_str = sprintf("%d", data)
argstr = sprintf("%d, %s",func, data_str)
}
probe nd_syscall.bdflush.return = kernel.function("sys_bdflush").return ? {
@@ -179,10 +214,15 @@ probe nd_syscall.bdflush.return = kernel.function("sys_bdflush").return ? {
# long sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen)
probe nd_syscall.bind = kernel.function("sys_bind") ? {
name = "bind"
- sockfd = $fd
- my_addr_uaddr = $umyaddr
- addrlen = $addrlen
- argstr = sprintf("%d, %s, %d", $fd, _struct_sockaddr_u($umyaddr,$addrlen),$addrlen)
+ // sockfd = $fd
+ // my_addr_uaddr = $umyaddr
+ // addrlen = $addrlen
+ // argstr = sprintf("%d, %s, %d", $fd, _struct_sockaddr_u($umyaddr,$addrlen),$addrlen)
+ asmlinkage()
+ sockfd = int_arg(1)
+ my_addr_uaddr = pointer_arg(2)
+ addrlen = int_arg(3)
+ argstr = sprintf("%d, %s, %d", sockfd, _struct_sockaddr_u(my_addr_uaddr,addrlen),addrlen)
}
probe nd_syscall.bind.return = kernel.function("sys_bind").return ? {
name = "bind"
@@ -196,7 +236,9 @@ probe nd_syscall.brk =
kernel.function("ia64_brk") ?
{
name = "brk"
- brk = $brk
+ // brk = $brk
+ asmlinkage()
+ brk = ulong_arg(1)
argstr = sprintf("%p", brk)
}
probe nd_syscall.brk.return =
@@ -222,9 +264,13 @@ probe nd_syscall.brk.return =
# long sys_capget(cap_user_header_t header, cap_user_data_t dataptr)
probe nd_syscall.capget = kernel.function("sys_capget") {
name = "capget"
- header_uaddr = $header
- data_uaddr = $dataptr
- argstr = sprintf("%p, %p", $header, $dataptr)
+ // header_uaddr = $header
+ // data_uaddr = $dataptr
+ // argstr = sprintf("%p, %p", $header, $dataptr)
+ asmlinkage()
+ header_uaddr = pointer_arg(1)
+ data_uaddr = pointer_arg(2)
+ argstr = sprintf("%p, %p", header_uaddr, data_uaddr)
}
probe nd_syscall.capget.return = kernel.function("sys_capget").return {
name = "capget"
@@ -245,9 +291,13 @@ probe nd_syscall.capget.return = kernel.function("sys_capget").return {
# long sys_capset(cap_user_header_t header, const cap_user_data_t data)
probe nd_syscall.capset = kernel.function("sys_capset") {
name = "capset"
- header_uaddr = $header
- data_uaddr = $data
- argstr = sprintf("%p, %p", $header, $data)
+ // header_uaddr = $header
+ // data_uaddr = $data
+ // argstr = sprintf("%p, %p", $header, $data)
+ asmlinkage()
+ header_uaddr = pointer_arg(1)
+ data_uaddr = pointer_arg(2)
+ argstr = sprintf("%p, %p", header_uaddr, data_uaddr)
}
probe nd_syscall.capset.return = kernel.function("sys_capset").return {
name = "capset"
@@ -258,8 +308,11 @@ probe nd_syscall.capset.return = kernel.function("sys_capset").return {
# long sys_chdir(const char __user * filename)
probe nd_syscall.chdir = kernel.function("sys_chdir") {
name = "chdir"
- path = user_string($filename)
- argstr = user_string_quoted($filename)
+ // path = user_string($filename)
+ // argstr = user_string_quoted($filename)
+ asmlinkage()
+ path = user_string(pointer_arg(1))
+ argstr = user_string_quoted(pointer_arg(1))
}
probe nd_syscall.chdir.return = kernel.function("sys_chdir").return {
name = "chdir"
@@ -270,9 +323,13 @@ probe nd_syscall.chdir.return = kernel.function("sys_chdir").return {
# long sys_chmod(const char __user * filename, mode_t mode)
probe nd_syscall.chmod = kernel.function("sys_chmod") {
name = "chmod"
- path = user_string($filename)
- mode = $mode
- argstr = sprintf("%s, %#o", user_string_quoted($filename), mode)
+ // path = user_string($filename)
+ // mode = $mode
+ // argstr = sprintf("%s, %#o", user_string_quoted($filename), mode)
+ asmlinkage()
+ path = user_string(pointer_arg(1))
+ mode = uint_arg(2)
+ argstr = sprintf("%s, %#o", user_string_quoted(pointer_arg(1)), mode)
}
probe nd_syscall.chmod.return = kernel.function("sys_chmod").return {
name = "chmod"
@@ -283,10 +340,15 @@ probe nd_syscall.chmod.return = kernel.function("sys_chmod").return {
# long sys_chown(const char __user * filename, uid_t user, gid_t group)
probe nd_syscall.chown = kernel.function("sys_chown") {
name = "chown"
- path = user_string($filename)
- owner = __int32($user)
- group = __int32($group)
- argstr = sprintf("%s, %d, %d",user_string_quoted($filename), owner, group)
+ // path = user_string($filename)
+ // owner = __int32($user)
+ // group = __int32($group)
+ // argstr = sprintf("%s, %d, %d",user_string_quoted($filename), owner, group)
+ asmlinkage()
+ path = user_string(pointer_arg(1))
+ owner = __int32(uint_arg(2))
+ group = __int32(uint_arg(3))
+ argstr = sprintf("%s, %d, %d",user_string_quoted(pointer_arg(1)), owner, group)
}
probe nd_syscall.chown.return = kernel.function("sys_chown").return {
name = "chown"
@@ -298,10 +360,15 @@ probe nd_syscall.chown.return = kernel.function("sys_chown").return {
#
probe nd_syscall.chown16 = kernel.function("sys_chown16") ? {
name = "chown16"
- path = user_string($filename)
- owner = __short($user)
- group = __short($group)
- argstr = sprintf("%s, %d, %d", user_string_quoted($filename), owner, group)
+ // path = user_string($filename)
+ // owner = __short($user)
+ // group = __short($group)
+ // argstr = sprintf("%s, %d, %d", user_string_quoted($filename), owner, group)
+ asmlinkage()
+ path = user_string(pointer_arg(1))
+ owner = __short(uint_arg(2))
+ group = __short(uint_arg(3))
+ argstr = sprintf("%s, %d, %d", user_string_quoted(pointer_arg(1)), owner, group)
}
probe nd_syscall.chown16.return = kernel.function("sys_chown16").return ? {
name = "chown16"
@@ -312,8 +379,11 @@ probe nd_syscall.chown16.return = kernel.function("sys_chown16").return ? {
# long sys_chroot(const char __user * filename)
probe nd_syscall.chroot = kernel.function("sys_chroot") {
name = "chroot"
- path = user_string($filename)
- argstr = user_string_quoted($filename)
+ // path = user_string($filename)
+ // argstr = user_string_quoted($filename)
+ asmlinkage()
+ path = user_string(pointer_arg(1))
+ argstr = user_string_quoted(pointer_arg(1))
}
probe nd_syscall.chroot.return = kernel.function("sys_chroot").return {
name = "chroot"
@@ -329,10 +399,15 @@ probe nd_syscall.clock_getres =
kernel.function("compat_clock_getres") ?
{
name = "clock_getres"
- clk_id = $which_clock
- clk_id_str = _get_wc_str($which_clock)
- res_uaddr = $tp
- argstr = sprintf("%s, %p", _get_wc_str($which_clock), $tp)
+ // clk_id = $which_clock
+ // clk_id_str = _get_wc_str($which_clock)
+ // res_uaddr = $tp
+ // argstr = sprintf("%s, %p", _get_wc_str($which_clock), $tp)
+ asmlinkage()
+ clk_id = int_arg(1)
+ clk_id_str = _get_wc_str(clk_id)
+ res_uaddr = pointer_arg(2)
+ argstr = sprintf("%s, %p", clk_id_str, res_uaddr)
}
probe nd_syscall.clock_getres.return =
kernel.function("sys_clock_getres").return,
@@ -349,9 +424,13 @@ probe nd_syscall.clock_gettime =
kernel.function("sys_clock_gettime")
{
name = "clock_gettime"
- clk_id = $which_clock
- clk_id_str = _get_wc_str($which_clock)
- argstr = sprintf("%s, %p", _get_wc_str($which_clock), $tp)
+ // clk_id = $which_clock
+ // clk_id_str = _get_wc_str($which_clock)
+ // argstr = sprintf("%s, %p", _get_wc_str($which_clock), $tp)
+ asmlinkage()
+ clk_id = int_arg(1)
+ clk_id_str = _get_wc_str(clk_id)
+ argstr = sprintf("%s, %p", clk_id_str, pointer_arg(2))
}
probe nd_syscall.clock_gettime.return = kernel.function("sys_clock_gettime").return
{
@@ -367,12 +446,20 @@ probe nd_syscall.clock_gettime.return = kernel.function("sys_clock_gettime").ret
#
probe nd_syscall.clock_nanosleep = kernel.function("sys_clock_nanosleep") {
name = "clock_nanosleep"
- if ($flags == 1)
+ // if ($flags == 1)
+ // flag_str = "TIMER_ABSTIME"
+ // else
+ // flag_str = sprintf("0x%x", $flags)
+ // argstr = sprintf("%s, %s, %s, %p", _get_wc_str($which_clock), flag_str,
+ // _struct_timespec_u($rqtp,1), $rmtp)
+ asmlinkage()
+ flags = int_arg(2)
+ if (flags == 1)
flag_str = "TIMER_ABSTIME"
else
- flag_str = sprintf("0x%x", $flags)
- argstr = sprintf("%s, %s, %s, %p", _get_wc_str($which_clock), flag_str,
- _struct_timespec_u($rqtp,1), $rmtp)
+ flag_str = sprintf("0x%x", flags)
+ argstr = sprintf("%s, %s, %s, %p", _get_wc_str(int_arg(1)), flag_str,
+ _struct_timespec_u(pointer_arg(3),1), pointer_arg(4))
}
probe nd_syscall.clock_nanosleep.return = kernel.function("sys_clock_nanosleep").return {
name = "clock_nanosleep"
@@ -389,12 +476,21 @@ probe nd_syscall.compat_clock_nanosleep =
kernel.function("compat_sys_clock_nanosleep") ?
{
name = "compat_clock_nanosleep"
- if ($flags == 1)
+ // if ($flags == 1)
+ // flag_str = "TIMER_ABSTIME"
+ // else
+ // flag_str = sprintf("0x%x", $flags)
+ // argstr = sprintf("%s, %s, %s, %p", _get_wc_str($which_clock), flag_str,
+ // _struct_compat_timespec_u($rqtp,1), $rmtp)
+ asmlinkage()
+ flags = int_arg(2)
+ if (flags == 1)
flag_str = "TIMER_ABSTIME"
else
- flag_str = sprintf("0x%x", $flags)
- argstr = sprintf("%s, %s, %s, %p", _get_wc_str($which_clock), flag_str,
- _struct_compat_timespec_u($rqtp,1), $rmtp)
+ flag_str = sprintf("0x%x", flags)
+ argstr = sprintf("%s, %s, %s, %p", _get_wc_str(int_arg(1)), flag_str,
+ _struct_compat_timespec_u(pointer_arg(3),1),
+ pointer_arg(4))
}
probe nd_syscall.compat_clock_nanosleep.return =
kernel.function("compat_clock_nanosleep").return ?,
@@ -410,10 +506,15 @@ probe nd_syscall.compat_clock_nanosleep.return =
#
probe nd_syscall.clock_settime = kernel.function("sys_clock_settime") {
name = "clock_settime"
- clk_id = $which_clock
- clk_id_str = _get_wc_str($which_clock)
- tp_uaddr = $tp
- argstr = sprintf("%s, %s", clk_id_str, _struct_timespec_u($tp,1))
+ // clk_id = $which_clock
+ // clk_id_str = _get_wc_str($which_clock)
+ // tp_uaddr = $tp
+ // argstr = sprintf("%s, %s", clk_id_str, _struct_timespec_u($tp,1))
+ asmlinkage()
+ clk_id = int_arg(1)
+ clk_id_str = _get_wc_str(clk_id)
+ tp_uaddr = pointer_arg(2)
+ argstr = sprintf("%s, %s", clk_id_str, _struct_timespec_u(tp_uaddr,1))
}
probe nd_syscall.clock_settime.return = kernel.function("sys_clock_settime").return {
name = "clock_settime"
@@ -437,10 +538,15 @@ probe nd_syscall.close.return = kernel.function("sys_close").return {
# long sys_connect(int fd, struct sockaddr __user *uservaddr, int addrlen)
probe nd_syscall.connect = kernel.function("sys_connect") ? {
name = "connect"
- sockfd = $fd
- serv_addr_uaddr = $uservaddr
- addrlen = $addrlen
- argstr = sprintf("%d, %s, %d", $fd, _struct_sockaddr_u($uservaddr,$addrlen),$addrlen)
+ // sockfd = $fd
+ // serv_addr_uaddr = $uservaddr
+ // addrlen = $addrlen
+ // argstr = sprintf("%d, %s, %d", $fd, _struct_sockaddr_u($uservaddr,$addrlen),$addrlen)
+ asmlinkage()
+ sockfd = int_arg(1)
+ serv_addr_uaddr = pointer_arg(2)
+ addrlen = int_arg(3)
+ argstr = sprintf("%d, %s, %d", sockfd, _struct_sockaddr_u(serv_addr_uaddr,addrlen),addrlen)
}
probe nd_syscall.connect.return = kernel.function("sys_connect").return ? {
name = "connect"
@@ -452,9 +558,12 @@ probe nd_syscall.connect.return = kernel.function("sys_connect").return ? {
probe nd_syscall.creat = kernel.function("sys_creat") ?
{
name = "creat"
- mode = $mode
- pathname = user_string($pathname)
- argstr = sprintf("%s, %#o", user_string_quoted($pathname), $mode)
+ // mode = $mode
+ // pathname = user_string($pathname)
+ // argstr = sprintf("%s, %#o", user_string_quoted($pathname), $mode)
+ mode = int_arg(2)
+ pathname = user_string(pointer_arg(1))
+ argstr = sprintf("%s, %#o", user_string_quoted(pointer_arg(1)), mode)
}
probe nd_syscall.creat.return = kernel.function("sys_creat").return ?
{
@@ -1128,18 +1237,32 @@ probe nd_syscall.ftruncate64.return = kernel.function("sys_ftruncate64").return
#
probe nd_syscall.futex = kernel.function("sys_futex") ? {
name = "futex"
- futex_uaddr = $uaddr
- op = $op
- val = $val
- utime_uaddr = $utime
- uaddr2_uaddr = $uaddr2
- val3 = $val3
+ // futex_uaddr = $uaddr
+ // op = $op
+ // val = $val
+ // utime_uaddr = $utime
+ // uaddr2_uaddr = $uaddr2
+ // val3 = $val3
+ // if (op == 0)
+ // argstr = sprintf("%p, %s, %d, %s", $uaddr, _futex_op_str($op),
+ // $val, _struct_timespec_u($utime,1))
+ // else
+ // argstr = sprintf("%p, %s, %d", $uaddr, _futex_op_str($op),
+ // $val)
+ asmlinkage()
+ futex_uaddr = pointer_arg(1)
+ op = int_arg(2)
+ val = u32_arg(3)
+ utime_uaddr = pointer_arg(4)
+ uaddr2_uaddr = pointer_arg(5)
+ val3 = u32_arg(6)
if (op == 0)
- argstr = sprintf("%p, %s, %d, %s", $uaddr, _futex_op_str($op),
- $val, _struct_timespec_u($utime,1))
+ argstr = sprintf("%p, %s, %d, %s", futex_uaddr,
+ _futex_op_str(op), val,
+ _struct_timespec_u(utime_uaddr,1))
else
- argstr = sprintf("%p, %s, %d", $uaddr, _futex_op_str($op),
- $val)
+ argstr = sprintf("%p, %s, %d", futex_uaddr,
+ _futex_op_str(op), val)
}
probe nd_syscall.futex.return = kernel.function("sys_futex").return ? {
name = "futex"
@@ -1147,18 +1270,32 @@ probe nd_syscall.futex.return = kernel.function("sys_futex").return ? {
}
probe nd_syscall.compat_futex = kernel.function("compat_sys_futex") ? {
name = "futex"
- futex_uaddr = $uaddr
- op = $op
- val = $val
- utime_uaddr = $utime
- uaddr2_uaddr = $uaddr2
- val3 = $val3
+ // futex_uaddr = $uaddr
+ // op = $op
+ // val = $val
+ // utime_uaddr = $utime
+ // uaddr2_uaddr = $uaddr2
+ // val3 = $val3
+ // if (op == 0)
+ // argstr = sprintf("%p, %s, %d, %s", $uaddr, _futex_op_str($op),
+ // $val, _struct_compat_timespec_u($utime,1))
+ // else
+ // argstr = sprintf("%p, %s, %d", $uaddr, _futex_op_str($op),
+ // $val)
+ asmlinkage()
+ futex_uaddr = pointer_arg(1)
+ op = int_arg(2)
+ val = u32_arg(3)
+ utime_uaddr = pointer_arg(4)
+ uaddr2_uaddr = pointer_arg(5)
+ val3 = u32_arg(6)
if (op == 0)
- argstr = sprintf("%p, %s, %d, %s", $uaddr, _futex_op_str($op),
- $val, _struct_compat_timespec_u($utime,1))
+ argstr = sprintf("%p, %s, %d, %s", futex_uaddr,
+ _futex_op_str(op), val,
+ _struct_compat_timespec_u(utime_uaddr,1))
else
- argstr = sprintf("%p, %s, %d", $uaddr, _futex_op_str($op),
- $val)
+ argstr = sprintf("%p, %s, %d", futex_uaddr,
+ _futex_op_str(op), val)
}
probe nd_syscall.compat_futex.return = kernel.function("compat_sys_futex").return ? {
name = "futex"
@@ -1542,17 +1679,29 @@ probe nd_syscall.getrlimit.return = kernel.function("sys_getrlimit").return,
# long sys_getrusage(int who, struct rusage __user *ru)
probe nd_syscall.getrusage = kernel.function("sys_getrusage") {
name = "getrusage"
- who = $who
- if($who==-2)
+ // who = $who
+ // if($who==-2)
+ // {
+ // # RUSAGE_BOTH is not valid argument for sys_getrusage
+ // who_str = sprintf("UNKNOWN VALUE: %d", $who)
+ // }
+ // else
+ // {
+ // who_str = _rusage_who_str($who)
+ // }
+ // usage_uaddr = $ru
+ asmlinkage()
+ who = int_arg(1)
+ if(who==-2)
{
# RUSAGE_BOTH is not valid argument for sys_getrusage
- who_str = sprintf("UNKNOWN VALUE: %d", $who)
+ who_str = sprintf("UNKNOWN VALUE: %d", who)
}
else
{
- who_str = _rusage_who_str($who)
+ who_str = _rusage_who_str(who)
}
- usage_uaddr = $ru
+ usage_uaddr = pointer_arg(2)
argstr = sprintf("%s, %p", who_str, usage_uaddr)
}
probe nd_syscall.getrusage.return = kernel.function("sys_getrusage").return {
@@ -2561,16 +2710,28 @@ probe nd_syscall.mq_open =
kernel.function("compat_sys_mq_open") ?
{
name = "mq_open"
- name_uaddr = $u_name
- filename = user_string($u_name)
- mode = $mode
- u_attr_uaddr = $u_attr
- oflag = $oflag
+ // name_uaddr = $u_name
+ // filename = user_string($u_name)
+ // mode = $mode
+ // u_attr_uaddr = $u_attr
+ // oflag = $oflag
+ // if (oflag & 64)
+ // argstr = sprintf("%s, %s, %#o, %p", user_string_quoted($u_name),
+ // _sys_open_flag_str($oflag), $mode, $u_attr)
+ // else
+ // argstr = sprintf("%s, %s", user_string_quoted($u_name), _sys_open_flag_str($oflag))
+ asmlinkage()
+ name_uaddr = pointer_arg(1)
+ filename = user_string(name_uaddr)
+ mode = uint_arg(3)
+ u_attr_uaddr = pointer_arg(4)
+ oflag = int_arg(2)
if (oflag & 64)
- argstr = sprintf("%s, %s, %#o, %p", user_string_quoted($u_name),
- _sys_open_flag_str($oflag), $mode, $u_attr)
+ argstr = sprintf("%s, %s, %#o, %p",
+ user_string_quoted(name_uaddr),
+ _sys_open_flag_str(oflag), mode, u_attr_uaddr)
else
- argstr = sprintf("%s, %s", user_string_quoted($u_name), _sys_open_flag_str($oflag))
+ argstr = sprintf("%s, %s", user_string_quoted(name_uaddr), _sys_open_flag_str(oflag))
}
probe nd_syscall.mq_open.return =
kernel.function("sys_mq_open").return ?,
diff --git a/tapset/x86_64/registers.stp b/tapset/x86_64/registers.stp
index 45acddd1..a5aba55a 100644
--- a/tapset/x86_64/registers.stp
+++ b/tapset/x86_64/registers.stp
@@ -1,18 +1,93 @@
-/* Return the named register value as a signed value. */
-function register:long (name:string) %{ /* pure */
- int reg32 = 0;
- THIS->__retvalue = (int64_t) _stp_get_reg64_by_name(THIS->name,
- CONTEXT->regs, &reg32);
- if (reg32)
- THIS->__retvalue = _stp_sign_extend32(THIS->__retvalue);
+global _reg_offsets, _r32_offsets, _stp_regs_registered
+
+function _stp_register_regs() {
+ /* Same order as pt_regs */
+ _reg_offsets["r15"] = 0
+ _reg_offsets["r14"] = 8
+ _reg_offsets["r13"] = 16
+ _reg_offsets["r12"] = 24
+ _reg_offsets["rbp"] = 32 _reg_offsets["bp"] = 32
+ _reg_offsets["rbx"] = 40 _reg_offsets["bx"] = 40
+ _reg_offsets["r11"] = 48
+ _reg_offsets["r10"] = 56
+ _reg_offsets["r9"] = 64
+ _reg_offsets["r8"] = 72
+ _reg_offsets["rax"] = 80 _reg_offsets["ax"] = 80
+ _reg_offsets["rcx"] = 88 _reg_offsets["cx"] = 88
+ _reg_offsets["rdx"] = 96 _reg_offsets["dx"] = 96
+ _reg_offsets["rsi"] = 104 _reg_offsets["si"] = 104
+ _reg_offsets["rdi"] = 112 _reg_offsets["di"] = 112
+ _reg_offsets["orig_rax"] = 120 _reg_offsets["orig_ax"] = 120
+ _reg_offsets["rip"] = 128 _reg_offsets["ip"] = 128
+ _reg_offsets["xcs"] = 136 _reg_offsets["cs"] = 136
+ _reg_offsets["eflags"] = 144 _reg_offsets["flags"] = 144
+ _reg_offsets["rsp"] = 152 _reg_offsets["sp"] = 152
+ _reg_offsets["xss"] = 160 _reg_offsets["ss"] = 160
+
+ _r32_offsets["ebp"] = 32
+ _r32_offsets["ebx"] = 40
+ _r32_offsets["eax"] = 80
+ _r32_offsets["ecx"] = 88
+ _r32_offsets["edx"] = 96
+ _r32_offsets["esi"] = 104
+ _r32_offsets["edi"] = 112
+ _r32_offsets["orig_eax"] = 120
+ _r32_offsets["eip"] = 128
+ _r32_offsets["esp"] = 152
+
+ _stp_regs_registered = 1
+}
+
+function _stp_get_register_by_offset:long (offset:long) %{
+ long value;
+ memcpy(&value, ((char *)CONTEXT->regs) + THIS->offset, sizeof(value));
+ THIS->__retvalue = value;
%}
-/* Return the named register value as an unsigned value. */
-function u_register:long (name:string) %{
- THIS->__retvalue = (int64_t) _stp_get_reg64_by_name(THIS->name,
- CONTEXT->regs, NULL);
+/*
+ * _stp_sign_extend32() is callable from a script function.
+ * __stp_sign_extend32() (in regs.c) is callable from a C function.
+ */
+function _stp_sign_extend32:long (value:long) %{
+ THIS->__retvalue = __stp_sign_extend32(THIS->value);
%}
+function _stp_register:long (name:string, sign_extend:long) {
+ reg32 = 0
+ if (!_stp_regs_registered)
+ _stp_register_regs()
+ offset = _reg_offsets[name]
+ if (offset == 0 && !(name in _reg_offsets)) {
+ offset = _r32_offsets[name]
+ if (offset == 0 && !(name in _r32_offsets)) {
+ error("Unknown register: " . name)
+ return 0
+ }
+ reg32 = 1
+ }
+ value = _stp_get_register_by_offset(offset)
+ if (reg32) {
+ if (sign_extend)
+ value = _stp_sign_extend32(value)
+ else
+ value &= 0xffffffff
+ }
+ return value
+}
+
+/* Return the named register value as a signed value. */
+function register:long (name:string) {
+ return _stp_register(name, 1)
+}
+
+/*
+ * Return the named register value as an unsigned value. Specifically,
+ * don't sign-extend the register value when promoting it to 64 bits.
+ */
+function u_register:long (name:string) {
+ return _stp_register(name, 0)
+}
+
/*
* Return the value of function arg #argnum (1=first arg).
* If truncate=1, mask off the top 32 bits.
@@ -68,7 +143,7 @@ function _stp_arg:long (argnum:long, sign_extend:long, truncate:long) %{
}
if (THIS->truncate || argsz == sizeof(int)) {
if (THIS->sign_extend)
- THIS->__retvalue = (int64_t) _stp_sign_extend32(val);
+ THIS->__retvalue = (int64_t) __stp_sign_extend32(val);
else
/* High bits may be garbage. */
THIS->__retvalue = (int64_t) (val & 0xffffffff);