1*12683SJimmy.Vetayases@oracle.com /* 2*12683SJimmy.Vetayases@oracle.com * CDDL HEADER START 3*12683SJimmy.Vetayases@oracle.com * 4*12683SJimmy.Vetayases@oracle.com * The contents of this file are subject to the terms of the 5*12683SJimmy.Vetayases@oracle.com * Common Development and Distribution License (the "License"). 6*12683SJimmy.Vetayases@oracle.com * You may not use this file except in compliance with the License. 7*12683SJimmy.Vetayases@oracle.com * 8*12683SJimmy.Vetayases@oracle.com * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*12683SJimmy.Vetayases@oracle.com * or http://www.opensolaris.org/os/licensing. 10*12683SJimmy.Vetayases@oracle.com * See the License for the specific language governing permissions 11*12683SJimmy.Vetayases@oracle.com * and limitations under the License. 12*12683SJimmy.Vetayases@oracle.com * 13*12683SJimmy.Vetayases@oracle.com * When distributing Covered Code, include this CDDL HEADER in each 14*12683SJimmy.Vetayases@oracle.com * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*12683SJimmy.Vetayases@oracle.com * If applicable, add the following below this CDDL HEADER, with the 16*12683SJimmy.Vetayases@oracle.com * fields enclosed by brackets "[]" replaced with your own identifying 17*12683SJimmy.Vetayases@oracle.com * information: Portions Copyright [yyyy] [name of copyright owner] 18*12683SJimmy.Vetayases@oracle.com * 19*12683SJimmy.Vetayases@oracle.com * CDDL HEADER END 20*12683SJimmy.Vetayases@oracle.com */ 21*12683SJimmy.Vetayases@oracle.com /* 22*12683SJimmy.Vetayases@oracle.com * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 23*12683SJimmy.Vetayases@oracle.com */ 24*12683SJimmy.Vetayases@oracle.com 25*12683SJimmy.Vetayases@oracle.com #include "intr_common.h" 26*12683SJimmy.Vetayases@oracle.com 27*12683SJimmy.Vetayases@oracle.com /* 28*12683SJimmy.Vetayases@oracle.com * Globals 29*12683SJimmy.Vetayases@oracle.com */ 30*12683SJimmy.Vetayases@oracle.com static struct av_head avec_tbl[APIC_MAX_VECTOR+1]; 31*12683SJimmy.Vetayases@oracle.com static apic_irq_t *irq_tbl[APIC_MAX_VECTOR+1], airq; 32*12683SJimmy.Vetayases@oracle.com static char level_tbl[APIC_MAX_VECTOR+1]; 33*12683SJimmy.Vetayases@oracle.com 34*12683SJimmy.Vetayases@oracle.com /* 35*12683SJimmy.Vetayases@oracle.com * Dump interrupt information for pcplusmp PSM. 36*12683SJimmy.Vetayases@oracle.com */ 37*12683SJimmy.Vetayases@oracle.com /* ARGSUSED */ 38*12683SJimmy.Vetayases@oracle.com int 39*12683SJimmy.Vetayases@oracle.com interrupt_dump_apic(uintptr_t addr, uint_t flags, int argc, 40*12683SJimmy.Vetayases@oracle.com const mdb_arg_t *argv) 41*12683SJimmy.Vetayases@oracle.com { 42*12683SJimmy.Vetayases@oracle.com int i; 43*12683SJimmy.Vetayases@oracle.com 44*12683SJimmy.Vetayases@oracle.com option_flags = 0; 45*12683SJimmy.Vetayases@oracle.com if (mdb_getopts(argc, argv, 46*12683SJimmy.Vetayases@oracle.com 'd', MDB_OPT_SETBITS, INTR_DISPLAY_DRVR_INST, &option_flags, 47*12683SJimmy.Vetayases@oracle.com 'i', MDB_OPT_SETBITS, INTR_DISPLAY_INTRSTAT, &option_flags, 48*12683SJimmy.Vetayases@oracle.com NULL) != argc) 49*12683SJimmy.Vetayases@oracle.com return (DCMD_USAGE); 50*12683SJimmy.Vetayases@oracle.com 51*12683SJimmy.Vetayases@oracle.com if (mdb_readvar(&irq_tbl, "apic_irq_table") == -1) { 52*12683SJimmy.Vetayases@oracle.com mdb_warn("failed to read apic_irq_table"); 53*12683SJimmy.Vetayases@oracle.com return (DCMD_ERR); 54*12683SJimmy.Vetayases@oracle.com } 55*12683SJimmy.Vetayases@oracle.com 56*12683SJimmy.Vetayases@oracle.com if (mdb_readvar(&level_tbl, "apic_level_intr") == -1) { 57*12683SJimmy.Vetayases@oracle.com mdb_warn("failed to read apic_level_intr"); 58*12683SJimmy.Vetayases@oracle.com return (DCMD_ERR); 59*12683SJimmy.Vetayases@oracle.com } 60*12683SJimmy.Vetayases@oracle.com 61*12683SJimmy.Vetayases@oracle.com if (mdb_readvar(&avec_tbl, "autovect") == -1) { 62*12683SJimmy.Vetayases@oracle.com mdb_warn("failed to read autovect"); 63*12683SJimmy.Vetayases@oracle.com return (DCMD_ERR); 64*12683SJimmy.Vetayases@oracle.com } 65*12683SJimmy.Vetayases@oracle.com 66*12683SJimmy.Vetayases@oracle.com /* Print the header first */ 67*12683SJimmy.Vetayases@oracle.com if (option_flags & INTR_DISPLAY_INTRSTAT) 68*12683SJimmy.Vetayases@oracle.com mdb_printf("%<u>CPU "); 69*12683SJimmy.Vetayases@oracle.com else 70*12683SJimmy.Vetayases@oracle.com mdb_printf( 71*12683SJimmy.Vetayases@oracle.com "%<u>IRQ Vect IPL Bus Trg Type CPU Share APIC/INT# "); 72*12683SJimmy.Vetayases@oracle.com mdb_printf("%s %</u>\n", option_flags & INTR_DISPLAY_DRVR_INST ? 73*12683SJimmy.Vetayases@oracle.com "Driver Name(s)" : "ISR(s)"); 74*12683SJimmy.Vetayases@oracle.com 75*12683SJimmy.Vetayases@oracle.com /* Walk all the entries */ 76*12683SJimmy.Vetayases@oracle.com for (i = 0; i < APIC_MAX_VECTOR + 1; i++) { 77*12683SJimmy.Vetayases@oracle.com /* Read the entry */ 78*12683SJimmy.Vetayases@oracle.com if (mdb_vread(&airq, sizeof (apic_irq_t), 79*12683SJimmy.Vetayases@oracle.com (uintptr_t)irq_tbl[i]) == -1) 80*12683SJimmy.Vetayases@oracle.com continue; 81*12683SJimmy.Vetayases@oracle.com 82*12683SJimmy.Vetayases@oracle.com apic_interrupt_dump(&airq, &avec_tbl[i], i, NULL, level_tbl[i]); 83*12683SJimmy.Vetayases@oracle.com } 84*12683SJimmy.Vetayases@oracle.com 85*12683SJimmy.Vetayases@oracle.com return (DCMD_OK); 86*12683SJimmy.Vetayases@oracle.com } 87*12683SJimmy.Vetayases@oracle.com 88*12683SJimmy.Vetayases@oracle.com 89*12683SJimmy.Vetayases@oracle.com /* 90*12683SJimmy.Vetayases@oracle.com * MDB module linkage information: 91*12683SJimmy.Vetayases@oracle.com * 92*12683SJimmy.Vetayases@oracle.com * We declare a list of structures describing our dcmds, and a function 93*12683SJimmy.Vetayases@oracle.com * named _mdb_init to return a pointer to our module information. 94*12683SJimmy.Vetayases@oracle.com */ 95*12683SJimmy.Vetayases@oracle.com static const mdb_dcmd_t dcmds[] = { 96*12683SJimmy.Vetayases@oracle.com { "interrupts", "?[-di]", "print interrupts", interrupt_dump_apic, 97*12683SJimmy.Vetayases@oracle.com interrupt_help}, 98*12683SJimmy.Vetayases@oracle.com { "softint", "?[-d]", "print soft interrupts", soft_interrupt_dump, 99*12683SJimmy.Vetayases@oracle.com soft_interrupt_help}, 100*12683SJimmy.Vetayases@oracle.com { "apic", NULL, "print apic register contents", apic }, 101*12683SJimmy.Vetayases@oracle.com { "ioapic", NULL, "print ioapic register contents", ioapic }, 102*12683SJimmy.Vetayases@oracle.com { NULL } 103*12683SJimmy.Vetayases@oracle.com }; 104*12683SJimmy.Vetayases@oracle.com 105*12683SJimmy.Vetayases@oracle.com static const mdb_modinfo_t modinfo = { MDB_API_VERSION, dcmds, NULL }; 106*12683SJimmy.Vetayases@oracle.com 107*12683SJimmy.Vetayases@oracle.com const mdb_modinfo_t * 108*12683SJimmy.Vetayases@oracle.com _mdb_init(void) 109*12683SJimmy.Vetayases@oracle.com { 110*12683SJimmy.Vetayases@oracle.com GElf_Sym sym; 111*12683SJimmy.Vetayases@oracle.com 112*12683SJimmy.Vetayases@oracle.com if (mdb_lookup_by_name("gld_intr", &sym) != -1) 113*12683SJimmy.Vetayases@oracle.com if (GELF_ST_TYPE(sym.st_info) == STT_FUNC) 114*12683SJimmy.Vetayases@oracle.com gld_intr_addr = (uintptr_t)sym.st_value; 115*12683SJimmy.Vetayases@oracle.com 116*12683SJimmy.Vetayases@oracle.com return (&modinfo); 117*12683SJimmy.Vetayases@oracle.com } 118