1174199Srwatson/*- 2174199Srwatson * Copyright (c) 2007 Robert N. M. Watson 3174199Srwatson * All rights reserved. 4174199Srwatson * 5174199Srwatson * Redistribution and use in source and binary forms, with or without 6174199Srwatson * modification, are permitted provided that the following conditions 7174199Srwatson * are met: 8174199Srwatson * 1. Redistributions of source code must retain the above copyright 9174199Srwatson * notice, this list of conditions and the following disclaimer. 10174199Srwatson * 2. Redistributions in binary form must reproduce the above copyright 11174199Srwatson * notice, this list of conditions and the following disclaimer in the 12174199Srwatson * documentation and/or other materials provided with the distribution. 13174199Srwatson * 14174199Srwatson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15174199Srwatson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16174199Srwatson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17174199Srwatson * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18174199Srwatson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19174199Srwatson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20174199Srwatson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21174199Srwatson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22174199Srwatson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23174199Srwatson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24174199Srwatson * SUCH DAMAGE. 25174199Srwatson * 26174199Srwatson * $FreeBSD$ 27174199Srwatson */ 28174199Srwatson 29186567Srwatson#include <sys/param.h> 30174199Srwatson#include <sys/sysctl.h> 31174199Srwatson#include <sys/user.h> 32174199Srwatson 33200462Sdelphij#include <err.h> 34174199Srwatson#include <errno.h> 35221807Sstas#include <libprocstat.h> 36174199Srwatson#include <stdio.h> 37174199Srwatson#include <stdlib.h> 38185563Speter#include <stdint.h> 39185548Speter#include <libutil.h> 40174199Srwatson 41174199Srwatson#include "procstat.h" 42174199Srwatson 43174199Srwatsonvoid 44249669Strocinyprocstat_vm(struct procstat *procstat, struct kinfo_proc *kipp) 45174199Srwatson{ 46174199Srwatson struct kinfo_vmentry *freep, *kve; 47185548Speter int ptrwidth; 48185548Speter int i, cnt; 49174199Srwatson const char *str; 50174199Srwatson 51174199Srwatson ptrwidth = 2*sizeof(void *) + 2; 52174199Srwatson if (!hflag) 53238753Strociny printf("%5s %*s %*s %3s %4s %4s %3s %3s %4s %-2s %-s\n", 54174199Srwatson "PID", ptrwidth, "START", ptrwidth, "END", "PRT", "RES", 55174199Srwatson "PRES", "REF", "SHD", "FL", "TP", "PATH"); 56174199Srwatson 57249669Strociny freep = procstat_getvmmap(procstat, kipp, &cnt); 58186315Smarcus if (freep == NULL) 59186315Smarcus return; 60185548Speter for (i = 0; i < cnt; i++) { 61185548Speter kve = &freep[i]; 62221807Sstas printf("%5d ", kipp->ki_pid); 63185563Speter printf("%#*jx ", ptrwidth, (uintmax_t)kve->kve_start); 64185563Speter printf("%#*jx ", ptrwidth, (uintmax_t)kve->kve_end); 65174199Srwatson printf("%s", kve->kve_protection & KVME_PROT_READ ? "r" : "-"); 66174199Srwatson printf("%s", kve->kve_protection & KVME_PROT_WRITE ? "w" : "-"); 67174199Srwatson printf("%s ", kve->kve_protection & KVME_PROT_EXEC ? "x" : "-"); 68174199Srwatson printf("%4d ", kve->kve_resident); 69174199Srwatson printf("%4d ", kve->kve_private_resident); 70174199Srwatson printf("%3d ", kve->kve_ref_count); 71174199Srwatson printf("%3d ", kve->kve_shadow_count); 72174199Srwatson printf("%-1s", kve->kve_flags & KVME_FLAG_COW ? "C" : "-"); 73227317Strociny printf("%-1s", kve->kve_flags & KVME_FLAG_NEEDS_COPY ? "N" : 74174199Srwatson "-"); 75238527Spgj printf("%-1s", kve->kve_flags & KVME_FLAG_SUPER ? "S" : "-"); 76238527Spgj printf("%-1s ", kve->kve_flags & KVME_FLAG_GROWS_UP ? "U" : 77238527Spgj kve->kve_flags & KVME_FLAG_GROWS_DOWN ? "D" : "-"); 78174199Srwatson switch (kve->kve_type) { 79174199Srwatson case KVME_TYPE_NONE: 80174199Srwatson str = "--"; 81174199Srwatson break; 82174199Srwatson case KVME_TYPE_DEFAULT: 83174199Srwatson str = "df"; 84174199Srwatson break; 85174199Srwatson case KVME_TYPE_VNODE: 86174199Srwatson str = "vn"; 87174199Srwatson break; 88174199Srwatson case KVME_TYPE_SWAP: 89174199Srwatson str = "sw"; 90174199Srwatson break; 91174199Srwatson case KVME_TYPE_DEVICE: 92174199Srwatson str = "dv"; 93174199Srwatson break; 94174199Srwatson case KVME_TYPE_PHYS: 95174199Srwatson str = "ph"; 96174199Srwatson break; 97174199Srwatson case KVME_TYPE_DEAD: 98174199Srwatson str = "dd"; 99174199Srwatson break; 100195840Sjhb case KVME_TYPE_SG: 101195840Sjhb str = "sg"; 102195840Sjhb break; 103262228Sjhb case KVME_TYPE_MGTDEVICE: 104262228Sjhb str = "md"; 105262228Sjhb break; 106174199Srwatson case KVME_TYPE_UNKNOWN: 107174199Srwatson default: 108174199Srwatson str = "??"; 109174199Srwatson break; 110174199Srwatson } 111174199Srwatson printf("%-2s ", str); 112174199Srwatson printf("%-s\n", kve->kve_path); 113174199Srwatson } 114174199Srwatson free(freep); 115174199Srwatson} 116