1*0a6a1f1dSLionel Sambuc #include <sys/cdefs.h>
2*0a6a1f1dSLionel Sambuc #ifdef __FBSDID
3*0a6a1f1dSLionel Sambuc __FBSDID("$FreeBSD: head/lib/libutil/kinfo_getvmmap.c 186512 2008-12-27 11:12:23Z rwatson $");
4*0a6a1f1dSLionel Sambuc #endif
5*0a6a1f1dSLionel Sambuc __RCSID("$NetBSD: kinfo_getvmmap.c,v 1.3 2015/09/26 20:28:55 christos Exp $");
6*0a6a1f1dSLionel Sambuc
7*0a6a1f1dSLionel Sambuc #include <sys/param.h>
8*0a6a1f1dSLionel Sambuc #include <sys/user.h>
9*0a6a1f1dSLionel Sambuc #include <sys/sysctl.h>
10*0a6a1f1dSLionel Sambuc #include <stdlib.h>
11*0a6a1f1dSLionel Sambuc #include <string.h>
12*0a6a1f1dSLionel Sambuc #include <util.h>
13*0a6a1f1dSLionel Sambuc #include <uvm/uvm_param.h>
14*0a6a1f1dSLionel Sambuc
15*0a6a1f1dSLionel Sambuc struct kinfo_vmentry *
kinfo_getvmmap(pid_t pid,size_t * cntp)16*0a6a1f1dSLionel Sambuc kinfo_getvmmap(pid_t pid, size_t *cntp)
17*0a6a1f1dSLionel Sambuc {
18*0a6a1f1dSLionel Sambuc int mib[5];
19*0a6a1f1dSLionel Sambuc int error;
20*0a6a1f1dSLionel Sambuc size_t len;
21*0a6a1f1dSLionel Sambuc struct kinfo_vmentry *kiv;
22*0a6a1f1dSLionel Sambuc
23*0a6a1f1dSLionel Sambuc *cntp = 0;
24*0a6a1f1dSLionel Sambuc len = 0;
25*0a6a1f1dSLionel Sambuc mib[0] = CTL_VM;
26*0a6a1f1dSLionel Sambuc mib[1] = VM_PROC;
27*0a6a1f1dSLionel Sambuc mib[2] = VM_PROC_MAP;
28*0a6a1f1dSLionel Sambuc mib[3] = pid;
29*0a6a1f1dSLionel Sambuc mib[4] = sizeof(*kiv);
30*0a6a1f1dSLionel Sambuc
31*0a6a1f1dSLionel Sambuc error = sysctl(mib, (u_int)__arraycount(mib), NULL, &len, NULL, 0);
32*0a6a1f1dSLionel Sambuc if (error)
33*0a6a1f1dSLionel Sambuc return NULL;
34*0a6a1f1dSLionel Sambuc
35*0a6a1f1dSLionel Sambuc len = len * 4 / 3;
36*0a6a1f1dSLionel Sambuc
37*0a6a1f1dSLionel Sambuc kiv = malloc(len);
38*0a6a1f1dSLionel Sambuc if (kiv == NULL)
39*0a6a1f1dSLionel Sambuc return NULL;
40*0a6a1f1dSLionel Sambuc
41*0a6a1f1dSLionel Sambuc error = sysctl(mib, (u_int)__arraycount(mib), kiv, &len, NULL, 0);
42*0a6a1f1dSLionel Sambuc if (error) {
43*0a6a1f1dSLionel Sambuc free(kiv);
44*0a6a1f1dSLionel Sambuc return NULL;
45*0a6a1f1dSLionel Sambuc }
46*0a6a1f1dSLionel Sambuc
47*0a6a1f1dSLionel Sambuc *cntp = len / sizeof(*kiv);
48*0a6a1f1dSLionel Sambuc return kiv; /* Caller must free() return value */
49*0a6a1f1dSLionel Sambuc }
50