fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * CDDL HEADER START
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe *
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * The contents of this file are subject to the terms of the
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * Common Development and Distribution License (the "License").
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * You may not use this file except in compliance with the License.
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe *
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * or http://www.opensolaris.org/os/licensing.
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * See the License for the specific language governing permissions
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * and limitations under the License.
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe *
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * When distributing Covered Code, include this CDDL HEADER in each
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * If applicable, add the following below this CDDL HEADER, with the
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * fields enclosed by brackets "[]" replaced with your own identifying
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * information: Portions Copyright [yyyy] [name of copyright owner]
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe *
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * CDDL HEADER END
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * Use is subject to license terms.
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * Display processor group information
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#include "pg.h"
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#include <mdb/mdb_modapi.h>
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#include <sys/pghw.h>
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe#include <sys/cmt.h>
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * PG hardware types indexed by hardware ID
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxechar *pg_hw_names[] = {
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe "hw",
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe "ipipe",
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe "cache",
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe "fpu",
e853d8c363bb48f997502f6e034877de20256ab0jc "mpipe",
e853d8c363bb48f997502f6e034877de20256ab0jc "chip",
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe "memory",
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe "active_pwr",
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe "idle_pwr",
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe};
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#define A_CNT(arr) (sizeof (arr) / sizeof (arr[0]))
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe#define NHW A_CNT(pg_hw_names)
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * Convert HW id to symbolic name
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxestatic char *
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxepg_hw_name(int hw)
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe{
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe return ((hw < 0 || hw > NHW) ? "UNKNOWN" : pg_hw_names[hw]);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe}
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * Display processor group.
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe/* ARGSUSED */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxeint
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxepg(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe{
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe pg_t pg;
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe pghw_t pghw;
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe pg_cmt_t pg_cmt;
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe pg_class_t pg_class;
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe int opt_q = 0; /* display only address. */
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe int is_cmt = 0; /* This is CMT pg */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe /* Should provide an address */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe if (! (flags & DCMD_ADDRSPEC))
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe return (DCMD_USAGE);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe if (mdb_getopts(argc, argv,
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe 'q', MDB_OPT_SETBITS, TRUE, &opt_q,
e853d8c363bb48f997502f6e034877de20256ab0jc NULL) != argc)
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe return (DCMD_USAGE);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe if (flags & DCMD_PIPE_OUT)
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe opt_q = B_TRUE;
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe if (DCMD_HDRSPEC(flags) && !opt_q) {
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe mdb_printf("%6s %?s %6s %7s %11s %5s %5s\n",
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe "PGID",
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe "ADDR",
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe "PHYSID",
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe "CLASS",
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe "HARDWARE",
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe "#CPUs",
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe "LOAD");
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe }
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe /*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * Read pg at specified address
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe if (mdb_vread(&pg, sizeof (struct pg), addr) == -1) {
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe mdb_warn("unable to read 'pg' at %p", addr);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe return (DCMD_ERR);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe }
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe /*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * In quiet mode just print pg address
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe if (opt_q) {
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe mdb_printf("%0?p\n", addr);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe return (DCMD_OK);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe }
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
c0a3d87bd66ca5a9f1c81e383ee86d31aebd8ab7Rafael Vanoni if (mdb_vread(&pg_class, sizeof (struct pg_class),
c0a3d87bd66ca5a9f1c81e383ee86d31aebd8ab7Rafael Vanoni (uintptr_t)pg.pg_class) == -1) {
c0a3d87bd66ca5a9f1c81e383ee86d31aebd8ab7Rafael Vanoni mdb_warn("unable to read 'pg_class' at %p", pg.pg_class);
c0a3d87bd66ca5a9f1c81e383ee86d31aebd8ab7Rafael Vanoni return (DCMD_ERR);
c0a3d87bd66ca5a9f1c81e383ee86d31aebd8ab7Rafael Vanoni }
c0a3d87bd66ca5a9f1c81e383ee86d31aebd8ab7Rafael Vanoni
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe if (strcmp(pg_class.pgc_name, "cmt") == 0) {
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe if (mdb_vread(&pg_cmt, sizeof (pg_cmt_t), addr) == -1) {
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe mdb_warn("unable to read 'cmt pg' at %p", addr);
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe return (DCMD_ERR);
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe }
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe is_cmt = 1;
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe }
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe if (pg.pg_relation == PGR_PHYSICAL) {
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe if (mdb_vread(&pghw, sizeof (struct pghw), addr) == -1) {
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe mdb_warn("unable to read 'pghw' at %p", addr);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe return (DCMD_ERR);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe }
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe /*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * Display the physical PG info.
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe mdb_printf("%6d %?p %6d %7s %11s %5d %5d\n",
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe pg.pg_id, addr, pghw.pghw_instance,
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe pg_class.pgc_name, pg_hw_name(pghw.pghw_hw),
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe pg.pg_cpus.grp_size,
0e7515250c8395f368aa45fb9acae7c4f8f8b786Eric Saxe is_cmt ? pg_cmt.cmt_utilization : 0);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe } else {
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe /*
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe * Display the basic PG info.
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe */
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe mdb_printf("%6d %?p %7s %5d\n",
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe pg.pg_id, addr, pg_class.pgc_name,
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe pg.pg_cpus.grp_size);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe }
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe return (DCMD_OK);
fb2f18f820d90b001aea4fb27dd654bc1263c440esaxe}