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