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