mmap.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <uapi/linux/mman.h>
  3. static size_t syscall_arg__scnprintf_mmap_prot(char *bf, size_t size,
  4. struct syscall_arg *arg)
  5. {
  6. int printed = 0, prot = arg->val;
  7. if (prot == PROT_NONE)
  8. return scnprintf(bf, size, "NONE");
  9. #define P_MMAP_PROT(n) \
  10. if (prot & PROT_##n) { \
  11. printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
  12. prot &= ~PROT_##n; \
  13. }
  14. P_MMAP_PROT(EXEC);
  15. P_MMAP_PROT(READ);
  16. P_MMAP_PROT(WRITE);
  17. P_MMAP_PROT(SEM);
  18. P_MMAP_PROT(GROWSDOWN);
  19. P_MMAP_PROT(GROWSUP);
  20. #undef P_MMAP_PROT
  21. if (prot)
  22. printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", prot);
  23. return printed;
  24. }
  25. #define SCA_MMAP_PROT syscall_arg__scnprintf_mmap_prot
  26. static size_t syscall_arg__scnprintf_mmap_flags(char *bf, size_t size,
  27. struct syscall_arg *arg)
  28. {
  29. int printed = 0, flags = arg->val;
  30. if (flags & MAP_ANONYMOUS)
  31. arg->mask |= (1 << 4) | (1 << 5); /* Mask 4th ('fd') and 5th ('offset') args, ignored */
  32. #define P_MMAP_FLAG(n) \
  33. if (flags & MAP_##n) { \
  34. printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
  35. flags &= ~MAP_##n; \
  36. }
  37. P_MMAP_FLAG(SHARED);
  38. P_MMAP_FLAG(PRIVATE);
  39. #ifdef MAP_32BIT
  40. P_MMAP_FLAG(32BIT);
  41. #endif
  42. P_MMAP_FLAG(ANONYMOUS);
  43. P_MMAP_FLAG(DENYWRITE);
  44. P_MMAP_FLAG(EXECUTABLE);
  45. P_MMAP_FLAG(FILE);
  46. P_MMAP_FLAG(FIXED);
  47. #ifdef MAP_FIXED_NOREPLACE
  48. P_MMAP_FLAG(FIXED_NOREPLACE);
  49. #endif
  50. P_MMAP_FLAG(GROWSDOWN);
  51. P_MMAP_FLAG(HUGETLB);
  52. P_MMAP_FLAG(LOCKED);
  53. P_MMAP_FLAG(NONBLOCK);
  54. P_MMAP_FLAG(NORESERVE);
  55. P_MMAP_FLAG(POPULATE);
  56. P_MMAP_FLAG(STACK);
  57. P_MMAP_FLAG(UNINITIALIZED);
  58. #ifdef MAP_SYNC
  59. P_MMAP_FLAG(SYNC);
  60. #endif
  61. #undef P_MMAP_FLAG
  62. if (flags)
  63. printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
  64. return printed;
  65. }
  66. #define SCA_MMAP_FLAGS syscall_arg__scnprintf_mmap_flags
  67. static size_t syscall_arg__scnprintf_mremap_flags(char *bf, size_t size,
  68. struct syscall_arg *arg)
  69. {
  70. int printed = 0, flags = arg->val;
  71. #define P_MREMAP_FLAG(n) \
  72. if (flags & MREMAP_##n) { \
  73. printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
  74. flags &= ~MREMAP_##n; \
  75. }
  76. P_MREMAP_FLAG(MAYMOVE);
  77. P_MREMAP_FLAG(FIXED);
  78. #undef P_MREMAP_FLAG
  79. if (flags)
  80. printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
  81. return printed;
  82. }
  83. #define SCA_MREMAP_FLAGS syscall_arg__scnprintf_mremap_flags
  84. static size_t madvise__scnprintf_behavior(int behavior, char *bf, size_t size)
  85. {
  86. #include "trace/beauty/generated/madvise_behavior_array.c"
  87. static DEFINE_STRARRAY(madvise_advices);
  88. if (behavior < strarray__madvise_advices.nr_entries && strarray__madvise_advices.entries[behavior] != NULL)
  89. return scnprintf(bf, size, "MADV_%s", strarray__madvise_advices.entries[behavior]);
  90. return scnprintf(bf, size, "%#", behavior);
  91. }
  92. static size_t syscall_arg__scnprintf_madvise_behavior(char *bf, size_t size,
  93. struct syscall_arg *arg)
  94. {
  95. return madvise__scnprintf_behavior(arg->val, bf, size);
  96. }
  97. #define SCA_MADV_BHV syscall_arg__scnprintf_madvise_behavior