xref: /freebsd/usr.bin/procstat/procstat_auxv.c (revision 944cf37b)
1e99272c7SMikolaj Golub /*-
21de7b4b8SPedro F. Giffuni  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
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  * $FreeBSD$
30e99272c7SMikolaj Golub  */
31e99272c7SMikolaj Golub 
32e99272c7SMikolaj Golub #include <sys/param.h>
33d3c10c52SMikolaj Golub #include <sys/elf.h>
34e99272c7SMikolaj Golub #include <sys/sysctl.h>
35e99272c7SMikolaj Golub #include <sys/user.h>
36e99272c7SMikolaj Golub 
37d3c10c52SMikolaj Golub #include <vm/vm.h>
38d3c10c52SMikolaj Golub 
39e99272c7SMikolaj Golub #include <err.h>
40e99272c7SMikolaj Golub #include <errno.h>
41e99272c7SMikolaj Golub #include <libprocstat.h>
42e99272c7SMikolaj Golub #include <limits.h>
43e99272c7SMikolaj Golub #include <stdio.h>
44e99272c7SMikolaj Golub #include <stdlib.h>
45e99272c7SMikolaj Golub #include <string.h>
46e99272c7SMikolaj Golub 
47e99272c7SMikolaj Golub #include "procstat.h"
48e99272c7SMikolaj Golub 
49e99272c7SMikolaj Golub void
5061e1b7c6SMikolaj Golub procstat_auxv(struct procstat *procstat, struct kinfo_proc *kipp)
51e99272c7SMikolaj Golub {
5261e1b7c6SMikolaj Golub 	Elf_Auxinfo *auxv;
5361e1b7c6SMikolaj Golub 	u_int count, i;
5461e1b7c6SMikolaj Golub 	static char prefix[256];
55e99272c7SMikolaj Golub 
562a243b95SBrooks Davis 	if ((procstat_opts & PS_OPT_NOHEADER) == 0)
57474b62b8SAllan Jude 		xo_emit("{T:/%5s %-16s %-16s %-16s}\n", "PID", "COMM", "AUXV",
58474b62b8SAllan Jude 		    "VALUE");
59474b62b8SAllan Jude 
6061e1b7c6SMikolaj Golub 	auxv = procstat_getauxv(procstat, kipp, &count);
6161e1b7c6SMikolaj Golub 	if (auxv == NULL)
62e99272c7SMikolaj Golub 		return;
63d3c10c52SMikolaj Golub         snprintf(prefix, sizeof(prefix), "%5d %-16s", kipp->ki_pid,
64d3c10c52SMikolaj Golub             kipp->ki_comm);
65474b62b8SAllan Jude 
66474b62b8SAllan Jude 	xo_emit("{e:process_id/%5d/%d}{e:command/%-16s/%s}", kipp->ki_pid,
67474b62b8SAllan Jude 	    kipp->ki_comm);
68474b62b8SAllan Jude 
6961e1b7c6SMikolaj Golub 	for (i = 0; i < count; i++) {
7072943219SMikolaj Golub 		switch(auxv[i].a_type) {
71e99272c7SMikolaj Golub 		case AT_NULL:
72e99272c7SMikolaj Golub 			return;
73e99272c7SMikolaj Golub 		case AT_IGNORE:
74e99272c7SMikolaj Golub 			break;
75e99272c7SMikolaj Golub 		case AT_EXECFD:
76474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_EXECFD/%ld}\n",
77474b62b8SAllan Jude 			    prefix, "AT_EXECFD", (long)auxv[i].a_un.a_val);
78e99272c7SMikolaj Golub 			break;
79e99272c7SMikolaj Golub 		case AT_PHDR:
80474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PHDR/%p}\n",
81474b62b8SAllan Jude 			    prefix, "AT_PHDR", auxv[i].a_un.a_ptr);
82e99272c7SMikolaj Golub 			break;
83e99272c7SMikolaj Golub 		case AT_PHENT:
84474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PHENT/%ld}\n",
85474b62b8SAllan Jude 			    prefix, "AT_PHENT", (long)auxv[i].a_un.a_val);
86e99272c7SMikolaj Golub 			break;
87e99272c7SMikolaj Golub 		case AT_PHNUM:
88474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PHNUM/%ld}\n",
89474b62b8SAllan Jude 			    prefix, "AT_PHNUM", (long)auxv[i].a_un.a_val);
90e99272c7SMikolaj Golub 			break;
91e99272c7SMikolaj Golub 		case AT_PAGESZ:
92474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PAGESZ/%ld}\n",
93474b62b8SAllan Jude 			    prefix, "AT_PAGESZ", (long)auxv[i].a_un.a_val);
94e99272c7SMikolaj Golub 			break;
95e99272c7SMikolaj Golub 		case AT_BASE:
96474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_BASE/%p}\n",
97474b62b8SAllan Jude 			    prefix, "AT_BASE", auxv[i].a_un.a_ptr);
98e99272c7SMikolaj Golub 			break;
99e99272c7SMikolaj Golub 		case AT_FLAGS:
100474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_FLAGS/%#lx}\n",
101474b62b8SAllan Jude 			    prefix, "AT_FLAGS", (u_long)auxv[i].a_un.a_val);
102e99272c7SMikolaj Golub 			break;
103e99272c7SMikolaj Golub 		case AT_ENTRY:
104474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_ENTRY/%p}\n",
105474b62b8SAllan Jude 			    prefix, "AT_ENTRY", auxv[i].a_un.a_ptr);
106e99272c7SMikolaj Golub 			break;
10772943219SMikolaj Golub #ifdef AT_NOTELF
108e99272c7SMikolaj Golub 		case AT_NOTELF:
109474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_NOTELF/%ld}\n",
110474b62b8SAllan Jude 			    prefix, "AT_NOTELF", (long)auxv[i].a_un.a_val);
111e99272c7SMikolaj Golub 			break;
11272943219SMikolaj Golub #endif
11372943219SMikolaj Golub #ifdef AT_UID
114e99272c7SMikolaj Golub 		case AT_UID:
115474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_UID/%ld}\n",
116474b62b8SAllan Jude 			    prefix, "AT_UID", (long)auxv[i].a_un.a_val);
117e99272c7SMikolaj Golub 			break;
11872943219SMikolaj Golub #endif
11972943219SMikolaj Golub #ifdef AT_EUID
120e99272c7SMikolaj Golub 		case AT_EUID:
121474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_EUID/%ld}\n",
122474b62b8SAllan Jude 			    prefix, "AT_EUID", (long)auxv[i].a_un.a_val);
123e99272c7SMikolaj Golub 			break;
12472943219SMikolaj Golub #endif
12572943219SMikolaj Golub #ifdef AT_GID
126e99272c7SMikolaj Golub 		case AT_GID:
127474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_GID/%ld}\n",
128474b62b8SAllan Jude 			    prefix, "AT_GID", (long)auxv[i].a_un.a_val);
129e99272c7SMikolaj Golub 			break;
13072943219SMikolaj Golub #endif
13172943219SMikolaj Golub #ifdef AT_EGID
132e99272c7SMikolaj Golub 		case AT_EGID:
133474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_EGID/%ld}\n",
134474b62b8SAllan Jude 			    prefix, "AT_EGID", (long)auxv[i].a_un.a_val);
135e99272c7SMikolaj Golub 			break;
13672943219SMikolaj Golub #endif
137e99272c7SMikolaj Golub 		case AT_EXECPATH:
138474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_EXECPATH/%p}\n",
139474b62b8SAllan Jude 			    prefix, "AT_EXECPATH", auxv[i].a_un.a_ptr);
140e99272c7SMikolaj Golub 			break;
141e99272c7SMikolaj Golub 		case AT_CANARY:
142474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_CANARY/%p}\n",
143474b62b8SAllan Jude 			    prefix, "AT_CANARY", auxv[i].a_un.a_ptr);
144e99272c7SMikolaj Golub 			break;
145e99272c7SMikolaj Golub 		case AT_CANARYLEN:
146474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_CANARYLEN/%ld}\n",
147474b62b8SAllan Jude 			    prefix, "AT_CANARYLEN", (long)auxv[i].a_un.a_val);
148e99272c7SMikolaj Golub 			break;
149e99272c7SMikolaj Golub 		case AT_OSRELDATE:
150474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_OSRELDATE/%ld}\n",
151474b62b8SAllan Jude 			    prefix, "AT_OSRELDATE", (long)auxv[i].a_un.a_val);
152e99272c7SMikolaj Golub 			break;
153e99272c7SMikolaj Golub 		case AT_NCPUS:
154474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_NCPUS/%ld}\n",
155474b62b8SAllan Jude 			    prefix, "AT_NCPUS", (long)auxv[i].a_un.a_val);
156e99272c7SMikolaj Golub 			break;
157e99272c7SMikolaj Golub 		case AT_PAGESIZES:
158474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_PAGESIZES/%p}\n",
159474b62b8SAllan Jude 			    prefix, "AT_PAGESIZES", auxv[i].a_un.a_ptr);
160e99272c7SMikolaj Golub 			break;
161e99272c7SMikolaj Golub 		case AT_PAGESIZESLEN:
162474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}"
163474b62b8SAllan Jude 			    "{:AT_PAGESIZESLEN/%ld}\n", prefix,
164474b62b8SAllan Jude 			    "AT_PAGESIZESLEN", (long)auxv[i].a_un.a_val);
165e99272c7SMikolaj Golub 			break;
166e99272c7SMikolaj Golub 		case AT_STACKPROT:
167d3c10c52SMikolaj Golub 			if ((auxv[i].a_un.a_val & VM_PROT_EXECUTE) != 0)
168474b62b8SAllan Jude 				xo_emit("{dw:/%s}{Lw:/%-16s/%s}"
169474b62b8SAllan Jude 				    "{:AT_STACKPROT/%s}\n", prefix,
170dafe59a9SAllan Jude 				    "AT_STACKPROT", "EXECUTABLE");
171d3c10c52SMikolaj Golub 			else
172474b62b8SAllan Jude 				xo_emit("{dw:/%s}{Lw:/%-16s/%s}"
173474b62b8SAllan Jude 				    "{:AT_STACKPROT/%s}\n", prefix,
174dafe59a9SAllan Jude 				    "AT_STACKPROT", "NONEXECUTABLE");
175e99272c7SMikolaj Golub 			break;
1762a438557SKonstantin Belousov #ifdef AT_TIMEKEEP
1772a438557SKonstantin Belousov 		case AT_TIMEKEEP:
178474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_TIMEKEEP/%p}\n",
179474b62b8SAllan Jude 			    prefix, "AT_TIMEKEEP", auxv[i].a_un.a_ptr);
180e99272c7SMikolaj Golub 			break;
1812a438557SKonstantin Belousov #endif
1826d7f9194SJohn Baldwin #ifdef AT_EHDRFLAGS
1836d7f9194SJohn Baldwin 		case AT_EHDRFLAGS:
1846d7f9194SJohn Baldwin 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_EHDRFLAGS/%#lx}\n",
1856d7f9194SJohn Baldwin 			    prefix, "AT_EHDRFLAGS", (u_long)auxv[i].a_un.a_val);
1866d7f9194SJohn Baldwin 			break;
1876d7f9194SJohn Baldwin #endif
1888a250c75SMitchell Horne #ifdef AT_HWCAP
1898a250c75SMitchell Horne 		case AT_HWCAP:
1908a250c75SMitchell Horne 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_HWCAP/%#lx}\n",
1918a250c75SMitchell Horne 			    prefix, "AT_HWCAP", (u_long)auxv[i].a_un.a_val);
1928a250c75SMitchell Horne 			break;
1938a250c75SMitchell Horne #endif
1948a250c75SMitchell Horne #ifdef AT_HWCAP2
1958a250c75SMitchell Horne 		case AT_HWCAP2:
1968a250c75SMitchell Horne 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_HWCAP2/%#lx}\n",
1978a250c75SMitchell Horne 			    prefix, "AT_HWCAP2", (u_long)auxv[i].a_un.a_val);
1988a250c75SMitchell Horne 			break;
1998a250c75SMitchell Horne #endif
200944cf37bSKonstantin Belousov #ifdef AT_BSDFLAGS
201944cf37bSKonstantin Belousov 		case AT_BSDFLAGS:
202944cf37bSKonstantin Belousov 			xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_BSDFLAGS/%#lx}\n",
203944cf37bSKonstantin Belousov 			    prefix, "AT_BSDFLAGS", (u_long)auxv[i].a_un.a_val);
204944cf37bSKonstantin Belousov 			break;
205944cf37bSKonstantin Belousov #endif
206e99272c7SMikolaj Golub 		default:
207474b62b8SAllan Jude 			xo_emit("{dw:/%s}{Lw:/%16ld/%ld}{:UNKNOWN/%#lx}\n",
208474b62b8SAllan Jude 			    prefix, auxv[i].a_type, auxv[i].a_un.a_val);
209e99272c7SMikolaj Golub 			break;
210e99272c7SMikolaj Golub 		}
211e99272c7SMikolaj Golub 	}
212474b62b8SAllan Jude 	xo_emit("\n");
21361e1b7c6SMikolaj Golub 	procstat_freeauxv(procstat, auxv);
214e99272c7SMikolaj Golub }
215e99272c7SMikolaj Golub 
216