From d5a2b9eb797dee4458911f38f273af5906670f06 Mon Sep 17 00:00:00 2001 From: Martin Cermak Date: Thu, 22 Dec 2016 13:07:21 +0100 Subject: [PATCH] PR20333/accept --- tapset/linux/nd_syscalls.stp | 99 -------------------------- tapset/linux/sysc_accept.stp | 134 +++++++++++++++++++++++++++++++++++ tapset/linux/syscalls.stp | 84 ---------------------- 3 files changed, 134 insertions(+), 183 deletions(-) create mode 100644 tapset/linux/sysc_accept.stp diff --git a/tapset/linux/nd_syscalls.stp b/tapset/linux/nd_syscalls.stp index 26ebdd305..7530a77fe 100644 --- a/tapset/linux/nd_syscalls.stp +++ b/tapset/linux/nd_syscalls.stp @@ -1,102 +1,3 @@ -// syscalls tapset part 1 [A-M] -// Copyright (C) 2005 IBM Corp. -// Copyright (C) 2005-2014 Red Hat Inc. -// Copyright (C) 2007 Quentin Barnes. -// -// 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. - -/* - * 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. - */ - - -/* Each syscall returns the calls parameters. In addition, the following -* variables are set: -* -* name - generally the syscall name minus the "sys_". -* -* argstr - a string containing the decoded args in an easy-to-read format. -* It doesn't need to contain everything, but should have all the -* important args. Set in entry probes only. Values enclosed in -* square brackets are user-space pointers. Values in curly -* braces are decoded structs. -* -* retstr - a string containing the return value in an easy-to-read format. -* Set in return probes only. -*/ - - -# accept _____________________________________________________ -# long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr, -# int __user *upeer_addrlen) -# -probe nd_syscall.accept = __nd_syscall.accept ?, - __nd_syscall.socketcall.accept ?, - __nd_syscall.compat_socketcall.accept ? -{ - name = "accept" -%(systemtap_v <= "2.5" %? - # systemtap <= 2.5 combined accept and accept4 - flags = 0 - flags_str = "0x0" -# 'flag_str should have been 'flags_str'. Deprecate the old name. -%(systemtap_v <= "1.4" %? - flag_str = "0x0" -%) - argstr = sprintf("%d, %p, %p, %s", sockfd, addr_uaddr, addrlen_uaddr, - flags_str) -%: - argstr = sprintf("%d, %p, %p", sockfd, addr_uaddr, addrlen_uaddr) -%) -} -probe __nd_syscall.accept = kprobe.function("sys_accept").call -{ - asmlinkage() - @__syscall_gate(@const("__NR_accept")) - sockfd = int_arg(1) - addr_uaddr = pointer_arg(2) - addrlen_uaddr = pointer_arg(3) -} -probe __nd_syscall.socketcall.accept = kprobe.function("sys_socketcall").call ? -{ - asmlinkage() - if (int_arg(1) != @const("SYS_ACCEPT")) next; - __args = &@cast(pointer_arg(2), "ulong", "kernel") - sockfd = __int32(user_ulong(&(__args)[0])) - addr_uaddr = user_ulong(&(__args)[1]) - addrlen_uaddr = user_ulong(&(__args)[2]) -} -probe __nd_syscall.compat_socketcall.accept = - kprobe.function("compat_sys_socketcall").call ? -{ - asmlinkage() - if (int_arg(1) != @const("SYS_ACCEPT")) next; - __args = &@cast(pointer_arg(2), "unsigned int", "kernel") - sockfd = user_int(&(__args)[0]) - addr_uaddr = user_uint32(&(__args)[1]) - addrlen_uaddr = user_uint32(&(__args)[2]) -} -probe nd_syscall.accept.return = __nd_syscall.accept.return ?, - __nd_syscall.socketcall.accept.return ? -{ - name = "accept" - retstr = returnstr(1) -} -probe __nd_syscall.accept.return = kprobe.function("sys_accept").return ? -{ - @__syscall_gate(@const("__NR_accept")) -} -probe __nd_syscall.socketcall.accept.return = - kprobe.function("sys_socketcall").return ?, - kprobe.function("compat_sys_socketcall").return ? -{ - if (@entry(__asmlinkage_int_arg(1)) != @const("SYS_ACCEPT")) next; -} # accept4 ____________________________________________________ # diff --git a/tapset/linux/sysc_accept.stp b/tapset/linux/sysc_accept.stp new file mode 100644 index 000000000..3f5243387 --- /dev/null +++ b/tapset/linux/sysc_accept.stp @@ -0,0 +1,134 @@ +# accept _____________________________________________________ +# +# asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr, +# int __user *upeer_addrlen) +# + +@define _SYSCALL_ACCEPT_NAME +%( + name = "accept" +%) + +@define _SYSCALL_ACCEPT_ARGSTR +%( + argstr = sprintf("%d, %p, %p", sockfd, addr_uaddr, addrlen_uaddr) +%) + +probe syscall.accept = dw_syscall.accept !, nd_syscall.accept {} +probe syscall.accept.return = dw_syscall.accept.return !, nd_syscall.accept.return {} + +# dw_accept _____________________________________________________ + +probe dw_syscall.accept = __syscall.accept ?, __syscall.socketcall.accept ?, + __syscall.compat_socketcall.accept ? +{ + @_SYSCALL_ACCEPT_NAME +%(systemtap_v <= "2.5" %? + # systemtap <= 2.5 combined accept and accept4 + flags = 0 + flags_str = "0x0" + argstr = sprintf("%d, %p, %p, %s", sockfd, addr_uaddr, addrlen_uaddr, + flags_str) +%: + @_SYSCALL_ACCEPT_ARGSTR +%) +} +probe __syscall.accept = kernel.function("sys_accept").call +{ + @__syscall_gate(@const("__NR_accept")) + sockfd = __int32($fd) + addr_uaddr = $upeer_sockaddr + addrlen_uaddr = $upeer_addrlen +} +probe __syscall.socketcall.accept = kernel.function("sys_socketcall").call ? +{ + if ($call != @const("SYS_ACCEPT")) next; + sockfd = __int32(user_ulong(&@cast($args, "ulong")[0])) + addr_uaddr = user_ulong(&@cast($args, "ulong")[1]) + addrlen_uaddr = user_ulong(&@cast($args, "ulong")[2]) +} +probe __syscall.compat_socketcall.accept = + kernel.function("compat_sys_socketcall").call ? +{ + if ($call != @const("SYS_ACCEPT")) next; + sockfd = user_int(&@cast($args, "unsigned int")[0]) + addr_uaddr = user_uint32(&@cast($args, "unsigned int")[1]) + addrlen_uaddr = user_uint32(&@cast($args, "unsigned int")[2]) +} +probe dw_syscall.accept.return = __syscall.accept.return ?, + __syscall.socketcall.accept.return ? +{ + @_SYSCALL_ACCEPT_NAME + retstr = return_str(1, $return) +} +probe __syscall.accept.return = kernel.function("sys_accept").return ? +{ + @__syscall_gate(@const("__NR_accept")) +} +probe __syscall.socketcall.accept.return = + kernel.function("sys_socketcall").return ?, + kernel.function("compat_sys_socketcall").return ? +{ + if (@entry($call) != @const("SYS_ACCEPT")) next; +} + +# nd_accept _____________________________________________________ + +probe nd_syscall.accept = __nd_syscall.accept ?, + __nd_syscall.socketcall.accept ?, + __nd_syscall.compat_socketcall.accept ? +{ + @_SYSCALL_ACCEPT_NAME +%(systemtap_v <= "2.5" %? + # systemtap <= 2.5 combined accept and accept4 + flags = 0 + flags_str = "0x0" + argstr = sprintf("%d, %p, %p, %s", sockfd, addr_uaddr, addrlen_uaddr, + flags_str) +%: + @_SYSCALL_ACCEPT_ARGSTR +%) +} +probe __nd_syscall.accept = kprobe.function("sys_accept").call +{ + asmlinkage() + @__syscall_gate(@const("__NR_accept")) + sockfd = int_arg(1) + addr_uaddr = pointer_arg(2) + addrlen_uaddr = pointer_arg(3) +} +probe __nd_syscall.socketcall.accept = kprobe.function("sys_socketcall").call ? +{ + asmlinkage() + if (int_arg(1) != @const("SYS_ACCEPT")) next; + __args = &@cast(pointer_arg(2), "ulong", "kernel") + sockfd = __int32(user_ulong(&(__args)[0])) + addr_uaddr = user_ulong(&(__args)[1]) + addrlen_uaddr = user_ulong(&(__args)[2]) +} +probe __nd_syscall.compat_socketcall.accept = + kprobe.function("compat_sys_socketcall").call ? +{ + asmlinkage() + if (int_arg(1) != @const("SYS_ACCEPT")) next; + __args = &@cast(pointer_arg(2), "unsigned int", "kernel") + sockfd = user_int(&(__args)[0]) + addr_uaddr = user_uint32(&(__args)[1]) + addrlen_uaddr = user_uint32(&(__args)[2]) +} +probe nd_syscall.accept.return = __nd_syscall.accept.return ?, + __nd_syscall.socketcall.accept.return ? +{ + @_SYSCALL_ACCEPT_NAME + retstr = returnstr(1) +} +probe __nd_syscall.accept.return = kprobe.function("sys_accept").return ? +{ + @__syscall_gate(@const("__NR_accept")) +} +probe __nd_syscall.socketcall.accept.return = + kprobe.function("sys_socketcall").return ?, + kprobe.function("compat_sys_socketcall").return ? +{ + if (@entry(__asmlinkage_int_arg(1)) != @const("SYS_ACCEPT")) next; +} diff --git a/tapset/linux/syscalls.stp b/tapset/linux/syscalls.stp index f247d41ad..5f00e963c 100644 --- a/tapset/linux/syscalls.stp +++ b/tapset/linux/syscalls.stp @@ -1,87 +1,3 @@ -// syscalls tapset part 1 [A-M] -// Copyright (C) 2005 IBM Corp. -// Copyright (C) 2005-2014 Red Hat Inc. -// Copyright (C) 2007 Quentin Barnes. -// -// 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. - - -/* Each syscall returns the calls parameters. In addition, the following -* variables are set: -* -* name - generally the syscall name minus the "sys_". -* -* argstr - a string containing the decoded args in an easy-to-read format. -* It doesn't need to contain everything, but should have all the -* important args. Set in entry probes only. Values enclosed in -* square brackets are user-space pointers. Values in curly -* braces are decoded structs. -* -* retstr - a string containing the return value in an easy-to-read format. -* Set in return probes only. -*/ - - -# accept _____________________________________________________ -# -# asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr, -# int __user *upeer_addrlen) -# -probe syscall.accept = __syscall.accept ?, __syscall.socketcall.accept ?, - __syscall.compat_socketcall.accept ? -{ - name = "accept" -%(systemtap_v <= "2.5" %? - # systemtap <= 2.5 combined accept and accept4 - flags = 0 - flags_str = "0x0" - argstr = sprintf("%d, %p, %p, %s", sockfd, addr_uaddr, addrlen_uaddr, - flags_str) -%: - argstr = sprintf("%d, %p, %p", sockfd, addr_uaddr, addrlen_uaddr) -%) -} -probe __syscall.accept = kernel.function("sys_accept").call -{ - @__syscall_gate(@const("__NR_accept")) - sockfd = __int32($fd) - addr_uaddr = $upeer_sockaddr - addrlen_uaddr = $upeer_addrlen -} -probe __syscall.socketcall.accept = kernel.function("sys_socketcall").call ? -{ - if ($call != @const("SYS_ACCEPT")) next; - sockfd = __int32(user_ulong(&@cast($args, "ulong")[0])) - addr_uaddr = user_ulong(&@cast($args, "ulong")[1]) - addrlen_uaddr = user_ulong(&@cast($args, "ulong")[2]) -} -probe __syscall.compat_socketcall.accept = - kernel.function("compat_sys_socketcall").call ? -{ - if ($call != @const("SYS_ACCEPT")) next; - sockfd = user_int(&@cast($args, "unsigned int")[0]) - addr_uaddr = user_uint32(&@cast($args, "unsigned int")[1]) - addrlen_uaddr = user_uint32(&@cast($args, "unsigned int")[2]) -} -probe syscall.accept.return = __syscall.accept.return ?, - __syscall.socketcall.accept.return ? -{ - name = "accept" - retstr = return_str(1, $return) -} -probe __syscall.accept.return = kernel.function("sys_accept").return ? -{ - @__syscall_gate(@const("__NR_accept")) -} -probe __syscall.socketcall.accept.return = - kernel.function("sys_socketcall").return ?, - kernel.function("compat_sys_socketcall").return ? -{ - if (@entry($call) != @const("SYS_ACCEPT")) next; -} # accept4 ____________________________________________________ # -- 2.43.5