13980Snarayan /*
23980Snarayan * CDDL HEADER START
33980Snarayan *
43980Snarayan * The contents of this file are subject to the terms of the
53980Snarayan * Common Development and Distribution License (the "License").
63980Snarayan * You may not use this file except in compliance with the License.
73980Snarayan *
83980Snarayan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
93980Snarayan * or http://www.opensolaris.org/os/licensing.
103980Snarayan * See the License for the specific language governing permissions
113980Snarayan * and limitations under the License.
123980Snarayan *
133980Snarayan * When distributing Covered Code, include this CDDL HEADER in each
143980Snarayan * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
153980Snarayan * If applicable, add the following below this CDDL HEADER, with the
163980Snarayan * fields enclosed by brackets "[]" replaced with your own identifying
173980Snarayan * information: Portions Copyright [yyyy] [name of copyright owner]
183980Snarayan *
193980Snarayan * CDDL HEADER END
203980Snarayan */
213980Snarayan
223980Snarayan /*
235944Sha137994 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
243980Snarayan * Use is subject to license terms.
253980Snarayan */
263980Snarayan
273980Snarayan #pragma ident "%Z%%M% %I% %E% SMI"
283980Snarayan
293980Snarayan /*
303980Snarayan * This module provides debugging tools for the LDoms channels (ldc)
313980Snarayan */
323980Snarayan
333980Snarayan #include <sys/mdb_modapi.h>
343980Snarayan #include <sys/ldc.h>
353980Snarayan #include <sys/ldc_impl.h>
363980Snarayan #include <sys/hypervisor_api.h>
373980Snarayan
383980Snarayan #define ALLBITS (u_longlong_t)-1
393980Snarayan
403980Snarayan const mdb_bitmask_t ldc_mode_bits[] = {
413980Snarayan { "raw ", ALLBITS, LDC_MODE_RAW },
423980Snarayan { "unrel ", ALLBITS, LDC_MODE_UNRELIABLE },
43*6408Sha137994 { "rel ", ALLBITS, LDC_MODE_RELIABLE },
443980Snarayan { NULL, 0, 0}
453980Snarayan };
463980Snarayan
473980Snarayan const mdb_bitmask_t ldc_status_bits[] = {
483980Snarayan { "init ", ALLBITS, LDC_INIT },
493980Snarayan { "open ", ALLBITS, LDC_OPEN },
503980Snarayan { "ready ", ALLBITS, LDC_READY },
513980Snarayan { "up ", ALLBITS, LDC_UP },
523980Snarayan { NULL, 0, 0}
533980Snarayan };
543980Snarayan
553980Snarayan const mdb_bitmask_t ldc_tstate_bits[] = {
563980Snarayan { "txq", TS_TXQ_RDY, TS_TXQ_RDY },
573980Snarayan { "rxq", TS_RXQ_RDY, TS_RXQ_RDY },
583980Snarayan { "hv_qconf", TS_QCONF_RDY, TS_QCONF_RDY },
593980Snarayan { "cnex_reg", TS_CNEX_RDY, TS_CNEX_RDY },
603980Snarayan { "hv_link_rdy", TS_LINK_READY, TS_LINK_READY },
613980Snarayan { "ver_done", TS_VER_DONE, TS_VER_DONE },
623980Snarayan { "hs_done", TS_HSHAKE_DONE, TS_HSHAKE_DONE },
633980Snarayan { NULL, 0, 0}
643980Snarayan };
653980Snarayan
663980Snarayan const mdb_bitmask_t ldc_hstate_bits[] = {
673980Snarayan { "snt_ver", TS_SENT_VER, TS_SENT_VER },
683980Snarayan { "snt_rts", TS_SENT_RTS, TS_SENT_RTS },
693980Snarayan { "rcv_rtr", TS_RCVD_RTR, TS_RCVD_RTR },
703980Snarayan { "snt_rdx", TS_SENT_RDX, TS_SENT_RDX },
713980Snarayan { "rcv_ver", TS_RCVD_VER, TS_RCVD_VER },
723980Snarayan { "rcv_rts", TS_RCVD_RTS, TS_RCVD_RTS },
733980Snarayan { "snt_rtr", TS_SENT_RTR, TS_SENT_RTR },
743980Snarayan { "rcv_rdx", TS_RCVD_RDX, TS_RCVD_RDX },
753980Snarayan { NULL, 0, 0}
763980Snarayan };
773980Snarayan
783980Snarayan const mdb_bitmask_t ldc_class_bits[] = {
793980Snarayan { "generic ", ALLBITS, LDC_DEV_GENERIC },
803980Snarayan { "blk ", ALLBITS, LDC_DEV_BLK },
813980Snarayan { "blk_svc ", ALLBITS, LDC_DEV_BLK_SVC },
823980Snarayan { "net ", ALLBITS, LDC_DEV_NT },
833980Snarayan { "net_svc ", ALLBITS, LDC_DEV_NT_SVC },
843980Snarayan { "serial ", ALLBITS, LDC_DEV_SERIAL },
853980Snarayan { NULL, 0, 0}
863980Snarayan };
873980Snarayan
883980Snarayan const mdb_bitmask_t ldc_intrstate_bits[] = {
893980Snarayan { "none ", ALLBITS, LDC_INTR_NONE },
903980Snarayan { "active ", ALLBITS, LDC_INTR_ACTIVE },
913980Snarayan { "pending", ALLBITS, LDC_INTR_PEND },
923980Snarayan { NULL, 0, 0}
933980Snarayan };
943980Snarayan
953980Snarayan const mdb_bitmask_t ldc_linkstate_bits[] = {
963980Snarayan { "down ", ALLBITS, LDC_CHANNEL_DOWN },
973980Snarayan { "reset", ALLBITS, LDC_CHANNEL_RESET },
983980Snarayan { "up ", ALLBITS, LDC_CHANNEL_UP },
993980Snarayan { NULL, 0, 0}
1003980Snarayan };
1013980Snarayan
1023980Snarayan const mdb_bitmask_t msg_type_bits[] = {
1033980Snarayan { "ctrl", ALLBITS, LDC_CTRL },
1043980Snarayan { "data", ALLBITS, LDC_DATA },
1053980Snarayan { "err ", ALLBITS, LDC_ERR },
1063980Snarayan { NULL, 0, 0}
1073980Snarayan };
1083980Snarayan
1093980Snarayan const mdb_bitmask_t msg_stype_bits[] = {
1103980Snarayan { "info ", ALLBITS, LDC_INFO },
1113980Snarayan { "ack ", ALLBITS, LDC_ACK },
1123980Snarayan { "nack ", ALLBITS, LDC_NACK },
1133980Snarayan { NULL, 0, 0}
1143980Snarayan };
1153980Snarayan
1163980Snarayan const mdb_bitmask_t msg_ctrl_bits[] = {
1173980Snarayan { "ver ", ALLBITS, LDC_VER },
1183980Snarayan { "rts ", ALLBITS, LDC_RTS },
1193980Snarayan { "rtr ", ALLBITS, LDC_RTR },
1203980Snarayan { "rdx ", ALLBITS, LDC_RDX },
1213980Snarayan { NULL, 0, 0}
1223980Snarayan };
1233980Snarayan
1243980Snarayan const mdb_bitmask_t mhdl_status_bits[] = {
1253980Snarayan { "unbound", ALLBITS, LDC_UNBOUND },
1263980Snarayan { "bound ", LDC_BOUND, LDC_BOUND },
1273980Snarayan { "mapped ", LDC_MAPPED, LDC_MAPPED },
1283980Snarayan { NULL, 0, 0}
1293980Snarayan };
1303980Snarayan
1313980Snarayan const mdb_bitmask_t mhdl_type_bits[] = {
1323980Snarayan { "shadow ", ALLBITS, LDC_SHADOW_MAP },
1333980Snarayan { "direct ", ALLBITS, LDC_DIRECT_MAP },
1343980Snarayan { "io ", ALLBITS, LDC_IO_MAP },
1353980Snarayan { NULL, 0, 0}
1363980Snarayan };
1373980Snarayan
1383980Snarayan const mdb_bitmask_t mhdl_perm_bits[] = {
1393980Snarayan { "r-- ", ALLBITS, LDC_MEM_R },
1403980Snarayan { "-w- ", ALLBITS, LDC_MEM_W },
1413980Snarayan { "--x ", ALLBITS, LDC_MEM_X },
1423980Snarayan { "rw- ", ALLBITS, LDC_MEM_RW },
1433980Snarayan { "rwx ", ALLBITS, LDC_MEM_RWX },
1443980Snarayan { NULL, 0, 0}
1453980Snarayan };
1463980Snarayan
1473980Snarayan
1483980Snarayan /*
1493980Snarayan * Print LDC channel information
1503980Snarayan */
1513980Snarayan int
ldcinfo(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)1523980Snarayan ldcinfo(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
1533980Snarayan {
1543980Snarayan uint_t verbose = FALSE;
1553980Snarayan ldc_chan_t ldcp;
1563980Snarayan
1573980Snarayan /*
1583980Snarayan * If no ldc_chan_t address was specified on the command line,
1593980Snarayan * we can print out all ldc channels by invoking the
1603980Snarayan * walker, using this dcmd itself as the callback.
1613980Snarayan */
1623980Snarayan if (!(flags & DCMD_ADDRSPEC)) {
1633980Snarayan if (mdb_walk_dcmd("ldcinfo", "ldcinfo", argc, argv) == -1) {
1643980Snarayan mdb_warn("failed to walk 'ldcinfo'");
1653980Snarayan return (DCMD_ERR);
1663980Snarayan }
1673980Snarayan return (DCMD_OK);
1683980Snarayan }
1693980Snarayan
1703980Snarayan
1713980Snarayan if (mdb_vread(&ldcp, sizeof (ldcp), addr) != sizeof (ldcp)) {
1723980Snarayan mdb_warn("failed to read ldc_chan_t at %p", addr);
1733980Snarayan return (DCMD_ERR);
1743980Snarayan }
1753980Snarayan
1763980Snarayan
1773980Snarayan if (mdb_getopts(argc, argv,
1785944Sha137994 'v', MDB_OPT_SETBITS, TRUE, &verbose, NULL) != argc) {
1793980Snarayan return (DCMD_USAGE);
1803980Snarayan }
1813980Snarayan
1823980Snarayan if (DCMD_HDRSPEC(flags)) {
1833980Snarayan mdb_printf("%-5s %-13s %-6s %-8s %-6s %-6s %-6s %-8s\n",
1843980Snarayan "ID", "ADDR", "MODE", "DEVCLASS", "STATUS", "TSTATE",
1853980Snarayan "HSTATE", "HV_LINK");
1863980Snarayan }
1873980Snarayan
1883980Snarayan mdb_printf("0x%-3x 0x%p %b %b %b 0x%-4x 0x%-4x %b\n",
1893980Snarayan ldcp.id, addr, ldcp.mode, ldc_mode_bits,
1903980Snarayan ldcp.devclass, ldc_class_bits,
1913980Snarayan ldcp.status, ldc_status_bits, ldcp.tstate, ldcp.hstate,
1923980Snarayan ldcp.link_state, ldc_linkstate_bits);
1933980Snarayan
1943980Snarayan if (verbose) {
1953980Snarayan mdb_printf("Link State: %b\n", ldcp.tstate, ldc_tstate_bits);
1963980Snarayan mdb_printf("Hshake State: %b\n", ldcp.hstate, ldc_hstate_bits);
1973980Snarayan mdb_printf("Callback: %a(0x%p) - %s\n",
1983980Snarayan ldcp.cb, ldcp.cb_arg,
1993980Snarayan (ldcp.cb_enabled == 1) ? "enabled" : "disabled");
2003980Snarayan mdb_printf("Tx Info: 0x%p len=0x%lx hd=0x%lx tl=0x%lx "
2013980Snarayan "intr=%b\n", ldcp.tx_q_va, ldcp.tx_q_entries, ldcp.tx_head,
2023980Snarayan ldcp.tx_tail, ldcp.tx_intr_state, ldc_intrstate_bits);
2033980Snarayan mdb_printf("Rx Info: 0x%p len=0x%lx intr=%b\n",
2043980Snarayan ldcp.rx_q_va, ldcp.rx_q_entries,
2053980Snarayan ldcp.rx_intr_state, ldc_intrstate_bits);
206*6408Sha137994 if (ldcp.mode == LDC_MODE_RELIABLE) {
2075944Sha137994 mdb_printf("Rx Dq Info: 0x%p len=0x%lx hd=0x%lx "
2085944Sha137994 "tl=0x%lx ackhd=0x%lx", ldcp.rx_dq_va,
2095944Sha137994 ldcp.rx_dq_entries, ldcp.rx_dq_head,
2105944Sha137994 ldcp.rx_dq_tail, ldcp.rx_ack_head);
2113980Snarayan mdb_printf("Stream: buf=0x%p off=0x%lx remains=0x%lx\n",
2123980Snarayan ldcp.stream_bufferp, ldcp.stream_offset,
2133980Snarayan ldcp.stream_remains);
2143980Snarayan }
2153980Snarayan if (ldcp.mtbl != NULL || ldcp.mhdl_list != NULL)
2163980Snarayan mdb_printf("Memory: mtbl=0x%p mhdl_list=0x%p\n",
2173980Snarayan ldcp.mtbl, ldcp.mhdl_list);
2183980Snarayan if (ldcp.exp_dring_list != NULL || ldcp.imp_dring_list != NULL)
2193980Snarayan mdb_printf("Desc Ring: exported=0x%p imported=0x%p\n",
2203980Snarayan ldcp.exp_dring_list, ldcp.imp_dring_list);
2213980Snarayan mdb_printf("\n");
2223980Snarayan }
2233980Snarayan return (DCMD_OK);
2243980Snarayan }
2253980Snarayan
2263980Snarayan
2273980Snarayan /*
2283980Snarayan * ldcinfo walker initialization
2293980Snarayan */
2303980Snarayan int
ldc_walk_init(mdb_walk_state_t * wsp)2313980Snarayan ldc_walk_init(mdb_walk_state_t *wsp)
2323980Snarayan {
2333980Snarayan ldc_soft_state_t softstate;
2343980Snarayan
2353980Snarayan /* Must have a start addr. */
2363980Snarayan if (wsp->walk_addr == NULL) {
2373980Snarayan if (mdb_readvar(&wsp->walk_addr, "ldcssp") == -1) {
2383980Snarayan mdb_warn("failed to read 'ldcssp'");
2393980Snarayan return (WALK_ERR);
2403980Snarayan }
2413980Snarayan
2423980Snarayan if (wsp->walk_addr == NULL)
2433980Snarayan return (WALK_DONE);
2443980Snarayan
2453980Snarayan if (mdb_vread(&softstate, sizeof (softstate), wsp->walk_addr)
2463980Snarayan != sizeof (softstate)) {
2473980Snarayan mdb_warn("failed to read softstate %p", wsp->walk_addr);
2483980Snarayan return (WALK_ERR);
2493980Snarayan }
2503980Snarayan
2513980Snarayan wsp->walk_addr = (uintptr_t)softstate.chan_list;
2523980Snarayan }
2533980Snarayan
2543980Snarayan return (WALK_NEXT);
2553980Snarayan }
2563980Snarayan
2573980Snarayan /*
2583980Snarayan * ldcinfo walker step routine.
2593980Snarayan */
2603980Snarayan int
ldc_walk_step(mdb_walk_state_t * wsp)2613980Snarayan ldc_walk_step(mdb_walk_state_t *wsp)
2623980Snarayan {
2633980Snarayan int status;
2643980Snarayan ldc_chan_t ldcp;
2653980Snarayan
2663980Snarayan if (wsp->walk_addr == NULL)
2673980Snarayan return (WALK_DONE);
2683980Snarayan
2693980Snarayan if (mdb_vread(&ldcp, sizeof (ldc_chan_t), wsp->walk_addr) == -1) {
2703980Snarayan mdb_warn("failed to read at %p", wsp->walk_addr);
2713980Snarayan
2723980Snarayan return (WALK_ERR);
2733980Snarayan }
2743980Snarayan
2753980Snarayan status = wsp->walk_callback(wsp->walk_addr, &ldcp,
2763980Snarayan wsp->walk_cbdata);
2773980Snarayan wsp->walk_addr = (uintptr_t)ldcp.next;
2783980Snarayan
2793980Snarayan return (status);
2803980Snarayan }
2813980Snarayan
2823980Snarayan
2833980Snarayan /*
2843980Snarayan * dcmd to print ldc packet information
2853980Snarayan *
2863980Snarayan * arg0 - count (number of pkts to print)
2873980Snarayan */
2883980Snarayan int
ldcmsg(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)2893980Snarayan ldcmsg(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
2903980Snarayan {
2913980Snarayan ldc_msg_t msg;
2923980Snarayan uint64_t count = 1;
2933980Snarayan int i;
2943980Snarayan
2953980Snarayan /*
2963980Snarayan * If no ldc_msg_t address was specified on the command line,
2973980Snarayan * print usage.
2983980Snarayan */
2993980Snarayan if (!(flags & DCMD_ADDRSPEC)) {
3003980Snarayan return (DCMD_USAGE);
3013980Snarayan }
3023980Snarayan
3033980Snarayan /* chk if we need to print more that one pkt */
3043980Snarayan if (argc != 0) {
3053980Snarayan const mdb_arg_t *arg = &argv[0];
3063980Snarayan
3073980Snarayan if (arg->a_type == MDB_TYPE_IMMEDIATE)
3083980Snarayan count = arg->a_un.a_val;
3093980Snarayan else
3103980Snarayan count = (uint64_t)mdb_strtoull(arg->a_un.a_str);
3113980Snarayan }
3123980Snarayan
3133980Snarayan /* print header */
3143980Snarayan mdb_printf("%-13s %-10s %-4s %-5s %-4s %-11s %-4s %-10s\n",
3153980Snarayan "ADDR", "SEQID", "TYPE", "STYPE", "CTRL", "ENVELOPE",
3163980Snarayan "SIZE", "ACKID");
3173980Snarayan
3183980Snarayan /* print pkt */
3193980Snarayan for (i = 0; i < count; i++) {
3203980Snarayan
3213980Snarayan if (mdb_vread(&msg, sizeof (msg), addr) != sizeof (msg)) {
3223980Snarayan mdb_warn("failed to read ldc_msg_t at %p", addr);
3233980Snarayan return (DCMD_ERR);
3243980Snarayan }
3253980Snarayan
3263980Snarayan mdb_printf("0x%p 0x%-8x %b %b", addr, msg.seqid,
3273980Snarayan msg.type, msg_type_bits, msg.stype, msg_stype_bits);
3283980Snarayan
3293980Snarayan if (msg.type == LDC_CTRL)
3303980Snarayan mdb_printf(" %b ", msg.ctrl, msg_ctrl_bits);
3313980Snarayan else
3323980Snarayan mdb_printf(" %-4s ", "--");
3333980Snarayan
3343980Snarayan mdb_printf("%-5s %-5s",
3353980Snarayan ((msg.env & LDC_FRAG_START) != 0) ? "start" : "--",
3363980Snarayan ((msg.env & LDC_FRAG_STOP) != 0) ? "stop" : "--");
3373980Snarayan
3383980Snarayan /* print size */
3393980Snarayan if (msg.type == LDC_DATA && msg.stype == LDC_INFO)
3403980Snarayan mdb_printf(" 0x%-2x ", (msg.env & LDC_LEN_MASK));
3413980Snarayan else
3423980Snarayan mdb_printf(" %-4s ", "--");
3433980Snarayan
3443980Snarayan /* print ackid if data/ack */
3453980Snarayan if (msg.type == LDC_DATA && msg.stype == LDC_ACK)
3463980Snarayan mdb_printf("0x%-8x\n", msg.ackid);
3473980Snarayan else
3483980Snarayan mdb_printf("%-10s\n", "--");
3493980Snarayan
3503980Snarayan /* next packet */
3513980Snarayan addr = addr + LDC_PACKET_SIZE;
3523980Snarayan }
3533980Snarayan
3543980Snarayan return (DCMD_OK);
3553980Snarayan }
3563980Snarayan
3573980Snarayan
3583980Snarayan /*
3593980Snarayan * Print LDC map table information
3603980Snarayan */
3613980Snarayan int
ldcmtbl(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)3623980Snarayan ldcmtbl(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
3633980Snarayan {
3643980Snarayan uint_t verbose = FALSE;
3653980Snarayan ldc_mtbl_t mtbl;
3663980Snarayan ldc_mte_slot_t mte;
3673980Snarayan uintptr_t mteaddr;
3683980Snarayan int i;
3693980Snarayan
3703980Snarayan /*
3713980Snarayan * If no ldc_mtbl_t address was specified on the command line,
3723980Snarayan * print usage.
3733980Snarayan */
3743980Snarayan if (!(flags & DCMD_ADDRSPEC)) {
3753980Snarayan return (DCMD_USAGE);
3763980Snarayan }
3773980Snarayan
3783980Snarayan if (mdb_vread(&mtbl, sizeof (mtbl), addr) != sizeof (mtbl)) {
3793980Snarayan mdb_warn("failed to read ldc_mtbl_t at %p", addr);
3803980Snarayan return (DCMD_ERR);
3813980Snarayan }
3823980Snarayan
3833980Snarayan mdb_printf("Map Table: addr=0x%p total=%ld free=%ld tbl_base=0x%p\n",
3843980Snarayan addr, mtbl.num_entries, mtbl.num_avail, mtbl.table);
3853980Snarayan
3863980Snarayan if (mdb_getopts(argc, argv,
3875944Sha137994 'v', MDB_OPT_SETBITS, TRUE, &verbose, NULL) != argc) {
3883980Snarayan return (DCMD_USAGE);
3893980Snarayan }
3903980Snarayan if (!verbose)
3913980Snarayan return (DCMD_OK);
3923980Snarayan
3933980Snarayan /* print table header */
3943980Snarayan mdb_printf("\n%-4s %-13s %-2s %-2s %-2s %-2s %-2s %-2s %-2s %-5s\n",
3953980Snarayan "IDX", "RA_PFN", "CW", "CR", "IW", "IR", "X", "W", "R", "PGSZC");
3963980Snarayan
3973980Snarayan /* print each table entry */
3983980Snarayan mteaddr = (uintptr_t)mtbl.table;
3993980Snarayan for (i = 0; i < mtbl.num_entries; i++) {
4003980Snarayan if (mdb_vread(&mte, sizeof (mte), mteaddr) != sizeof (mte)) {
4013980Snarayan return (DCMD_ABORT);
4023980Snarayan }
4033980Snarayan
4043980Snarayan /* skip empty entries */
4053980Snarayan if (mte.entry.ll != 0) {
4063980Snarayan mdb_printf("%-4d 0x%-11x %-2d %-2d %-2d %-2d "
4073980Snarayan "%-2d %-2d %-2d 0x%-2x\n",
4083980Snarayan i, mte.entry.mte_bit.rpfn, mte.entry.mte_bit.cw,
4093980Snarayan mte.entry.mte_bit.cr, mte.entry.mte_bit.iw,
4103980Snarayan mte.entry.mte_bit.ir, mte.entry.mte_bit.x,
4113980Snarayan mte.entry.mte_bit.w, mte.entry.mte_bit.r,
4123980Snarayan mte.entry.mte_bit.pgszc);
4133980Snarayan }
4143980Snarayan mteaddr = mteaddr + sizeof (ldc_mte_slot_t);
4153980Snarayan }
4163980Snarayan return (DCMD_OK);
4173980Snarayan }
4183980Snarayan
4193980Snarayan
4203980Snarayan
4213980Snarayan /*
4223980Snarayan * Print LDC channel memory handle information
4233980Snarayan */
4243980Snarayan int
ldcmhdl(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)4253980Snarayan ldcmhdl(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
4263980Snarayan {
4273980Snarayan ldc_mhdl_t mhdl;
4283980Snarayan ldc_memseg_t memseg;
4293980Snarayan uint64_t count = 1;
4303980Snarayan int i;
4313980Snarayan
4323980Snarayan /*
4333980Snarayan * If no ldc_msg_t address was specified on the command line,
4343980Snarayan * print usage.
4353980Snarayan */
4363980Snarayan if (!(flags & DCMD_ADDRSPEC)) {
4373980Snarayan return (DCMD_USAGE);
4383980Snarayan }
4393980Snarayan
4403980Snarayan /* chk if we need to print more that one pkt */
4413980Snarayan if (argc != 0) {
4423980Snarayan const mdb_arg_t *arg = &argv[0];
4433980Snarayan
4443980Snarayan if (arg->a_type == MDB_TYPE_IMMEDIATE)
4453980Snarayan count = arg->a_un.a_val;
4463980Snarayan else
4473980Snarayan count = (uint64_t)mdb_strtoull(arg->a_un.a_str);
4483980Snarayan }
4493980Snarayan
4503980Snarayan mdb_printf("%-13s %-7s %-7s %-4s %-13s %-13s %-10s\n",
4513980Snarayan "ADDR", "STATUS", "MAPTYPE", "PERM", "MEMSEG", "VADDR", "SIZE");
4523980Snarayan
4533980Snarayan /* print pkt */
4543980Snarayan for (i = 0; i < count; i++) {
4553980Snarayan
4563980Snarayan if (mdb_vread(&mhdl, sizeof (mhdl), addr) != sizeof (mhdl)) {
4573980Snarayan mdb_warn("failed to read ldc_mhdl_t at %p", addr);
4583980Snarayan return (DCMD_ERR);
4593980Snarayan }
4603980Snarayan
4613980Snarayan mdb_printf("0x%p %b %b %b 0x%p ",
4623980Snarayan addr, mhdl.status, mhdl_status_bits,
4633980Snarayan mhdl.mtype, mhdl_type_bits, mhdl.perm, mhdl_perm_bits,
4643980Snarayan mhdl.memseg);
4653980Snarayan
4663980Snarayan if (mhdl.memseg != NULL) {
4673980Snarayan if (mdb_vread(&memseg, sizeof (memseg),
4685944Sha137994 (uintptr_t)mhdl.memseg) != sizeof (memseg)) {
4693980Snarayan mdb_warn("failed to read ldc_memseg_t at %p",
4703980Snarayan mhdl.memseg);
4713980Snarayan return (DCMD_ERR);
4723980Snarayan }
4733980Snarayan
4743980Snarayan mdb_printf("0x%p 0x%-8lx\n", memseg.vaddr, memseg.size);
4753980Snarayan } else {
4763980Snarayan mdb_printf("\n");
4773980Snarayan }
4783980Snarayan
4793980Snarayan if ((addr = (uintptr_t)mhdl.next) == NULL)
4803980Snarayan break;
4813980Snarayan }
4823980Snarayan
4833980Snarayan return (DCMD_OK);
4843980Snarayan }
4853980Snarayan
4863980Snarayan
4873980Snarayan /*
4883980Snarayan * MDB module linkage information:
4893980Snarayan */
4903980Snarayan static const mdb_dcmd_t dcmds[] = {
4913980Snarayan { "ldcinfo", "?[-v]", "LDom channel information", ldcinfo },
4923980Snarayan { "ldcmsg", ":[cnt]", "LDom channel message", ldcmsg },
4933980Snarayan { "ldcmtbl", ":[-v]", "LDom channel map table", ldcmtbl },
4943980Snarayan { "ldcmhdl", ":[cnt]", "LDom channel memory handles", ldcmhdl },
4953980Snarayan { NULL }
4963980Snarayan };
4973980Snarayan
4983980Snarayan static const mdb_walker_t walkers[] = {
4993980Snarayan { "ldcinfo", "List all LDom channels",
5003980Snarayan ldc_walk_init, ldc_walk_step, NULL },
5013980Snarayan { NULL }
5023980Snarayan };
5033980Snarayan
5043980Snarayan static const mdb_modinfo_t modinfo = {
5053980Snarayan MDB_API_VERSION, dcmds, walkers
5063980Snarayan };
5073980Snarayan
5083980Snarayan const mdb_modinfo_t *
_mdb_init(void)5093980Snarayan _mdb_init(void)
5103980Snarayan {
5113980Snarayan return (&modinfo);
5123980Snarayan }
513