1 /* 2 * This file and its contents are supplied under the terms of the 3 * Common Development and Distribution License ("CDDL"), version 1.0. 4 * You may only use this file in accordance with the terms of version 5 * 1.0 of the CDDL. 6 * 7 * A full copy of the text of the CDDL should have accompanied this 8 * source. A copy of the CDDL is also available via the Internet at 9 * http://www.illumos.org/license/CDDL. 10 */ 11 /* 12 * Copyright (c) 2013, Joyent, Inc. All rights reserved. 13 */ 14 15 #include "ddi_periodic.h" 16 17 #include <mdb/mdb_modapi.h> 18 #include <sys/ddi_timer.h> 19 #include <sys/sysmacros.h> 20 #include <stdio.h> 21 22 /*ARGSUSED*/ 23 int 24 dprinfo(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 25 { 26 char prflags[4]; 27 ddi_periodic_impl_t dpr; 28 boolean_t verbose = B_FALSE; 29 30 if (!(flags & DCMD_ADDRSPEC)) { 31 if (mdb_walk_dcmd("ddi_periodic", "ddi_periodic", argc, argv) 32 == -1) { 33 mdb_warn("cannot walk 'ddi_periodic'"); 34 return (DCMD_ERR); 35 } 36 return (DCMD_OK); 37 } 38 39 if (mdb_getopts(argc, argv, 40 'v', MDB_OPT_SETBITS, B_TRUE, &verbose, NULL) != argc) 41 return (DCMD_USAGE); 42 43 if (mdb_vread(&dpr, sizeof (dpr), addr) == -1) { 44 mdb_warn("could not read ddi_periodic_impl_t at %p", addr); 45 return (DCMD_ERR); 46 } 47 48 if (DCMD_HDRSPEC(flags)) { 49 mdb_printf("%16s %4s %3s %5s %5s %12s %s\n", "ADDR", "ID", 50 "LVL", "FLAGS", "MS", "FIRE_COUNT", "HANDLER"); 51 if (verbose) { 52 mdb_printf("%33s %16s %s\n", "", "CYCLIC_ID", 53 "ARGUMENT"); 54 } 55 } 56 57 prflags[0] = dpr.dpr_flags & DPF_DISPATCHED ? 'D' : '-'; 58 prflags[1] = dpr.dpr_flags & DPF_EXECUTING ? 'X' : '-'; 59 prflags[2] = dpr.dpr_flags & DPF_CANCELLED ? 'C' : '-'; 60 prflags[3] = '\0'; 61 62 mdb_printf("%16p %4x %3d %5s %5d %12x %a\n", addr, dpr.dpr_id, 63 dpr.dpr_level, prflags, (int)(dpr.dpr_interval / 1000000), 64 dpr.dpr_fire_count, dpr.dpr_handler); 65 if (verbose) { 66 mdb_printf("%33s %16p %a\n", "", dpr.dpr_cyclic_id, 67 dpr.dpr_arg); 68 } 69 70 return (DCMD_OK); 71 }