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.
26 #ifndef _CMD_LxCACHE_H
27 #define _CMD_LxCACHE_H
30 * Routines for the creation of Lxcache retirement faults and for the
31 * management of Lxcache-related state.
34 #include <cmd_state.h>
38 #include <fm/fmd_api.h>
39 #include <sys/types.h>
46 #define CMD_ANON_WAY -1
48 #define HUNDRED_PERCENT 100
49 #define SUSPECT_PERCENT 50
51 #define CMD_LxCACHE_F_ACTIVE 0x0
52 #define CMD_LxCACHE_F_FAULTING 0x1
53 #define CMD_LxCACHE_F_RETIRED 0x2
54 #define CMD_LxCACHE_F_UNRETIRED 0x4
55 #define CMD_LxCACHE_F_RERETIRED 0x8
57 #define LxCACHE_MKVERSION(version) ((version) << 4 | 1)
59 #define CMD_LxCACHE_VERSION_1 LxCACHE_MKVERSION(1) /* 17 */
60 #define CMD_LxCACHE_VERSION CMD_LxCACHE_VERSION_1
62 #define CMD_LxCACHE_VERSIONED(Lxcache) ((Lxcache)->Lxcache_version & 1)
64 #define MAX_FMRI_LEN 128
66 #define IS_TAG(type) ((type == CMD_PTR_CPU_L2TAG) ||\
67 (type == CMD_PTR_CPU_L3TAG))
69 typedef struct cmd_Lxcache_pers
{
70 cmd_header_t Lxcachep_header
; /* Nodetype must be CMD_NT_LxCACHE */
72 * We need the cpu_hdr_bufname in order to restore the Lxcache.
74 char Lxcachep_cpu_hdr_bufname
[CMD_BUFNMLEN
];
75 uint_t Lxcachep_version
;
76 cmd_fmri_t Lxcachep_asru
; /* ASRU for this LxCACHE */
77 char Lxcachep_retired_fmri
[MAX_FMRI_LEN
];
78 cmd_ptrsubtype_t Lxcachep_type
; /* L2 or L3 */
79 uint32_t Lxcachep_index
; /* cache index Lxcache represents */
80 uint32_t Lxcachep_way
; /* cache way this Lxcache represents */
81 uint16_t Lxcachep_bit
; /* bit in Lxcache that has fault */
82 uint_t Lxcachep_flags
; /* CMD_MEM_F_* */
83 uint_t Lxreason
; /* Suspicion or convicted */
86 #define CMD_LXFUNCTIONING 0 /* Initial value */
87 #define CMD_LXSUSPICIOUS 0x1
88 #define CMD_LXSUSPECT_DATA 0x1
89 #define CMD_LXCONVICTED 0x2
90 #define CMD_LXSUSPECT_0_TAG 0x4
91 #define CMD_LXSUSPECT_1_TAG 0x8
92 #define CMD_LXSUSPICIOUS_BY_ASSOCIATION 0x10
93 #define CMD_LXCONVICTED_BY_ASSOCIATION 0x20
95 typedef struct cmd_Lxcache
{
96 cmd_Lxcache_pers_t Lxcache_pers
;
97 int Lxcache_retry_count
; /* retry count for recheck taga */
98 id_t Lxcache_timeout_id
;
99 cmd_errcl_t Lxcache_clcode
;
101 fmd_event_t
*Lxcache_ep
;
102 nvlist_t
*Lxcache_nvl
;
103 char *Lxcache_serdnm
; /* SERD to hold the ep during */
104 /* recheck of tags */
105 cmd_case_t Lxcache_case
; /* Open CE case against this Lxcache */
106 cmd_xr_t
*xr
; /* The associated XR struct */
109 #define Lxcache_header Lxcache_pers.Lxcachep_header
110 #define Lxcache_nodetype Lxcache_pers.Lxcachep_header.hdr_nodetype
111 #define Lxcache_bufname Lxcache_pers.Lxcachep_header.hdr_bufname
112 #define Lxcache_cpu_bufname Lxcache_pers.Lxcachep_cpu_hdr_bufname
113 #define Lxcache_version Lxcache_pers.Lxcachep_version
114 #define Lxcache_asru Lxcache_pers.Lxcachep_asru
115 #define Lxcache_asru_nvl Lxcache_pers.Lxcachep_asru.fmri_nvl
116 #define Lxcache_flags Lxcache_pers.Lxcachep_flags
117 #define Lxcache_type Lxcache_pers.Lxcachep_type
118 #define Lxcache_index Lxcache_pers.Lxcachep_index
119 #define Lxcache_way Lxcache_pers.Lxcachep_way
120 #define Lxcache_bit Lxcache_pers.Lxcachep_bit
121 #define Lxcache_retired_fmri Lxcache_pers.Lxcachep_retired_fmri
122 #define Lxcache_reason Lxcache_pers.Lxreason
123 #define Lxcache_list Lxcache_header.hdr_list
128 * When a Lxcache is to be retired, these routines are called to generate and
129 * manage a fault.memory.Lxcache against the Lxcache.
132 extern int cmd_cache_ce_panther(fmd_hdl_t
*, fmd_event_t
*, cmd_xr_t
*);
133 extern int cmd_xr_pn_cache_fill(fmd_hdl_t
*, nvlist_t
*, cmd_xr_t
*,
134 cmd_cpu_t
*, cmd_errcl_t
);
136 extern cmd_evdisp_t
cmd_us4plus_tag_err(fmd_hdl_t
*, fmd_event_t
*, nvlist_t
*,
137 cmd_cpu_t
*, cmd_ptrsubtype_t
,
138 const char *, const char *, const char *, cmd_errcl_t
);
139 extern void cmd_Lxcache_close(fmd_hdl_t
*, void *);
140 extern void cmd_Lxcache_write(fmd_hdl_t
*, cmd_Lxcache_t
*);
142 extern cmd_Lxcache_t
*cmd_Lxcache_create(fmd_hdl_t
*, cmd_xr_t
*xr
,
143 cmd_cpu_t
*, nvlist_t
*, cmd_ptrsubtype_t
, int32_t, int8_t, int16_t);
145 extern cmd_Lxcache_t
*cmd_Lxcache_lookup_by_type_index_way_bit(cmd_cpu_t
*,
146 cmd_ptrsubtype_t
, int32_t, int8_t, int16_t);
148 extern cmd_Lxcache_t
*
149 cmd_Lxcache_lookup_by_index_way(cmd_cpu_t
*, cmd_ptrsubtype_t
,
151 extern cmd_Lxcache_t
*
152 cmd_Lxcache_lookup_by_type_index_way_reason(cmd_cpu_t
*, cmd_ptrsubtype_t
,
153 int32_t, int8_t, int32_t);
154 extern cmd_Lxcache_t
*
155 cmd_Lxcache_lookup_by_type_index_bit_reason(cmd_cpu_t
*, cmd_ptrsubtype_t
,
156 int32_t, int16_t, int32_t);
157 extern int8_t cmd_Lxcache_get_next_retirable_way(cmd_cpu_t
*, int32_t,
158 cmd_ptrsubtype_t
, int8_t);
159 extern int8_t cmd_Lxcache_get_lowest_retirable_way(cmd_cpu_t
*,
160 int32_t, cmd_ptrsubtype_t
);
161 extern void cmd_Lxcache_destroy_anonymous_serd_engines(fmd_hdl_t
*,
162 cmd_cpu_t
*, cmd_ptrsubtype_t
, int32_t, int16_t);
163 extern const char *cmd_type_to_str(cmd_ptrsubtype_t
);
164 extern const char *cmd_reason_to_str(int);
165 extern const char *cmd_flags_to_str(int);
166 extern boolean_t
cmd_Lxcache_unretire(fmd_hdl_t
*, cmd_cpu_t
*,
167 cmd_Lxcache_t
*, const char *);
168 extern boolean_t
cmd_Lxcache_retire(fmd_hdl_t
*, cmd_cpu_t
*,
169 cmd_Lxcache_t
*, const char *, uint_t
);
170 extern int cmd_Lx_repair_rsrc(fmd_hdl_t
*, nvlist_t
*);
171 extern ssize_t
cmd_fmri_nvl2str(fmd_hdl_t
*hdl
, nvlist_t
*nvl
, char *,
173 extern void cmd_Lxcache_dirty(fmd_hdl_t
*, cmd_Lxcache_t
*);
174 extern void *cmd_Lxcache_restore(fmd_hdl_t
*, fmd_case_t
*, cmd_case_ptr_t
*);
175 extern void cmd_Lxcache_validate(fmd_hdl_t
*, cmd_cpu_t
*);
176 extern void cmd_Lxcache_destroy(fmd_hdl_t
*, cmd_cpu_t
*, cmd_Lxcache_t
*);
177 extern void cmd_Lxcache_free(fmd_hdl_t
*, cmd_cpu_t
*, cmd_Lxcache_t
*, int);
178 extern void cmd_Lxcache_fini(fmd_hdl_t
*, cmd_cpu_t
*);
179 extern char *cmd_Lxcache_serdnm_create(fmd_hdl_t
*, uint32_t, cmd_ptrsubtype_t
,
180 int32_t, int8_t, int16_t);
181 extern char *cmd_Lxcache_anonymous_serdnm_create(fmd_hdl_t
*, uint32_t,
182 cmd_ptrsubtype_t
, int32_t, int8_t, int16_t);
183 extern void cmd_Lxcache_gc(fmd_hdl_t
*);
184 extern void cmd_Lxcache_fault(fmd_hdl_t
*, cmd_cpu_t
*, cmd_Lxcache_t
*,
185 const char *, nvlist_t
*, uint_t
);
186 extern cmd_evdisp_t
get_tagdata(cmd_cpu_t
*, cmd_ptrsubtype_t
,
187 int32_t, uint64_t *);
189 extern int get_cpu_retired_ways(cmd_cpu_t
*, cmd_ptrsubtype_t
);
190 extern int get_index_retired_ways(cmd_cpu_t
*, cmd_ptrsubtype_t
, int32_t);
191 extern int is_index_way_retired(cmd_cpu_t
*, cmd_ptrsubtype_t
, int32_t,
193 extern void cmd_fault_the_cpu(fmd_hdl_t
*, cmd_cpu_t
*, cmd_ptrsubtype_t
,
195 extern uint32_t cmd_Lx_index_count_type1_ways(cmd_cpu_t
*);
196 extern uint32_t cmd_Lx_index_count_type2_ways(cmd_cpu_t
*);
197 extern void cmd_Lxcache_anonymous_tag_error_timeout(fmd_hdl_t
*, id_t
);
198 extern cmd_Lxcache_t
*cmd_Lxcache_lookup_by_timeout_id(id_t
);
199 extern boolean_t
cmd_create_case_for_Lxcache(fmd_hdl_t
*, cmd_cpu_t
*,
201 extern int test_mode
;
206 #endif /* _CMD_LxCACHE_H */