1e99272c7SMikolaj Golub /*-
24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause
31de7b4b8SPedro F. Giffuni *
4e99272c7SMikolaj Golub * Copyright (c) 2011 Mikolaj Golub
5474b62b8SAllan Jude * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org>
6e99272c7SMikolaj Golub * All rights reserved.
7e99272c7SMikolaj Golub *
8e99272c7SMikolaj Golub * Redistribution and use in source and binary forms, with or without
9e99272c7SMikolaj Golub * modification, are permitted provided that the following conditions
10e99272c7SMikolaj Golub * are met:
11e99272c7SMikolaj Golub * 1. Redistributions of source code must retain the above copyright
12e99272c7SMikolaj Golub * notice, this list of conditions and the following disclaimer.
13e99272c7SMikolaj Golub * 2. Redistributions in binary form must reproduce the above copyright
14e99272c7SMikolaj Golub * notice, this list of conditions and the following disclaimer in the
15e99272c7SMikolaj Golub * documentation and/or other materials provided with the distribution.
16e99272c7SMikolaj Golub *
17e99272c7SMikolaj Golub * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18e99272c7SMikolaj Golub * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19e99272c7SMikolaj Golub * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20e99272c7SMikolaj Golub * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21e99272c7SMikolaj Golub * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22e99272c7SMikolaj Golub * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23e99272c7SMikolaj Golub * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24e99272c7SMikolaj Golub * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25e99272c7SMikolaj Golub * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26e99272c7SMikolaj Golub * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27e99272c7SMikolaj Golub * SUCH DAMAGE.
28e99272c7SMikolaj Golub */
29e99272c7SMikolaj Golub
30e99272c7SMikolaj Golub #include <sys/param.h>
31d3c10c52SMikolaj Golub #include <sys/elf.h>
32e99272c7SMikolaj Golub #include <sys/sysctl.h>
33e99272c7SMikolaj Golub #include <sys/user.h>
34e99272c7SMikolaj Golub
35d3c10c52SMikolaj Golub #include <vm/vm.h>
36d3c10c52SMikolaj Golub
37e99272c7SMikolaj Golub #include <err.h>
38e99272c7SMikolaj Golub #include <errno.h>
39e99272c7SMikolaj Golub #include <libprocstat.h>
40e99272c7SMikolaj Golub #include <limits.h>
41e99272c7SMikolaj Golub #include <stdio.h>
42e99272c7SMikolaj Golub #include <stdlib.h>
43e99272c7SMikolaj Golub #include <string.h>
44e99272c7SMikolaj Golub
45e99272c7SMikolaj Golub #include "procstat.h"
46e99272c7SMikolaj Golub
47e99272c7SMikolaj Golub void
procstat_auxv(struct procstat * procstat,struct kinfo_proc * kipp)4861e1b7c6SMikolaj Golub procstat_auxv(struct procstat *procstat, struct kinfo_proc *kipp)
49e99272c7SMikolaj Golub {
5061e1b7c6SMikolaj Golub Elf_Auxinfo *auxv;
5161e1b7c6SMikolaj Golub u_int count, i;
5261e1b7c6SMikolaj Golub static char prefix[256];
53e99272c7SMikolaj Golub
542a243b95SBrooks Davis if ((procstat_opts & PS_OPT_NOHEADER) == 0)
558f9f7b4aSBrooks Davis xo_emit("{T:/%5s %-19s %-16s %-16s}\n", "PID", "COMM", "AUXV",
56474b62b8SAllan Jude "VALUE");
57474b62b8SAllan Jude
5861e1b7c6SMikolaj Golub auxv = procstat_getauxv(procstat, kipp, &count);
5961e1b7c6SMikolaj Golub if (auxv == NULL)
60e99272c7SMikolaj Golub return;
618f9f7b4aSBrooks Davis snprintf(prefix, sizeof(prefix), "%5d %-19s", kipp->ki_pid,
62d3c10c52SMikolaj Golub kipp->ki_comm);
63474b62b8SAllan Jude
648f9f7b4aSBrooks Davis xo_emit("{e:process_id/%5d/%d}{e:command/%-19s/%s}", kipp->ki_pid,
65474b62b8SAllan Jude kipp->ki_comm);
66474b62b8SAllan Jude
6761e1b7c6SMikolaj Golub for (i = 0; i < count; i++) {
6872943219SMikolaj Golub switch(auxv[i].a_type) {
69e99272c7SMikolaj Golub case AT_NULL:
70e99272c7SMikolaj Golub return;
71e99272c7SMikolaj Golub case AT_IGNORE:
72e99272c7SMikolaj Golub break;
73e99272c7SMikolaj Golub case AT_EXECFD:
74474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_EXECFD/%ld}\n",
75474b62b8SAllan Jude prefix, "AT_EXECFD", (long)auxv[i].a_un.a_val);
76e99272c7SMikolaj Golub break;
77e99272c7SMikolaj Golub case AT_PHDR:
78474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PHDR/%p}\n",
79474b62b8SAllan Jude prefix, "AT_PHDR", auxv[i].a_un.a_ptr);
80e99272c7SMikolaj Golub break;
81e99272c7SMikolaj Golub case AT_PHENT:
82474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PHENT/%ld}\n",
83474b62b8SAllan Jude prefix, "AT_PHENT", (long)auxv[i].a_un.a_val);
84e99272c7SMikolaj Golub break;
85e99272c7SMikolaj Golub case AT_PHNUM:
86474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PHNUM/%ld}\n",
87474b62b8SAllan Jude prefix, "AT_PHNUM", (long)auxv[i].a_un.a_val);
88e99272c7SMikolaj Golub break;
89e99272c7SMikolaj Golub case AT_PAGESZ:
90474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PAGESZ/%ld}\n",
91474b62b8SAllan Jude prefix, "AT_PAGESZ", (long)auxv[i].a_un.a_val);
92e99272c7SMikolaj Golub break;
93e99272c7SMikolaj Golub case AT_BASE:
94474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_BASE/%p}\n",
95474b62b8SAllan Jude prefix, "AT_BASE", auxv[i].a_un.a_ptr);
96e99272c7SMikolaj Golub break;
97e99272c7SMikolaj Golub case AT_FLAGS:
98474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_FLAGS/%#lx}\n",
99474b62b8SAllan Jude prefix, "AT_FLAGS", (u_long)auxv[i].a_un.a_val);
100e99272c7SMikolaj Golub break;
101e99272c7SMikolaj Golub case AT_ENTRY:
102474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_ENTRY/%p}\n",
103474b62b8SAllan Jude prefix, "AT_ENTRY", auxv[i].a_un.a_ptr);
104e99272c7SMikolaj Golub break;
10572943219SMikolaj Golub #ifdef AT_NOTELF
106e99272c7SMikolaj Golub case AT_NOTELF:
107474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_NOTELF/%ld}\n",
108474b62b8SAllan Jude prefix, "AT_NOTELF", (long)auxv[i].a_un.a_val);
109e99272c7SMikolaj Golub break;
11072943219SMikolaj Golub #endif
11172943219SMikolaj Golub #ifdef AT_UID
112e99272c7SMikolaj Golub case AT_UID:
113474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_UID/%ld}\n",
114474b62b8SAllan Jude prefix, "AT_UID", (long)auxv[i].a_un.a_val);
115e99272c7SMikolaj Golub break;
11672943219SMikolaj Golub #endif
11772943219SMikolaj Golub #ifdef AT_EUID
118e99272c7SMikolaj Golub case AT_EUID:
119474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_EUID/%ld}\n",
120474b62b8SAllan Jude prefix, "AT_EUID", (long)auxv[i].a_un.a_val);
121e99272c7SMikolaj Golub break;
12272943219SMikolaj Golub #endif
12372943219SMikolaj Golub #ifdef AT_GID
124e99272c7SMikolaj Golub case AT_GID:
125474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_GID/%ld}\n",
126474b62b8SAllan Jude prefix, "AT_GID", (long)auxv[i].a_un.a_val);
127e99272c7SMikolaj Golub break;
12872943219SMikolaj Golub #endif
12972943219SMikolaj Golub #ifdef AT_EGID
130e99272c7SMikolaj Golub case AT_EGID:
131474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_EGID/%ld}\n",
132474b62b8SAllan Jude prefix, "AT_EGID", (long)auxv[i].a_un.a_val);
133e99272c7SMikolaj Golub break;
13472943219SMikolaj Golub #endif
135e99272c7SMikolaj Golub case AT_EXECPATH:
136474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_EXECPATH/%p}\n",
137474b62b8SAllan Jude prefix, "AT_EXECPATH", auxv[i].a_un.a_ptr);
138e99272c7SMikolaj Golub break;
139e99272c7SMikolaj Golub case AT_CANARY:
140474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_CANARY/%p}\n",
141474b62b8SAllan Jude prefix, "AT_CANARY", auxv[i].a_un.a_ptr);
142e99272c7SMikolaj Golub break;
143e99272c7SMikolaj Golub case AT_CANARYLEN:
144474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_CANARYLEN/%ld}\n",
145474b62b8SAllan Jude prefix, "AT_CANARYLEN", (long)auxv[i].a_un.a_val);
146e99272c7SMikolaj Golub break;
147e99272c7SMikolaj Golub case AT_OSRELDATE:
148474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_OSRELDATE/%ld}\n",
149474b62b8SAllan Jude prefix, "AT_OSRELDATE", (long)auxv[i].a_un.a_val);
150e99272c7SMikolaj Golub break;
151e99272c7SMikolaj Golub case AT_NCPUS:
152474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_NCPUS/%ld}\n",
153474b62b8SAllan Jude prefix, "AT_NCPUS", (long)auxv[i].a_un.a_val);
154e99272c7SMikolaj Golub break;
155e99272c7SMikolaj Golub case AT_PAGESIZES:
156474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PAGESIZES/%p}\n",
157474b62b8SAllan Jude prefix, "AT_PAGESIZES", auxv[i].a_un.a_ptr);
158e99272c7SMikolaj Golub break;
159e99272c7SMikolaj Golub case AT_PAGESIZESLEN:
160474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}"
161474b62b8SAllan Jude "{:AT_PAGESIZESLEN/%ld}\n", prefix,
162474b62b8SAllan Jude "AT_PAGESIZESLEN", (long)auxv[i].a_un.a_val);
163e99272c7SMikolaj Golub break;
164e99272c7SMikolaj Golub case AT_STACKPROT:
165d3c10c52SMikolaj Golub if ((auxv[i].a_un.a_val & VM_PROT_EXECUTE) != 0)
166474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}"
167474b62b8SAllan Jude "{:AT_STACKPROT/%s}\n", prefix,
168dafe59a9SAllan Jude "AT_STACKPROT", "EXECUTABLE");
169d3c10c52SMikolaj Golub else
170474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}"
171474b62b8SAllan Jude "{:AT_STACKPROT/%s}\n", prefix,
172dafe59a9SAllan Jude "AT_STACKPROT", "NONEXECUTABLE");
173e99272c7SMikolaj Golub break;
1742a438557SKonstantin Belousov #ifdef AT_TIMEKEEP
1752a438557SKonstantin Belousov case AT_TIMEKEEP:
176474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_TIMEKEEP/%p}\n",
177474b62b8SAllan Jude prefix, "AT_TIMEKEEP", auxv[i].a_un.a_ptr);
178e99272c7SMikolaj Golub break;
1792a438557SKonstantin Belousov #endif
1806d7f9194SJohn Baldwin #ifdef AT_EHDRFLAGS
1816d7f9194SJohn Baldwin case AT_EHDRFLAGS:
1826d7f9194SJohn Baldwin xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_EHDRFLAGS/%#lx}\n",
1836d7f9194SJohn Baldwin prefix, "AT_EHDRFLAGS", (u_long)auxv[i].a_un.a_val);
1846d7f9194SJohn Baldwin break;
1856d7f9194SJohn Baldwin #endif
1868a250c75SMitchell Horne #ifdef AT_HWCAP
1878a250c75SMitchell Horne case AT_HWCAP:
1888a250c75SMitchell Horne xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_HWCAP/%#lx}\n",
1898a250c75SMitchell Horne prefix, "AT_HWCAP", (u_long)auxv[i].a_un.a_val);
1908a250c75SMitchell Horne break;
1918a250c75SMitchell Horne #endif
1928a250c75SMitchell Horne #ifdef AT_HWCAP2
1938a250c75SMitchell Horne case AT_HWCAP2:
1948a250c75SMitchell Horne xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_HWCAP2/%#lx}\n",
1958a250c75SMitchell Horne prefix, "AT_HWCAP2", (u_long)auxv[i].a_un.a_val);
1968a250c75SMitchell Horne break;
1978a250c75SMitchell Horne #endif
198944cf37bSKonstantin Belousov #ifdef AT_BSDFLAGS
199944cf37bSKonstantin Belousov case AT_BSDFLAGS:
200944cf37bSKonstantin Belousov xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_BSDFLAGS/%#lx}\n",
201944cf37bSKonstantin Belousov prefix, "AT_BSDFLAGS", (u_long)auxv[i].a_un.a_val);
202944cf37bSKonstantin Belousov break;
203944cf37bSKonstantin Belousov #endif
2043780fcd9SBrooks Davis #ifdef AT_ARGC
2053780fcd9SBrooks Davis case AT_ARGC:
2063780fcd9SBrooks Davis xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_ARGC/%ld}\n",
2073780fcd9SBrooks Davis prefix, "AT_ARGC", (long)auxv[i].a_un.a_val);
2083780fcd9SBrooks Davis break;
2093780fcd9SBrooks Davis #endif
2103780fcd9SBrooks Davis #ifdef AT_ARGV
2113780fcd9SBrooks Davis case AT_ARGV:
2123780fcd9SBrooks Davis xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_ARGV/%p}\n",
2133780fcd9SBrooks Davis prefix, "AT_ARGV", auxv[i].a_un.a_ptr);
2143780fcd9SBrooks Davis break;
2153780fcd9SBrooks Davis #endif
2163780fcd9SBrooks Davis #ifdef AT_ENVC
2173780fcd9SBrooks Davis case AT_ENVC:
2183780fcd9SBrooks Davis xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_ENVC/%ld}\n",
2193780fcd9SBrooks Davis prefix, "AT_ENVC", (long)auxv[i].a_un.a_val);
2203780fcd9SBrooks Davis break;
2213780fcd9SBrooks Davis #endif
2223780fcd9SBrooks Davis #ifdef AT_ENVV
2233780fcd9SBrooks Davis case AT_ENVV:
2243780fcd9SBrooks Davis xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_ENVV/%p}\n",
2253780fcd9SBrooks Davis prefix, "AT_ENVV", auxv[i].a_un.a_ptr);
2263780fcd9SBrooks Davis break;
2273780fcd9SBrooks Davis #endif
2283780fcd9SBrooks Davis #ifdef AT_PS_STRINGS
2293780fcd9SBrooks Davis case AT_PS_STRINGS:
2303780fcd9SBrooks Davis xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PS_STRINGS/%p}\n",
2313780fcd9SBrooks Davis prefix, "AT_PS_STRINGS", auxv[i].a_un.a_ptr);
2323780fcd9SBrooks Davis break;
2333780fcd9SBrooks Davis #endif
2340864ab3dSKonstantin Belousov #ifdef AT_FXRNG
2350864ab3dSKonstantin Belousov case AT_FXRNG:
2360864ab3dSKonstantin Belousov xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_FXRNG/%p}\n",
2370864ab3dSKonstantin Belousov prefix, "AT_FXRNG", auxv[i].a_un.a_ptr);
2380864ab3dSKonstantin Belousov break;
2390864ab3dSKonstantin Belousov #endif
24001c77a43SKonstantin Belousov #ifdef AT_KPRELOAD
24101c77a43SKonstantin Belousov case AT_KPRELOAD:
24201c77a43SKonstantin Belousov xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_KPRELOAD/%p}\n",
24301c77a43SKonstantin Belousov prefix, "AT_KPRELOAD", auxv[i].a_un.a_ptr);
24401c77a43SKonstantin Belousov break;
24501c77a43SKonstantin Belousov #endif
2461d280f21SKonstantin Belousov #ifdef AT_USRSTACKBASE
2471d280f21SKonstantin Belousov case AT_USRSTACKBASE:
2481d280f21SKonstantin Belousov xo_emit("{dw:/%s}{Lw:/%-16s/%s}"
2491d280f21SKonstantin Belousov "{:AT_USRSTACKBASE/%#lx}\n",
2501d280f21SKonstantin Belousov prefix, "AT_USRSTACKBASE", auxv[i].a_un.a_val);
2511d280f21SKonstantin Belousov break;
2521d280f21SKonstantin Belousov #endif
2531d280f21SKonstantin Belousov #ifdef AT_USRSTACKLIM
2541d280f21SKonstantin Belousov case AT_USRSTACKLIM:
2551d280f21SKonstantin Belousov xo_emit("{dw:/%s}{Lw:/%-16s/%s}"
2561d280f21SKonstantin Belousov "{:AT_USRSTACKLIM/%#lx}\n",
2571d280f21SKonstantin Belousov prefix, "AT_USRSTACKLIM", auxv[i].a_un.a_val);
2581d280f21SKonstantin Belousov break;
2591d280f21SKonstantin Belousov #endif
260e99272c7SMikolaj Golub default:
261474b62b8SAllan Jude xo_emit("{dw:/%s}{Lw:/%16ld/%ld}{:UNKNOWN/%#lx}\n",
262474b62b8SAllan Jude prefix, auxv[i].a_type, auxv[i].a_un.a_val);
263e99272c7SMikolaj Golub break;
264e99272c7SMikolaj Golub }
265e99272c7SMikolaj Golub }
266474b62b8SAllan Jude xo_emit("\n");
26761e1b7c6SMikolaj Golub procstat_freeauxv(procstat, auxv);
268e99272c7SMikolaj Golub }
269e99272c7SMikolaj Golub
270