3895f3e681d42b8122c8084f114c0d2f88dd7979narayan/*
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * CDDL HEADER START
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan *
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 *
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * or http://www.opensolaris.org/os/licensing.
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * See the License for the specific language governing permissions
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * and limitations under the License.
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan *
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 *
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * CDDL HEADER END
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan/*
582832867ac00db0b1619c1bb890285984d338c9ha * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * Use is subject to license terms.
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan#pragma ident "%Z%%M% %I% %E% SMI"
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan/*
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * This module provides debugging tools for the LDoms channels (ldc)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan#include <sys/mdb_modapi.h>
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan#include <sys/ldc.h>
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan#include <sys/ldc_impl.h>
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan#include <sys/hypervisor_api.h>
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan#define ALLBITS (u_longlong_t)-1
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanconst mdb_bitmask_t ldc_mode_bits[] = {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "raw ", ALLBITS, LDC_MODE_RAW },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "unrel ", ALLBITS, LDC_MODE_UNRELIABLE },
20ae46ebaff1237662e05edf9db61538aa85d448ha { "rel ", ALLBITS, LDC_MODE_RELIABLE },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { NULL, 0, 0}
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan};
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanconst mdb_bitmask_t ldc_status_bits[] = {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "init ", ALLBITS, LDC_INIT },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "open ", ALLBITS, LDC_OPEN },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "ready ", ALLBITS, LDC_READY },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "up ", ALLBITS, LDC_UP },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { NULL, 0, 0}
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan};
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanconst mdb_bitmask_t ldc_tstate_bits[] = {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "txq", TS_TXQ_RDY, TS_TXQ_RDY },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "rxq", TS_RXQ_RDY, TS_RXQ_RDY },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "hv_qconf", TS_QCONF_RDY, TS_QCONF_RDY },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "cnex_reg", TS_CNEX_RDY, TS_CNEX_RDY },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "hv_link_rdy", TS_LINK_READY, TS_LINK_READY },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "ver_done", TS_VER_DONE, TS_VER_DONE },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "hs_done", TS_HSHAKE_DONE, TS_HSHAKE_DONE },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { NULL, 0, 0}
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan};
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanconst mdb_bitmask_t ldc_hstate_bits[] = {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "snt_ver", TS_SENT_VER, TS_SENT_VER },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "snt_rts", TS_SENT_RTS, TS_SENT_RTS },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "rcv_rtr", TS_RCVD_RTR, TS_RCVD_RTR },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "snt_rdx", TS_SENT_RDX, TS_SENT_RDX },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "rcv_ver", TS_RCVD_VER, TS_RCVD_VER },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "rcv_rts", TS_RCVD_RTS, TS_RCVD_RTS },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "snt_rtr", TS_SENT_RTR, TS_SENT_RTR },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "rcv_rdx", TS_RCVD_RDX, TS_RCVD_RDX },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { NULL, 0, 0}
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan};
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanconst mdb_bitmask_t ldc_class_bits[] = {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "generic ", ALLBITS, LDC_DEV_GENERIC },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "blk ", ALLBITS, LDC_DEV_BLK },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "blk_svc ", ALLBITS, LDC_DEV_BLK_SVC },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "net ", ALLBITS, LDC_DEV_NT },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "net_svc ", ALLBITS, LDC_DEV_NT_SVC },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "serial ", ALLBITS, LDC_DEV_SERIAL },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { NULL, 0, 0}
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan};
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanconst mdb_bitmask_t ldc_intrstate_bits[] = {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "none ", ALLBITS, LDC_INTR_NONE },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "active ", ALLBITS, LDC_INTR_ACTIVE },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "pending", ALLBITS, LDC_INTR_PEND },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { NULL, 0, 0}
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan};
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanconst mdb_bitmask_t ldc_linkstate_bits[] = {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "down ", ALLBITS, LDC_CHANNEL_DOWN },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "reset", ALLBITS, LDC_CHANNEL_RESET },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "up ", ALLBITS, LDC_CHANNEL_UP },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { NULL, 0, 0}
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan};
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanconst mdb_bitmask_t msg_type_bits[] = {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "ctrl", ALLBITS, LDC_CTRL },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "data", ALLBITS, LDC_DATA },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "err ", ALLBITS, LDC_ERR },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { NULL, 0, 0}
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan};
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanconst mdb_bitmask_t msg_stype_bits[] = {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "info ", ALLBITS, LDC_INFO },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "ack ", ALLBITS, LDC_ACK },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "nack ", ALLBITS, LDC_NACK },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { NULL, 0, 0}
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan};
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanconst mdb_bitmask_t msg_ctrl_bits[] = {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "ver ", ALLBITS, LDC_VER },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "rts ", ALLBITS, LDC_RTS },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "rtr ", ALLBITS, LDC_RTR },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "rdx ", ALLBITS, LDC_RDX },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { NULL, 0, 0}
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan};
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanconst mdb_bitmask_t mhdl_status_bits[] = {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "unbound", ALLBITS, LDC_UNBOUND },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "bound ", LDC_BOUND, LDC_BOUND },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "mapped ", LDC_MAPPED, LDC_MAPPED },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { NULL, 0, 0}
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan};
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanconst mdb_bitmask_t mhdl_type_bits[] = {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "shadow ", ALLBITS, LDC_SHADOW_MAP },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "direct ", ALLBITS, LDC_DIRECT_MAP },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "io ", ALLBITS, LDC_IO_MAP },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { NULL, 0, 0}
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan};
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanconst mdb_bitmask_t mhdl_perm_bits[] = {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "r-- ", ALLBITS, LDC_MEM_R },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "-w- ", ALLBITS, LDC_MEM_W },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "--x ", ALLBITS, LDC_MEM_X },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "rw- ", ALLBITS, LDC_MEM_RW },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "rwx ", ALLBITS, LDC_MEM_RWX },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { NULL, 0, 0}
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan};
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan/*
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * Print LDC channel information
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanint
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanldcinfo(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan{
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan uint_t verbose = FALSE;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldc_chan_t ldcp;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /*
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 */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (!(flags & DCMD_ADDRSPEC)) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mdb_walk_dcmd("ldcinfo", "ldcinfo", argc, argv) == -1) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_warn("failed to walk 'ldcinfo'");
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (DCMD_ERR);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (DCMD_OK);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mdb_vread(&ldcp, sizeof (ldcp), addr) != sizeof (ldcp)) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_warn("failed to read ldc_chan_t at %p", addr);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (DCMD_ERR);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mdb_getopts(argc, argv,
582832867ac00db0b1619c1bb890285984d338c9ha 'v', MDB_OPT_SETBITS, TRUE, &verbose, NULL) != argc) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (DCMD_USAGE);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (DCMD_HDRSPEC(flags)) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("%-5s %-13s %-6s %-8s %-6s %-6s %-6s %-8s\n",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan "ID", "ADDR", "MODE", "DEVCLASS", "STATUS", "TSTATE",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan "HSTATE", "HV_LINK");
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("0x%-3x 0x%p %b %b %b 0x%-4x 0x%-4x %b\n",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldcp.id, addr, ldcp.mode, ldc_mode_bits,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldcp.devclass, ldc_class_bits,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldcp.status, ldc_status_bits, ldcp.tstate, ldcp.hstate,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldcp.link_state, ldc_linkstate_bits);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (verbose) {
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("Callback: %a(0x%p) - %s\n",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldcp.cb, ldcp.cb_arg,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan (ldcp.cb_enabled == 1) ? "enabled" : "disabled");
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("Rx Info: 0x%p len=0x%lx intr=%b\n",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldcp.rx_q_va, ldcp.rx_q_entries,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldcp.rx_intr_state, ldc_intrstate_bits);
20ae46ebaff1237662e05edf9db61538aa85d448ha if (ldcp.mode == LDC_MODE_RELIABLE) {
582832867ac00db0b1619c1bb890285984d338c9ha mdb_printf("Rx Dq Info: 0x%p len=0x%lx hd=0x%lx "
582832867ac00db0b1619c1bb890285984d338c9ha "tl=0x%lx ackhd=0x%lx", ldcp.rx_dq_va,
582832867ac00db0b1619c1bb890285984d338c9ha ldcp.rx_dq_entries, ldcp.rx_dq_head,
582832867ac00db0b1619c1bb890285984d338c9ha ldcp.rx_dq_tail, ldcp.rx_ack_head);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("Stream: buf=0x%p off=0x%lx remains=0x%lx\n",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldcp.stream_bufferp, ldcp.stream_offset,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldcp.stream_remains);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (ldcp.mtbl != NULL || ldcp.mhdl_list != NULL)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("Memory: mtbl=0x%p mhdl_list=0x%p\n",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldcp.mtbl, ldcp.mhdl_list);
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 ldcp.exp_dring_list, ldcp.imp_dring_list);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("\n");
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (DCMD_OK);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan}
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan/*
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * ldcinfo walker initialization
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanint
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanldc_walk_init(mdb_walk_state_t *wsp)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan{
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldc_soft_state_t softstate;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* Must have a start addr. */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (wsp->walk_addr == NULL) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mdb_readvar(&wsp->walk_addr, "ldcssp") == -1) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_warn("failed to read 'ldcssp'");
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (WALK_ERR);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (wsp->walk_addr == NULL)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (WALK_DONE);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
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 return (WALK_ERR);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan wsp->walk_addr = (uintptr_t)softstate.chan_list;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (WALK_NEXT);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan}
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan/*
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * ldcinfo walker step routine.
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanint
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanldc_walk_step(mdb_walk_state_t *wsp)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan{
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan int status;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldc_chan_t ldcp;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (wsp->walk_addr == NULL)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (WALK_DONE);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mdb_vread(&ldcp, sizeof (ldc_chan_t), wsp->walk_addr) == -1) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_warn("failed to read at %p", wsp->walk_addr);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (WALK_ERR);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan status = wsp->walk_callback(wsp->walk_addr, &ldcp,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan wsp->walk_cbdata);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan wsp->walk_addr = (uintptr_t)ldcp.next;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (status);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan}
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan/*
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * dcmd to print ldc packet information
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan *
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * arg0 - count (number of pkts to print)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanint
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanldcmsg(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan{
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldc_msg_t msg;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan uint64_t count = 1;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan int i;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /*
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * If no ldc_msg_t address was specified on the command line,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * print usage.
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (!(flags & DCMD_ADDRSPEC)) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (DCMD_USAGE);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* chk if we need to print more that one pkt */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (argc != 0) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan const mdb_arg_t *arg = &argv[0];
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (arg->a_type == MDB_TYPE_IMMEDIATE)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan count = arg->a_un.a_val;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan else
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan count = (uint64_t)mdb_strtoull(arg->a_un.a_str);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* print header */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("%-13s %-10s %-4s %-5s %-4s %-11s %-4s %-10s\n",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan "ADDR", "SEQID", "TYPE", "STYPE", "CTRL", "ENVELOPE",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan "SIZE", "ACKID");
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* print pkt */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan for (i = 0; i < count; i++) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mdb_vread(&msg, sizeof (msg), addr) != sizeof (msg)) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_warn("failed to read ldc_msg_t at %p", addr);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (DCMD_ERR);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("0x%p 0x%-8x %b %b", addr, msg.seqid,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan msg.type, msg_type_bits, msg.stype, msg_stype_bits);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (msg.type == LDC_CTRL)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf(" %b ", msg.ctrl, msg_ctrl_bits);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan else
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf(" %-4s ", "--");
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("%-5s %-5s",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ((msg.env & LDC_FRAG_START) != 0) ? "start" : "--",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ((msg.env & LDC_FRAG_STOP) != 0) ? "stop" : "--");
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* print size */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (msg.type == LDC_DATA && msg.stype == LDC_INFO)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf(" 0x%-2x ", (msg.env & LDC_LEN_MASK));
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan else
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf(" %-4s ", "--");
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* print ackid if data/ack */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (msg.type == LDC_DATA && msg.stype == LDC_ACK)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("0x%-8x\n", msg.ackid);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan else
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("%-10s\n", "--");
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* next packet */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan addr = addr + LDC_PACKET_SIZE;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (DCMD_OK);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan}
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan/*
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * Print LDC map table information
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanint
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanldcmtbl(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan{
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan uint_t verbose = FALSE;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldc_mtbl_t mtbl;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldc_mte_slot_t mte;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan uintptr_t mteaddr;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan int i;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /*
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * If no ldc_mtbl_t address was specified on the command line,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * print usage.
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (!(flags & DCMD_ADDRSPEC)) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (DCMD_USAGE);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mdb_vread(&mtbl, sizeof (mtbl), addr) != sizeof (mtbl)) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_warn("failed to read ldc_mtbl_t at %p", addr);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (DCMD_ERR);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
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
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mdb_getopts(argc, argv,
582832867ac00db0b1619c1bb890285984d338c9ha 'v', MDB_OPT_SETBITS, TRUE, &verbose, NULL) != argc) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (DCMD_USAGE);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (!verbose)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (DCMD_OK);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
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
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* print each table entry */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mteaddr = (uintptr_t)mtbl.table;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan for (i = 0; i < mtbl.num_entries; i++) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mdb_vread(&mte, sizeof (mte), mteaddr) != sizeof (mte)) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (DCMD_ABORT);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* skip empty entries */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mte.entry.ll != 0) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("%-4d 0x%-11x %-2d %-2d %-2d %-2d "
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan "%-2d %-2d %-2d 0x%-2x\n",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan i, mte.entry.mte_bit.rpfn, mte.entry.mte_bit.cw,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mte.entry.mte_bit.cr, mte.entry.mte_bit.iw,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mte.entry.mte_bit.ir, mte.entry.mte_bit.x,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mte.entry.mte_bit.w, mte.entry.mte_bit.r,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mte.entry.mte_bit.pgszc);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mteaddr = mteaddr + sizeof (ldc_mte_slot_t);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (DCMD_OK);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan}
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan/*
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * Print LDC channel memory handle information
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanint
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanldcmhdl(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan{
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldc_mhdl_t mhdl;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldc_memseg_t memseg;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan uint64_t count = 1;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan int i;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /*
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * If no ldc_msg_t address was specified on the command line,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * print usage.
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (!(flags & DCMD_ADDRSPEC)) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (DCMD_USAGE);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* chk if we need to print more that one pkt */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (argc != 0) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan const mdb_arg_t *arg = &argv[0];
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (arg->a_type == MDB_TYPE_IMMEDIATE)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan count = arg->a_un.a_val;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan else
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan count = (uint64_t)mdb_strtoull(arg->a_un.a_str);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("%-13s %-7s %-7s %-4s %-13s %-13s %-10s\n",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan "ADDR", "STATUS", "MAPTYPE", "PERM", "MEMSEG", "VADDR", "SIZE");
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan /* print pkt */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan for (i = 0; i < count; i++) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mdb_vread(&mhdl, sizeof (mhdl), addr) != sizeof (mhdl)) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_warn("failed to read ldc_mhdl_t at %p", addr);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (DCMD_ERR);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("0x%p %b %b %b 0x%p ",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan addr, mhdl.status, mhdl_status_bits,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mhdl.mtype, mhdl_type_bits, mhdl.perm, mhdl_perm_bits,
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mhdl.memseg);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mhdl.memseg != NULL) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if (mdb_vread(&memseg, sizeof (memseg),
582832867ac00db0b1619c1bb890285984d338c9ha (uintptr_t)mhdl.memseg) != sizeof (memseg)) {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_warn("failed to read ldc_memseg_t at %p",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mhdl.memseg);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (DCMD_ERR);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("0x%p 0x%-8lx\n", memseg.vaddr, memseg.size);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan } else {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan mdb_printf("\n");
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan if ((addr = (uintptr_t)mhdl.next) == NULL)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan break;
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (DCMD_OK);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan}
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan/*
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan * MDB module linkage information:
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan */
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanstatic const mdb_dcmd_t dcmds[] = {
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 },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { NULL }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan};
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanstatic const mdb_walker_t walkers[] = {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { "ldcinfo", "List all LDom channels",
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan ldc_walk_init, ldc_walk_step, NULL },
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan { NULL }
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan};
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanstatic const mdb_modinfo_t modinfo = {
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan MDB_API_VERSION, dcmds, walkers
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan};
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan
3895f3e681d42b8122c8084f114c0d2f88dd7979narayanconst mdb_modinfo_t *
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan_mdb_init(void)
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan{
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan return (&modinfo);
3895f3e681d42b8122c8084f114c0d2f88dd7979narayan}