diff options
Diffstat (limited to 'tapset/syscalls.stp')
-rw-r--r-- | tapset/syscalls.stp | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/tapset/syscalls.stp b/tapset/syscalls.stp index 500aff1a..3a239245 100644 --- a/tapset/syscalls.stp +++ b/tapset/syscalls.stp @@ -848,6 +848,37 @@ probe syscall.flock.return = kernel.function("sys_flock").return { retstr = returnstr(1) } +function __is_user_regs:long (regs:long) %{ /* pure */ + struct pt_regs * regs = (void *)((unsigned long)THIS->regs); +/* copied from asm/ptrace.h */ +#if defined(__i386__) +#ifdef STAPCONF_X86_UNIREGS + int cs = kread(®s->cs); +#else + int cs = kread(®s->xcs); +#endif + THIS->__retvalue = ((cs & SEGMENT_RPL_MASK) == USER_RPL); +#elif defined(__x86_64__) + unsigned long cs = kread(®s->cs); + THIS->__retvalue = (!!((cs & 3))); +#elif defined(__ia64__) + unsigned long psr = kread(®s->cr_ipsr); + THIS->__retvalue = (((struct ia64_psr *) &psr)->cpl != 0); +#elif defined(__powerpc64__) + unsigned long msr = kread(®s->msr); + THIS->__retvalue = ((msr >> MSR_PR_LG) & 0x1); +#elif defined(__arm__) + long cpsr = kread(®s->ARM_cpsr); + THIS->__retvalue = ((cpsr & 0xf) == 0); +#elif defined(__s390__) || defined(__s390x__) + unsigned long mask = kread(®s->psw.mask); + THIS->__retvalue = ((mask & PSW_MASK_PSTATE) != 0); +#else +#error "Unimplemented architecture" +#endif +CATCH_DEREF_FAULT(); +%} + # fork _______________________________________________________ # long do_fork(unsigned long clone_flags, # unsigned long stack_start, @@ -863,7 +894,7 @@ probe syscall.fork = kernel.function("do_fork") { parent_tid_uaddr = $parent_tidptr child_tid_uaddr = $child_tidptr - if (stack_start == 0) { + if (!__is_user_regs(regs)) { name = "fork_kernel_thread" argstr = __fork_flags(clone_flags) } else if (clone_flags == 17) |