162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#include <syscall.h>
362306a36Sopenharmony_ci#include <errno.h>
462306a36Sopenharmony_ci#include <stdio.h>
562306a36Sopenharmony_ci#include <stdlib.h>
662306a36Sopenharmony_ci
762306a36Sopenharmony_cistatic int mlock2_(void *start, size_t len, int flags)
862306a36Sopenharmony_ci{
962306a36Sopenharmony_ci#ifdef __NR_mlock2
1062306a36Sopenharmony_ci	return syscall(__NR_mlock2, start, len, flags);
1162306a36Sopenharmony_ci#else
1262306a36Sopenharmony_ci	errno = ENOSYS;
1362306a36Sopenharmony_ci	return -1;
1462306a36Sopenharmony_ci#endif
1562306a36Sopenharmony_ci}
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistatic FILE *seek_to_smaps_entry(unsigned long addr)
1862306a36Sopenharmony_ci{
1962306a36Sopenharmony_ci	FILE *file;
2062306a36Sopenharmony_ci	char *line = NULL;
2162306a36Sopenharmony_ci	size_t size = 0;
2262306a36Sopenharmony_ci	unsigned long start, end;
2362306a36Sopenharmony_ci	char perms[5];
2462306a36Sopenharmony_ci	unsigned long offset;
2562306a36Sopenharmony_ci	char dev[32];
2662306a36Sopenharmony_ci	unsigned long inode;
2762306a36Sopenharmony_ci	char path[BUFSIZ];
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	file = fopen("/proc/self/smaps", "r");
3062306a36Sopenharmony_ci	if (!file) {
3162306a36Sopenharmony_ci		perror("fopen smaps");
3262306a36Sopenharmony_ci		_exit(1);
3362306a36Sopenharmony_ci	}
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	while (getline(&line, &size, file) > 0) {
3662306a36Sopenharmony_ci		if (sscanf(line, "%lx-%lx %s %lx %s %lu %s\n",
3762306a36Sopenharmony_ci			   &start, &end, perms, &offset, dev, &inode, path) < 6)
3862306a36Sopenharmony_ci			goto next;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci		if (start <= addr && addr < end)
4162306a36Sopenharmony_ci			goto out;
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cinext:
4462306a36Sopenharmony_ci		free(line);
4562306a36Sopenharmony_ci		line = NULL;
4662306a36Sopenharmony_ci		size = 0;
4762306a36Sopenharmony_ci	}
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	fclose(file);
5062306a36Sopenharmony_ci	file = NULL;
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ciout:
5362306a36Sopenharmony_ci	free(line);
5462306a36Sopenharmony_ci	return file;
5562306a36Sopenharmony_ci}
56