3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * CDDL HEADER START
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * The contents of this file are subject to the terms of the
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * Common Development and Distribution License (the "License").
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * You may not use this file except in compliance with the License.
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * See the License for the specific language governing permissions
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * and limitations under the License.
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * When distributing Covered Code, include this CDDL HEADER in each
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * If applicable, add the following below this CDDL HEADER, with the
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * fields enclosed by brackets "[]" replaced with your own identifying
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * information: Portions Copyright [yyyy] [name of copyright owner]
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * CDDL HEADER END
582832867ac00db0b1619c1bb890285984d338c9ha * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * Use is subject to license terms.
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan#pragma ident "%Z%%M% %I% %E% SMI"
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * This module provides debugging tools for the LDoms channels (ldc)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * Print LDC channel information
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanldcinfo(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * If no ldc_chan_t address was specified on the command line,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * we can print out all ldc channels by invoking the
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * walker, using this dcmd itself as the callback.
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mdb_walk_dcmd("ldcinfo", "ldcinfo", argc, argv) == -1) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mdb_vread(&ldcp, sizeof (ldcp), addr) != sizeof (ldcp)) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("%-5s %-13s %-6s %-8s %-6s %-6s %-6s %-8s\n",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan "ID", "ADDR", "MODE", "DEVCLASS", "STATUS", "TSTATE",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("0x%-3x 0x%p %b %b %b 0x%-4x 0x%-4x %b\n",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldcp.status, ldc_status_bits, ldcp.tstate, ldcp.hstate,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("Link State: %b\n", ldcp.tstate, ldc_tstate_bits);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("Hshake State: %b\n", ldcp.hstate, ldc_hstate_bits);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("Tx Info: 0x%p len=0x%lx hd=0x%lx tl=0x%lx "
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan "intr=%b\n", ldcp.tx_q_va, ldcp.tx_q_entries, ldcp.tx_head,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldcp.tx_tail, ldcp.tx_intr_state, ldc_intrstate_bits);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("Stream: buf=0x%p off=0x%lx remains=0x%lx\n",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (ldcp.exp_dring_list != NULL || ldcp.imp_dring_list != NULL)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("Desc Ring: exported=0x%p imported=0x%p\n",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * ldcinfo walker initialization
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* Must have a start addr. */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mdb_vread(&softstate, sizeof (softstate), wsp->walk_addr)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan != sizeof (softstate)) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_warn("failed to read softstate %p", wsp->walk_addr);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * ldcinfo walker step routine.
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mdb_vread(&ldcp, sizeof (ldc_chan_t), wsp->walk_addr) == -1) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * dcmd to print ldc packet information
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * arg0 - count (number of pkts to print)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanldcmsg(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * If no ldc_msg_t address was specified on the command line,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * print usage.
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* chk if we need to print more that one pkt */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (argc != 0) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* print header */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("%-13s %-10s %-4s %-5s %-4s %-11s %-4s %-10s\n",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan "ADDR", "SEQID", "TYPE", "STYPE", "CTRL", "ENVELOPE",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* print pkt */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan for (i = 0; i < count; i++) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mdb_vread(&msg, sizeof (msg), addr) != sizeof (msg)) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan msg.type, msg_type_bits, msg.stype, msg_stype_bits);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* print size */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* print ackid if data/ack */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* next packet */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * Print LDC map table information
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanldcmtbl(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * If no ldc_mtbl_t address was specified on the command line,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * print usage.
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mdb_vread(&mtbl, sizeof (mtbl), addr) != sizeof (mtbl)) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("Map Table: addr=0x%p total=%ld free=%ld tbl_base=0x%p\n",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan addr, mtbl.num_entries, mtbl.num_avail, mtbl.table);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* print table header */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("\n%-4s %-13s %-2s %-2s %-2s %-2s %-2s %-2s %-2s %-5s\n",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan "IDX", "RA_PFN", "CW", "CR", "IW", "IR", "X", "W", "R", "PGSZC");
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* print each table entry */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mdb_vread(&mte, sizeof (mte), mteaddr) != sizeof (mte)) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* skip empty entries */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan "%-2d %-2d %-2d 0x%-2x\n",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * Print LDC channel memory handle information
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanldcmhdl(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * If no ldc_msg_t address was specified on the command line,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * print usage.
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* chk if we need to print more that one pkt */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (argc != 0) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("%-13s %-7s %-7s %-4s %-13s %-13s %-10s\n",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan "ADDR", "STATUS", "MAPTYPE", "PERM", "MEMSEG", "VADDR", "SIZE");
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* print pkt */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan for (i = 0; i < count; i++) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mdb_vread(&mhdl, sizeof (mhdl), addr) != sizeof (mhdl)) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mhdl.mtype, mhdl_type_bits, mhdl.perm, mhdl_perm_bits,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("0x%p 0x%-8lx\n", memseg.vaddr, memseg.size);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * MDB module linkage information:
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "ldcinfo", "?[-v]", "LDom channel information", ldcinfo },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "ldcmsg", ":[cnt]", "LDom channel message", ldcmsg },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "ldcmtbl", ":[-v]", "LDom channel map table", ldcmtbl },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "ldcmhdl", ":[cnt]", "LDom channel memory handles", ldcmhdl },