xref: /aosp_15_r20/external/strace/tests-mx32/remap_file_pages.c (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker  * Check decoding of remap_file_pages syscall.
3*cf84ac9aSAndroid Build Coastguard Worker  *
4*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2016-2017 Dmitry V. Levin <[email protected]>
5*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2016-2018 The strace developers.
6*cf84ac9aSAndroid Build Coastguard Worker  * All rights reserved.
7*cf84ac9aSAndroid Build Coastguard Worker  *
8*cf84ac9aSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
9*cf84ac9aSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
10*cf84ac9aSAndroid Build Coastguard Worker  * are met:
11*cf84ac9aSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
12*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
13*cf84ac9aSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
14*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
15*cf84ac9aSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
16*cf84ac9aSAndroid Build Coastguard Worker  * 3. The name of the author may not be used to endorse or promote products
17*cf84ac9aSAndroid Build Coastguard Worker  *    derived from this software without specific prior written permission.
18*cf84ac9aSAndroid Build Coastguard Worker  *
19*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20*cf84ac9aSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21*cf84ac9aSAndroid Build Coastguard Worker  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22*cf84ac9aSAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23*cf84ac9aSAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24*cf84ac9aSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*cf84ac9aSAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*cf84ac9aSAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*cf84ac9aSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*cf84ac9aSAndroid Build Coastguard Worker  */
30*cf84ac9aSAndroid Build Coastguard Worker 
31*cf84ac9aSAndroid Build Coastguard Worker #include "tests.h"
32*cf84ac9aSAndroid Build Coastguard Worker #include <asm/unistd.h>
33*cf84ac9aSAndroid Build Coastguard Worker 
34*cf84ac9aSAndroid Build Coastguard Worker #ifdef __NR_remap_file_pages
35*cf84ac9aSAndroid Build Coastguard Worker 
36*cf84ac9aSAndroid Build Coastguard Worker # include <stdio.h>
37*cf84ac9aSAndroid Build Coastguard Worker # include <stdint.h>
38*cf84ac9aSAndroid Build Coastguard Worker # include <unistd.h>
39*cf84ac9aSAndroid Build Coastguard Worker # include <linux/mman.h>
40*cf84ac9aSAndroid Build Coastguard Worker 
41*cf84ac9aSAndroid Build Coastguard Worker static const char *errstr;
42*cf84ac9aSAndroid Build Coastguard Worker 
43*cf84ac9aSAndroid Build Coastguard Worker static long
k_remap_file_pages(const kernel_ulong_t addr,const kernel_ulong_t size,const kernel_ulong_t prot,const kernel_ulong_t pgoff,const kernel_ulong_t flags)44*cf84ac9aSAndroid Build Coastguard Worker k_remap_file_pages(const kernel_ulong_t addr,
45*cf84ac9aSAndroid Build Coastguard Worker 		   const kernel_ulong_t size,
46*cf84ac9aSAndroid Build Coastguard Worker 		   const kernel_ulong_t prot,
47*cf84ac9aSAndroid Build Coastguard Worker 		   const kernel_ulong_t pgoff,
48*cf84ac9aSAndroid Build Coastguard Worker 		   const kernel_ulong_t flags)
49*cf84ac9aSAndroid Build Coastguard Worker {
50*cf84ac9aSAndroid Build Coastguard Worker 	const long rc = syscall(__NR_remap_file_pages,
51*cf84ac9aSAndroid Build Coastguard Worker 				addr, size, prot, pgoff, flags);
52*cf84ac9aSAndroid Build Coastguard Worker 	errstr = sprintrc(rc);
53*cf84ac9aSAndroid Build Coastguard Worker 	return rc;
54*cf84ac9aSAndroid Build Coastguard Worker }
55*cf84ac9aSAndroid Build Coastguard Worker 
56*cf84ac9aSAndroid Build Coastguard Worker int
main(void)57*cf84ac9aSAndroid Build Coastguard Worker main(void)
58*cf84ac9aSAndroid Build Coastguard Worker {
59*cf84ac9aSAndroid Build Coastguard Worker 	kernel_ulong_t addr = (kernel_ulong_t) 0xfacefeeddeadbeefULL;
60*cf84ac9aSAndroid Build Coastguard Worker 	kernel_ulong_t size = (kernel_ulong_t) 0xdefaced1bad2f00dULL;
61*cf84ac9aSAndroid Build Coastguard Worker 	kernel_ulong_t prot = PROT_READ|PROT_WRITE|PROT_EXEC;
62*cf84ac9aSAndroid Build Coastguard Worker 	kernel_ulong_t pgoff = (kernel_ulong_t) 0xcaf3babebad4deedULL;
63*cf84ac9aSAndroid Build Coastguard Worker 	kernel_ulong_t flags = MAP_PRIVATE|MAP_ANONYMOUS;
64*cf84ac9aSAndroid Build Coastguard Worker 
65*cf84ac9aSAndroid Build Coastguard Worker 	k_remap_file_pages(addr, size, prot, pgoff, flags);
66*cf84ac9aSAndroid Build Coastguard Worker 	printf("remap_file_pages(%#jx, %ju, %s, %ju, %s) = %s\n",
67*cf84ac9aSAndroid Build Coastguard Worker 	       (uintmax_t) addr, (uintmax_t) size,
68*cf84ac9aSAndroid Build Coastguard Worker 	       "PROT_READ|PROT_WRITE|PROT_EXEC",
69*cf84ac9aSAndroid Build Coastguard Worker 	       (uintmax_t) pgoff, "MAP_PRIVATE|MAP_ANONYMOUS", errstr);
70*cf84ac9aSAndroid Build Coastguard Worker 
71*cf84ac9aSAndroid Build Coastguard Worker #ifdef MAP_HUGETLB
72*cf84ac9aSAndroid Build Coastguard Worker # ifndef MAP_HUGE_2MB
73*cf84ac9aSAndroid Build Coastguard Worker #  ifndef MAP_HUGE_SHIFT
74*cf84ac9aSAndroid Build Coastguard Worker #   define MAP_HUGE_SHIFT 26
75*cf84ac9aSAndroid Build Coastguard Worker #  endif
76*cf84ac9aSAndroid Build Coastguard Worker #  define MAP_HUGE_2MB (21 << MAP_HUGE_SHIFT)
77*cf84ac9aSAndroid Build Coastguard Worker # endif /* !MAP_HUGE_2MB */
78*cf84ac9aSAndroid Build Coastguard Worker 	addr = (kernel_ulong_t) 0xfacefeeddeadf00dULL;
79*cf84ac9aSAndroid Build Coastguard Worker 	size = (kernel_ulong_t) 0xdefaced1bad2beefULL;
80*cf84ac9aSAndroid Build Coastguard Worker 	prot = (kernel_ulong_t) 0xdefaced00000000ULL | PROT_NONE;
81*cf84ac9aSAndroid Build Coastguard Worker 	flags = MAP_TYPE | MAP_FIXED | MAP_NORESERVE | MAP_HUGETLB | MAP_HUGE_2MB;
82*cf84ac9aSAndroid Build Coastguard Worker 
83*cf84ac9aSAndroid Build Coastguard Worker 	k_remap_file_pages(addr, size, prot, pgoff, flags);
84*cf84ac9aSAndroid Build Coastguard Worker 	printf("remap_file_pages(%#jx, %ju, %s, %ju"
85*cf84ac9aSAndroid Build Coastguard Worker /*
86*cf84ac9aSAndroid Build Coastguard Worker  * HP PA-RISC is the only architecture that has MAP_TYPE defined to 0x3, which
87*cf84ac9aSAndroid Build Coastguard Worker  * is also used for MAP_SHARED_VALIDATE since Linux commit v4.15-rc1~71^2^2~23.
88*cf84ac9aSAndroid Build Coastguard Worker  */
89*cf84ac9aSAndroid Build Coastguard Worker # ifdef __hppa__
90*cf84ac9aSAndroid Build Coastguard Worker 	       ", MAP_SHARED_VALIDATE"
91*cf84ac9aSAndroid Build Coastguard Worker # else
92*cf84ac9aSAndroid Build Coastguard Worker 	       ", 0xf /* MAP_??? */"
93*cf84ac9aSAndroid Build Coastguard Worker # endif
94*cf84ac9aSAndroid Build Coastguard Worker 	       "|MAP_FIXED|MAP_NORESERVE|MAP_HUGETLB|21<<MAP_HUGE_SHIFT)"
95*cf84ac9aSAndroid Build Coastguard Worker 	       " = %s\n",
96*cf84ac9aSAndroid Build Coastguard Worker 	       (uintmax_t) addr, (uintmax_t) size,
97*cf84ac9aSAndroid Build Coastguard Worker 	       prot == PROT_NONE ? "PROT_NONE" :
98*cf84ac9aSAndroid Build Coastguard Worker 				   "0xdefaced00000000 /* PROT_??? */",
99*cf84ac9aSAndroid Build Coastguard Worker 	       (uintmax_t) pgoff, errstr);
100*cf84ac9aSAndroid Build Coastguard Worker #endif /* MAP_HUGETLB */
101*cf84ac9aSAndroid Build Coastguard Worker 
102*cf84ac9aSAndroid Build Coastguard Worker 	puts("+++ exited with 0 +++");
103*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
104*cf84ac9aSAndroid Build Coastguard Worker }
105*cf84ac9aSAndroid Build Coastguard Worker 
106*cf84ac9aSAndroid Build Coastguard Worker #else
107*cf84ac9aSAndroid Build Coastguard Worker 
108*cf84ac9aSAndroid Build Coastguard Worker SKIP_MAIN_UNDEFINED("__NR_remap_file_pages")
109*cf84ac9aSAndroid Build Coastguard Worker 
110*cf84ac9aSAndroid Build Coastguard Worker #endif
111