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