]> granicus.if.org Git - strace/commitdiff
2002-12-15 Roland McGrath <roland@redhat.com>
authorRoland McGrath <roland@redhat.com>
Sun, 15 Dec 2002 23:58:26 +0000 (23:58 +0000)
committerRoland McGrath <roland@redhat.com>
Sun, 15 Dec 2002 23:58:26 +0000 (23:58 +0000)
* syscall.c (syscall_enter) [LINUX && POWERPC]: Define PT_ORIG_R3 if
not defined, since <asm/ptrace.h> defines it only #ifdef __KERNEL__.
* process.c: Likewise.
* configure.in: Check for linux/xattr.h and linux/futex.h headers.
* linux/syscall.h: Add sys_* decls for new syscalls getpmsg, putpmsg,
readahead, sendfile64, setxattr, fsetxattr, getxattr, fgetxattr, int
listxattr, flistxattr, removexattr, fremovexattr, sched_setaffinity,
sched_getaffinity, futex.
* linux/syscallent.h: Update the table.
* io.c: Add sys_sendfile64.
* file.c: Add sys_readahead, sys_*xattr.
* process.c: Add sys_futex, sys_*affinity.

process.c

index 8c9065119950d52b1b17ff89f06abd4ff91b4b44..c6d5ee2d95c722cc40e793b330607f4a12f27c2c 100644 (file)
--- a/process.c
+++ b/process.c
@@ -66,7 +66,7 @@
 #ifdef SPARC
 #  undef fpq
 #  undef fq
-#  undef fpu 
+#  undef fpu
 #endif
 #endif /* HAVE_ASM_REG_H */
 
 #include <linux/ptrace.h>
 #endif
 
+#ifdef HAVE_LINUX_FUTEX_H
+#include <linux/futex.h>
+#endif
+#if defined LINUX
+# ifndef FUTEX_WAIT
+#  define FUTEX_WAIT 0
+# endif
+# ifndef FUTEX_WAKE
+#  define FUTEX_WAKE 1
+# endif
+# ifndef FUTEX_FD
+#  define FUTEX_FD 2
+# endif
+#endif
 
 #ifdef LINUX
 #include <asm/posix_types.h>
@@ -492,12 +506,12 @@ int new;
 #if defined(LINUX)
 #if defined(I386)
        /* Attempt to make vfork into fork, which we can follow. */
-       if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0) 
+       if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
                return -1;
        return 0;
 #elif defined(X86_64)
        /* Attempt to make vfork into fork, which we can follow. */
-       if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0) 
+       if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
                return -1;
        return 0;
 #elif defined(POWERPC)
@@ -600,8 +614,8 @@ setarg(tcp, argnum)
         {
                if(argnum <= 5)
                        ptrace(PTRACE_POKEUSER, tcp->pid,
-                              (char *) (argnum==0 ? PT_ORIGGPR2 : 
-                              PT_GPR2 + argnum*sizeof(long)), 
+                              (char *) (argnum==0 ? PT_ORIGGPR2 :
+                              PT_GPR2 + argnum*sizeof(long)),
                               tcp->u_arg[argnum]);
                else
                        return -E2BIG;
@@ -696,7 +710,7 @@ struct tcb *tcp;
 #ifdef SYS_vfork
        if (tcp->scno == SYS_vfork) {
                /* Attempt to make vfork into fork, which we can follow. */
-               if (!followvfork || 
+               if (!followvfork ||
                    change_syscall(tcp, SYS_fork) < 0)
                        dont_follow = 1;
        }
@@ -1196,9 +1210,9 @@ struct xlat *opt;
        int max = verbose (tcp) ? sizeof buf / sizeof buf [0] : 10;
        int dots = len > max;
        int i;
-       
+
        if (len > max) len = max;
-       
+
        if (len <= 0 ||
            umoven (tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
        {
@@ -1259,7 +1273,7 @@ struct tcb *tcp;
                        tprintf (", %ld", tcp->u_arg[2]);
                }
        }
-       
+
        return 0;
 }
 
@@ -1569,7 +1583,7 @@ sys_wait(tcp)
 struct tcb *tcp;
 {
        int status;
-       
+
        if (exiting(tcp)) {
                if (!syserror(tcp)) {
                        if (umove(tcp, tcp->u_arg[0], &status) < 0)
@@ -1703,7 +1717,7 @@ struct tcb *tcp;
 #ifndef SVR4
 
 static struct xlat ptrace_cmds[] = {
-#ifndef FREEBSD        
+#ifndef FREEBSD
        { PTRACE_TRACEME,       "PTRACE_TRACEME"        },
        { PTRACE_PEEKTEXT,      "PTRACE_PEEKTEXT",      },
        { PTRACE_PEEKDATA,      "PTRACE_PEEKDATA",      },
@@ -1878,6 +1892,9 @@ struct xlat struct_user_offsets[] = {
 #elif defined(HPPA)
        /* XXX No support for these offsets yet. */
 #elif defined(POWERPC)
+#ifndef PT_ORIG_R3
+#define PT_ORIG_R3 34
+#endif
        { 4*PT_R0,              "4*PT_R0"                               },
        { 4*PT_R1,              "4*PT_R1"                               },
        { 4*PT_R2,              "4*PT_R2"                               },
@@ -1918,7 +1935,7 @@ struct xlat struct_user_offsets[] = {
        { 4*PT_XER,             "4*PT_XER"                              },
        { 4*PT_CCR,             "4*PT_CCR"                              },
        { 4*PT_FPR0,            "4*PT_FPR0"                             },
-#else  
+#else
 #ifdef ALPHA
        { 0,                    "r0"                                    },
        { 1,                    "r1"                                    },
@@ -2278,7 +2295,7 @@ struct tcb *tcp;
                cmd = "PTRACE_???";
 #else
                cmd = "PT_???";
-#endif         
+#endif
        if (entering(tcp)) {
                tprintf("%s, %lu, ", cmd, tcp->u_arg[1]);
                addr = tcp->u_arg[2];
@@ -2352,3 +2369,63 @@ struct tcb *tcp;
 }
 
 #endif /* !SVR4 */
+
+#ifdef LINUX
+static struct xlat futexops[] = {
+       { FUTEX_WAIT,   "FUTEX_WAIT" },
+       { FUTEX_WAKE,   "FUTEX_WAKE" },
+       { FUTEX_FD,     "FUTEX_FD" },
+       { 0,            NULL }
+};
+
+int
+sys_futex(tcp)
+struct tcb *tcp;
+{
+    if (entering(tcp)) {
+       tprintf("%p, ", (void *) tcp->u_arg[0]);
+       printflags(futexops, tcp->u_arg[1]);
+       tprintf(", %ld, ", tcp->u_arg[2]);
+       printtv(tcp, tcp->u_arg[3]);
+    }
+    return 0;
+}
+
+static void
+print_affinitylist(list, len)
+unsigned long *list;
+unsigned int len;
+{
+    int first = 1;
+    tprintf(" {");
+    while (len > sizeof (unsigned long)) {
+       tprintf("%s %lx", first ? "" : ",", *list++);
+       first = 0;
+       len -= sizeof (unsigned long);
+    }
+    tprintf(" }");
+}
+
+int
+sys_sched_setaffinity(tcp)
+struct tcb *tcp;
+{
+    if (entering(tcp)) {
+       tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
+       print_affinitylist((unsigned long *) tcp->u_arg[2], tcp->u_arg[1]);
+    }
+    return 0;
+}
+
+int
+sys_sched_getaffinity(tcp)
+struct tcb *tcp;
+{
+    if (entering(tcp)) {
+       tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
+    } else {
+       print_affinitylist((unsigned long *) tcp->u_arg[2], tcp->u_rval);
+    }
+    return 0;
+}
+#endif