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