#ifndef __NR_ia32_readlinkat
#define __NR_ia32_readlinkat 305
#endif
+#ifndef __NR_ia32_rt_sigprocmask
+#define __NR_ia32_rt_sigprocmask 175
+#endif
#ifndef __NR_ia32_symlinkat
#define __NR_ia32_symlinkat 304
#endif
#define __NR_compat_linkat __NR_ia32_linkat
#define __NR_compat_pipe2 __NR_ia32_pipe2
#define __NR_compat_readlinkat __NR_ia32_readlinkat
+#define __NR_compat_rt_sigprocmask __NR_ia32_rt_sigprocmask
#define __NR_compat_symlinkat __NR_ia32_symlinkat
#define __NR_compat_umount2 __NR_ia32_umount2
#define __NR_compat_linkat __NR_linkat
#define __NR_compat_pipe2 __NR_pipe2
#define __NR_compat_readlinkat __NR_readlinkat
+#define __NR_compat_rt_sigprocmask __NR_rt_sigprocmask
#define __NR_compat_symlinkat __NR_symlinkat
#define __NR_compat_umount2 __NR_umount2
STAP_RETVALUE = (int32_t)STAP_ARG_val;
%}
+function __uint32:long(val:long) %{ /* pure */
+ STAP_RETVALUE = (uint32_t)STAP_ARG_val;
+%}
+
/* Unsigned values can get get sign-extended and become negative. */
function __ulong:long(val:long) %{ /* pure */
STAP_RETVALUE = (unsigned long)STAP_ARG_val;
#
probe nd_syscall.rt_sigprocmask = kprobe.function("sys_rt_sigprocmask") ?
{
+%( arch != "x86_64" || kernel_v < "3.4" || CONFIG_COMPAT != "y" %?
+ // In kernels < 3.4, a 32-bit rt_sigprocmask call goes through
+ // sys32_rt_sigprocmask().
+ @__syscall_gate(%{ __NR_rt_sigprocmask %})
+%)
name = "rt_sigprocmask"
// how = $how
// how_str = _sigprocmask_how_str($how)
how = int_arg(1)
how_str = _sigprocmask_how_str(how)
set_uaddr = pointer_arg(2)
- oldset_uaddr = pointer_arg(3)
- argstr = sprintf("%s, [%s], %p, %d", how_str,
- _stp_sigset_u(set_uaddr), oldset_uaddr, uint_arg(4))
+
+ // In kernels 3.4+, the following kernel commit changed the
+ // way rt_sigprocmask is handled on x86:
+ //
+ // commit 2c73ce734653f96542a070f3c3b3e3d1cd0fba02
+ // Author: H. Peter Anvin <hpa@zytor.com>
+ // Date: Sun Feb 19 09:48:01 2012 -0800
+ //
+ // x86-64, ia32: Drop sys32_rt_sigprocmask
+ //
+ // On those kernels, a call to the 32-bit rt_sigprocmask goes
+ // straight to the 64-bit rt_sigprocmask function.
+%( arch == "x86_64" && kernel_v >= "3.4" && CONFIG_COMPAT == "y" %?
+ if (%{ _stp_is_compat_task() %}
+ && _stp_syscall_nr() == %{ __NR_compat_rt_sigprocmask %}) {
+ oldset_uaddr = uint_arg(3)
+ argstr = sprintf("%s, [%s], %p, %d", how_str,
+ _stp_compat_sigset_u(set_uaddr), oldset_uaddr,
+ int_arg(4))
+ }
+ else
+%)
+ {
+ oldset_uaddr = pointer_arg(3)
+ argstr = sprintf("%s, [%s], %p, %d", how_str,
+ _stp_sigset_u(set_uaddr), oldset_uaddr,
+ uint_arg(4))
+ }
}
probe nd_syscall.rt_sigprocmask.return =
kprobe.function("sys_rt_sigprocmask").return ?
{
+%( arch != "x86_64" || kernel_v < "3.4" || CONFIG_COMPAT != "y" %?
+ @__syscall_gate(%{ __NR_rt_sigprocmask %})
+%)
name = "rt_sigprocmask"
retstr = returnstr(1)
}
#
probe syscall.rt_sigprocmask = kernel.function("sys_rt_sigprocmask").call ?
{
+%( arch != "x86_64" || kernel_v < "3.4" || CONFIG_COMPAT != "y" %?
+ // In kernels < 3.4, a 32-bit rt_sigprocmask call goes through
+ // sys32_rt_sigprocmask().
+ @__syscall_gate(%{ __NR_rt_sigprocmask %})
+%)
name = "rt_sigprocmask"
how = $how
how_str = _sigprocmask_how_str($how)
set_uaddr = @choose_defined($set, $nset)
- oldset_uaddr = $oset
- argstr = sprintf("%s, [%s], %p, %d", how_str, _stp_sigset_u(set_uaddr),
- $oset, $sigsetsize)
+
+ // In kernels 3.4+, the following kernel commit changed the
+ // way rt_sigprocmask is handled on x86:
+ //
+ // commit 2c73ce734653f96542a070f3c3b3e3d1cd0fba02
+ // Author: H. Peter Anvin <hpa@zytor.com>
+ // Date: Sun Feb 19 09:48:01 2012 -0800
+ //
+ // x86-64, ia32: Drop sys32_rt_sigprocmask
+ //
+ // On those kernels, a call to the 32-bit rt_sigprocmask goes
+ // straight to the 64-bit rt_sigprocmask function.
+%( arch == "x86_64" && kernel_v >= "3.4" && CONFIG_COMPAT == "y" %?
+ if (%{ _stp_is_compat_task() %}
+ && _stp_syscall_nr() == %{ __NR_compat_rt_sigprocmask %}) {
+ oldset_uaddr = __uint32($oset)
+ argstr = sprintf("%s, [%s], %p, %d", how_str,
+ _stp_compat_sigset_u(set_uaddr), oldset_uaddr,
+ __int32($sigsetsize))
+ }
+ else
+%)
+ {
+ oldset_uaddr = $oset
+ argstr = sprintf("%s, [%s], %p, %d", how_str,
+ _stp_sigset_u(set_uaddr), $oset, $sigsetsize)
+ }
}
probe syscall.rt_sigprocmask.return =
kernel.function("sys_rt_sigprocmask").return ?
{
+%( arch != "x86_64" || kernel_v < "3.4" || CONFIG_COMPAT != "y" %?
+ @__syscall_gate(%{ __NR_rt_sigprocmask %})
+%)
name = "rt_sigprocmask"
retstr = return_str(1, $return)
}