120c794b3Sgavinm/*
220c794b3Sgavinm * CDDL HEADER START
320c794b3Sgavinm *
420c794b3Sgavinm * The contents of this file are subject to the terms of the
520c794b3Sgavinm * Common Development and Distribution License (the "License").
620c794b3Sgavinm * You may not use this file except in compliance with the License.
720c794b3Sgavinm *
820c794b3Sgavinm * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
920c794b3Sgavinm * or http://www.opensolaris.org/os/licensing.
1020c794b3Sgavinm * See the License for the specific language governing permissions
1120c794b3Sgavinm * and limitations under the License.
1220c794b3Sgavinm *
1320c794b3Sgavinm * When distributing Covered Code, include this CDDL HEADER in each
1420c794b3Sgavinm * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1520c794b3Sgavinm * If applicable, add the following below this CDDL HEADER, with the
1620c794b3Sgavinm * fields enclosed by brackets "[]" replaced with your own identifying
1720c794b3Sgavinm * information: Portions Copyright [yyyy] [name of copyright owner]
1820c794b3Sgavinm *
1920c794b3Sgavinm * CDDL HEADER END
2020c794b3Sgavinm */
2120c794b3Sgavinm
2220c794b3Sgavinm/*
23b7d3956bSstephh * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
2420c794b3Sgavinm * Use is subject to license terms.
2520c794b3Sgavinm */
2620c794b3Sgavinm
2720c794b3Sgavinm/*
2820c794b3Sgavinm * eversholt rules for generic x86 MCA
2920c794b3Sgavinm *
3020c794b3Sgavinm * Most propogations are generated by preprocessor macros.  The event
3120c794b3Sgavinm * declarations are deliberately not part of the propogation macros
3220c794b3Sgavinm * so that we know we have full coverage - propogations defined without
3320c794b3Sgavinm * events, or events not used in propogations, will produce compiler
3420c794b3Sgavinm * whinges.
3520c794b3Sgavinm */
3620c794b3Sgavinm
3720c794b3Sgavinm#pragma dictionary "GMCA"
3820c794b3Sgavinm
3920c794b3Sgavinm/*
4020c794b3Sgavinm * Ereports for Simple error codes.
4120c794b3Sgavinm */
4220c794b3Sgavinm
4320c794b3Sgavinm#define SMPL_EVENT(leafclass) \
44e3d60c9bSAdrian Frost	event ereport.cpu.generic-x86.leafclass@chip/core/strand { within(1s) }
4520c794b3Sgavinm
4620c794b3SgavinmSMPL_EVENT(unknown);
4720c794b3SgavinmSMPL_EVENT(unclassified);
4820c794b3SgavinmSMPL_EVENT(microcode_rom_parity);
4920c794b3SgavinmSMPL_EVENT(external);
5020c794b3SgavinmSMPL_EVENT(frc);
5120c794b3SgavinmSMPL_EVENT(internal_timer);
52e3d60c9bSAdrian FrostSMPL_EVENT(internal_parity);
5320c794b3SgavinmSMPL_EVENT(internal_unclassified);
5420c794b3Sgavinm
5520c794b3Sgavinm/*
5620c794b3Sgavinm * Propogations for all but "external" and "unknown" simple errors.
57b7d3956bSstephh * If the error is uncorrected we produce a fault immediately by incrementing
58b7d3956bSstephh * by N+1, otherwise we declare a fault when the SERD engine trips.
5920c794b3Sgavinm */
6020c794b3Sgavinm
61b7d3956bSstephh#define	SMPL_N	3
6220c794b3Sgavinm
63e3d60c9bSAdrian Frostengine serd.cpu.generic-x86.simple@chip/core/strand, N=SMPL_N, T=72h;
64e3d60c9bSAdrian Frostevent fault.cpu.generic-x86.internal@chip/core/strand,
65e3d60c9bSAdrian Frost    engine=serd.cpu.generic-x86.simple@chip/core/strand;
6620c794b3Sgavinm
67e3d60c9bSAdrian Frostprop fault.cpu.generic-x86.internal@chip/core/strand
68e3d60c9bSAdrian Frost    { payloadprop("error_uncorrected") == 1 ?
69e3d60c9bSAdrian Frost	setserdincrement(SMPL_N + 1) : 1 } (1)->
70e3d60c9bSAdrian Frost    ereport.cpu.generic-x86.microcode_rom_parity@chip/core/strand,
71e3d60c9bSAdrian Frost    ereport.cpu.generic-x86.internal_timer@chip/core/strand,
72e3d60c9bSAdrian Frost    ereport.cpu.generic-x86.internal_parity@chip/core/strand,
73e3d60c9bSAdrian Frost    ereport.cpu.generic-x86.unclassified@chip/core/strand,
74e3d60c9bSAdrian Frost    ereport.cpu.generic-x86.internal_unclassified@chip/core/strand,
75e3d60c9bSAdrian Frost    ereport.cpu.generic-x86.frc@chip/core/strand;
7620c794b3Sgavinm
7720c794b3Sgavinm/*
7820c794b3Sgavinm * Ereports for Compound error codes.  These are in pairs "foo" and "foo_uc"
7920c794b3Sgavinm * for the corrected and uncorrected version of each error type.  All are
80*e4b86885SCheng Sean Ye * detected at chip/core[/strand].
8120c794b3Sgavinm */
8220c794b3Sgavinm
8320c794b3Sgavinm#define	CMPND_EVENT(leafclass) \
84e3d60c9bSAdrian Frost	event ereport.cpu.generic-x86.leafclass@chip/core/strand \
85e3d60c9bSAdrian Frost	{ within(1s) }; \
86e3d60c9bSAdrian Frost	event ereport.cpu.generic-x86.leafclass/**/_uc@chip/core/strand \
87e3d60c9bSAdrian Frost	{ within(1s) }
8820c794b3Sgavinm
8920c794b3Sgavinm/*
9020c794b3Sgavinm * Ereports for Compound error codes - generic memory hierarchy errors
9120c794b3Sgavinm */
9220c794b3SgavinmCMPND_EVENT(l0cache);
9320c794b3SgavinmCMPND_EVENT(l1cache);
9420c794b3SgavinmCMPND_EVENT(l2cache);
9520c794b3SgavinmCMPND_EVENT(cache);
9620c794b3Sgavinm
9720c794b3Sgavinm/*
9820c794b3Sgavinm * Ereports for Compound error codes - TLB errors
9920c794b3Sgavinm */
10020c794b3SgavinmCMPND_EVENT(l0dtlb);
10120c794b3SgavinmCMPND_EVENT(l1dtlb);
10220c794b3SgavinmCMPND_EVENT(l2dtlb);
10320c794b3SgavinmCMPND_EVENT(dtlb);
10420c794b3Sgavinm
10520c794b3SgavinmCMPND_EVENT(l0itlb);
10620c794b3SgavinmCMPND_EVENT(l1itlb);
10720c794b3SgavinmCMPND_EVENT(l2itlb);
10820c794b3SgavinmCMPND_EVENT(itlb);
10920c794b3Sgavinm
11020c794b3SgavinmCMPND_EVENT(l0tlb);
11120c794b3SgavinmCMPND_EVENT(l1tlb);
11220c794b3SgavinmCMPND_EVENT(l2tlb);
11320c794b3SgavinmCMPND_EVENT(tlb);
11420c794b3Sgavinm
11520c794b3Sgavinm/*
11620c794b3Sgavinm * Ereports for Compound error codes - memory hierarchy errors
11720c794b3Sgavinm */
11820c794b3SgavinmCMPND_EVENT(l0dcache);
11920c794b3SgavinmCMPND_EVENT(l1dcache);
12020c794b3SgavinmCMPND_EVENT(l2dcache);
12120c794b3SgavinmCMPND_EVENT(dcache);
12220c794b3Sgavinm
12320c794b3SgavinmCMPND_EVENT(l0icache);
12420c794b3SgavinmCMPND_EVENT(l1icache);
12520c794b3SgavinmCMPND_EVENT(l2icache);
12620c794b3SgavinmCMPND_EVENT(icache);
12720c794b3Sgavinm
12820c794b3Sgavinm/*
12920c794b3Sgavinm * Ereports for Compound error codes - bus and interconnect errors
13020c794b3Sgavinm */
13120c794b3SgavinmCMPND_EVENT(bus_interconnect);
13220c794b3SgavinmCMPND_EVENT(bus_interconnect_memory);
13320c794b3SgavinmCMPND_EVENT(bus_interconnect_io);
134e3d60c9bSAdrian FrostCMPND_EVENT(mc);
13520c794b3Sgavinm
13620c794b3Sgavinm/*
137b7d3956bSstephh * Compound error propogations
13820c794b3Sgavinm *
13920c794b3Sgavinm * We resist the temptation propogate, for example, a single dcache fault
14020c794b3Sgavinm * to all ereports mentioning dcache (l0dcache, l1dcache, l2dcache, dcache).
14120c794b3Sgavinm * Instead we will diagnose a distinct fault for each possible cache level,
14220c794b3Sgavinm * whether or not current chips have dcaches at all levels.
14320c794b3Sgavinm *
14420c794b3Sgavinm * Corrected errors are SERDed and produce a fault when the engine fires;
14520c794b3Sgavinm * the same fault is diagnosed immediately for a corresponding uncorrected
146b7d3956bSstephh * error by incrementing the serd engine by n + 1.
14720c794b3Sgavinm */
14820c794b3Sgavinm
14920c794b3Sgavinm#define	CMPND_FLT_PROP_1(erptleaf, fltleaf, n, t) \
150e3d60c9bSAdrian Frost	engine serd.cpu.generic-x86.fltleaf@chip/core/strand, N=n, T=t;	\
151e3d60c9bSAdrian Frost	event fault.cpu.generic-x86.fltleaf@chip/core/strand,		\
152e3d60c9bSAdrian Frost	    engine=serd.cpu.generic-x86.fltleaf@chip/core/strand;	\
15320c794b3Sgavinm									\
154e3d60c9bSAdrian Frost        prop fault.cpu.generic-x86.fltleaf@chip/core/strand (0)->	\
155e3d60c9bSAdrian Frost            ereport.cpu.generic-x86.erptleaf@chip/core/strand;		\
156e3d60c9bSAdrian Frost	prop fault.cpu.generic-x86.fltleaf@chip/core/strand		\
157e3d60c9bSAdrian Frost	    { setserdincrement(n + 1) } (0)->				\
158e3d60c9bSAdrian Frost	    ereport.cpu.generic-x86.erptleaf/**/_uc@chip/core/strand
15920c794b3Sgavinm
160b7d3956bSstephh#define	CMPND_FLT_PROP_2(erptleaf, fltleaf, n, t) \
161e3d60c9bSAdrian Frost	engine serd.cpu.generic-x86.fltleaf@chip/core/strand, N=n, T=t;	\
162e3d60c9bSAdrian Frost	event fault.cpu.generic-x86.fltleaf@chip/core/strand, retire=0,	\
163e3d60c9bSAdrian Frost	    response=0, engine=serd.cpu.generic-x86.fltleaf@chip/core/strand;\
164b7d3956bSstephh									\
165e3d60c9bSAdrian Frost        prop fault.cpu.generic-x86.fltleaf@chip/core/strand (0)->	\
166e3d60c9bSAdrian Frost            ereport.cpu.generic-x86.erptleaf@chip/core/strand;		\
167e3d60c9bSAdrian Frost	prop fault.cpu.generic-x86.fltleaf@chip/core/strand		\
168e3d60c9bSAdrian Frost	    { setserdincrement(n + 1) } (0)->				\
169e3d60c9bSAdrian Frost	    ereport.cpu.generic-x86.erptleaf/**/_uc@chip/core/strand
17020c794b3Sgavinm
17120c794b3SgavinmCMPND_FLT_PROP_1(l0cache, l0cache, 3, 72h);
17220c794b3SgavinmCMPND_FLT_PROP_1(l1cache, l1cache, 3, 72h);
17320c794b3SgavinmCMPND_FLT_PROP_1(l2cache, l2cache, 3, 72h);
17420c794b3SgavinmCMPND_FLT_PROP_1(cache, cache, 12, 72h);
17520c794b3Sgavinm
17620c794b3SgavinmCMPND_FLT_PROP_1(l0dtlb, l0dtlb, 3, 72h);
17720c794b3SgavinmCMPND_FLT_PROP_1(l1dtlb, l1dtlb, 3, 72h);
17820c794b3SgavinmCMPND_FLT_PROP_1(l2dtlb, l2dtlb, 3, 72h);
17920c794b3SgavinmCMPND_FLT_PROP_1(dtlb, dtlb, 12, 72h);
18020c794b3Sgavinm
18120c794b3SgavinmCMPND_FLT_PROP_1(l0itlb, l0itlb, 3, 72h);
18220c794b3SgavinmCMPND_FLT_PROP_1(l1itlb, l1itlb, 3, 72h);
18320c794b3SgavinmCMPND_FLT_PROP_1(l2itlb, l2itlb, 3, 72h);
18420c794b3SgavinmCMPND_FLT_PROP_1(itlb, itlb, 12, 72h);
18520c794b3Sgavinm
18620c794b3SgavinmCMPND_FLT_PROP_1(l0tlb, l0tlb, 3, 72h);
18720c794b3SgavinmCMPND_FLT_PROP_1(l1tlb, l1tlb, 3, 72h);
18820c794b3SgavinmCMPND_FLT_PROP_1(l2tlb, l2tlb, 3, 72h);
18920c794b3SgavinmCMPND_FLT_PROP_1(tlb, tlb, 12, 72h);
19020c794b3Sgavinm
19120c794b3SgavinmCMPND_FLT_PROP_1(l0dcache, l0dcache, 3, 72h);
19220c794b3SgavinmCMPND_FLT_PROP_1(l1dcache, l1dcache, 3, 72h);
19320c794b3SgavinmCMPND_FLT_PROP_1(l2dcache, l2dcache, 3, 72h);
19420c794b3SgavinmCMPND_FLT_PROP_1(dcache, dcache, 12, 72h);
19520c794b3Sgavinm
19620c794b3SgavinmCMPND_FLT_PROP_1(l0icache, l0icache, 3, 72h);
19720c794b3SgavinmCMPND_FLT_PROP_1(l1icache, l1icache, 3, 72h);
19820c794b3SgavinmCMPND_FLT_PROP_1(l2icache, l2icache, 3, 72h);
19920c794b3SgavinmCMPND_FLT_PROP_1(icache, icache, 12, 72h);
20020c794b3Sgavinm
20120c794b3SgavinmCMPND_FLT_PROP_2(bus_interconnect, bus_interconnect, 10, 72h);
20220c794b3SgavinmCMPND_FLT_PROP_2(bus_interconnect_memory, bus_interconnect_memory, 10, 72h);
20320c794b3SgavinmCMPND_FLT_PROP_2(bus_interconnect_io, bus_interconnect_io, 10, 72h);
20420c794b3Sgavinm
205e3d60c9bSAdrian FrostCMPND_FLT_PROP_2(mc, mc, 10, 72h);
206e3d60c9bSAdrian Frost
20720c794b3Sgavinm/*
20820c794b3Sgavinm * Discards - not enough info to diagnose.
20920c794b3Sgavinm */
210e3d60c9bSAdrian Frostevent upset.discard@chip/core/strand;
211e3d60c9bSAdrian Frost
212e3d60c9bSAdrian Frostprop upset.discard@chip/core/strand (0)->
213e3d60c9bSAdrian Frost    ereport.cpu.generic-x86.external@chip/core/strand,
214e3d60c9bSAdrian Frost    ereport.cpu.generic-x86.unknown@chip/core/strand;
215