]> granicus.if.org Git - strace/blobdiff - system.c
Get rid of TCB_INUSE and TCB_STRACE_CHILD
[strace] / system.c
index bc284aa2805978ac4bdc6a9b37225e3ac1159bcd..26d0d7fd2eb2d96f60f3840dbaabbcb2333bf90a 100644 (file)
--- a/system.c
+++ b/system.c
@@ -378,7 +378,7 @@ sys_sram_alloc(struct tcb *tcp)
                /* size */
                tprintf("%lu, ", tcp->u_arg[0]);
                /* flags */
-               printxval(sram_alloc_flags, tcp->u_arg[1], "???_SRAM");
+               printflags(sram_alloc_flags, tcp->u_arg[1], "???_SRAM");
        }
        return 1;
 }
@@ -954,32 +954,32 @@ sys_sysctl(struct tcb *tcp)
                tprintf("}, %d, ", info.nlen);
        } else {
                size_t oldlen = 0;
-               if (umove(tcp, (long)info.oldlenp, &oldlen) >= 0
-                   && info.nlen >= 2
-                   && ((name[0] == CTL_KERN
-                        && (name[1] == KERN_OSRELEASE
-                            || name[1] == KERN_OSTYPE
+               if (info.oldval == NULL) {
+                       tprints("NULL");
+               } else if (umove(tcp, (long)info.oldlenp, &oldlen) >= 0
+                          && info.nlen >= 2
+                          && ((name[0] == CTL_KERN
+                               && (name[1] == KERN_OSRELEASE
+                                   || name[1] == KERN_OSTYPE
 #ifdef KERN_JAVA_INTERPRETER
-                            || name[1] == KERN_JAVA_INTERPRETER
+                                   || name[1] == KERN_JAVA_INTERPRETER
 #endif
 #ifdef KERN_JAVA_APPLETVIEWER
-                            || name[1] == KERN_JAVA_APPLETVIEWER
+                                   || name[1] == KERN_JAVA_APPLETVIEWER
 #endif
-                                )))) {
+                                       )))) {
                        printpath(tcp, (size_t)info.oldval);
-                       tprintf(", %lu, ", (unsigned long)oldlen);
-                       if (info.newval == 0)
-                               tprints("NULL");
-                       else if (syserror(tcp))
-                               tprintf("%p", info.newval);
-                       else
-                               printpath(tcp, (size_t)info.newval);
-                       tprintf(", %ld}", (unsigned long)info.newlen);
                } else {
-                       tprintf("%p, %ld, %p, %ld}",
-                               info.oldval, (unsigned long)oldlen,
-                               info.newval, (unsigned long)info.newlen);
+                       tprintf("%p", info.oldval);
                }
+               tprintf(", %lu, ", (unsigned long)oldlen);
+               if (info.newval == NULL)
+                       tprints("NULL");
+               else if (syserror(tcp))
+                       tprintf("%p", info.newval);
+               else
+                       printpath(tcp, (size_t)info.newval);
+               tprintf(", %lu", (unsigned long)info.newlen);
        }
 
        free(name);
@@ -1026,3 +1026,63 @@ int sys_sysmips(struct tcb *tcp)
 }
 
 #endif /* MIPS */
+
+#ifdef OR1K
+#define OR1K_ATOMIC_SWAP        1
+#define OR1K_ATOMIC_CMPXCHG     2
+#define OR1K_ATOMIC_XCHG        3
+#define OR1K_ATOMIC_ADD         4
+#define OR1K_ATOMIC_DECPOS      5
+#define OR1K_ATOMIC_AND         6
+#define OR1K_ATOMIC_OR          7
+#define OR1K_ATOMIC_UMAX        8
+#define OR1K_ATOMIC_UMIN        9
+
+static const struct xlat atomic_ops[] = {
+       { OR1K_ATOMIC_SWAP,             "SWAP"          },
+       { OR1K_ATOMIC_CMPXCHG,          "CMPXCHG"       },
+       { OR1K_ATOMIC_XCHG,             "XCHG"          },
+       { OR1K_ATOMIC_ADD,              "ADD"           },
+       { OR1K_ATOMIC_DECPOS,           "DECPOS"        },
+       { OR1K_ATOMIC_AND,              "AND"           },
+       { OR1K_ATOMIC_OR,               "OR"            },
+       { OR1K_ATOMIC_UMAX,             "UMAX"          },
+       { OR1K_ATOMIC_UMIN,             "UMIN"          },
+       { 0, NULL }
+};
+
+int sys_or1k_atomic(struct tcb *tcp)
+{
+       if (entering(tcp)) {
+               printxval(atomic_ops, tcp->u_arg[0], "???");
+               switch(tcp->u_arg[0]) {
+               case OR1K_ATOMIC_SWAP:
+                       tprintf(", 0x%lx, 0x%lx", tcp->u_arg[1], tcp->u_arg[2]);
+                       break;
+               case OR1K_ATOMIC_CMPXCHG:
+                       tprintf(", 0x%lx, %#lx, %#lx", tcp->u_arg[1], tcp->u_arg[2],
+                               tcp->u_arg[3]);
+                       break;
+
+               case OR1K_ATOMIC_XCHG:
+               case OR1K_ATOMIC_ADD:
+               case OR1K_ATOMIC_AND:
+               case OR1K_ATOMIC_OR:
+               case OR1K_ATOMIC_UMAX:
+               case OR1K_ATOMIC_UMIN:
+                       tprintf(", 0x%lx, %#lx", tcp->u_arg[1], tcp->u_arg[2]);
+                       break;
+
+               case OR1K_ATOMIC_DECPOS:
+                       tprintf(", 0x%lx", tcp->u_arg[1]);
+                       break;
+
+               default:
+                       break;
+               }
+       }
+
+       return RVAL_HEX;
+}
+
+#endif /* OR1K */