1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 1991, 1992 Paul Kranenburg <[email protected]>
3*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 1993 Branko Lankester <[email protected]>
4*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <[email protected]>
5*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 1996-1999 Wichert Akkerman <[email protected]>
6*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2000 PocketPenguins Inc. Linux for Hitachi SuperH
7*cf84ac9aSAndroid Build Coastguard Worker * port by Greg Banks <[email protected]>
8*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 1999-2018 The strace developers.
9*cf84ac9aSAndroid Build Coastguard Worker * All rights reserved.
10*cf84ac9aSAndroid Build Coastguard Worker *
11*cf84ac9aSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
12*cf84ac9aSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
13*cf84ac9aSAndroid Build Coastguard Worker * are met:
14*cf84ac9aSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
15*cf84ac9aSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
16*cf84ac9aSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
17*cf84ac9aSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
18*cf84ac9aSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
19*cf84ac9aSAndroid Build Coastguard Worker * 3. The name of the author may not be used to endorse or promote products
20*cf84ac9aSAndroid Build Coastguard Worker * derived from this software without specific prior written permission.
21*cf84ac9aSAndroid Build Coastguard Worker *
22*cf84ac9aSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23*cf84ac9aSAndroid Build Coastguard Worker * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24*cf84ac9aSAndroid Build Coastguard Worker * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25*cf84ac9aSAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26*cf84ac9aSAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27*cf84ac9aSAndroid Build Coastguard Worker * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28*cf84ac9aSAndroid Build Coastguard Worker * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29*cf84ac9aSAndroid Build Coastguard Worker * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30*cf84ac9aSAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31*cf84ac9aSAndroid Build Coastguard Worker * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32*cf84ac9aSAndroid Build Coastguard Worker */
33*cf84ac9aSAndroid Build Coastguard Worker
34*cf84ac9aSAndroid Build Coastguard Worker #include "defs.h"
35*cf84ac9aSAndroid Build Coastguard Worker #include <linux/mman.h>
36*cf84ac9aSAndroid Build Coastguard Worker #include <sys/mman.h>
37*cf84ac9aSAndroid Build Coastguard Worker
38*cf84ac9aSAndroid Build Coastguard Worker unsigned long
get_pagesize(void)39*cf84ac9aSAndroid Build Coastguard Worker get_pagesize(void)
40*cf84ac9aSAndroid Build Coastguard Worker {
41*cf84ac9aSAndroid Build Coastguard Worker static unsigned long pagesize;
42*cf84ac9aSAndroid Build Coastguard Worker
43*cf84ac9aSAndroid Build Coastguard Worker if (!pagesize) {
44*cf84ac9aSAndroid Build Coastguard Worker long ret = sysconf(_SC_PAGESIZE);
45*cf84ac9aSAndroid Build Coastguard Worker
46*cf84ac9aSAndroid Build Coastguard Worker if (ret < 0)
47*cf84ac9aSAndroid Build Coastguard Worker perror_func_msg_and_die("sysconf(_SC_PAGESIZE)");
48*cf84ac9aSAndroid Build Coastguard Worker if (ret == 0)
49*cf84ac9aSAndroid Build Coastguard Worker error_func_msg_and_die("sysconf(_SC_PAGESIZE) "
50*cf84ac9aSAndroid Build Coastguard Worker "returned 0");
51*cf84ac9aSAndroid Build Coastguard Worker
52*cf84ac9aSAndroid Build Coastguard Worker pagesize = (unsigned long) ret;
53*cf84ac9aSAndroid Build Coastguard Worker }
54*cf84ac9aSAndroid Build Coastguard Worker
55*cf84ac9aSAndroid Build Coastguard Worker return pagesize;
56*cf84ac9aSAndroid Build Coastguard Worker }
57*cf84ac9aSAndroid Build Coastguard Worker
SYS_FUNC(brk)58*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(brk)
59*cf84ac9aSAndroid Build Coastguard Worker {
60*cf84ac9aSAndroid Build Coastguard Worker printaddr(tcp->u_arg[0]);
61*cf84ac9aSAndroid Build Coastguard Worker
62*cf84ac9aSAndroid Build Coastguard Worker return RVAL_DECODED | RVAL_HEX;
63*cf84ac9aSAndroid Build Coastguard Worker }
64*cf84ac9aSAndroid Build Coastguard Worker
65*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/mmap_prot.h"
66*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/mmap_flags.h"
67*cf84ac9aSAndroid Build Coastguard Worker
68*cf84ac9aSAndroid Build Coastguard Worker #ifndef MAP_HUGE_SHIFT
69*cf84ac9aSAndroid Build Coastguard Worker # define MAP_HUGE_SHIFT 26
70*cf84ac9aSAndroid Build Coastguard Worker #endif
71*cf84ac9aSAndroid Build Coastguard Worker
72*cf84ac9aSAndroid Build Coastguard Worker #ifndef MAP_HUGE_MASK
73*cf84ac9aSAndroid Build Coastguard Worker # define MAP_HUGE_MASK 0x3f
74*cf84ac9aSAndroid Build Coastguard Worker #endif
75*cf84ac9aSAndroid Build Coastguard Worker
76*cf84ac9aSAndroid Build Coastguard Worker static void
print_mmap_flags(kernel_ulong_t flags)77*cf84ac9aSAndroid Build Coastguard Worker print_mmap_flags(kernel_ulong_t flags)
78*cf84ac9aSAndroid Build Coastguard Worker {
79*cf84ac9aSAndroid Build Coastguard Worker printxval64(mmap_flags, flags & MAP_TYPE, "MAP_???");
80*cf84ac9aSAndroid Build Coastguard Worker flags &= ~MAP_TYPE;
81*cf84ac9aSAndroid Build Coastguard Worker
82*cf84ac9aSAndroid Build Coastguard Worker const unsigned int mask = MAP_HUGE_MASK << MAP_HUGE_SHIFT;
83*cf84ac9aSAndroid Build Coastguard Worker const unsigned int hugetlb_value = flags & mask;
84*cf84ac9aSAndroid Build Coastguard Worker
85*cf84ac9aSAndroid Build Coastguard Worker flags &= ~mask;
86*cf84ac9aSAndroid Build Coastguard Worker if (flags) {
87*cf84ac9aSAndroid Build Coastguard Worker tprints("|");
88*cf84ac9aSAndroid Build Coastguard Worker printflags64(mmap_flags, flags, NULL);
89*cf84ac9aSAndroid Build Coastguard Worker }
90*cf84ac9aSAndroid Build Coastguard Worker
91*cf84ac9aSAndroid Build Coastguard Worker if (hugetlb_value)
92*cf84ac9aSAndroid Build Coastguard Worker tprintf("|%u<<MAP_HUGE_SHIFT",
93*cf84ac9aSAndroid Build Coastguard Worker hugetlb_value >> MAP_HUGE_SHIFT);
94*cf84ac9aSAndroid Build Coastguard Worker }
95*cf84ac9aSAndroid Build Coastguard Worker
96*cf84ac9aSAndroid Build Coastguard Worker static void
print_mmap(struct tcb * tcp,kernel_ulong_t * u_arg,unsigned long long offset)97*cf84ac9aSAndroid Build Coastguard Worker print_mmap(struct tcb *tcp, kernel_ulong_t *u_arg, unsigned long long offset)
98*cf84ac9aSAndroid Build Coastguard Worker {
99*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr = u_arg[0];
100*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t len = u_arg[1];
101*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t prot = u_arg[2];
102*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t flags = u_arg[3];
103*cf84ac9aSAndroid Build Coastguard Worker const int fd = u_arg[4];
104*cf84ac9aSAndroid Build Coastguard Worker
105*cf84ac9aSAndroid Build Coastguard Worker printaddr(addr);
106*cf84ac9aSAndroid Build Coastguard Worker tprintf(", %" PRI_klu ", ", len);
107*cf84ac9aSAndroid Build Coastguard Worker printflags64(mmap_prot, prot, "PROT_???");
108*cf84ac9aSAndroid Build Coastguard Worker tprints(", ");
109*cf84ac9aSAndroid Build Coastguard Worker print_mmap_flags(flags);
110*cf84ac9aSAndroid Build Coastguard Worker tprints(", ");
111*cf84ac9aSAndroid Build Coastguard Worker printfd(tcp, fd);
112*cf84ac9aSAndroid Build Coastguard Worker tprintf(", %#llx", offset);
113*cf84ac9aSAndroid Build Coastguard Worker }
114*cf84ac9aSAndroid Build Coastguard Worker
115*cf84ac9aSAndroid Build Coastguard Worker /* Syscall name<->function correspondence is messed up on many arches.
116*cf84ac9aSAndroid Build Coastguard Worker * For example:
117*cf84ac9aSAndroid Build Coastguard Worker * i386 has __NR_mmap == 90, and it is "old mmap", and
118*cf84ac9aSAndroid Build Coastguard Worker * also it has __NR_mmap2 == 192, which is a "new mmap with page offsets".
119*cf84ac9aSAndroid Build Coastguard Worker * But x86_64 has just one __NR_mmap == 9, a "new mmap with byte offsets".
120*cf84ac9aSAndroid Build Coastguard Worker * Confused? Me too!
121*cf84ac9aSAndroid Build Coastguard Worker */
122*cf84ac9aSAndroid Build Coastguard Worker
123*cf84ac9aSAndroid Build Coastguard Worker #if HAVE_ARCH_OLD_MMAP
124*cf84ac9aSAndroid Build Coastguard Worker /* Params are pointed to by u_arg[0], offset is in bytes */
SYS_FUNC(old_mmap)125*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(old_mmap)
126*cf84ac9aSAndroid Build Coastguard Worker {
127*cf84ac9aSAndroid Build Coastguard Worker kernel_ulong_t *args =
128*cf84ac9aSAndroid Build Coastguard Worker fetch_indirect_syscall_args(tcp, tcp->u_arg[0], 6);
129*cf84ac9aSAndroid Build Coastguard Worker
130*cf84ac9aSAndroid Build Coastguard Worker if (args)
131*cf84ac9aSAndroid Build Coastguard Worker print_mmap(tcp, args, args[5]);
132*cf84ac9aSAndroid Build Coastguard Worker else
133*cf84ac9aSAndroid Build Coastguard Worker printaddr(tcp->u_arg[0]);
134*cf84ac9aSAndroid Build Coastguard Worker
135*cf84ac9aSAndroid Build Coastguard Worker return RVAL_DECODED | RVAL_HEX;
136*cf84ac9aSAndroid Build Coastguard Worker }
137*cf84ac9aSAndroid Build Coastguard Worker
138*cf84ac9aSAndroid Build Coastguard Worker # if HAVE_ARCH_OLD_MMAP_PGOFF
139*cf84ac9aSAndroid Build Coastguard Worker /* Params are pointed to by u_arg[0], offset is in pages */
SYS_FUNC(old_mmap_pgoff)140*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(old_mmap_pgoff)
141*cf84ac9aSAndroid Build Coastguard Worker {
142*cf84ac9aSAndroid Build Coastguard Worker kernel_ulong_t *args =
143*cf84ac9aSAndroid Build Coastguard Worker fetch_indirect_syscall_args(tcp, tcp->u_arg[0], 6);
144*cf84ac9aSAndroid Build Coastguard Worker
145*cf84ac9aSAndroid Build Coastguard Worker if (args) {
146*cf84ac9aSAndroid Build Coastguard Worker unsigned long long offset;
147*cf84ac9aSAndroid Build Coastguard Worker
148*cf84ac9aSAndroid Build Coastguard Worker offset = args[5];
149*cf84ac9aSAndroid Build Coastguard Worker offset *= get_pagesize();
150*cf84ac9aSAndroid Build Coastguard Worker
151*cf84ac9aSAndroid Build Coastguard Worker print_mmap(tcp, args, offset);
152*cf84ac9aSAndroid Build Coastguard Worker } else {
153*cf84ac9aSAndroid Build Coastguard Worker printaddr(tcp->u_arg[0]);
154*cf84ac9aSAndroid Build Coastguard Worker }
155*cf84ac9aSAndroid Build Coastguard Worker
156*cf84ac9aSAndroid Build Coastguard Worker return RVAL_DECODED | RVAL_HEX;
157*cf84ac9aSAndroid Build Coastguard Worker }
158*cf84ac9aSAndroid Build Coastguard Worker # endif /* HAVE_ARCH_OLD_MMAP_PGOFF */
159*cf84ac9aSAndroid Build Coastguard Worker #endif /* HAVE_ARCH_OLD_MMAP */
160*cf84ac9aSAndroid Build Coastguard Worker
161*cf84ac9aSAndroid Build Coastguard Worker /* Params are passed directly, offset is in bytes */
SYS_FUNC(mmap)162*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(mmap)
163*cf84ac9aSAndroid Build Coastguard Worker {
164*cf84ac9aSAndroid Build Coastguard Worker /* Example of kernel-side handling of this variety of mmap:
165*cf84ac9aSAndroid Build Coastguard Worker * arch/x86/kernel/sys_x86_64.c::SYSCALL_DEFINE6(mmap, ...) calls
166*cf84ac9aSAndroid Build Coastguard Worker * sys_mmap_pgoff(..., off >> PAGE_SHIFT); i.e. off is in bytes,
167*cf84ac9aSAndroid Build Coastguard Worker * since the above code converts off to pages.
168*cf84ac9aSAndroid Build Coastguard Worker */
169*cf84ac9aSAndroid Build Coastguard Worker print_mmap(tcp, tcp->u_arg, tcp->u_arg[5]);
170*cf84ac9aSAndroid Build Coastguard Worker
171*cf84ac9aSAndroid Build Coastguard Worker return RVAL_DECODED | RVAL_HEX;
172*cf84ac9aSAndroid Build Coastguard Worker }
173*cf84ac9aSAndroid Build Coastguard Worker
174*cf84ac9aSAndroid Build Coastguard Worker /* Params are passed directly, offset is in pages */
SYS_FUNC(mmap_pgoff)175*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(mmap_pgoff)
176*cf84ac9aSAndroid Build Coastguard Worker {
177*cf84ac9aSAndroid Build Coastguard Worker /* Try test/mmap_offset_decode.c */
178*cf84ac9aSAndroid Build Coastguard Worker unsigned long long offset;
179*cf84ac9aSAndroid Build Coastguard Worker offset = tcp->u_arg[5];
180*cf84ac9aSAndroid Build Coastguard Worker offset *= get_pagesize();
181*cf84ac9aSAndroid Build Coastguard Worker print_mmap(tcp, tcp->u_arg, offset);
182*cf84ac9aSAndroid Build Coastguard Worker
183*cf84ac9aSAndroid Build Coastguard Worker return RVAL_DECODED | RVAL_HEX;
184*cf84ac9aSAndroid Build Coastguard Worker }
185*cf84ac9aSAndroid Build Coastguard Worker
186*cf84ac9aSAndroid Build Coastguard Worker /* Params are passed directly, offset is in 4k units */
SYS_FUNC(mmap_4koff)187*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(mmap_4koff)
188*cf84ac9aSAndroid Build Coastguard Worker {
189*cf84ac9aSAndroid Build Coastguard Worker unsigned long long offset;
190*cf84ac9aSAndroid Build Coastguard Worker offset = tcp->u_arg[5];
191*cf84ac9aSAndroid Build Coastguard Worker offset <<= 12;
192*cf84ac9aSAndroid Build Coastguard Worker print_mmap(tcp, tcp->u_arg, offset);
193*cf84ac9aSAndroid Build Coastguard Worker
194*cf84ac9aSAndroid Build Coastguard Worker return RVAL_DECODED | RVAL_HEX;
195*cf84ac9aSAndroid Build Coastguard Worker }
196*cf84ac9aSAndroid Build Coastguard Worker
SYS_FUNC(munmap)197*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(munmap)
198*cf84ac9aSAndroid Build Coastguard Worker {
199*cf84ac9aSAndroid Build Coastguard Worker printaddr(tcp->u_arg[0]);
200*cf84ac9aSAndroid Build Coastguard Worker tprintf(", %" PRI_klu, tcp->u_arg[1]);
201*cf84ac9aSAndroid Build Coastguard Worker
202*cf84ac9aSAndroid Build Coastguard Worker return RVAL_DECODED;
203*cf84ac9aSAndroid Build Coastguard Worker }
204*cf84ac9aSAndroid Build Coastguard Worker
205*cf84ac9aSAndroid Build Coastguard Worker static int
do_mprotect(struct tcb * tcp,bool has_pkey)206*cf84ac9aSAndroid Build Coastguard Worker do_mprotect(struct tcb *tcp, bool has_pkey)
207*cf84ac9aSAndroid Build Coastguard Worker {
208*cf84ac9aSAndroid Build Coastguard Worker printaddr(tcp->u_arg[0]);
209*cf84ac9aSAndroid Build Coastguard Worker tprintf(", %" PRI_klu ", ", tcp->u_arg[1]);
210*cf84ac9aSAndroid Build Coastguard Worker printflags64(mmap_prot, tcp->u_arg[2], "PROT_???");
211*cf84ac9aSAndroid Build Coastguard Worker
212*cf84ac9aSAndroid Build Coastguard Worker if (has_pkey)
213*cf84ac9aSAndroid Build Coastguard Worker tprintf(", %d", (int) tcp->u_arg[3]);
214*cf84ac9aSAndroid Build Coastguard Worker
215*cf84ac9aSAndroid Build Coastguard Worker return RVAL_DECODED;
216*cf84ac9aSAndroid Build Coastguard Worker }
217*cf84ac9aSAndroid Build Coastguard Worker
SYS_FUNC(mprotect)218*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(mprotect)
219*cf84ac9aSAndroid Build Coastguard Worker {
220*cf84ac9aSAndroid Build Coastguard Worker return do_mprotect(tcp, false);
221*cf84ac9aSAndroid Build Coastguard Worker }
222*cf84ac9aSAndroid Build Coastguard Worker
SYS_FUNC(pkey_mprotect)223*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(pkey_mprotect)
224*cf84ac9aSAndroid Build Coastguard Worker {
225*cf84ac9aSAndroid Build Coastguard Worker return do_mprotect(tcp, true);
226*cf84ac9aSAndroid Build Coastguard Worker }
227*cf84ac9aSAndroid Build Coastguard Worker
228*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/mremap_flags.h"
229*cf84ac9aSAndroid Build Coastguard Worker
SYS_FUNC(mremap)230*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(mremap)
231*cf84ac9aSAndroid Build Coastguard Worker {
232*cf84ac9aSAndroid Build Coastguard Worker printaddr(tcp->u_arg[0]);
233*cf84ac9aSAndroid Build Coastguard Worker tprintf(", %" PRI_klu ", %" PRI_klu ", ", tcp->u_arg[1], tcp->u_arg[2]);
234*cf84ac9aSAndroid Build Coastguard Worker printflags64(mremap_flags, tcp->u_arg[3], "MREMAP_???");
235*cf84ac9aSAndroid Build Coastguard Worker #ifdef MREMAP_FIXED
236*cf84ac9aSAndroid Build Coastguard Worker if ((tcp->u_arg[3] & (MREMAP_MAYMOVE | MREMAP_FIXED)) ==
237*cf84ac9aSAndroid Build Coastguard Worker (MREMAP_MAYMOVE | MREMAP_FIXED)) {
238*cf84ac9aSAndroid Build Coastguard Worker tprints(", ");
239*cf84ac9aSAndroid Build Coastguard Worker printaddr(tcp->u_arg[4]);
240*cf84ac9aSAndroid Build Coastguard Worker }
241*cf84ac9aSAndroid Build Coastguard Worker #endif
242*cf84ac9aSAndroid Build Coastguard Worker return RVAL_DECODED | RVAL_HEX;
243*cf84ac9aSAndroid Build Coastguard Worker }
244*cf84ac9aSAndroid Build Coastguard Worker
245*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/madvise_cmds.h"
246*cf84ac9aSAndroid Build Coastguard Worker
SYS_FUNC(madvise)247*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(madvise)
248*cf84ac9aSAndroid Build Coastguard Worker {
249*cf84ac9aSAndroid Build Coastguard Worker printaddr(tcp->u_arg[0]);
250*cf84ac9aSAndroid Build Coastguard Worker tprintf(", %" PRI_klu ", ", tcp->u_arg[1]);
251*cf84ac9aSAndroid Build Coastguard Worker printxval(madvise_cmds, tcp->u_arg[2], "MADV_???");
252*cf84ac9aSAndroid Build Coastguard Worker
253*cf84ac9aSAndroid Build Coastguard Worker return RVAL_DECODED;
254*cf84ac9aSAndroid Build Coastguard Worker }
255*cf84ac9aSAndroid Build Coastguard Worker
256*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/mlockall_flags.h"
257*cf84ac9aSAndroid Build Coastguard Worker
SYS_FUNC(mlockall)258*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(mlockall)
259*cf84ac9aSAndroid Build Coastguard Worker {
260*cf84ac9aSAndroid Build Coastguard Worker printflags(mlockall_flags, tcp->u_arg[0], "MCL_???");
261*cf84ac9aSAndroid Build Coastguard Worker
262*cf84ac9aSAndroid Build Coastguard Worker return RVAL_DECODED;
263*cf84ac9aSAndroid Build Coastguard Worker }
264*cf84ac9aSAndroid Build Coastguard Worker
265*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/mctl_sync.h"
266*cf84ac9aSAndroid Build Coastguard Worker
SYS_FUNC(msync)267*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(msync)
268*cf84ac9aSAndroid Build Coastguard Worker {
269*cf84ac9aSAndroid Build Coastguard Worker /* addr */
270*cf84ac9aSAndroid Build Coastguard Worker printaddr(tcp->u_arg[0]);
271*cf84ac9aSAndroid Build Coastguard Worker /* len */
272*cf84ac9aSAndroid Build Coastguard Worker tprintf(", %" PRI_klu ", ", tcp->u_arg[1]);
273*cf84ac9aSAndroid Build Coastguard Worker /* flags */
274*cf84ac9aSAndroid Build Coastguard Worker printflags(mctl_sync, tcp->u_arg[2], "MS_???");
275*cf84ac9aSAndroid Build Coastguard Worker
276*cf84ac9aSAndroid Build Coastguard Worker return RVAL_DECODED;
277*cf84ac9aSAndroid Build Coastguard Worker }
278*cf84ac9aSAndroid Build Coastguard Worker
279*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/mlock_flags.h"
280*cf84ac9aSAndroid Build Coastguard Worker
SYS_FUNC(mlock2)281*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(mlock2)
282*cf84ac9aSAndroid Build Coastguard Worker {
283*cf84ac9aSAndroid Build Coastguard Worker printaddr(tcp->u_arg[0]);
284*cf84ac9aSAndroid Build Coastguard Worker tprintf(", %" PRI_klu ", ", tcp->u_arg[1]);
285*cf84ac9aSAndroid Build Coastguard Worker printflags(mlock_flags, tcp->u_arg[2], "MLOCK_???");
286*cf84ac9aSAndroid Build Coastguard Worker
287*cf84ac9aSAndroid Build Coastguard Worker return RVAL_DECODED;
288*cf84ac9aSAndroid Build Coastguard Worker }
289*cf84ac9aSAndroid Build Coastguard Worker
SYS_FUNC(mincore)290*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(mincore)
291*cf84ac9aSAndroid Build Coastguard Worker {
292*cf84ac9aSAndroid Build Coastguard Worker if (entering(tcp)) {
293*cf84ac9aSAndroid Build Coastguard Worker printaddr(tcp->u_arg[0]);
294*cf84ac9aSAndroid Build Coastguard Worker tprintf(", %" PRI_klu ", ", tcp->u_arg[1]);
295*cf84ac9aSAndroid Build Coastguard Worker } else {
296*cf84ac9aSAndroid Build Coastguard Worker const unsigned long page_size = get_pagesize();
297*cf84ac9aSAndroid Build Coastguard Worker const unsigned long page_mask = page_size - 1;
298*cf84ac9aSAndroid Build Coastguard Worker unsigned long len = tcp->u_arg[1];
299*cf84ac9aSAndroid Build Coastguard Worker unsigned char *vec = NULL;
300*cf84ac9aSAndroid Build Coastguard Worker
301*cf84ac9aSAndroid Build Coastguard Worker len = len / page_size + (len & page_mask ? 1 : 0);
302*cf84ac9aSAndroid Build Coastguard Worker if (syserror(tcp) || !verbose(tcp) ||
303*cf84ac9aSAndroid Build Coastguard Worker !tcp->u_arg[2] || !(vec = malloc(len)) ||
304*cf84ac9aSAndroid Build Coastguard Worker umoven(tcp, tcp->u_arg[2], len, vec) < 0)
305*cf84ac9aSAndroid Build Coastguard Worker printaddr(tcp->u_arg[2]);
306*cf84ac9aSAndroid Build Coastguard Worker else {
307*cf84ac9aSAndroid Build Coastguard Worker unsigned long i;
308*cf84ac9aSAndroid Build Coastguard Worker tprints("[");
309*cf84ac9aSAndroid Build Coastguard Worker for (i = 0; i < len; i++) {
310*cf84ac9aSAndroid Build Coastguard Worker if (i)
311*cf84ac9aSAndroid Build Coastguard Worker tprints(", ");
312*cf84ac9aSAndroid Build Coastguard Worker if (abbrev(tcp) && i >= max_strlen) {
313*cf84ac9aSAndroid Build Coastguard Worker tprints("...");
314*cf84ac9aSAndroid Build Coastguard Worker break;
315*cf84ac9aSAndroid Build Coastguard Worker }
316*cf84ac9aSAndroid Build Coastguard Worker tprints((vec[i] & 1) ? "1" : "0");
317*cf84ac9aSAndroid Build Coastguard Worker }
318*cf84ac9aSAndroid Build Coastguard Worker tprints("]");
319*cf84ac9aSAndroid Build Coastguard Worker }
320*cf84ac9aSAndroid Build Coastguard Worker free(vec);
321*cf84ac9aSAndroid Build Coastguard Worker }
322*cf84ac9aSAndroid Build Coastguard Worker return 0;
323*cf84ac9aSAndroid Build Coastguard Worker }
324*cf84ac9aSAndroid Build Coastguard Worker
SYS_FUNC(remap_file_pages)325*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(remap_file_pages)
326*cf84ac9aSAndroid Build Coastguard Worker {
327*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr = tcp->u_arg[0];
328*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t size = tcp->u_arg[1];
329*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t prot = tcp->u_arg[2];
330*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t pgoff = tcp->u_arg[3];
331*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t flags = tcp->u_arg[4];
332*cf84ac9aSAndroid Build Coastguard Worker
333*cf84ac9aSAndroid Build Coastguard Worker printaddr(addr);
334*cf84ac9aSAndroid Build Coastguard Worker tprintf(", %" PRI_klu ", ", size);
335*cf84ac9aSAndroid Build Coastguard Worker printflags64(mmap_prot, prot, "PROT_???");
336*cf84ac9aSAndroid Build Coastguard Worker tprintf(", %" PRI_klu ", ", pgoff);
337*cf84ac9aSAndroid Build Coastguard Worker print_mmap_flags(flags);
338*cf84ac9aSAndroid Build Coastguard Worker
339*cf84ac9aSAndroid Build Coastguard Worker return RVAL_DECODED;
340*cf84ac9aSAndroid Build Coastguard Worker }
341*cf84ac9aSAndroid Build Coastguard Worker
342*cf84ac9aSAndroid Build Coastguard Worker #if defined(POWERPC)
343*cf84ac9aSAndroid Build Coastguard Worker static bool
print_protmap_entry(struct tcb * tcp,void * elem_buf,size_t elem_size,void * data)344*cf84ac9aSAndroid Build Coastguard Worker print_protmap_entry(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
345*cf84ac9aSAndroid Build Coastguard Worker {
346*cf84ac9aSAndroid Build Coastguard Worker tprintf("%#08x", *(unsigned int *) elem_buf);
347*cf84ac9aSAndroid Build Coastguard Worker
348*cf84ac9aSAndroid Build Coastguard Worker return true;
349*cf84ac9aSAndroid Build Coastguard Worker }
350*cf84ac9aSAndroid Build Coastguard Worker
SYS_FUNC(subpage_prot)351*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(subpage_prot)
352*cf84ac9aSAndroid Build Coastguard Worker {
353*cf84ac9aSAndroid Build Coastguard Worker kernel_ulong_t addr = tcp->u_arg[0];
354*cf84ac9aSAndroid Build Coastguard Worker kernel_ulong_t len = tcp->u_arg[1];
355*cf84ac9aSAndroid Build Coastguard Worker kernel_ulong_t nmemb = len >> 16;
356*cf84ac9aSAndroid Build Coastguard Worker kernel_ulong_t map = tcp->u_arg[2];
357*cf84ac9aSAndroid Build Coastguard Worker
358*cf84ac9aSAndroid Build Coastguard Worker printaddr(addr);
359*cf84ac9aSAndroid Build Coastguard Worker tprintf(", %" PRI_klu ", ", len);
360*cf84ac9aSAndroid Build Coastguard Worker
361*cf84ac9aSAndroid Build Coastguard Worker unsigned int entry;
362*cf84ac9aSAndroid Build Coastguard Worker print_array(tcp, map, nmemb, &entry, sizeof(entry),
363*cf84ac9aSAndroid Build Coastguard Worker tfetch_mem, print_protmap_entry, 0);
364*cf84ac9aSAndroid Build Coastguard Worker
365*cf84ac9aSAndroid Build Coastguard Worker return RVAL_DECODED;
366*cf84ac9aSAndroid Build Coastguard Worker }
367*cf84ac9aSAndroid Build Coastguard Worker #endif
368