1e99272c7SMikolaj Golub /*- 2e99272c7SMikolaj Golub * Copyright (c) 2011 Mikolaj Golub 3e99272c7SMikolaj Golub * All rights reserved. 4e99272c7SMikolaj Golub * 5e99272c7SMikolaj Golub * Redistribution and use in source and binary forms, with or without 6e99272c7SMikolaj Golub * modification, are permitted provided that the following conditions 7e99272c7SMikolaj Golub * are met: 8e99272c7SMikolaj Golub * 1. Redistributions of source code must retain the above copyright 9e99272c7SMikolaj Golub * notice, this list of conditions and the following disclaimer. 10e99272c7SMikolaj Golub * 2. Redistributions in binary form must reproduce the above copyright 11e99272c7SMikolaj Golub * notice, this list of conditions and the following disclaimer in the 12e99272c7SMikolaj Golub * documentation and/or other materials provided with the distribution. 13e99272c7SMikolaj Golub * 14e99272c7SMikolaj Golub * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15e99272c7SMikolaj Golub * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16e99272c7SMikolaj Golub * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17e99272c7SMikolaj Golub * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18e99272c7SMikolaj Golub * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19e99272c7SMikolaj Golub * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20e99272c7SMikolaj Golub * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21e99272c7SMikolaj Golub * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22e99272c7SMikolaj Golub * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23e99272c7SMikolaj Golub * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24e99272c7SMikolaj Golub * SUCH DAMAGE. 25e99272c7SMikolaj Golub * 26e99272c7SMikolaj Golub * $FreeBSD$ 27e99272c7SMikolaj Golub */ 28e99272c7SMikolaj Golub 29e99272c7SMikolaj Golub #include <sys/param.h> 30d3c10c52SMikolaj Golub #include <sys/elf.h> 31e99272c7SMikolaj Golub #include <sys/sysctl.h> 32e99272c7SMikolaj Golub #include <sys/user.h> 33e99272c7SMikolaj Golub 34d3c10c52SMikolaj Golub #include <vm/vm.h> 35d3c10c52SMikolaj Golub 36e99272c7SMikolaj Golub #include <err.h> 37e99272c7SMikolaj Golub #include <errno.h> 38e99272c7SMikolaj Golub #include <libprocstat.h> 39e99272c7SMikolaj Golub #include <limits.h> 40e99272c7SMikolaj Golub #include <stdio.h> 41e99272c7SMikolaj Golub #include <stdlib.h> 42e99272c7SMikolaj Golub #include <string.h> 43e99272c7SMikolaj Golub 44e99272c7SMikolaj Golub #include "procstat.h" 45e99272c7SMikolaj Golub 46d3c10c52SMikolaj Golub #define PRINT(name, spec, val) \ 47d3c10c52SMikolaj Golub printf("%s %-16s " #spec "\n", prefix, #name, (val)) 48d3c10c52SMikolaj Golub #define PRINT_UNKNOWN(type, val) \ 49d3c10c52SMikolaj Golub printf("%s %16ld %#lx\n", prefix, (long)type, (u_long)(val)) 50e99272c7SMikolaj Golub 51e99272c7SMikolaj Golub void 5261e1b7c6SMikolaj Golub procstat_auxv(struct procstat *procstat, struct kinfo_proc *kipp) 53e99272c7SMikolaj Golub { 5461e1b7c6SMikolaj Golub Elf_Auxinfo *auxv; 5561e1b7c6SMikolaj Golub u_int count, i; 5661e1b7c6SMikolaj Golub static char prefix[256]; 57e99272c7SMikolaj Golub 58e99272c7SMikolaj Golub if (!hflag) 59d3c10c52SMikolaj Golub printf("%5s %-16s %-16s %-16s\n", "PID", "COMM", "AUXV", "VALUE"); 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); 6561e1b7c6SMikolaj Golub for (i = 0; i < count; i++) { 6672943219SMikolaj Golub switch(auxv[i].a_type) { 67e99272c7SMikolaj Golub case AT_NULL: 68e99272c7SMikolaj Golub return; 69e99272c7SMikolaj Golub case AT_IGNORE: 70e99272c7SMikolaj Golub break; 71e99272c7SMikolaj Golub case AT_EXECFD: 726bfefd99SMikolaj Golub PRINT(AT_EXECFD, %ld, (long)auxv[i].a_un.a_val); 73e99272c7SMikolaj Golub break; 74e99272c7SMikolaj Golub case AT_PHDR: 75d3c10c52SMikolaj Golub PRINT(AT_PHDR, %p, auxv[i].a_un.a_ptr); 76e99272c7SMikolaj Golub break; 77e99272c7SMikolaj Golub case AT_PHENT: 786bfefd99SMikolaj Golub PRINT(AT_PHENT, %ld, (long)auxv[i].a_un.a_val); 79e99272c7SMikolaj Golub break; 80e99272c7SMikolaj Golub case AT_PHNUM: 816bfefd99SMikolaj Golub PRINT(AT_PHNUM, %ld, (long)auxv[i].a_un.a_val); 82e99272c7SMikolaj Golub break; 83e99272c7SMikolaj Golub case AT_PAGESZ: 846bfefd99SMikolaj Golub PRINT(AT_PAGESZ, %ld, (long)auxv[i].a_un.a_val); 85e99272c7SMikolaj Golub break; 86e99272c7SMikolaj Golub case AT_BASE: 87d3c10c52SMikolaj Golub PRINT(AT_BASE, %p, auxv[i].a_un.a_ptr); 88e99272c7SMikolaj Golub break; 89e99272c7SMikolaj Golub case AT_FLAGS: 90d3c10c52SMikolaj Golub PRINT(AT_FLAGS, %#lx, (u_long)auxv[i].a_un.a_val); 91e99272c7SMikolaj Golub break; 92e99272c7SMikolaj Golub case AT_ENTRY: 93d3c10c52SMikolaj Golub PRINT(AT_ENTRY, %p, auxv[i].a_un.a_ptr); 94e99272c7SMikolaj Golub break; 9572943219SMikolaj Golub #ifdef AT_NOTELF 96e99272c7SMikolaj Golub case AT_NOTELF: 976bfefd99SMikolaj Golub PRINT(AT_NOTELF, %ld, (long)auxv[i].a_un.a_val); 98e99272c7SMikolaj Golub break; 9972943219SMikolaj Golub #endif 10072943219SMikolaj Golub #ifdef AT_UID 101e99272c7SMikolaj Golub case AT_UID: 1026bfefd99SMikolaj Golub PRINT(AT_UID, %ld, (long)auxv[i].a_un.a_val); 103e99272c7SMikolaj Golub break; 10472943219SMikolaj Golub #endif 10572943219SMikolaj Golub #ifdef AT_EUID 106e99272c7SMikolaj Golub case AT_EUID: 1076bfefd99SMikolaj Golub PRINT(AT_EUID, %ld, (long)auxv[i].a_un.a_val); 108e99272c7SMikolaj Golub break; 10972943219SMikolaj Golub #endif 11072943219SMikolaj Golub #ifdef AT_GID 111e99272c7SMikolaj Golub case AT_GID: 1126bfefd99SMikolaj Golub PRINT(AT_GID, %ld, (long)auxv[i].a_un.a_val); 113e99272c7SMikolaj Golub break; 11472943219SMikolaj Golub #endif 11572943219SMikolaj Golub #ifdef AT_EGID 116e99272c7SMikolaj Golub case AT_EGID: 1176bfefd99SMikolaj Golub PRINT(AT_EGID, %ld, (long)auxv[i].a_un.a_val); 118e99272c7SMikolaj Golub break; 11972943219SMikolaj Golub #endif 120e99272c7SMikolaj Golub case AT_EXECPATH: 121d3c10c52SMikolaj Golub PRINT(AT_EXECPATH, %p, auxv[i].a_un.a_ptr); 122e99272c7SMikolaj Golub break; 123e99272c7SMikolaj Golub case AT_CANARY: 124d3c10c52SMikolaj Golub PRINT(AT_CANARY, %p, auxv[i].a_un.a_ptr); 125e99272c7SMikolaj Golub break; 126e99272c7SMikolaj Golub case AT_CANARYLEN: 1276bfefd99SMikolaj Golub PRINT(AT_CANARYLEN, %ld, (long)auxv[i].a_un.a_val); 128e99272c7SMikolaj Golub break; 129e99272c7SMikolaj Golub case AT_OSRELDATE: 1306bfefd99SMikolaj Golub PRINT(AT_OSRELDATE, %ld, (long)auxv[i].a_un.a_val); 131e99272c7SMikolaj Golub break; 132e99272c7SMikolaj Golub case AT_NCPUS: 1336bfefd99SMikolaj Golub PRINT(AT_NCPUS, %ld, (long)auxv[i].a_un.a_val); 134e99272c7SMikolaj Golub break; 135e99272c7SMikolaj Golub case AT_PAGESIZES: 136d3c10c52SMikolaj Golub PRINT(AT_PAGESIZES, %p, auxv[i].a_un.a_ptr); 137e99272c7SMikolaj Golub break; 138e99272c7SMikolaj Golub case AT_PAGESIZESLEN: 1396bfefd99SMikolaj Golub PRINT(AT_PAGESIZESLEN, %ld, (long)auxv[i].a_un.a_val); 140e99272c7SMikolaj Golub break; 141e99272c7SMikolaj Golub case AT_STACKPROT: 142d3c10c52SMikolaj Golub if ((auxv[i].a_un.a_val & VM_PROT_EXECUTE) != 0) 143d3c10c52SMikolaj Golub PRINT(AT_STACKPROT, %s, "NONEXECUTABLE"); 144d3c10c52SMikolaj Golub else 145d3c10c52SMikolaj Golub PRINT(AT_STACKPROT, %s, "EXECUTABLE"); 146e99272c7SMikolaj Golub break; 1472a438557SKonstantin Belousov #ifdef AT_TIMEKEEP 1482a438557SKonstantin Belousov case AT_TIMEKEEP: 1492a438557SKonstantin Belousov PRINT(AT_TIMEKEEP, %p, auxv[i].a_un.a_ptr); 150e99272c7SMikolaj Golub break; 1512a438557SKonstantin Belousov #endif 152e99272c7SMikolaj Golub default: 153d3c10c52SMikolaj Golub PRINT_UNKNOWN(auxv[i].a_type, auxv[i].a_un.a_val); 154e99272c7SMikolaj Golub break; 155e99272c7SMikolaj Golub } 156e99272c7SMikolaj Golub } 157e99272c7SMikolaj Golub printf("\n"); 15861e1b7c6SMikolaj Golub procstat_freeauxv(procstat, auxv); 159e99272c7SMikolaj Golub } 160e99272c7SMikolaj Golub 161