]> granicus.if.org Git - strace/blobdiff - ipc_shm.c
Remove linux/ptp_clock.h
[strace] / ipc_shm.c
index 93c8a27d8a699b3fdc9225374f212ba8a0467f06..b358fc6986fb485b1c07772f98e286bd181d7f5c 100644 (file)
--- a/ipc_shm.c
+++ b/ipc_shm.c
@@ -5,6 +5,7 @@
  * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
  * Copyright (c) 2003-2006 Roland McGrath <roland@redhat.com>
  * Copyright (c) 2006-2015 Dmitry V. Levin <ldv@altlinux.org>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 # include <linux/shm.h>
 #endif
 
+#ifndef SHM_HUGE_SHIFT
+# define SHM_HUGE_SHIFT 26
+#endif
+
+#ifndef SHM_HUGE_MASK
+# define SHM_HUGE_MASK 0x3f
+#endif
+
 #include "xlat/shm_resource_flags.h"
 #include "xlat/shm_flags.h"
 
@@ -48,17 +57,32 @@ SYS_FUNC(shmget)
                tprintf("%#x", key);
        else
                tprints("IPC_PRIVATE");
-       tprintf(", %lu, ", tcp->u_arg[1]);
-       if (printflags(shm_resource_flags, tcp->u_arg[2] & ~0777, NULL) != 0)
+       tprintf(", %" PRI_klu ", ", tcp->u_arg[1]);
+
+       unsigned int flags = tcp->u_arg[2] & ~0777;
+       const unsigned int mask = SHM_HUGE_MASK << SHM_HUGE_SHIFT;
+       const unsigned int hugetlb_value = flags & mask;
+
+       flags &= ~mask;
+       if (flags || !hugetlb_value)
+               printflags(shm_resource_flags, flags, NULL);
+
+       if (hugetlb_value)
+               tprintf("%s%u<<SHM_HUGE_SHIFT",
+                       flags ? "|" : "",
+                       hugetlb_value >> SHM_HUGE_SHIFT);
+
+       if (flags || hugetlb_value)
                tprints("|");
        print_numeric_umode_t(tcp->u_arg[2] & 0777);
+
        return RVAL_DECODED;
 }
 
 SYS_FUNC(shmat)
 {
        if (entering(tcp)) {
-               tprintf("%lu, ", tcp->u_arg[0]);
+               tprintf("%d, ", (int) tcp->u_arg[0]);
                if (indirect_ipccall(tcp)) {
                        printaddr(tcp->u_arg[3]);
                        tprints(", ");