xref: /aosp_15_r20/external/strace/mem.c (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
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