xref: /freebsd/usr.bin/procstat/procstat_auxv.c (revision 5e3934b1)
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