Ruby 4.1.0dev (2026-08-15 revision cfb2ed7c723c5435f630fd70897273db032b0bcc)
procstat_vm.c
1#ifdef __FreeBSD__
2#include <sys/user.h>
3#include <sys/sysctl.h>
4#include <sys/param.h>
5#include <libprocstat.h>
6# ifndef KVME_TYPE_MGTDEVICE
7# define KVME_TYPE_MGTDEVICE 8
8# endif
9void
10procstat_vm(struct procstat *procstat, struct kinfo_proc *kipp, FILE *errout)
11{
12 struct kinfo_vmentry *freep, *kve;
13 int ptrwidth;
14 unsigned int i, cnt;
15 const char *str;
16#ifdef __x86_64__
17 ptrwidth = 14;
18#else
19 ptrwidth = 2*sizeof(void *) + 2;
20#endif
21 fprintf(errout, "%*s %*s %3s %4s %4s %3s %3s %4s %-2s %-s\n",
22 ptrwidth, "START", ptrwidth, "END", "PRT", "RES",
23 "P""RES", "REF", "SHD", "FL", "TP", "PATH");
24
25#ifdef HAVE_PROCSTAT_GETVMMAP
26 freep = procstat_getvmmap(procstat, kipp, &cnt);
27#else
28 freep = kinfo_getvmmap(kipp->ki_pid, &cnt);
29#endif
30 if (freep == NULL)
31 return;
32 for (i = 0; i < cnt; i++) {
33 kve = &freep[i];
34 fprintf(errout, "%#*jx ", ptrwidth, (uintmax_t)kve->kve_start);
35 fprintf(errout, "%#*jx ", ptrwidth, (uintmax_t)kve->kve_end);
36 fprintf(errout, "%s", kve->kve_protection & KVME_PROT_READ ? "r" : "-");
37 fprintf(errout, "%s", kve->kve_protection & KVME_PROT_WRITE ? "w" : "-");
38 fprintf(errout, "%s ", kve->kve_protection & KVME_PROT_EXEC ? "x" : "-");
39 fprintf(errout, "%4d ", kve->kve_resident);
40 fprintf(errout, "%4d ", kve->kve_private_resident);
41 fprintf(errout, "%3d ", kve->kve_ref_count);
42 fprintf(errout, "%3d ", kve->kve_shadow_count);
43 fprintf(errout, "%-1s", kve->kve_flags & KVME_FLAG_COW ? "C" : "-");
44 fprintf(errout, "%-1s", kve->kve_flags & KVME_FLAG_NEEDS_COPY ? "N" :
45 "-");
46 fprintf(errout, "%-1s", kve->kve_flags & KVME_FLAG_SUPER ? "S" : "-");
47 fprintf(errout, "%-1s ", kve->kve_flags & KVME_FLAG_GROWS_UP ? "U" :
48 kve->kve_flags & KVME_FLAG_GROWS_DOWN ? "D" : "-");
49 switch (kve->kve_type) {
50 case KVME_TYPE_NONE:
51 str = "--";
52 break;
53 case KVME_TYPE_DEFAULT:
54 str = "df";
55 break;
56 case KVME_TYPE_VNODE:
57 str = "vn";
58 break;
59 case KVME_TYPE_SWAP:
60 str = "sw";
61 break;
62 case KVME_TYPE_DEVICE:
63 str = "dv";
64 break;
65 case KVME_TYPE_PHYS:
66 str = "ph";
67 break;
68 case KVME_TYPE_DEAD:
69 str = "dd";
70 break;
71 case KVME_TYPE_SG:
72 str = "sg";
73 break;
74 case KVME_TYPE_MGTDEVICE:
75 str = "md";
76 break;
77 case KVME_TYPE_UNKNOWN:
78 default:
79 str = "??";
80 break;
81 }
82 fprintf(errout, "%-2s ", str);
83 fprintf(errout, "%-s\n", kve->kve_path);
84 }
85 free(freep);
86}
87#endif