#include #include #include #include #include #include #include #include "pagemap.h" static void add_index(unsigned long index) { static unsigned long offset, len; if (index == offset + len) len++; else { if (len) printf("%10lu %8lu %8luKB\n", offset, len, pages2kb(len)); offset = index; len = 1; } } static void usage(const char *prog) { printf("Usage: %s page_flags\n", prog); } static uint64_t kpageflags[KPF_BYTES * (1<<20)]; int main(int argc, char *argv[]) { uint64_t match_flags; int match_exact; unsigned long n; unsigned long i; char *p; int fd; if (argc < 2) { usage(argv[0]); exit(1); } match_exact = 0; p = argv[1]; if (p[0] == '=') { match_exact = 1; p++; } match_flags = strtol(p, 0, 16); fd = open(PROC_KPAGEFLAGS, O_RDONLY); if (fd < 0) { perror(PROC_KPAGEFLAGS); exit(1); } while (1) { n = read(fd, kpageflags, sizeof(kpageflags)); if (n == 0) break; if (n < 0) { perror(PROC_KPAGEFLAGS); exit(2); } if (n % KPF_BYTES != 0) { fprintf(stderr, "%s: partial read: %lu bytes\n", argv[0], n); exit(3); } n = n / KPF_BYTES; printf(" offset len KB\n"); for (i = 0; i < n; i++) { if (!match_exact && ((kpageflags[i] & match_flags) == match_flags) || (match_exact && kpageflags[i] == match_flags)) add_index(i); } } add_index(0); /* flush the stored range */ return 0; }