74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering/*
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * CDDL HEADER START
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering *
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * The contents of this file are subject to the terms of the
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * Common Development and Distribution License, Version 1.0 only
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * (the "License"). You may not use this file except in compliance
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * with the License.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering *
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * or http://www.opensolaris.org/os/licensing.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * See the License for the specific language governing permissions
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * and limitations under the License.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering *
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * When distributing Covered Code, include this CDDL HEADER in each
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * If applicable, add the following below this CDDL HEADER, with the
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * fields enclosed by brackets "[]" replaced with your own identifying
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * information: Portions Copyright [yyyy] [name of copyright owner]
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering *
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * CDDL HEADER END
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering/*
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
71d35b6b5563817dfbe757ab9e3b9f018b2db491Thomas Hindoe Paaboel Andersen * Use is subject to license terms.
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poettering#pragma ident "%Z%%M% %I% %E% SMI"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#include "mdinclude.h"
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering
71d35b6b5563817dfbe757ab9e3b9f018b2db491Thomas Hindoe Paaboel Andersen/* array of the sets */
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poetteringmd_set_t mdset[MD_MAXSETS];
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poetteringmddb_set_t set_dbs[MD_MAXSETS];
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poettering/* for the addresses of each set above */
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poetteringuintptr_t mdset_addrs[MD_MAXSETS];
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poettering
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poetteringunit_t md_nunits = 0;
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poetteringset_t md_nsets = 0;
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poetteringint snarfed = 0;
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poetteringint active_sets = 0;
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poettering
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poettering/*
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poettering * routines to snarf the metaset information
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poettering *
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poettering * usage: ::dumpsetaddr [-s setname]
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poettering */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering/* ARGSUSED */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringint
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringdumpsetaddr(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
45ec7efb6c2560c80dfa752bc9d3733749dc52cbLennart Poettering{
45ec7efb6c2560c80dfa752bc9d3733749dc52cbLennart Poettering int i;
45ec7efb6c2560c80dfa752bc9d3733749dc52cbLennart Poettering int setno;
45ec7efb6c2560c80dfa752bc9d3733749dc52cbLennart Poettering char *s_opt = (char *)NULL;
45ec7efb6c2560c80dfa752bc9d3733749dc52cbLennart Poettering
45ec7efb6c2560c80dfa752bc9d3733749dc52cbLennart Poettering if (mdb_getopts(argc, argv, 's', MDB_OPT_STR, &s_opt,
45ec7efb6c2560c80dfa752bc9d3733749dc52cbLennart Poettering NULL) != argc) {
45ec7efb6c2560c80dfa752bc9d3733749dc52cbLennart Poettering /* left over arguments ?? */
45ec7efb6c2560c80dfa752bc9d3733749dc52cbLennart Poettering return (DCMD_USAGE);
45ec7efb6c2560c80dfa752bc9d3733749dc52cbLennart Poettering }
23b298bce75a0d1f4f15f34458af9678b4a30c3aLennart Poettering
23b298bce75a0d1f4f15f34458af9678b4a30c3aLennart Poettering if (!snarfed) {
23b298bce75a0d1f4f15f34458af9678b4a30c3aLennart Poettering mdb_warn("No sets read in yet - try ::metaset\n");
23b298bce75a0d1f4f15f34458af9678b4a30c3aLennart Poettering return (DCMD_ERR);
23b298bce75a0d1f4f15f34458af9678b4a30c3aLennart Poettering }
23b298bce75a0d1f4f15f34458af9678b4a30c3aLennart Poettering if (argc == 0) { /* dump all sets */
23b298bce75a0d1f4f15f34458af9678b4a30c3aLennart Poettering for (i = 0; i < md_nsets; i++) {
51323288fc628a5cac50914df915545d685b793eLennart Poettering if (mdset_addrs[i] != (uintptr_t)0)
51323288fc628a5cac50914df915545d685b793eLennart Poettering mdb_printf("%d %p\n", i, mdset_addrs[i]);
51323288fc628a5cac50914df915545d685b793eLennart Poettering }
011696f76233486bc56c266b18a328924f70269cLennart Poettering } else {
011696f76233486bc56c266b18a328924f70269cLennart Poettering setno = findset(s_opt);
011696f76233486bc56c266b18a328924f70269cLennart Poettering if (setno == -1) {
011696f76233486bc56c266b18a328924f70269cLennart Poettering mdb_warn("no such set: %s\n", s_opt);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering return (DCMD_ERR);
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering }
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (mdset_addrs[setno] != (uintptr_t)0)
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poettering mdb_printf("%d %p\n", setno,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering mdset_addrs[setno]);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering }
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering return (DCMD_OK);
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering}
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering
019036a47fcd10fcf0286800d144c706f3773e2fLennart Poettering
019036a47fcd10fcf0286800d144c706f3773e2fLennart Poettering/*
ae6a4bbf318e197813227e50c245a00de03784a2Lennart Poettering * Function: snarf_ui_anchor
ae6a4bbf318e197813227e50c245a00de03784a2Lennart Poettering * Purpose: to read in the s_ui part of a metaset.
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poettering * Returns: <n> - number of configured metadevices
7cc6ed7ba6c667caef9a92ba4d59e1ecdc3af8ffLennart Poettering * -1 - not configured
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering */
8ba9fd9cee0eef572f7b3ed7a8c3ed31160e93d3Lennart Poetteringint
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringsnarf_ui_anchor(int i)
0dd25fb9f005d8ab7ac4bc10a609d00569f8c56aLennart Poettering{
45ec7efb6c2560c80dfa752bc9d3733749dc52cbLennart Poettering int j;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering int num_found = 0;
45ec7efb6c2560c80dfa752bc9d3733749dc52cbLennart Poettering void **ptr = mdset[i].s_ui;
23b298bce75a0d1f4f15f34458af9678b4a30c3aLennart Poettering void *addr;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering for (j = 0; j < md_nunits; j++) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (mdb_vread(&addr, sizeof (void *), (uintptr_t)ptr) == -1) {
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering ptr++;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering continue;
82bd6dddc4a363a9c3c6f41eb46eb171a80dca27Lennart Poettering }
82bd6dddc4a363a9c3c6f41eb46eb171a80dca27Lennart Poettering if (addr != NULL) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering num_found++;
45ec7efb6c2560c80dfa752bc9d3733749dc52cbLennart Poettering }
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering ptr++;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering }
7588460aaf6bd33f6c9bd5645916cfd8a862e9c4Tom Gundersen return (num_found);
7588460aaf6bd33f6c9bd5645916cfd8a862e9c4Tom Gundersen}
7588460aaf6bd33f6c9bd5645916cfd8a862e9c4Tom Gundersen
7588460aaf6bd33f6c9bd5645916cfd8a862e9c4Tom Gundersen/*
7588460aaf6bd33f6c9bd5645916cfd8a862e9c4Tom Gundersen * Function: snarf_sets
7588460aaf6bd33f6c9bd5645916cfd8a862e9c4Tom Gundersen * Purpose: Entry point into the module that reads the kernel's version
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poettering * of the SVM configuration.
547973dea7abd6c124ff6c79fe2bbe322a7314aeLennart Poettering * First of all populates the mdset array and then for each
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poettering * component that makes up an "md_set_t" reads it in, via calls
23b298bce75a0d1f4f15f34458af9678b4a30c3aLennart Poettering * to other functions.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering */
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poetteringint
45ec7efb6c2560c80dfa752bc9d3733749dc52cbLennart Poetteringsnarf_sets(void)
45ec7efb6c2560c80dfa752bc9d3733749dc52cbLennart Poettering{
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering GElf_Sym setsym;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering GElf_Sym nmdsym;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering GElf_Sym mdsetsym;
45ec7efb6c2560c80dfa752bc9d3733749dc52cbLennart Poettering int i;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering size_t offset = 0;
966c66e34940001a40806142ecebaae61b478444Lennart Poettering
82bd6dddc4a363a9c3c6f41eb46eb171a80dca27Lennart Poettering if (snarfed)
23b298bce75a0d1f4f15f34458af9678b4a30c3aLennart Poettering return (DCMD_OK);
23b298bce75a0d1f4f15f34458af9678b4a30c3aLennart Poettering
23b298bce75a0d1f4f15f34458af9678b4a30c3aLennart Poettering /* find the SVM hook - md_set */
23b298bce75a0d1f4f15f34458af9678b4a30c3aLennart Poettering if (mdb_lookup_by_name("md_set", &setsym) == -1) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering mdb_warn("SVM is not configured on this machine\n");
return (DCMD_ERR);
}
/* find out how many metadevices are configured per set */
if (mdb_lookup_by_name("md_nunits", &nmdsym) == -1) {
mdb_warn("unable to find md_nunits\n");
return (DCMD_ERR);
}
if (mdb_vread(&md_nunits, sizeof (unit_t), nmdsym.st_value) == -1) {
mdb_warn("failed to read md_nunits at %p\n", nmdsym.st_value);
return (DCMD_ERR);
}
if (mdb_lookup_by_name("md_nsets", &mdsetsym) == -1) {
mdb_warn("unable to find md_nsets\n");
return (DCMD_ERR);
}
if (mdb_vread(&md_nsets, sizeof (set_t), mdsetsym.st_value) == -1) {
mdb_warn("failed to read md_nsets at %p\n", mdsetsym.st_value);
return (DCMD_ERR);
}
if (md_verbose) {
mdb_printf("mdset array addr: 0x%lx size is: 0x%lx\n",
(uintptr_t)setsym.st_value, sizeof (md_set_t));
}
offset = setsym.st_value;
for (i = 0; i < md_nsets; i++) {
if (mdb_vread(&mdset[i], sizeof (md_set_t), offset) == -1) {
mdb_warn("failed to read md_set_t at 0x%lx\n",
(uintptr_t)(setsym.st_value + offset));
}
/* Should check the status flags */
if (mdset[i].s_status & MD_SET_NM_LOADED) {
if (md_verbose)
mdb_printf("Set %d (0x%lx) has a name space\n",
i, (uintptr_t)(setsym.st_value + offset));
} else {
offset += sizeof (md_set_t);
continue;
}
if (mdb_vread(&set_dbs[i], sizeof (mddb_set_t),
(uintptr_t)mdset[i].s_db) == -1) {
if (mdset[i].s_db != 0) {
mdb_warn("failed to read mddb_set_t at 0x%p\n",
mdset[i].s_db);
return (DCMD_ERR);
} else {
mdb_warn("%d - no set configured\n", i);
return (DCMD_ERR);
}
}
active_sets++;
mdset_addrs[i] = (uintptr_t)(offset);
(void) snarf_ui_anchor(i);
/* have the set now read in the various bits and pieces */
offset += sizeof (md_set_t);
}
snarfed = 1;
if (md_verbose) {
mdb_printf("Number of active sets: %d\n", active_sets);
mdb_printf("Max number of metadevices: %u\n", md_nunits);
mdb_printf("Max number of sets: %u\n", md_nsets);
}
return (DCMD_OK);
}