1227838Strociny/*- 2227838Strociny * Copyright (c) 2011 Mikolaj Golub 3227838Strociny * All rights reserved. 4227838Strociny * 5227838Strociny * Redistribution and use in source and binary forms, with or without 6227838Strociny * modification, are permitted provided that the following conditions 7227838Strociny * are met: 8227838Strociny * 1. Redistributions of source code must retain the above copyright 9227838Strociny * notice, this list of conditions and the following disclaimer. 10227838Strociny * 2. Redistributions in binary form must reproduce the above copyright 11227838Strociny * notice, this list of conditions and the following disclaimer in the 12227838Strociny * documentation and/or other materials provided with the distribution. 13227838Strociny * 14227838Strociny * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15227838Strociny * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16227838Strociny * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17227838Strociny * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18227838Strociny * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19227838Strociny * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20227838Strociny * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21227838Strociny * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22227838Strociny * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23227838Strociny * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24227838Strociny * SUCH DAMAGE. 25227838Strociny * 26227838Strociny * $FreeBSD$ 27227838Strociny */ 28227838Strociny 29227838Strociny#include <sys/param.h> 30228025Strociny#include <sys/elf.h> 31227838Strociny#include <sys/sysctl.h> 32227838Strociny#include <sys/user.h> 33227838Strociny 34228025Strociny#include <vm/vm.h> 35228025Strociny 36227838Strociny#include <err.h> 37227838Strociny#include <errno.h> 38227838Strociny#include <libprocstat.h> 39227838Strociny#include <limits.h> 40227838Strociny#include <stdio.h> 41227838Strociny#include <stdlib.h> 42227838Strociny#include <string.h> 43227838Strociny 44227838Strociny#include "procstat.h" 45227838Strociny 46228025Strociny#define PRINT(name, spec, val) \ 47228025Strociny printf("%s %-16s " #spec "\n", prefix, #name, (val)) 48228025Strociny#define PRINT_UNKNOWN(type, val) \ 49228025Strociny printf("%s %16ld %#lx\n", prefix, (long)type, (u_long)(val)) 50228025Strociny 51228447Strocinyvoid 52249683Strocinyprocstat_auxv(struct procstat *procstat, struct kinfo_proc *kipp) 53228447Strociny{ 54249683Strociny Elf_Auxinfo *auxv; 55249683Strociny u_int count, i; 56249683Strociny static char prefix[256]; 57228447Strociny 58228447Strociny if (!hflag) 59228447Strociny printf("%5s %-16s %-16s %-16s\n", "PID", "COMM", "AUXV", "VALUE"); 60249683Strociny auxv = procstat_getauxv(procstat, kipp, &count); 61249683Strociny if (auxv == NULL) 62227838Strociny return; 63228025Strociny snprintf(prefix, sizeof(prefix), "%5d %-16s", kipp->ki_pid, 64228025Strociny kipp->ki_comm); 65249683Strociny for (i = 0; i < count; i++) { 66227873Strociny switch(auxv[i].a_type) { 67227838Strociny case AT_NULL: 68227838Strociny return; 69227838Strociny case AT_IGNORE: 70227838Strociny break; 71227838Strociny case AT_EXECFD: 72228049Strociny PRINT(AT_EXECFD, %ld, (long)auxv[i].a_un.a_val); 73227838Strociny break; 74227838Strociny case AT_PHDR: 75228025Strociny PRINT(AT_PHDR, %p, auxv[i].a_un.a_ptr); 76227838Strociny break; 77227838Strociny case AT_PHENT: 78228049Strociny PRINT(AT_PHENT, %ld, (long)auxv[i].a_un.a_val); 79227838Strociny break; 80227838Strociny case AT_PHNUM: 81228049Strociny PRINT(AT_PHNUM, %ld, (long)auxv[i].a_un.a_val); 82227838Strociny break; 83227838Strociny case AT_PAGESZ: 84228049Strociny PRINT(AT_PAGESZ, %ld, (long)auxv[i].a_un.a_val); 85227838Strociny break; 86227838Strociny case AT_BASE: 87228025Strociny PRINT(AT_BASE, %p, auxv[i].a_un.a_ptr); 88227838Strociny break; 89227838Strociny case AT_FLAGS: 90228025Strociny PRINT(AT_FLAGS, %#lx, (u_long)auxv[i].a_un.a_val); 91227838Strociny break; 92227838Strociny case AT_ENTRY: 93228025Strociny PRINT(AT_ENTRY, %p, auxv[i].a_un.a_ptr); 94227838Strociny break; 95227873Strociny#ifdef AT_NOTELF 96227838Strociny case AT_NOTELF: 97228049Strociny PRINT(AT_NOTELF, %ld, (long)auxv[i].a_un.a_val); 98227838Strociny break; 99227873Strociny#endif 100227873Strociny#ifdef AT_UID 101227838Strociny case AT_UID: 102228049Strociny PRINT(AT_UID, %ld, (long)auxv[i].a_un.a_val); 103227838Strociny break; 104227873Strociny#endif 105227873Strociny#ifdef AT_EUID 106227838Strociny case AT_EUID: 107228049Strociny PRINT(AT_EUID, %ld, (long)auxv[i].a_un.a_val); 108227838Strociny break; 109227873Strociny#endif 110227873Strociny#ifdef AT_GID 111227838Strociny case AT_GID: 112228049Strociny PRINT(AT_GID, %ld, (long)auxv[i].a_un.a_val); 113227838Strociny break; 114227873Strociny#endif 115227873Strociny#ifdef AT_EGID 116227838Strociny case AT_EGID: 117228049Strociny PRINT(AT_EGID, %ld, (long)auxv[i].a_un.a_val); 118227838Strociny break; 119227873Strociny#endif 120227838Strociny case AT_EXECPATH: 121228025Strociny PRINT(AT_EXECPATH, %p, auxv[i].a_un.a_ptr); 122227838Strociny break; 123227838Strociny case AT_CANARY: 124228025Strociny PRINT(AT_CANARY, %p, auxv[i].a_un.a_ptr); 125227838Strociny break; 126227838Strociny case AT_CANARYLEN: 127228049Strociny PRINT(AT_CANARYLEN, %ld, (long)auxv[i].a_un.a_val); 128227838Strociny break; 129227838Strociny case AT_OSRELDATE: 130228049Strociny PRINT(AT_OSRELDATE, %ld, (long)auxv[i].a_un.a_val); 131227838Strociny break; 132227838Strociny case AT_NCPUS: 133228049Strociny PRINT(AT_NCPUS, %ld, (long)auxv[i].a_un.a_val); 134227838Strociny break; 135227838Strociny case AT_PAGESIZES: 136228025Strociny PRINT(AT_PAGESIZES, %p, auxv[i].a_un.a_ptr); 137227838Strociny break; 138227838Strociny case AT_PAGESIZESLEN: 139228049Strociny PRINT(AT_PAGESIZESLEN, %ld, (long)auxv[i].a_un.a_val); 140227838Strociny break; 141227838Strociny case AT_STACKPROT: 142228025Strociny if ((auxv[i].a_un.a_val & VM_PROT_EXECUTE) != 0) 143228025Strociny PRINT(AT_STACKPROT, %s, "NONEXECUTABLE"); 144228025Strociny else 145228025Strociny PRINT(AT_STACKPROT, %s, "EXECUTABLE"); 146227838Strociny break; 147240546Skib#ifdef AT_TIMEKEEP 148240546Skib case AT_TIMEKEEP: 149240546Skib PRINT(AT_TIMEKEEP, %p, auxv[i].a_un.a_ptr); 150227838Strociny break; 151240546Skib#endif 152227838Strociny default: 153228025Strociny PRINT_UNKNOWN(auxv[i].a_type, auxv[i].a_un.a_val); 154227838Strociny break; 155227838Strociny } 156227838Strociny } 157227838Strociny printf("\n"); 158249683Strociny procstat_freeauxv(procstat, auxv); 159227838Strociny} 160227838Strociny 161