1*053f45beSAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0 */
2*053f45beSAndroid Build Coastguard Worker #include <syscall.h>
3*053f45beSAndroid Build Coastguard Worker #include <errno.h>
4*053f45beSAndroid Build Coastguard Worker #include <stdio.h>
5*053f45beSAndroid Build Coastguard Worker #include <stdlib.h>
6*053f45beSAndroid Build Coastguard Worker
7*053f45beSAndroid Build Coastguard Worker #ifndef MLOCK_ONFAULT
8*053f45beSAndroid Build Coastguard Worker #define MLOCK_ONFAULT 1
9*053f45beSAndroid Build Coastguard Worker #endif
10*053f45beSAndroid Build Coastguard Worker
11*053f45beSAndroid Build Coastguard Worker #ifndef MCL_ONFAULT
12*053f45beSAndroid Build Coastguard Worker #define MCL_ONFAULT (MCL_FUTURE << 1)
13*053f45beSAndroid Build Coastguard Worker #endif
14*053f45beSAndroid Build Coastguard Worker
mlock2_(void * start,size_t len,int flags)15*053f45beSAndroid Build Coastguard Worker static int mlock2_(void *start, size_t len, int flags)
16*053f45beSAndroid Build Coastguard Worker {
17*053f45beSAndroid Build Coastguard Worker #ifdef __NR_mlock2
18*053f45beSAndroid Build Coastguard Worker return syscall(__NR_mlock2, start, len, flags);
19*053f45beSAndroid Build Coastguard Worker #else
20*053f45beSAndroid Build Coastguard Worker errno = ENOSYS;
21*053f45beSAndroid Build Coastguard Worker return -1;
22*053f45beSAndroid Build Coastguard Worker #endif
23*053f45beSAndroid Build Coastguard Worker }
24*053f45beSAndroid Build Coastguard Worker
seek_to_smaps_entry(unsigned long addr)25*053f45beSAndroid Build Coastguard Worker static FILE *seek_to_smaps_entry(unsigned long addr)
26*053f45beSAndroid Build Coastguard Worker {
27*053f45beSAndroid Build Coastguard Worker FILE *file;
28*053f45beSAndroid Build Coastguard Worker char *line = NULL;
29*053f45beSAndroid Build Coastguard Worker size_t size = 0;
30*053f45beSAndroid Build Coastguard Worker unsigned long start, end;
31*053f45beSAndroid Build Coastguard Worker char perms[5];
32*053f45beSAndroid Build Coastguard Worker unsigned long offset;
33*053f45beSAndroid Build Coastguard Worker char dev[32];
34*053f45beSAndroid Build Coastguard Worker unsigned long inode;
35*053f45beSAndroid Build Coastguard Worker char path[BUFSIZ];
36*053f45beSAndroid Build Coastguard Worker
37*053f45beSAndroid Build Coastguard Worker file = fopen("/proc/self/smaps", "r");
38*053f45beSAndroid Build Coastguard Worker if (!file) {
39*053f45beSAndroid Build Coastguard Worker perror("fopen smaps");
40*053f45beSAndroid Build Coastguard Worker _exit(1);
41*053f45beSAndroid Build Coastguard Worker }
42*053f45beSAndroid Build Coastguard Worker
43*053f45beSAndroid Build Coastguard Worker while (getline(&line, &size, file) > 0) {
44*053f45beSAndroid Build Coastguard Worker if (sscanf(line, "%lx-%lx %s %lx %s %lu %s\n",
45*053f45beSAndroid Build Coastguard Worker &start, &end, perms, &offset, dev, &inode, path) < 6)
46*053f45beSAndroid Build Coastguard Worker goto next;
47*053f45beSAndroid Build Coastguard Worker
48*053f45beSAndroid Build Coastguard Worker if (start <= addr && addr < end)
49*053f45beSAndroid Build Coastguard Worker goto out;
50*053f45beSAndroid Build Coastguard Worker
51*053f45beSAndroid Build Coastguard Worker next:
52*053f45beSAndroid Build Coastguard Worker free(line);
53*053f45beSAndroid Build Coastguard Worker line = NULL;
54*053f45beSAndroid Build Coastguard Worker size = 0;
55*053f45beSAndroid Build Coastguard Worker }
56*053f45beSAndroid Build Coastguard Worker
57*053f45beSAndroid Build Coastguard Worker fclose(file);
58*053f45beSAndroid Build Coastguard Worker file = NULL;
59*053f45beSAndroid Build Coastguard Worker
60*053f45beSAndroid Build Coastguard Worker out:
61*053f45beSAndroid Build Coastguard Worker free(line);
62*053f45beSAndroid Build Coastguard Worker return file;
63*053f45beSAndroid Build Coastguard Worker }
64