xref: /openbmc/linux/tools/perf/trace/beauty/mmap.c (revision bc5aa3a0)
1 #include <sys/mman.h>
2 
3 #ifndef PROT_SEM
4 #define PROT_SEM 0x8
5 #endif
6 
7 static size_t syscall_arg__scnprintf_mmap_prot(char *bf, size_t size,
8 					       struct syscall_arg *arg)
9 {
10 	int printed = 0, prot = arg->val;
11 
12 	if (prot == PROT_NONE)
13 		return scnprintf(bf, size, "NONE");
14 #define	P_MMAP_PROT(n) \
15 	if (prot & PROT_##n) { \
16 		printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
17 		prot &= ~PROT_##n; \
18 	}
19 
20 	P_MMAP_PROT(EXEC);
21 	P_MMAP_PROT(READ);
22 	P_MMAP_PROT(WRITE);
23 	P_MMAP_PROT(SEM);
24 	P_MMAP_PROT(GROWSDOWN);
25 	P_MMAP_PROT(GROWSUP);
26 #undef P_MMAP_PROT
27 
28 	if (prot)
29 		printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", prot);
30 
31 	return printed;
32 }
33 
34 #define SCA_MMAP_PROT syscall_arg__scnprintf_mmap_prot
35 
36 #ifndef MAP_FIXED
37 #define MAP_FIXED		     0x10
38 #endif
39 
40 #ifndef MAP_ANONYMOUS
41 #define MAP_ANONYMOUS		     0x20
42 #endif
43 
44 #ifndef MAP_32BIT
45 #define MAP_32BIT		     0x40
46 #endif
47 
48 #ifndef MAP_STACK
49 #define MAP_STACK		  0x20000
50 #endif
51 
52 #ifndef MAP_HUGETLB
53 #define MAP_HUGETLB		  0x40000
54 #endif
55 
56 #ifndef MAP_UNINITIALIZED
57 #define MAP_UNINITIALIZED	0x4000000
58 #endif
59 
60 
61 static size_t syscall_arg__scnprintf_mmap_flags(char *bf, size_t size,
62 						struct syscall_arg *arg)
63 {
64 	int printed = 0, flags = arg->val;
65 
66 #define	P_MMAP_FLAG(n) \
67 	if (flags & MAP_##n) { \
68 		printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
69 		flags &= ~MAP_##n; \
70 	}
71 
72 	P_MMAP_FLAG(SHARED);
73 	P_MMAP_FLAG(PRIVATE);
74 	P_MMAP_FLAG(32BIT);
75 	P_MMAP_FLAG(ANONYMOUS);
76 	P_MMAP_FLAG(DENYWRITE);
77 	P_MMAP_FLAG(EXECUTABLE);
78 	P_MMAP_FLAG(FILE);
79 	P_MMAP_FLAG(FIXED);
80 	P_MMAP_FLAG(GROWSDOWN);
81 	P_MMAP_FLAG(HUGETLB);
82 	P_MMAP_FLAG(LOCKED);
83 	P_MMAP_FLAG(NONBLOCK);
84 	P_MMAP_FLAG(NORESERVE);
85 	P_MMAP_FLAG(POPULATE);
86 	P_MMAP_FLAG(STACK);
87 	P_MMAP_FLAG(UNINITIALIZED);
88 #undef P_MMAP_FLAG
89 
90 	if (flags)
91 		printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
92 
93 	return printed;
94 }
95 
96 #define SCA_MMAP_FLAGS syscall_arg__scnprintf_mmap_flags
97 
98 #ifndef MREMAP_MAYMOVE
99 #define MREMAP_MAYMOVE 1
100 #endif
101 #ifndef MREMAP_FIXED
102 #define MREMAP_FIXED 2
103 #endif
104 
105 static size_t syscall_arg__scnprintf_mremap_flags(char *bf, size_t size,
106 						  struct syscall_arg *arg)
107 {
108 	int printed = 0, flags = arg->val;
109 
110 #define P_MREMAP_FLAG(n) \
111 	if (flags & MREMAP_##n) { \
112 		printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
113 		flags &= ~MREMAP_##n; \
114 	}
115 
116 	P_MREMAP_FLAG(MAYMOVE);
117 	P_MREMAP_FLAG(FIXED);
118 #undef P_MREMAP_FLAG
119 
120 	if (flags)
121 		printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
122 
123 	return printed;
124 }
125 
126 #define SCA_MREMAP_FLAGS syscall_arg__scnprintf_mremap_flags
127 
128 #ifndef MADV_HWPOISON
129 #define MADV_HWPOISON		100
130 #endif
131 
132 #ifndef MADV_SOFT_OFFLINE
133 #define MADV_SOFT_OFFLINE	101
134 #endif
135 
136 #ifndef MADV_MERGEABLE
137 #define MADV_MERGEABLE		 12
138 #endif
139 
140 #ifndef MADV_UNMERGEABLE
141 #define MADV_UNMERGEABLE	 13
142 #endif
143 
144 #ifndef MADV_HUGEPAGE
145 #define MADV_HUGEPAGE		 14
146 #endif
147 
148 #ifndef MADV_NOHUGEPAGE
149 #define MADV_NOHUGEPAGE		 15
150 #endif
151 
152 #ifndef MADV_DONTDUMP
153 #define MADV_DONTDUMP		 16
154 #endif
155 
156 #ifndef MADV_DODUMP
157 #define MADV_DODUMP		 17
158 #endif
159 
160 
161 static size_t syscall_arg__scnprintf_madvise_behavior(char *bf, size_t size,
162 						      struct syscall_arg *arg)
163 {
164 	int behavior = arg->val;
165 
166 	switch (behavior) {
167 #define	P_MADV_BHV(n) case MADV_##n: return scnprintf(bf, size, #n)
168 	P_MADV_BHV(NORMAL);
169 	P_MADV_BHV(RANDOM);
170 	P_MADV_BHV(SEQUENTIAL);
171 	P_MADV_BHV(WILLNEED);
172 	P_MADV_BHV(DONTNEED);
173 	P_MADV_BHV(REMOVE);
174 	P_MADV_BHV(DONTFORK);
175 	P_MADV_BHV(DOFORK);
176 	P_MADV_BHV(HWPOISON);
177 	P_MADV_BHV(SOFT_OFFLINE);
178 	P_MADV_BHV(MERGEABLE);
179 	P_MADV_BHV(UNMERGEABLE);
180 	P_MADV_BHV(HUGEPAGE);
181 	P_MADV_BHV(NOHUGEPAGE);
182 	P_MADV_BHV(DONTDUMP);
183 	P_MADV_BHV(DODUMP);
184 #undef P_MADV_BHV
185 	default: break;
186 	}
187 
188 	return scnprintf(bf, size, "%#x", behavior);
189 }
190 
191 #define SCA_MADV_BHV syscall_arg__scnprintf_madvise_behavior
192