Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: LGPL-2.1
0002 /*
0003  * trace/beauty/cone.c
0004  *
0005  *  Copyright (C) 2017, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
0006  */
0007 
0008 #include "trace/beauty/beauty.h"
0009 #include <linux/kernel.h>
0010 #include <sys/types.h>
0011 #include <uapi/linux/sched.h>
0012 
0013 static size_t clone__scnprintf_flags(unsigned long flags, char *bf, size_t size, bool show_prefix)
0014 {
0015     const char *prefix = "CLONE_";
0016     int printed = 0;
0017 
0018 #define P_FLAG(n) \
0019     if (flags & CLONE_##n) { \
0020         printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
0021         flags &= ~CLONE_##n; \
0022     }
0023 
0024     P_FLAG(VM);
0025     P_FLAG(FS);
0026     P_FLAG(FILES);
0027     P_FLAG(SIGHAND);
0028     P_FLAG(PIDFD);
0029     P_FLAG(PTRACE);
0030     P_FLAG(VFORK);
0031     P_FLAG(PARENT);
0032     P_FLAG(THREAD);
0033     P_FLAG(NEWNS);
0034     P_FLAG(SYSVSEM);
0035     P_FLAG(SETTLS);
0036     P_FLAG(PARENT_SETTID);
0037     P_FLAG(CHILD_CLEARTID);
0038     P_FLAG(DETACHED);
0039     P_FLAG(UNTRACED);
0040     P_FLAG(CHILD_SETTID);
0041     P_FLAG(NEWCGROUP);
0042     P_FLAG(NEWUTS);
0043     P_FLAG(NEWIPC);
0044     P_FLAG(NEWUSER);
0045     P_FLAG(NEWPID);
0046     P_FLAG(NEWNET);
0047     P_FLAG(IO);
0048     P_FLAG(CLEAR_SIGHAND);
0049     P_FLAG(INTO_CGROUP);
0050 #undef P_FLAG
0051 
0052     if (flags)
0053         printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
0054 
0055     return printed;
0056 }
0057 
0058 size_t syscall_arg__scnprintf_clone_flags(char *bf, size_t size, struct syscall_arg *arg)
0059 {
0060     unsigned long flags = arg->val;
0061     enum syscall_clone_args {
0062         SCC_FLAGS     = (1 << 0),
0063         SCC_CHILD_STACK   = (1 << 1),
0064         SCC_PARENT_TIDPTR = (1 << 2),
0065         SCC_CHILD_TIDPTR  = (1 << 3),
0066         SCC_TLS       = (1 << 4),
0067     };
0068     if (!(flags & CLONE_PARENT_SETTID))
0069         arg->mask |= SCC_PARENT_TIDPTR;
0070 
0071     if (!(flags & (CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID)))
0072         arg->mask |= SCC_CHILD_TIDPTR;
0073 
0074     if (!(flags & CLONE_SETTLS))
0075         arg->mask |= SCC_TLS;
0076 
0077     return clone__scnprintf_flags(flags, bf, size, arg->show_string_prefix);
0078 }