17ff178cdSJimmy Vetayases /* 27ff178cdSJimmy Vetayases * CDDL HEADER START 37ff178cdSJimmy Vetayases * 47ff178cdSJimmy Vetayases * The contents of this file are subject to the terms of the 57ff178cdSJimmy Vetayases * Common Development and Distribution License (the "License"). 67ff178cdSJimmy Vetayases * You may not use this file except in compliance with the License. 77ff178cdSJimmy Vetayases * 87ff178cdSJimmy Vetayases * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97ff178cdSJimmy Vetayases * or http://www.opensolaris.org/os/licensing. 107ff178cdSJimmy Vetayases * See the License for the specific language governing permissions 117ff178cdSJimmy Vetayases * and limitations under the License. 127ff178cdSJimmy Vetayases * 137ff178cdSJimmy Vetayases * When distributing Covered Code, include this CDDL HEADER in each 147ff178cdSJimmy Vetayases * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157ff178cdSJimmy Vetayases * If applicable, add the following below this CDDL HEADER, with the 167ff178cdSJimmy Vetayases * fields enclosed by brackets "[]" replaced with your own identifying 177ff178cdSJimmy Vetayases * information: Portions Copyright [yyyy] [name of copyright owner] 187ff178cdSJimmy Vetayases * 197ff178cdSJimmy Vetayases * CDDL HEADER END 207ff178cdSJimmy Vetayases */ 217ff178cdSJimmy Vetayases /* 225cd376e8SJimmy Vetayases * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 237ff178cdSJimmy Vetayases */ 247ff178cdSJimmy Vetayases 257ff178cdSJimmy Vetayases #include "intr_common.h" 26*41afdfa7SKrishnendu Sadhukhan - Sun Microsystems #include <sys/apic_timer.h> 277ff178cdSJimmy Vetayases 287ff178cdSJimmy Vetayases /* 297ff178cdSJimmy Vetayases * Globals 307ff178cdSJimmy Vetayases */ 317ff178cdSJimmy Vetayases static struct av_head avec_tbl[APIC_MAX_VECTOR+1]; 327ff178cdSJimmy Vetayases static apic_irq_t *irq_tbl[APIC_MAX_VECTOR+1], airq; 337ff178cdSJimmy Vetayases static char level_tbl[APIC_MAX_VECTOR+1]; 347ff178cdSJimmy Vetayases 357ff178cdSJimmy Vetayases /* 367ff178cdSJimmy Vetayases * Dump interrupt information for pcplusmp PSM. 377ff178cdSJimmy Vetayases */ 387ff178cdSJimmy Vetayases /* ARGSUSED */ 397ff178cdSJimmy Vetayases int 407ff178cdSJimmy Vetayases interrupt_dump_apic(uintptr_t addr, uint_t flags, int argc, 417ff178cdSJimmy Vetayases const mdb_arg_t *argv) 427ff178cdSJimmy Vetayases { 437ff178cdSJimmy Vetayases int i; 447ff178cdSJimmy Vetayases 457ff178cdSJimmy Vetayases option_flags = 0; 467ff178cdSJimmy Vetayases if (mdb_getopts(argc, argv, 477ff178cdSJimmy Vetayases 'd', MDB_OPT_SETBITS, INTR_DISPLAY_DRVR_INST, &option_flags, 487ff178cdSJimmy Vetayases 'i', MDB_OPT_SETBITS, INTR_DISPLAY_INTRSTAT, &option_flags, 497ff178cdSJimmy Vetayases NULL) != argc) 507ff178cdSJimmy Vetayases return (DCMD_USAGE); 517ff178cdSJimmy Vetayases 527ff178cdSJimmy Vetayases if (mdb_readvar(&irq_tbl, "apic_irq_table") == -1) { 537ff178cdSJimmy Vetayases mdb_warn("failed to read apic_irq_table"); 547ff178cdSJimmy Vetayases return (DCMD_ERR); 557ff178cdSJimmy Vetayases } 567ff178cdSJimmy Vetayases 577ff178cdSJimmy Vetayases if (mdb_readvar(&level_tbl, "apic_level_intr") == -1) { 587ff178cdSJimmy Vetayases mdb_warn("failed to read apic_level_intr"); 597ff178cdSJimmy Vetayases return (DCMD_ERR); 607ff178cdSJimmy Vetayases } 617ff178cdSJimmy Vetayases 627ff178cdSJimmy Vetayases if (mdb_readvar(&avec_tbl, "autovect") == -1) { 637ff178cdSJimmy Vetayases mdb_warn("failed to read autovect"); 647ff178cdSJimmy Vetayases return (DCMD_ERR); 657ff178cdSJimmy Vetayases } 667ff178cdSJimmy Vetayases 677ff178cdSJimmy Vetayases /* Print the header first */ 687ff178cdSJimmy Vetayases if (option_flags & INTR_DISPLAY_INTRSTAT) 697ff178cdSJimmy Vetayases mdb_printf("%<u>CPU "); 707ff178cdSJimmy Vetayases else 717ff178cdSJimmy Vetayases mdb_printf( 727ff178cdSJimmy Vetayases "%<u>IRQ Vect IPL Bus Trg Type CPU Share APIC/INT# "); 737ff178cdSJimmy Vetayases mdb_printf("%s %</u>\n", option_flags & INTR_DISPLAY_DRVR_INST ? 747ff178cdSJimmy Vetayases "Driver Name(s)" : "ISR(s)"); 757ff178cdSJimmy Vetayases 767ff178cdSJimmy Vetayases /* Walk all the entries */ 777ff178cdSJimmy Vetayases for (i = 0; i < APIC_MAX_VECTOR + 1; i++) { 787ff178cdSJimmy Vetayases /* Read the entry */ 797ff178cdSJimmy Vetayases if (mdb_vread(&airq, sizeof (apic_irq_t), 807ff178cdSJimmy Vetayases (uintptr_t)irq_tbl[i]) == -1) 817ff178cdSJimmy Vetayases continue; 827ff178cdSJimmy Vetayases 837ff178cdSJimmy Vetayases apic_interrupt_dump(&airq, &avec_tbl[i], i, NULL, level_tbl[i]); 847ff178cdSJimmy Vetayases } 857ff178cdSJimmy Vetayases 867ff178cdSJimmy Vetayases return (DCMD_OK); 877ff178cdSJimmy Vetayases } 887ff178cdSJimmy Vetayases 897ff178cdSJimmy Vetayases 907ff178cdSJimmy Vetayases /* 917ff178cdSJimmy Vetayases * MDB module linkage information: 927ff178cdSJimmy Vetayases * 937ff178cdSJimmy Vetayases * We declare a list of structures describing our dcmds, and a function 947ff178cdSJimmy Vetayases * named _mdb_init to return a pointer to our module information. 957ff178cdSJimmy Vetayases */ 967ff178cdSJimmy Vetayases static const mdb_dcmd_t dcmds[] = { 977ff178cdSJimmy Vetayases { "interrupts", "?[-di]", "print interrupts", interrupt_dump_apic, 987ff178cdSJimmy Vetayases interrupt_help}, 997ff178cdSJimmy Vetayases { "softint", "?[-d]", "print soft interrupts", soft_interrupt_dump, 1007ff178cdSJimmy Vetayases soft_interrupt_help}, 1015cd376e8SJimmy Vetayases #ifdef _KMDB 1027ff178cdSJimmy Vetayases { "apic", NULL, "print apic register contents", apic }, 1037ff178cdSJimmy Vetayases { "ioapic", NULL, "print ioapic register contents", ioapic }, 1045cd376e8SJimmy Vetayases #endif /* _KMDB */ 1057ff178cdSJimmy Vetayases { NULL } 1067ff178cdSJimmy Vetayases }; 1077ff178cdSJimmy Vetayases 1087ff178cdSJimmy Vetayases static const mdb_modinfo_t modinfo = { MDB_API_VERSION, dcmds, NULL }; 1097ff178cdSJimmy Vetayases 1107ff178cdSJimmy Vetayases const mdb_modinfo_t * 1117ff178cdSJimmy Vetayases _mdb_init(void) 1127ff178cdSJimmy Vetayases { 1137ff178cdSJimmy Vetayases GElf_Sym sym; 1147ff178cdSJimmy Vetayases 1157ff178cdSJimmy Vetayases if (mdb_lookup_by_name("gld_intr", &sym) != -1) 1167ff178cdSJimmy Vetayases if (GELF_ST_TYPE(sym.st_info) == STT_FUNC) 1177ff178cdSJimmy Vetayases gld_intr_addr = (uintptr_t)sym.st_value; 1187ff178cdSJimmy Vetayases 1197ff178cdSJimmy Vetayases return (&modinfo); 1207ff178cdSJimmy Vetayases } 121