summaryrefslogtreecommitdiffstats
path: root/tapset/aux_syscalls.stp
diff options
context:
space:
mode:
Diffstat (limited to 'tapset/aux_syscalls.stp')
-rw-r--r--tapset/aux_syscalls.stp315
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 ""
}
+