clone.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /*
  2. * trace/beauty/cone.c
  3. *
  4. * Copyright (C) 2017, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
  5. *
  6. * Released under the GPL v2. (and only v2, not any later version)
  7. */
  8. #include "trace/beauty/beauty.h"
  9. #include <linux/kernel.h>
  10. #include <sys/types.h>
  11. #include <uapi/linux/sched.h>
  12. static size_t clone__scnprintf_flags(unsigned long flags, char *bf, size_t size)
  13. {
  14. int printed = 0;
  15. #define P_FLAG(n) \
  16. if (flags & CLONE_##n) { \
  17. printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
  18. flags &= ~CLONE_##n; \
  19. }
  20. P_FLAG(VM);
  21. P_FLAG(FS);
  22. P_FLAG(FILES);
  23. P_FLAG(SIGHAND);
  24. P_FLAG(PTRACE);
  25. P_FLAG(VFORK);
  26. P_FLAG(PARENT);
  27. P_FLAG(THREAD);
  28. P_FLAG(NEWNS);
  29. P_FLAG(SYSVSEM);
  30. P_FLAG(SETTLS);
  31. P_FLAG(PARENT_SETTID);
  32. P_FLAG(CHILD_CLEARTID);
  33. P_FLAG(DETACHED);
  34. P_FLAG(UNTRACED);
  35. P_FLAG(CHILD_SETTID);
  36. P_FLAG(NEWCGROUP);
  37. P_FLAG(NEWUTS);
  38. P_FLAG(NEWIPC);
  39. P_FLAG(NEWUSER);
  40. P_FLAG(NEWPID);
  41. P_FLAG(NEWNET);
  42. P_FLAG(IO);
  43. #undef P_FLAG
  44. if (flags)
  45. printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
  46. return printed;
  47. }
  48. size_t syscall_arg__scnprintf_clone_flags(char *bf, size_t size, struct syscall_arg *arg)
  49. {
  50. unsigned long flags = arg->val;
  51. enum syscall_clone_args {
  52. SCC_FLAGS = (1 << 0),
  53. SCC_CHILD_STACK = (1 << 1),
  54. SCC_PARENT_TIDPTR = (1 << 2),
  55. SCC_CHILD_TIDPTR = (1 << 3),
  56. SCC_TLS = (1 << 4),
  57. };
  58. if (!(flags & CLONE_PARENT_SETTID))
  59. arg->mask |= SCC_PARENT_TIDPTR;
  60. if (!(flags & (CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID)))
  61. arg->mask |= SCC_CHILD_TIDPTR;
  62. if (!(flags & CLONE_SETTLS))
  63. arg->mask |= SCC_TLS;
  64. return clone__scnprintf_flags(flags, bf, size);
  65. }