diff options
Diffstat (limited to 'tapset/aux_syscalls.stp')
-rw-r--r-- | tapset/aux_syscalls.stp | 315 |
1 files changed, 193 insertions, 122 deletions
diff --git a/tapset/aux_syscalls.stp b/tapset/aux_syscalls.stp index 9892e118..5f29b8ca 100644 --- a/tapset/aux_syscalls.stp +++ b/tapset/aux_syscalls.stp @@ -1,3 +1,190 @@ +# +# Given a userspace pointer to a timeval, +# copy and decode it and return a string. +# +function _struct_timeval_u:string(uaddr:long) +%{ + struct timeval tv; + char *ptr = (char *)(unsigned long)THIS->uaddr; + + if (ptr == NULL) + strlcpy (THIS->__retvalue, "NULL", MAXSTRINGLEN); + else { + if(_stp_copy_from_user(&tv,ptr,sizeof(struct timeval)) == 0) + snprintf(THIS->__retvalue, MAXSTRINGLEN, "[%d.%06d]", tv.tv_sec, tv.tv_usec); + else + strlcpy (THIS->__retvalue, "UNKNOWN", MAXSTRINGLEN); + } +%} + +function _struct_timeval:string(addr:long) +%{ + struct timeval tv; + char *ptr = (char *)(unsigned long)THIS->addr; + + if (ptr == NULL) + strlcpy (THIS->__retvalue, "NULL", MAXSTRINGLEN); + else + snprintf(THIS->__retvalue, MAXSTRINGLEN, "[%d.%06d]", tv.tv_sec, tv.tv_usec); +%} + +function _struct_timespec_u:string(uaddr:long) +%{ + struct timespec ts; + char *ptr = (char *)(unsigned long)THIS->uaddr; + + if (ptr == NULL) + strlcpy (THIS->__retvalue, "NULL", MAXSTRINGLEN); + else { + if(_stp_copy_from_user((char *)&ts,ptr,sizeof(struct timespec))) { + strlcpy (THIS->__retvalue, "UNKNOWN", MAXSTRINGLEN); + } else + snprintf(THIS->__retvalue, MAXSTRINGLEN, "[%ld.%09ld]", + (unsigned long)ts.tv_sec, (unsigned long)ts.tv_nsec); + } +%} + +function _struct_timespec:string(addr:long) +%{ + struct timespec ts; + char *ptr = (char *)(unsigned long)THIS->addr; + + if (ptr == NULL) + strlcpy (THIS->__retvalue, "NULL", MAXSTRINGLEN); + else + snprintf(THIS->__retvalue, MAXSTRINGLEN, "[%ld.%09ld]", + (unsigned long)ts.tv_sec, (unsigned long)ts.tv_nsec); +%} + +function _struct_itimerval_u:string(uaddr:long) +%{ + struct itimerval itv; + char *ptr = (char *)(unsigned long)THIS->uaddr; + + if (ptr == NULL) + strlcpy (THIS->__retvalue, "NULL", MAXSTRINGLEN); + else { + if(_stp_copy_from_user((char *)&itv,ptr,sizeof(struct itimerval))) + strlcpy (THIS->__retvalue, "UNKNOWN", MAXSTRINGLEN); + else + snprintf(THIS->__retvalue, MAXSTRINGLEN, "[%d.%06d,%d.%06d]", + (int)itv.it_interval.tv_sec, (int)itv.it_interval.tv_usec, + (int)itv.it_value.tv_sec, (int)itv.it_value.tv_usec); + } +%} + +function _struct_itimerval:string(addr:long) +%{ + struct itimerval itv; + char *ptr = (char *)(unsigned long)THIS->addr; + + if (ptr == NULL) + strlcpy (THIS->__retvalue, "NULL", MAXSTRINGLEN); + else { + snprintf(THIS->__retvalue, MAXSTRINGLEN, "[%d.%06d,%d.%06d]", + (int)itv.it_interval.tv_sec, (int)itv.it_interval.tv_usec, + (int)itv.it_value.tv_sec, (int)itv.it_value.tv_usec); + } +%} + + +function _signal_name:string(sig:long) +%{ + int sig = THIS->sig; + char *res = 0; + + switch(sig) { + case 0: + res = "NO_SIGNAL"; + break; + case SIGHUP: + res = "SIGHUP"; + break; + case SIGINT: + res = "SIGINT"; + break; + case SIGQUIT: + res = "SIGQUIT"; + break; + case SIGILL: + res = "SIGILL"; + break; + case SIGTRAP: + res = "SIGTRAP"; + break; + case SIGABRT: + res = "SIGABRT"; + break; + case SIGBUS: + res = "SIGBUS"; + break; + case SIGFPE: + res = "SIGFPE"; + break; + case SIGKILL: + res = "SIGKILL"; + break; + case SIGUSR1: + res = "SIGUSR1"; + break; + case SIGSEGV: + res = "SIGSEGV"; + break; + case SIGPIPE: + res = "SIGPIPE"; + break; + case SIGUSR2: + res = "SIGUSR2"; + break; + case SIGALRM: + res = "SIGALRM"; + break; + case SIGTERM: + res = "SIGTERM"; + break; + case SIGCHLD: + res = "SIGCHLD"; + break; + case SIGCONT: + res = "SIGCONT"; + break; + case SIGSTOP: + res = "SIGSTOP"; + break; + case SIGTSTP: + res = "SIGTSTP"; + break; + case SIGTTIN: + res = "SIGTTIN"; + break; + case SIGTTOU: + res = "SIGTTOU"; + break; + case SIGURG: + res = "SIGURG"; + break; + case SIGPROF: + res = "SIGPROF"; + break; + case SIGWINCH: + res = "SIGWINCH"; + break; + case SIGVTALRM: + res = "SIGVTALRM"; + break; + case SIGIO: + res = "SIGIO/SIGPOLL"; + break; + case SIGPWR: + res = "SIGPWR"; + break; + } + if (res) + strlcpy (THIS->__retvalue, res, MAXSTRINGLEN); + else + snprintf(THIS->__retvalue, MAXSTRINGLEN, "%d", sig); +%} + function __fork_flags:string(flags:long) %{ long flags = THIS->flags; @@ -103,79 +290,6 @@ function __string:string (a:long) %} /* - * Return the 64 bit long value of the - * scalar user space pointer parameter - * CALLERS: - * kernel.syscall.time - * kernel.syscall.stime - */ -/* -function __uget_num:long(u_addr:long) -%{ - long long val = 0; - if(get_user(val, - (unsigned long *)(unsigned long)THIS->u_addr)) - { - THIS->__retvalue = -EFAULT; - } else - THIS->__retvalue = val; -%} -*/ -/* - * Return a time_t/subseconds_t member value of - * struct timeval user space pointer parameter - * CALLERS: - * kernel.syscall.gettimeofday - * kernel.syscall.settimeofday - */ -/* -function __uget_tv_m:long(u_addr:long,member:long) -%{ - struct timeval tv; - char *ptr = (char *)(unsigned long)THIS->u_addr; - size_t sz = sizeof(struct timeval); - - if(copy_from_user(&tv,ptr,sz)) - THIS->__retvalue = -EFAULT; - else if(THIS->member == 0) - THIS->__retvalue = tv.tv_sec; - else - THIS->__retvalue = tv.tv_usec; -%} -*/ -/* - * Return a time_t / subseconds_t member value of - * one of the struct timevals in the struct itimerval - * user space pointer parameter - * CALLERS: - * kernel.syscall.getitimer - * kernel.syscall.setitimer - */ -/* -function __uget_itimerval_tv_m:long(u_addr:long,member:long) -%{ - struct itimerval itv; - char *ptr = (char *)(unsigned long)THIS->u_addr; - size_t sz = sizeof(struct itimerval); - - if(copy_from_user(&itv,ptr,sz)) { - THIS->__retvalue = -EFAULT; - return; - } - switch(THIS->member) { - case 0: THIS->__retvalue = itv.it_interval.tv_sec; - break; - case 1: THIS->__retvalue = itv.it_interval.tv_usec; - break; - case 2: THIS->__retvalue = itv.it_value.tv_sec; - break; - case 3: THIS->__retvalue = itv.it_value.tv_usec; - break; - default: THIS->__retvalue = -1; - } -%} -*/ -/* * Return a integer member value of struct * timezone user space pointer parameter * CALLERS: @@ -293,37 +407,7 @@ function __uget_ts_m:long(u_addr:long,member:long) THIS->__retvalue = ts.tv_nsec; %} */ -/* - * Return a time_t / long member value of the - * struct timespecs in struct itimerspec user - * space pointer parameter - * CALLERS: - * kernel.syscall.timer_gettime - */ -/* -function __uget_itimerspec_ts_m:long(u_addr:long,member:long) -%{ - struct itimerspec its; - char *ptr = (char *)(unsigned long)THIS->u_addr; - size_t sz = sizeof(struct itimerspec); - if(copy_from_user(&its,ptr,sz)) { - THIS->__retvalue = -EFAULT; - return; - } - switch(THIS->member) { - case 0: THIS->__retvalue = its.it_interval.tv_sec; - break; - case 1: THIS->__retvalue = its.it_interval.tv_nsec; - break; - case 2: THIS->__retvalue = its.it_value.tv_sec; - break; - case 3: THIS->__retvalue = its.it_value.tv_nsec; - break; - default: THIS->__retvalue = -1; - } -%} -*/ /* * Return the symbolic string representation * of the struct timex.mode member of adjtimex @@ -512,25 +596,11 @@ function _mlockall_flags_str(f) { return substr(bs,0,strlen(bs)-1) } -/* - * The following functions return the symbolic string - * representation of the flag. If the argument doesnt - * map to string, an empty string ("") is returned. - */ - -function _module_flags_str(f) { - if(f==8192) return "O_ASYNC" - if(f==4096) return "O_SYNC" - if(f==2048) return "O_NONBLOCK" - if(f==1024) return "O_APPEND" - if(f==512) return "O_TRUNC" - if(f==256) return "O_NDCTTY" - if(f==128) return "O_EXCL" - if(f==64) return "O_CREAT" - if(f==2) return "O_RDWR" - if(f==1) return "O_WRONLY" - if(f==0) return "O_RDONLY" - return "" +/* used by sys_delete_module */ +function _module_flags_str(f) { + if(!(f & 2048)) bs="WAIT|" + if(f & 512) bs=bs."FORCE|" + return substr(bs,0,strlen(bs)-1) } function _sched_policy_str(policy) { @@ -974,3 +1044,4 @@ function _rusage_who_str(w) { if(w==-1) return "RUSAGE_CHILDREN" return "" } + |