usr/src/cmd/mdb/common/modules/genunix/memory.c
author johansen
Tue, 19 Dec 2006 23:13:06 -0800
changeset 3290 256464cbb73c
parent 436 c9ab97f06761
child 5084 7d838c5c0eed
permissions -rw-r--r--
4894692 caching data in heap inflates crash dump 6499454 time to increase size of kmem default allocation caches 6499459 vm should stop checking kvp directly
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
3290
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 436
diff changeset
     5
 * Common Development and Distribution License (the "License").
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 436
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
/*
3290
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 436
diff changeset
    22
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
#include <mdb/mdb_modapi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include <vm/page.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <sys/thread.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <sys/swap.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <sys/memlist.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
 * Page walker.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
 * By default, this will walk all pages in the system.  If given an
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
 * address, it will walk all pages belonging to the vnode at that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
 * address.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
 * page_walk_data
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
 * pw_hashleft is set to -1 when walking a vnode's pages, and holds the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
 * number of hash locations remaining in the page hash table when
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
 * walking all pages.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
 * The astute reader will notice that pw_hashloc is only used when
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
 * reading all pages (to hold a pointer to our location in the page
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
 * hash table), and that pw_first is only used when reading the pages
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
 * belonging to a particular vnode (to hold a pointer to the first
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
 * page).  While these could be combined to be a single pointer, they
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
 * are left separate for clarity.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
typedef struct page_walk_data {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
	long		pw_hashleft;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
	void		**pw_hashloc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
	uintptr_t	pw_first;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
} page_walk_data_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
page_walk_init(mdb_walk_state_t *wsp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
	page_walk_data_t	*pwd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
	void	**ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
	size_t	hashsz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
	vnode_t	vn;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	if (wsp->walk_addr == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
		 * Walk all pages
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
		if ((mdb_readvar(&ptr, "page_hash") == -1) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
		    (mdb_readvar(&hashsz, "page_hashsz") == -1) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
		    (ptr == NULL) || (hashsz == 0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
			mdb_warn("page_hash, page_hashsz not found or invalid");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
			return (WALK_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
		 * Since we are walking all pages, initialize hashleft
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
		 * to be the remaining number of entries in the page
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
		 * hash.  hashloc is set the start of the page hash
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
		 * table.  Setting the walk address to 0 indicates that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
		 * we aren't currently following a hash chain, and that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
		 * we need to scan the page hash table for a page.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
		pwd = mdb_alloc(sizeof (page_walk_data_t), UM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
		pwd->pw_hashleft = hashsz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
		pwd->pw_hashloc = ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
		wsp->walk_addr = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
		 * Walk just this vnode
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
		if (mdb_vread(&vn, sizeof (vnode_t), wsp->walk_addr) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
			mdb_warn("unable to read vnode_t at %#lx",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
			    wsp->walk_addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
			return (WALK_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
		 * We set hashleft to -1 to indicate that we are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
		 * walking a vnode, and initialize first to 0 (it is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
		 * used to terminate the walk, so it must not be set
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
		 * until after we have walked the first page).  The
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
		 * walk address is set to the first page.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
		pwd = mdb_alloc(sizeof (page_walk_data_t), UM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
		pwd->pw_hashleft = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
		pwd->pw_first = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
		wsp->walk_addr = (uintptr_t)vn.v_pages;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	wsp->walk_data = pwd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	return (WALK_NEXT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
page_walk_step(mdb_walk_state_t *wsp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	page_walk_data_t	*pwd = wsp->walk_data;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	page_t		page;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	uintptr_t	pp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
	pp = wsp->walk_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	if (pwd->pw_hashleft < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
		/* We're walking a vnode's pages */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
		 * If we don't have any pages to walk, we have come
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
		 * back around to the first one (we finished), or we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
		 * can't read the page we're looking at, we are done.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
		if (pp == NULL || pp == pwd->pw_first)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
			return (WALK_DONE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
		if (mdb_vread(&page, sizeof (page_t), pp) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
			mdb_warn("unable to read page_t at %#lx", pp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
			return (WALK_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
		 * Set the walk address to the next page, and if the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
		 * first page hasn't been set yet (i.e. we are on the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
		 * first page), set it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
		wsp->walk_addr = (uintptr_t)page.p_vpnext;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
		if (pwd->pw_first == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
			pwd->pw_first = pp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	} else if (pwd->pw_hashleft > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
		/* We're walking all pages */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
		 * If pp (the walk address) is NULL, we scan through
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
		 * the page hash table until we find a page.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
		if (pp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
			 * Iterate through the page hash table until we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
			 * find a page or reach the end.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
			do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
				if (mdb_vread(&pp, sizeof (uintptr_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
				    (uintptr_t)pwd->pw_hashloc) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
					mdb_warn("unable to read from %#p",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
					    pwd->pw_hashloc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
					return (WALK_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
				pwd->pw_hashleft--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
				pwd->pw_hashloc++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
			} while (pwd->pw_hashleft && (pp == NULL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
			 * We've reached the end; exit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
			if (pp == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
				return (WALK_DONE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
		if (mdb_vread(&page, sizeof (page_t), pp) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
			mdb_warn("unable to read page_t at %#lx", pp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
			return (WALK_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
		 * Set the walk address to the next page.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
		wsp->walk_addr = (uintptr_t)page.p_hash;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
		/* We've finished walking all pages. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
		return (WALK_DONE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	return (wsp->walk_callback(pp, &page, wsp->walk_cbdata));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
page_walk_fini(mdb_walk_state_t *wsp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	mdb_free(wsp->walk_data, sizeof (page_walk_data_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
/* Summary statistics of pages */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
typedef struct memstat {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
	struct vnode    *ms_kvp;	/* Cached address of kernel vnode */
3290
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 436
diff changeset
   220
	struct vnode    *ms_zvp;	/* Cached address of zio vnode    */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
	uint64_t	ms_kmem;	/* Pages of kernel memory	  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
	uint64_t	ms_anon;	/* Pages of anonymous memory	  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
	uint64_t	ms_vnode;	/* Pages of named (vnode) memory  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
	uint64_t	ms_exec;	/* Pages of exec/library memory	  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
	uint64_t	ms_cachelist;	/* Pages on the cachelist (free)  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
	uint64_t	ms_total;	/* Pages on page hash		  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
} memstat_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
3290
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 436
diff changeset
   229
#define	MS_PP_ISKAS(pp, stats)				\
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 436
diff changeset
   230
	(((pp)->p_vnode == (stats)->ms_kvp) ||		\
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 436
diff changeset
   231
	    (((stats)->ms_zvp != NULL) && ((pp)->p_vnode == (stats)->ms_zvp)))
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 436
diff changeset
   232
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
 * Summarize pages by type; called from page walker.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
memstat_callback(page_t *page, page_t *pp, memstat_t *stats)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
	struct vnode vn, *vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
	uintptr_t ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
	/* read page's vnode pointer */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
	if ((ptr = (uintptr_t)(pp->p_vnode)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
		if (mdb_vread(&vn, sizeof (vnode_t), ptr) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
			mdb_warn("unable to read vnode_t at %#lx",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
			    ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
			return (WALK_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
		vp = &vn;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
	} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
		vp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	if (PP_ISFREE(pp))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
		stats->ms_cachelist++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	else if (vp && IS_SWAPFSVP(vp))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
		stats->ms_anon++;
3290
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 436
diff changeset
   259
	else if (MS_PP_ISKAS(pp, stats))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
		stats->ms_kmem++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
	else if (vp && (((vp)->v_flag & VVMEXEC)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
		stats->ms_exec++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
		stats->ms_vnode++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
	stats->ms_total++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	return (WALK_NEXT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
memstat(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
	ulong_t pagesize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
	pgcnt_t total_pages;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
	ulong_t physmem;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
	memstat_t stats;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	memstat_t unused_stats;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	GElf_Sym sym;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	bzero(&stats, sizeof (memstat_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
	bzero(&unused_stats, sizeof (memstat_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
	if (argc != 0 || (flags & DCMD_ADDRSPEC))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
		return (DCMD_USAGE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
	/* Grab base page size */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
	if (mdb_readvar(&pagesize, "_pagesize") == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
		mdb_warn("unable to read _pagesize");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
		return (DCMD_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
	/* Total physical memory */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
	if (mdb_readvar(&total_pages, "total_pages") == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
		mdb_warn("unable to read total_pages");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
		return (DCMD_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	/* Artificially limited memory */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
	if (mdb_readvar(&physmem, "physmem") == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
		mdb_warn("unable to read physmem");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
		return (DCMD_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	/* read kernel vnode pointer */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
	if (mdb_lookup_by_obj(MDB_OBJ_EXEC, "kvp",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
		(GElf_Sym *)&sym) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
		mdb_warn("unable to read kvp");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
		return (DCMD_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	stats.ms_kvp = (struct vnode *)(uintptr_t)sym.st_value;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
3290
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 436
diff changeset
   315
	/*
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 436
diff changeset
   316
	 * Read the zio vnode pointer.  It may not exist on all kernels, so it
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 436
diff changeset
   317
	 * it isn't found, it's not a fatal error.
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 436
diff changeset
   318
	 */
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 436
diff changeset
   319
	if (mdb_lookup_by_obj(MDB_OBJ_EXEC, "zvp",
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 436
diff changeset
   320
		(GElf_Sym *)&sym) == -1) {
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 436
diff changeset
   321
		stats.ms_zvp = NULL;
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 436
diff changeset
   322
	} else {
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 436
diff changeset
   323
		stats.ms_zvp = (struct vnode *)(uintptr_t)sym.st_value;
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 436
diff changeset
   324
	}
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 436
diff changeset
   325
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	/* Walk page structures, summarizing usage */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
	if (mdb_walk("page", (mdb_walk_cb_t)memstat_callback,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
		&stats) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
		mdb_warn("can't walk pages");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
		return (DCMD_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	/* read unused pages vnode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
	if (mdb_lookup_by_obj(MDB_OBJ_EXEC, "unused_pages_vp",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
		(GElf_Sym *)&sym) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
		mdb_warn("unable to read unused_pages_vp");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
		return (DCMD_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
436
c9ab97f06761 6241314 ctfconvert should understand SPARC real types in DWARF
dmick
parents: 0
diff changeset
   340
	unused_stats.ms_kvp = (struct vnode *)(uintptr_t)sym.st_value;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
	/* Find unused pages */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
	if (mdb_walk("page", (mdb_walk_cb_t)memstat_callback,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
		&unused_stats) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
		mdb_warn("can't walk pages");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
		return (DCMD_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	 * If physmem != total_pages, then the administrator has limited the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
	 * number of pages available in the system.  In order to account for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
	 * this, we reduce the amount normally attributed to the page cache.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	stats.ms_vnode -= unused_stats.ms_kmem;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
	stats.ms_total -= unused_stats.ms_kmem;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
#define	MS_PCT_TOTAL(x)	(((5 * total_pages) + ((x) * 1000ull))) / \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
		((physmem) * 10)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
	mdb_printf("Page Summary                Pages                MB"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
	    "  %%Tot\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
	mdb_printf("------------     ----------------  ----------------"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
		"  ----\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
	mdb_printf("Kernel           %16llu  %16llu  %3llu%%\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
	    stats.ms_kmem,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
	    (uint64_t)stats.ms_kmem * pagesize / (1024 * 1024),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
	    MS_PCT_TOTAL(stats.ms_kmem));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
	mdb_printf("Anon             %16llu  %16llu  %3llu%%\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
	    stats.ms_anon,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
	    (uint64_t)stats.ms_anon * pagesize / (1024 * 1024),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
	    MS_PCT_TOTAL(stats.ms_anon));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
	mdb_printf("Exec and libs    %16llu  %16llu  %3llu%%\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
	    stats.ms_exec,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
	    (uint64_t)stats.ms_exec * pagesize / (1024 * 1024),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
	    MS_PCT_TOTAL(stats.ms_exec));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
	mdb_printf("Page cache       %16llu  %16llu  %3llu%%\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
	    stats.ms_vnode,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
	    (uint64_t)stats.ms_vnode * pagesize / (1024 * 1024),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
	    MS_PCT_TOTAL(stats.ms_vnode));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
	mdb_printf("Free (cachelist) %16llu  %16llu  %3llu%%\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
	    stats.ms_cachelist,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
	    (uint64_t)stats.ms_cachelist * pagesize / (1024 * 1024),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
	    MS_PCT_TOTAL(stats.ms_cachelist));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
	mdb_printf("Free (freelist)  %16llu  %16llu  %3llu%%\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
	    physmem - stats.ms_total,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
	    (uint64_t)(physmem - stats.ms_total) * pagesize / (1024 * 1024),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
	    MS_PCT_TOTAL(physmem - stats.ms_total));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
	mdb_printf("\nTotal            %16lu  %16lu\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
	    physmem,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
	    (uint64_t)physmem * pagesize / (1024 * 1024));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
	if (physmem != total_pages) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
		mdb_printf("Physical         %16lu  %16lu\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
		    total_pages,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
		    (uint64_t)total_pages * pagesize / (1024 * 1024));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
#undef MS_PCT_TOTAL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
	return (DCMD_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
page(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
	page_t	p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
	if (!(flags & DCMD_ADDRSPEC)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
		if (mdb_walk_dcmd("page", "page", argc, argv) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
			mdb_warn("can't walk pages");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
			return (DCMD_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
		return (DCMD_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
	if (DCMD_HDRSPEC(flags)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
		mdb_printf("%<u>%?s %?s %16s %8s %3s %3s %2s %2s %2s%</u>\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
		    "PAGE", "VNODE", "OFFSET", "SELOCK",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
		    "LCT", "COW", "IO", "FS", "ST");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
	if (mdb_vread(&p, sizeof (page_t), addr) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
		mdb_warn("can't read page_t at %#lx", addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
		return (DCMD_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
	mdb_printf("%0?lx %?p %16llx %8x %3d %3d %2x %2x %2x\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
	    addr, p.p_vnode, p.p_offset, p.p_selock, p.p_lckcnt, p.p_cowcnt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
	    p.p_iolock_state, p.p_fsdata, p.p_state);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
	return (DCMD_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
swap_walk_init(mdb_walk_state_t *wsp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
	void	*ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
	if ((mdb_readvar(&ptr, "swapinfo") == -1) || ptr == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
		mdb_warn("swapinfo not found or invalid");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
		return (WALK_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
	wsp->walk_addr = (uintptr_t)ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
	return (WALK_NEXT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
swap_walk_step(mdb_walk_state_t *wsp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
	uintptr_t	sip;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
	struct swapinfo	si;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
	sip = wsp->walk_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
	if (sip == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
		return (WALK_DONE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
	if (mdb_vread(&si, sizeof (struct swapinfo), sip) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
		mdb_warn("unable to read swapinfo at %#lx", sip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
		return (WALK_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
	wsp->walk_addr = (uintptr_t)si.si_next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
	return (wsp->walk_callback(sip, &si, wsp->walk_cbdata));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
swapinfof(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
	struct swapinfo	si;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
	char		*name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
	if (!(flags & DCMD_ADDRSPEC)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
		if (mdb_walk_dcmd("swapinfo", "swapinfo", argc, argv) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
			mdb_warn("can't walk swapinfo");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
			return (DCMD_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
		return (DCMD_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
	if (DCMD_HDRSPEC(flags)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
		mdb_printf("%<u>%?s %?s %9s %9s %s%</u>\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
		    "ADDR", "VNODE", "PAGES", "FREE", "NAME");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
	if (mdb_vread(&si, sizeof (struct swapinfo), addr) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
		mdb_warn("can't read swapinfo at %#lx", addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
		return (DCMD_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
	name = mdb_alloc(si.si_pnamelen, UM_SLEEP | UM_GC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
	if (mdb_vread(name, si.si_pnamelen, (uintptr_t)si.si_pname) == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
		name = "*error*";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
	mdb_printf("%0?lx %?p %9d %9d %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
	    addr, si.si_vp, si.si_npgs, si.si_nfpgs, name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
	return (DCMD_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
memlist_walk_step(mdb_walk_state_t *wsp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
	uintptr_t	mlp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
	struct memlist	ml;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
	mlp = wsp->walk_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
	if (mlp == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
		return (WALK_DONE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
	if (mdb_vread(&ml, sizeof (struct memlist), mlp) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
		mdb_warn("unable to read memlist at %#lx", mlp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
		return (WALK_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
	wsp->walk_addr = (uintptr_t)ml.next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
	return (wsp->walk_callback(mlp, &ml, wsp->walk_cbdata));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
memlist(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
	struct memlist	ml;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
	if (!(flags & DCMD_ADDRSPEC)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
		uintptr_t ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
		uint_t list = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
		int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
		static const char *lists[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
			"phys_install",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
			"phys_avail",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
			"virt_avail"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
		};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
		if (mdb_getopts(argc, argv,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
		    'i', MDB_OPT_SETBITS, (1 << 0), &list,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
		    'a', MDB_OPT_SETBITS, (1 << 1), &list,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
		    'v', MDB_OPT_SETBITS, (1 << 2), &list, NULL) != argc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
			return (DCMD_USAGE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
		if (!list)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
			list = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
		for (i = 0; list; i++, list >>= 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
			if (!(list & 1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
			if ((mdb_readvar(&ptr, lists[i]) == -1) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
			    (ptr == NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
				mdb_warn("%s not found or invalid", lists[i]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
				return (DCMD_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
			mdb_printf("%s:\n", lists[i]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
			if (mdb_pwalk_dcmd("memlist", "memlist", 0, NULL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
			    ptr) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
				mdb_warn("can't walk memlist");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
				return (DCMD_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
		return (DCMD_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
	if (DCMD_HDRSPEC(flags))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
		mdb_printf("%<u>%?s %16s %16s%</u>\n", "ADDR", "BASE", "SIZE");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
	if (mdb_vread(&ml, sizeof (struct memlist), addr) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
		mdb_warn("can't read memlist at %#lx", addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
		return (DCMD_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
	mdb_printf("%0?lx %16llx %16llx\n", addr, ml.address, ml.size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
	return (DCMD_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
}