4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
30 * Case management and saved state restoration
35 #include <fm/fmd_api.h>
42 * Our maximum persistent buffer name length, used to allocate fixed-size
43 * arrays for name storage.
45 #define CMD_BUFNMLEN 48
47 /* cmd_evdisp_t, cmd_evdisp_stat_t, and cmd_evdisp_names must be in sync */
48 typedef enum cmd_evdisp
{
56 * Each handled ereport type has four statistics, designed to indicate the
57 * eventual disposition of the ereport.
59 typedef struct cmd_evdisp_stat
{
60 fmd_stat_t evs_ok
; /* # of erpts processed successfully */
61 fmd_stat_t evs_bad
; /* # of malformed ereports */
62 fmd_stat_t evs_unused
; /* # of erpts unusable or not needed */
63 fmd_stat_t evs_redund
; /* # of erpts already explained */
66 /* Must be in sync with cmd_case_restorers */
67 typedef enum cmd_nodetype
{
82 * Must be in sync with cmd_case_closers. Additional types must be
83 * appended to this enum otherwise interpretation of existing logs
84 * and checkpoints will be confused.
86 typedef enum cmd_ptrsubtype
{
87 CMD_PTR_CPU_ICACHE
= 1,
93 CMD_PTR_CPU_L2DATA_UERETRY
, /* no longer used */
96 CMD_PTR_CPU_L3DATA_UERETRY
, /* no longer used */
102 CMD_PTR_CPU_XR_RETRY
,
108 CMD_PTR_DP_PAGE_DEFER
,
109 CMD_PTR_CPU_INV_SFSR
,
110 CMD_PTR_CPU_UE_DET_CPU
,
111 CMD_PTR_CPU_UE_DET_IO
,
114 CMD_PTR_CPU_UGESR_INV_URG
,
115 CMD_PTR_CPU_UGESR_CRE
,
116 CMD_PTR_CPU_UGESR_TSB_CTX
,
117 CMD_PTR_CPU_UGESR_TSBP
,
118 CMD_PTR_CPU_UGESR_PSTATE
,
119 CMD_PTR_CPU_UGESR_TSTATE
,
120 CMD_PTR_CPU_UGESR_IUG_F
,
121 CMD_PTR_CPU_UGESR_IUG_R
,
122 CMD_PTR_CPU_UGESR_SDC
,
123 CMD_PTR_CPU_UGESR_WDT
,
124 CMD_PTR_CPU_UGESR_DTLB
,
125 CMD_PTR_CPU_UGESR_ITLB
,
126 CMD_PTR_CPU_UGESR_CORE_ERR
,
127 CMD_PTR_CPU_UGESR_DAE
,
128 CMD_PTR_CPU_UGESR_IAE
,
129 CMD_PTR_CPU_UGESR_UGE
,
130 CMD_PTR_CPU_MISC_REGS
,
137 * A change was made to the above enum that violated the ordering requirement
138 * described in the comment. As such, there exist development machines in
139 * the wild that have pre-violation pointer buffers. Attempts to run the DE
140 * on those machines will cause the state-restoration code to fail, as it
141 * won't know what to do with the old pointer types. Unfortunately, the old
142 * and new values overlapped for the CPU pointers, so there's not much we
143 * can do there. The memory pointers, on the other hand, changed from 6-8 to
144 * 12-14, thus allowing us to make the dimm, bank, and page restoration code
145 * check for both values.
147 * This should go away soon into the next release.
149 typedef enum cmd_BUG_ptrsubtype
{
150 BUG_PTR_DIMM_CASE
= 6,
151 BUG_PTR_BANK_CASE
= 7,
152 BUG_PTR_PAGE_CASE
= 8
153 } cmd_BUG_ptrsubtype_t
;
155 #define CMD_TIMERTYPE_CPU_UEC_FLUSH 1
156 #define CMD_TIMERTYPE_CPU_XR_WAITER 2
157 #define CMD_TIMERTYPE_MEM 3
158 #define CMD_TIMERTYPE_DP 4
159 #define CMD_TIMERTYPE_ANONYMOUS_TAG_ERROR 5
161 #define CMD_TIMERTYPE_ISCPU(timer) ((timer) != CMD_TIMERTYPE_MEM && \
162 (timer) != CMD_TIMERTYPE_DP)
165 * There are three types of general-purpose buffers, used to track CPUs, DIMMs,
166 * and pages. Created on-demand as ereports arrive, one buffer is created for
167 * each thing tracked. The general-purpose buffers are used to track common
168 * state, and are used to support case-specific buffers. Each open case has
169 * a case-specific pointer buffer, used to aid in the rediscovery of the
170 * associated general-purpose buffer. When restoration begins, we iterate
171 * through each of the open cases, restoring the case-specific pointer buffers
172 * for each. The pointer buffers are then used to restore the general-purpose
176 typedef struct cmd_case_ptr
{
177 cmd_nodetype_t ptr_type
; /* The type of associated G.P. buffer */
178 cmd_ptrsubtype_t ptr_subtype
; /* The case within the G.P. buffer */
179 char ptr_name
[CMD_BUFNMLEN
]; /* G.P. buffer name */
183 * All general-purpose buffers begin with a common header. This header contains
184 * identification information used in the construction of new cases.
186 * Note that versioned structs (currently cmd_cpu_t) depend upon the size of
187 * this struct remaining fixed.
189 typedef struct cmd_header
{
190 cmd_list_t hdr_list
; /* List of G.P. structs of this type */
191 cmd_nodetype_t hdr_nodetype
; /* Type of this G.P. struct */
192 char hdr_bufname
[CMD_BUFNMLEN
]; /* G.P. buffer name */
196 * Per-case-subtype case closing routines. Stored in per-case state when the
197 * case is generated, and regenerated from saved state upon restore.
199 typedef void cmd_case_closer_f(fmd_hdl_t
*, void *);
200 typedef void *cmd_case_restorer_f(fmd_hdl_t
*, fmd_case_t
*, cmd_case_ptr_t
*);
202 typedef struct cmd_case_closer
{
203 cmd_case_closer_f
*cl_func
;
207 typedef struct cmd_case
{
213 * Utility functions which ease the management of cases.
215 extern fmd_case_t
*cmd_case_create(fmd_hdl_t
*, cmd_header_t
*,
216 cmd_ptrsubtype_t
, const char **);
217 extern void cmd_case_redirect(fmd_hdl_t
*, fmd_case_t
*, cmd_ptrsubtype_t
);
218 extern void cmd_case_fini(fmd_hdl_t
*, fmd_case_t
*, int);
219 extern void cmd_case_restore(fmd_hdl_t
*, cmd_case_t
*, fmd_case_t
*, char *);
221 extern int cmd_state_restore(fmd_hdl_t
*);
227 #endif /* _CMD_STATE_H */