13d91be41SRobert Watson /*- 21de7b4b8SPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 31de7b4b8SPedro F. Giffuni * 43d91be41SRobert Watson * Copyright (c) 2007 Robert N. M. Watson 5474b62b8SAllan Jude * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org> 63d91be41SRobert Watson * All rights reserved. 73d91be41SRobert Watson * 83d91be41SRobert Watson * Redistribution and use in source and binary forms, with or without 93d91be41SRobert Watson * modification, are permitted provided that the following conditions 103d91be41SRobert Watson * are met: 113d91be41SRobert Watson * 1. Redistributions of source code must retain the above copyright 123d91be41SRobert Watson * notice, this list of conditions and the following disclaimer. 133d91be41SRobert Watson * 2. Redistributions in binary form must reproduce the above copyright 143d91be41SRobert Watson * notice, this list of conditions and the following disclaimer in the 153d91be41SRobert Watson * documentation and/or other materials provided with the distribution. 163d91be41SRobert Watson * 173d91be41SRobert Watson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 183d91be41SRobert Watson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 193d91be41SRobert Watson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 203d91be41SRobert Watson * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 213d91be41SRobert Watson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 223d91be41SRobert Watson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 233d91be41SRobert Watson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 243d91be41SRobert Watson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 253d91be41SRobert Watson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 263d91be41SRobert Watson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 273d91be41SRobert Watson * SUCH DAMAGE. 283d91be41SRobert Watson * 293d91be41SRobert Watson * $FreeBSD$ 303d91be41SRobert Watson */ 313d91be41SRobert Watson 32e1f323f3SRobert Watson #include <sys/param.h> 333d91be41SRobert Watson #include <sys/sysctl.h> 343d91be41SRobert Watson #include <sys/user.h> 353d91be41SRobert Watson 36821df508SXin LI #include <err.h> 373d91be41SRobert Watson #include <errno.h> 380daf62d9SStanislav Sedov #include <libprocstat.h> 393d91be41SRobert Watson #include <stdio.h> 403d91be41SRobert Watson #include <stdlib.h> 4141fbf437SPeter Wemm #include <stdint.h> 4243151ee6SPeter Wemm #include <libutil.h> 433d91be41SRobert Watson 443d91be41SRobert Watson #include "procstat.h" 453d91be41SRobert Watson 463d91be41SRobert Watson void 47eee7107cSMikolaj Golub procstat_vm(struct procstat *procstat, struct kinfo_proc *kipp) 483d91be41SRobert Watson { 493d91be41SRobert Watson struct kinfo_vmentry *freep, *kve; 5043151ee6SPeter Wemm int ptrwidth; 5143151ee6SPeter Wemm int i, cnt; 52474b62b8SAllan Jude const char *str, *lstr; 533d91be41SRobert Watson 543d91be41SRobert Watson ptrwidth = 2*sizeof(void *) + 2; 552a243b95SBrooks Davis if ((procstat_opts & PS_OPT_NOHEADER) == 0) 566a855903SMark Johnston xo_emit("{T:/%5s %*s %*s %3s %4s %4s %3s %3s %-5s %-2s %-s}\n", 573d91be41SRobert Watson "PID", ptrwidth, "START", ptrwidth, "END", "PRT", "RES", 58587be2d8SRobert Watson "PRES", "REF", "SHD", "FLAG", "TP", "PATH"); 593d91be41SRobert Watson 60474b62b8SAllan Jude xo_emit("{ek:process_id/%d}", kipp->ki_pid); 61474b62b8SAllan Jude 62eee7107cSMikolaj Golub freep = procstat_getvmmap(procstat, kipp, &cnt); 6308afefa8SJoe Marcus Clarke if (freep == NULL) 6408afefa8SJoe Marcus Clarke return; 65474b62b8SAllan Jude xo_open_list("vm"); 6643151ee6SPeter Wemm for (i = 0; i < cnt; i++) { 67474b62b8SAllan Jude xo_open_instance("vm"); 6843151ee6SPeter Wemm kve = &freep[i]; 69474b62b8SAllan Jude xo_emit("{dk:process_id/%5d} ", kipp->ki_pid); 70474b62b8SAllan Jude xo_emit("{d:kve_start/%#*jx} ", ptrwidth, 71474b62b8SAllan Jude (uintmax_t)kve->kve_start); 72474b62b8SAllan Jude xo_emit("{d:kve_end/%#*jx} ", ptrwidth, 73474b62b8SAllan Jude (uintmax_t)kve->kve_end); 74474b62b8SAllan Jude xo_emit("{e:kve_start/%#jx}", (uintmax_t)kve->kve_start); 75474b62b8SAllan Jude xo_emit("{e:kve_end/%#jx}", (uintmax_t)kve->kve_end); 76474b62b8SAllan Jude xo_emit("{d:read/%s}", kve->kve_protection & KVME_PROT_READ ? 77474b62b8SAllan Jude "r" : "-"); 78474b62b8SAllan Jude xo_emit("{d:write/%s}", kve->kve_protection & KVME_PROT_WRITE ? 79474b62b8SAllan Jude "w" : "-"); 80474b62b8SAllan Jude xo_emit("{d:exec/%s} ", kve->kve_protection & KVME_PROT_EXEC ? 81474b62b8SAllan Jude "x" : "-"); 82474b62b8SAllan Jude xo_open_container("kve_protection"); 83474b62b8SAllan Jude xo_emit("{en:read/%s}", kve->kve_protection & KVME_PROT_READ ? 84474b62b8SAllan Jude "true" : "false"); 85474b62b8SAllan Jude xo_emit("{en:write/%s}", kve->kve_protection & KVME_PROT_WRITE ? 86474b62b8SAllan Jude "true" : "false"); 87474b62b8SAllan Jude xo_emit("{en:exec/%s}", kve->kve_protection & KVME_PROT_EXEC ? 88474b62b8SAllan Jude "true" : "false"); 89474b62b8SAllan Jude xo_close_container("kve_protection"); 90474b62b8SAllan Jude xo_emit("{:kve_resident/%4d/%d} ", kve->kve_resident); 91474b62b8SAllan Jude xo_emit("{:kve_private_resident/%4d/%d} ", 92474b62b8SAllan Jude kve->kve_private_resident); 93474b62b8SAllan Jude xo_emit("{:kve_ref_count/%3d/%d} ", kve->kve_ref_count); 94474b62b8SAllan Jude xo_emit("{:kve_shadow_count/%3d/%d} ", kve->kve_shadow_count); 95474b62b8SAllan Jude xo_emit("{d:copy_on_write/%-1s}", kve->kve_flags & 96474b62b8SAllan Jude KVME_FLAG_COW ? "C" : "-"); 97474b62b8SAllan Jude xo_emit("{d:need_copy/%-1s}", kve->kve_flags & 98474b62b8SAllan Jude KVME_FLAG_NEEDS_COPY ? "N" : "-"); 99474b62b8SAllan Jude xo_emit("{d:super_pages/%-1s}", kve->kve_flags & 100474b62b8SAllan Jude KVME_FLAG_SUPER ? "S" : "-"); 101474b62b8SAllan Jude xo_emit("{d:grows_down/%-1s}", kve->kve_flags & 102474b62b8SAllan Jude KVME_FLAG_GROWS_UP ? "U" : kve->kve_flags & 103474b62b8SAllan Jude KVME_FLAG_GROWS_DOWN ? "D" : "-"); 1046a855903SMark Johnston xo_emit("{d:wired/%-1s} ", kve->kve_flags & 1056a855903SMark Johnston KVME_FLAG_USER_WIRED ? "W" : "-"); 106474b62b8SAllan Jude xo_open_container("kve_flags"); 107474b62b8SAllan Jude xo_emit("{en:copy_on_write/%s}", kve->kve_flags & 108474b62b8SAllan Jude KVME_FLAG_COW ? "true" : "false"); 109474b62b8SAllan Jude xo_emit("{en:needs_copy/%s}", kve->kve_flags & 110474b62b8SAllan Jude KVME_FLAG_NEEDS_COPY ? "true" : "false"); 111474b62b8SAllan Jude xo_emit("{en:super_pages/%s}", kve->kve_flags & 112474b62b8SAllan Jude KVME_FLAG_SUPER ? "true" : "false"); 113474b62b8SAllan Jude xo_emit("{en:grows_up/%s}", kve->kve_flags & 114474b62b8SAllan Jude KVME_FLAG_GROWS_UP ? "true" : "false"); 115474b62b8SAllan Jude xo_emit("{en:grows_down/%s}", kve->kve_flags & 116474b62b8SAllan Jude KVME_FLAG_GROWS_DOWN ? "true" : "false"); 1176a855903SMark Johnston xo_emit("{en:wired/%s}", kve->kve_flags & 1186a855903SMark Johnston KVME_FLAG_USER_WIRED ? "true" : "false"); 119474b62b8SAllan Jude xo_close_container("kve_flags"); 1203d91be41SRobert Watson switch (kve->kve_type) { 1213d91be41SRobert Watson case KVME_TYPE_NONE: 1223d91be41SRobert Watson str = "--"; 123474b62b8SAllan Jude lstr = "none"; 1243d91be41SRobert Watson break; 1253d91be41SRobert Watson case KVME_TYPE_DEFAULT: 1263d91be41SRobert Watson str = "df"; 127474b62b8SAllan Jude lstr = "default"; 1283d91be41SRobert Watson break; 1293d91be41SRobert Watson case KVME_TYPE_VNODE: 1303d91be41SRobert Watson str = "vn"; 131474b62b8SAllan Jude lstr = "vnode"; 1323d91be41SRobert Watson break; 1333d91be41SRobert Watson case KVME_TYPE_SWAP: 1343d91be41SRobert Watson str = "sw"; 135474b62b8SAllan Jude lstr = "swap"; 1363d91be41SRobert Watson break; 1373d91be41SRobert Watson case KVME_TYPE_DEVICE: 1383d91be41SRobert Watson str = "dv"; 139474b62b8SAllan Jude lstr = "device"; 1403d91be41SRobert Watson break; 1413d91be41SRobert Watson case KVME_TYPE_PHYS: 1423d91be41SRobert Watson str = "ph"; 143474b62b8SAllan Jude lstr = "physical"; 1443d91be41SRobert Watson break; 1453d91be41SRobert Watson case KVME_TYPE_DEAD: 1463d91be41SRobert Watson str = "dd"; 147474b62b8SAllan Jude lstr = "dead"; 1483d91be41SRobert Watson break; 14901381811SJohn Baldwin case KVME_TYPE_SG: 15001381811SJohn Baldwin str = "sg"; 151474b62b8SAllan Jude lstr = "scatter/gather"; 15201381811SJohn Baldwin break; 1532db08c03SJohn Baldwin case KVME_TYPE_MGTDEVICE: 1542db08c03SJohn Baldwin str = "md"; 155474b62b8SAllan Jude lstr = "managed_device"; 1562db08c03SJohn Baldwin break; 1573d91be41SRobert Watson case KVME_TYPE_UNKNOWN: 1583d91be41SRobert Watson default: 1593d91be41SRobert Watson str = "??"; 160474b62b8SAllan Jude lstr = "unknown"; 1613d91be41SRobert Watson break; 1623d91be41SRobert Watson } 163474b62b8SAllan Jude xo_emit("{d:kve_type/%-2s} ", str); 164474b62b8SAllan Jude xo_emit("{e:kve_type/%s}", lstr); 165474b62b8SAllan Jude xo_emit("{:kve_path/%-s/%s}\n", kve->kve_path); 166474b62b8SAllan Jude xo_close_instance("vm"); 1673d91be41SRobert Watson } 168474b62b8SAllan Jude xo_close_list("vm"); 1693d91be41SRobert Watson free(freep); 1703d91be41SRobert Watson } 171