xref: /illumos-gate/usr/src/cmd/mdb/i86pc/modules/common/apic_common.c (revision 6a634c9dca3093f3922e4b7ab826d7bdf17bf78e)
1*7ff178cdSJimmy Vetayases /*
2*7ff178cdSJimmy Vetayases  * CDDL HEADER START
3*7ff178cdSJimmy Vetayases  *
4*7ff178cdSJimmy Vetayases  * The contents of this file are subject to the terms of the
5*7ff178cdSJimmy Vetayases  * Common Development and Distribution License (the "License").
6*7ff178cdSJimmy Vetayases  * You may not use this file except in compliance with the License.
7*7ff178cdSJimmy Vetayases  *
8*7ff178cdSJimmy Vetayases  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*7ff178cdSJimmy Vetayases  * or http://www.opensolaris.org/os/licensing.
10*7ff178cdSJimmy Vetayases  * See the License for the specific language governing permissions
11*7ff178cdSJimmy Vetayases  * and limitations under the License.
12*7ff178cdSJimmy Vetayases  *
13*7ff178cdSJimmy Vetayases  * When distributing Covered Code, include this CDDL HEADER in each
14*7ff178cdSJimmy Vetayases  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*7ff178cdSJimmy Vetayases  * If applicable, add the following below this CDDL HEADER, with the
16*7ff178cdSJimmy Vetayases  * fields enclosed by brackets "[]" replaced with your own identifying
17*7ff178cdSJimmy Vetayases  * information: Portions Copyright [yyyy] [name of copyright owner]
18*7ff178cdSJimmy Vetayases  *
19*7ff178cdSJimmy Vetayases  * CDDL HEADER END
20*7ff178cdSJimmy Vetayases  */
21*7ff178cdSJimmy Vetayases /*
22*7ff178cdSJimmy Vetayases  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
23*7ff178cdSJimmy Vetayases  */
24*7ff178cdSJimmy Vetayases 
25*7ff178cdSJimmy Vetayases #include "intr_common.h"
26*7ff178cdSJimmy Vetayases 
275cd376e8SJimmy Vetayases #ifdef _KMDB
28*7ff178cdSJimmy Vetayases 
29*7ff178cdSJimmy Vetayases /* Macros for reading/writing the IOAPIC RDT entries */
30*7ff178cdSJimmy Vetayases #define	APIC_READ_IOAPIC_RDT_ENTRY_LOW_DWORD(ioapic_ix, ipin) \
31*7ff178cdSJimmy Vetayases 	apic_ioapic_read(ioapic_ix, APIC_RDT_CMD + (2 * (ipin)))
32*7ff178cdSJimmy Vetayases 
33*7ff178cdSJimmy Vetayases #define	APIC_READ_IOAPIC_RDT_ENTRY_HIGH_DWORD(ioapic_ix, ipin) \
34*7ff178cdSJimmy Vetayases 	apic_ioapic_read(ioapic_ix, APIC_RDT_CMD2 + (2 * (ipin)))
35*7ff178cdSJimmy Vetayases 
36*7ff178cdSJimmy Vetayases static uint32_t *ioapic_adr[MAX_IO_APIC];
37*7ff178cdSJimmy Vetayases 
38*7ff178cdSJimmy Vetayases static uint32_t
apic_ioapic_read(int ioapic_ix,uint32_t reg)39*7ff178cdSJimmy Vetayases apic_ioapic_read(int ioapic_ix, uint32_t reg)
40*7ff178cdSJimmy Vetayases {
41*7ff178cdSJimmy Vetayases 	volatile uint32_t *ioapic;
42*7ff178cdSJimmy Vetayases 
43*7ff178cdSJimmy Vetayases 	ioapic = ioapic_adr[ioapic_ix];
44*7ff178cdSJimmy Vetayases 	ioapic[APIC_IO_REG] = reg;
45*7ff178cdSJimmy Vetayases 	return (ioapic[APIC_IO_DATA]);
46*7ff178cdSJimmy Vetayases }
47*7ff178cdSJimmy Vetayases 
48*7ff178cdSJimmy Vetayases /*
49*7ff178cdSJimmy Vetayases  * ioapic dcmd - Print out the ioapic registers, nicely formatted.
50*7ff178cdSJimmy Vetayases  */
51*7ff178cdSJimmy Vetayases /*ARGSUSED*/
52*7ff178cdSJimmy Vetayases int
ioapic(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)53*7ff178cdSJimmy Vetayases ioapic(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
54*7ff178cdSJimmy Vetayases {
55*7ff178cdSJimmy Vetayases 	uint32_t apic_io_max;
56*7ff178cdSJimmy Vetayases 	int	reg;
57*7ff178cdSJimmy Vetayases 	int	reg_max;
58*7ff178cdSJimmy Vetayases 	int	i;
59*7ff178cdSJimmy Vetayases 
60*7ff178cdSJimmy Vetayases 
61*7ff178cdSJimmy Vetayases 	if ((flags & DCMD_ADDRSPEC) || argc != 0)
62*7ff178cdSJimmy Vetayases 		return (DCMD_USAGE);
63*7ff178cdSJimmy Vetayases 
64*7ff178cdSJimmy Vetayases 	if (mdb_readvar(&ioapic_adr, "apicioadr") == -1) {
65*7ff178cdSJimmy Vetayases 		/*
66*7ff178cdSJimmy Vetayases 		 * If the mdb_warn string does not end in a \n, mdb will
67*7ff178cdSJimmy Vetayases 		 * automatically append the reason for the failure.
68*7ff178cdSJimmy Vetayases 		 */
69*7ff178cdSJimmy Vetayases 		mdb_warn("failed to read ioapicadr");
70*7ff178cdSJimmy Vetayases 		return (DCMD_ERR);
71*7ff178cdSJimmy Vetayases 	}
72*7ff178cdSJimmy Vetayases 
73*7ff178cdSJimmy Vetayases 	if (mdb_readvar(&apic_io_max, "apic_io_max") == -1) {
74*7ff178cdSJimmy Vetayases 		/*
75*7ff178cdSJimmy Vetayases 		 * If the mdb_warn string does not end in a \n, mdb will
76*7ff178cdSJimmy Vetayases 		 * automatically append the reason for the failure.
77*7ff178cdSJimmy Vetayases 		 */
78*7ff178cdSJimmy Vetayases 		mdb_warn("failed to read apic_io_max");
79*7ff178cdSJimmy Vetayases 		return (DCMD_ERR);
80*7ff178cdSJimmy Vetayases 	}
81*7ff178cdSJimmy Vetayases 
82*7ff178cdSJimmy Vetayases 	mdb_printf("ioapicadr\t%p\n", ioapic_adr);
83*7ff178cdSJimmy Vetayases 
84*7ff178cdSJimmy Vetayases 	for (i = 0; i < apic_io_max; i++) {
85*7ff178cdSJimmy Vetayases 		/* Bits 23-16 define the maximum redirection entries */
86*7ff178cdSJimmy Vetayases 		reg_max = apic_ioapic_read(i, APIC_VERS_CMD);
87*7ff178cdSJimmy Vetayases 		reg_max = (reg_max >> 16) & 0xff;
88*7ff178cdSJimmy Vetayases 
89*7ff178cdSJimmy Vetayases 		mdb_printf("%4s %8s %8s\n", "reg", "high", " low");
90*7ff178cdSJimmy Vetayases 		for (reg = 0; reg <= reg_max; reg++) {
91*7ff178cdSJimmy Vetayases 			uint32_t high, low;
92*7ff178cdSJimmy Vetayases 
93*7ff178cdSJimmy Vetayases 			high = APIC_READ_IOAPIC_RDT_ENTRY_HIGH_DWORD(i, reg);
94*7ff178cdSJimmy Vetayases 			low = APIC_READ_IOAPIC_RDT_ENTRY_LOW_DWORD(i, reg);
95*7ff178cdSJimmy Vetayases 
96*7ff178cdSJimmy Vetayases 			mdb_printf("%2d   %8x %8x\n", reg, high, low);
97*7ff178cdSJimmy Vetayases 		}
98*7ff178cdSJimmy Vetayases 
99*7ff178cdSJimmy Vetayases 		mdb_printf("\n");
100*7ff178cdSJimmy Vetayases 
101*7ff178cdSJimmy Vetayases 	}
102*7ff178cdSJimmy Vetayases 
103*7ff178cdSJimmy Vetayases 	return (DCMD_OK);
104*7ff178cdSJimmy Vetayases }
105*7ff178cdSJimmy Vetayases 
106*7ff178cdSJimmy Vetayases 
107*7ff178cdSJimmy Vetayases /*
108*7ff178cdSJimmy Vetayases  * apic dcmd - Print out the apic registers, nicely formatted.
109*7ff178cdSJimmy Vetayases  */
110*7ff178cdSJimmy Vetayases /*ARGSUSED*/
111*7ff178cdSJimmy Vetayases int
apic(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)112*7ff178cdSJimmy Vetayases apic(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
113*7ff178cdSJimmy Vetayases {
114*7ff178cdSJimmy Vetayases 	uint32_t *papic;
115*7ff178cdSJimmy Vetayases 
116*7ff178cdSJimmy Vetayases 	if ((flags & DCMD_ADDRSPEC) || argc != 0)
117*7ff178cdSJimmy Vetayases 		return (DCMD_USAGE);
118*7ff178cdSJimmy Vetayases 
119*7ff178cdSJimmy Vetayases 	if (mdb_readvar(&papic, "apicadr") == -1) {
120*7ff178cdSJimmy Vetayases 		/*
121*7ff178cdSJimmy Vetayases 		 * If the mdb_warn string does not end in a \n, mdb will
122*7ff178cdSJimmy Vetayases 		 * automatically append the reason for the failure.
123*7ff178cdSJimmy Vetayases 		 */
124*7ff178cdSJimmy Vetayases 		mdb_warn("failed to read apicadr");
125*7ff178cdSJimmy Vetayases 		return (DCMD_ERR);
126*7ff178cdSJimmy Vetayases 	}
127*7ff178cdSJimmy Vetayases 
128*7ff178cdSJimmy Vetayases 	mdb_printf("apicadr\t%p\n", papic);
129*7ff178cdSJimmy Vetayases 	mdb_printf("as_task_reg\t%x\n", papic[APIC_TASK_REG]);
130*7ff178cdSJimmy Vetayases 	mdb_printf("as_dest_reg\t%x\n", papic[APIC_DEST_REG]);
131*7ff178cdSJimmy Vetayases 	mdb_printf("as_format_reg\t%x\n", papic[APIC_FORMAT_REG]);
132*7ff178cdSJimmy Vetayases 	mdb_printf("as_local_timer\t%x\n", papic[APIC_LOCAL_TIMER]);
133*7ff178cdSJimmy Vetayases 	mdb_printf("as_pcint_vect\t%x\n", papic[APIC_PCINT_VECT]);
134*7ff178cdSJimmy Vetayases 	mdb_printf("as_int_vect0\t%x\n", papic[APIC_INT_VECT0]);
135*7ff178cdSJimmy Vetayases 	mdb_printf("as_int_vect1\t%x\n", papic[APIC_INT_VECT1]);
136*7ff178cdSJimmy Vetayases 	mdb_printf("as_err_vect\t%x\n", papic[APIC_ERR_VECT]);
137*7ff178cdSJimmy Vetayases 	mdb_printf("as_init_count\t%x\n", papic[APIC_INIT_COUNT]);
138*7ff178cdSJimmy Vetayases 	mdb_printf("as_divide_reg\t%x\n", papic[APIC_DIVIDE_REG]);
139*7ff178cdSJimmy Vetayases 	mdb_printf("as_spur_int_reg\t%x\n", papic[APIC_SPUR_INT_REG]);
140*7ff178cdSJimmy Vetayases 
141*7ff178cdSJimmy Vetayases 	return (DCMD_OK);
142*7ff178cdSJimmy Vetayases }
1435cd376e8SJimmy Vetayases 
1445cd376e8SJimmy Vetayases #endif /* _KMDB */
145