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