1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * Copyright (C) 2023 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com> 4 */ 5 6 #ifndef PROCESS_MADVISE_H__ 7 #define PROCESS_MADVISE_H__ 8 9 #include <stdio.h> 10 #include <stdlib.h> 11 #include <string.h> 12 #include <unistd.h> 13 #include "tst_safe_stdio.h" 14 15 struct addr_mapping { 16 int size; 17 int rss; 18 int pss; 19 int shared_clean; 20 int shared_dirty; 21 int private_clean; 22 int private_dirty; 23 int referenced; 24 int anonymous; 25 int anon_huge_pages; 26 int shmem_huge_pages; 27 int shmem_pmd_mapped; 28 int swap; 29 int kernel_page_size; 30 int mmu_page_size; 31 int locked; 32 int protection_key; 33 }; 34 read_address_mapping(unsigned long address,struct addr_mapping * mapping)35 static inline void read_address_mapping(unsigned long address, struct addr_mapping *mapping) 36 { 37 FILE *f; 38 int found = 0; 39 char label[BUFSIZ]; 40 char line[BUFSIZ]; 41 char smaps[BUFSIZ]; 42 char ptr_str[BUFSIZ]; 43 int value; 44 45 snprintf(smaps, BUFSIZ, "/proc/%i/smaps", getpid()); 46 snprintf(ptr_str, BUFSIZ, "%lx", address); 47 48 f = SAFE_FOPEN(smaps, "r"); 49 50 while (fgets(line, BUFSIZ, f) != NULL) { 51 if (strncmp(ptr_str, line, strlen(ptr_str)) == 0) 52 found = 1; 53 54 if (!found) 55 continue; 56 57 if (found && strcmp(line, "VmFlags") >= 0) 58 break; 59 60 if (sscanf(line, "%31[^:]: %d", label, &value) > 0) { 61 if (strcmp(label, "Size") == 0) 62 mapping->size = value; 63 else if (strcmp(label, "Rss") == 0) 64 mapping->rss = value; 65 else if (strcmp(label, "Pss") == 0) 66 mapping->pss = value; 67 else if (strcmp(label, "Shared_Clean") == 0) 68 mapping->shared_clean = value; 69 else if (strcmp(label, "Shared_Dirty") == 0) 70 mapping->shared_dirty = value; 71 else if (strcmp(label, "Private_Clean") == 0) 72 mapping->private_clean = value; 73 else if (strcmp(label, "Private_Dirty") == 0) 74 mapping->private_dirty = value; 75 else if (strcmp(label, "Referenced") == 0) 76 mapping->referenced = value; 77 else if (strcmp(label, "Anonymous") == 0) 78 mapping->anonymous = value; 79 else if (strcmp(label, "AnonHugePages") == 0) 80 mapping->anon_huge_pages = value; 81 else if (strcmp(label, "ShmemHugePages") == 0) 82 mapping->shmem_huge_pages = value; 83 else if (strcmp(label, "ShmemPmdMapped") == 0) 84 mapping->shmem_pmd_mapped = value; 85 else if (strcmp(label, "Swap") == 0) 86 mapping->swap = value; 87 else if (strcmp(label, "KernelPageSize") == 0) 88 mapping->kernel_page_size = value; 89 else if (strcmp(label, "MMUPageSize") == 0) 90 mapping->mmu_page_size = value; 91 else if (strcmp(label, "Locked") == 0) 92 mapping->locked = value; 93 else if (strcmp(label, "ProtectionKey") == 0) 94 mapping->protection_key = value; 95 } 96 } 97 98 SAFE_FCLOSE(f); 99 } 100 101 #endif 102