xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/vm/mlock2.h (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
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