cmd_state.c revision c498d9365aa68b789215f4f356a9935f70b0fb3b
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock/*
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * CDDL HEADER START
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock *
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * The contents of this file are subject to the terms of the
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * Common Development and Distribution License (the "License").
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * You may not use this file except in compliance with the License.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock *
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * or http://www.opensolaris.org/os/licensing.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * See the License for the specific language governing permissions
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * and limitations under the License.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock *
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * When distributing Covered Code, include this CDDL HEADER in each
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * If applicable, add the following below this CDDL HEADER, with the
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * fields enclosed by brackets "[]" replaced with your own identifying
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * information: Portions Copyright [yyyy] [name of copyright owner]
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock *
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * CDDL HEADER END
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock/*
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * Use is subject to license terms.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#pragma ident "%Z%%M% %I% %E% SMI"
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock/*
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * Case management and saved state restoration
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <cmd_state.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <cmd_cpu.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <cmd_mem.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <cmd_page.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <cmd_dimm.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#ifdef sun4u
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <cmd_dp.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <cmd_dp_page.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#endif
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <cmd_bank.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <cmd.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#ifdef sun4v
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <cmd_branch.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#endif
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <string.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <fm/fmd_api.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#ifdef sun4u
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <cmd_opl.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#endif
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock/* Must be in sync with cmd_ptrsubtype_t */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockstatic cmd_case_closer_f *const cmd_case_closers[] = {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock NULL,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_ICACHE */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_DCACHE */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_PCACHE */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_ITLB */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_DTLB */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_L2DATA */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_L2DATA_UERETRY */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_L2TAG */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_L3DATA */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_L3DATA_UERETRY */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_L3TAG */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_dimm_close, /* CMD_PTR_DIMM_CASE */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_bank_close, /* CMD_PTR_BANK_CASE */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_page_close, /* CMD_PTR_PAGE_CASE */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_FPU */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock NULL, /* CMD_PTR_CPU_XR_RETRY */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_IREG */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_FREG */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_MAU */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_L2CTL */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#ifdef sun4u
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_dp_close, /* CMD_PTR_DP_CASE */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#else
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock NULL, /* CMD_PTR_DP_CASE */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#endif
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock NULL, /* CMD_PTR_DP_PAGE_DEFER */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_INV_SFSR */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_UE_DET_CPU */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_UE_DET_IO */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_MTLB */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_TLBP */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_UGESR_INV_URG */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_UGESR_CRE */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_UGESR_TSB_CTX */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_UGESR_TSBP */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_UGESR_PSTATE */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_UGESR_TSTATE */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_UGESR_IUG_F */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_UGESR_IUG_R */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_UGESR_SDC */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_UGESR_WDT */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_UGESR_DTLB */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_UGESR_ITLB */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_UGESR_CORE_ERR */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_UGESR_DAE */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_UGESR_IAE */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_UGESR_UGE */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_MISC_REGS */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpuerr_close, /* CMD_PTR_CPU_LFU */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#ifdef sun4v
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_branch_close /* CMD_PTR_BRANCH_CASE */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#else
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock NULL
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#endif
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock};
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockfmd_case_t *
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockcmd_case_create(fmd_hdl_t *hdl, cmd_header_t *hdr, cmd_ptrsubtype_t ptrsubtype,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock const char **uuidp)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_case_ptr_t ptr;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_case_closer_t *cl;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock fmd_case_t *cp;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cl = fmd_hdl_alloc(hdl, sizeof (cmd_case_closer_t), FMD_SLEEP);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cl->cl_func = cmd_case_closers[ptrsubtype];
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cl->cl_arg = hdr;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cp = fmd_case_open(hdl, cl);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ptr.ptr_type = hdr->hdr_nodetype;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ptr.ptr_subtype = ptrsubtype;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) strcpy(ptr.ptr_name, hdr->hdr_bufname);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock *uuidp = fmd_case_uuid(hdl, cp);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock fmd_buf_write(hdl, cp, *uuidp, &ptr, sizeof (cmd_case_ptr_t));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (cp);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock}
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockvoid
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockcmd_case_redirect(fmd_hdl_t *hdl, fmd_case_t *cp, cmd_ptrsubtype_t newsubtype)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock const char *uuid = fmd_case_uuid(hdl, cp);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_case_ptr_t ptr;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock fmd_buf_read(hdl, cp, uuid, &ptr, sizeof (cmd_case_ptr_t));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock fmd_hdl_debug(hdl, "redirecting case %s from %d to %d\n", uuid,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ptr.ptr_subtype, newsubtype);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ptr.ptr_subtype = newsubtype;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock fmd_buf_write(hdl, cp, uuid, &ptr, sizeof (cmd_case_ptr_t));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock}
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockvoid
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockcmd_case_fini(fmd_hdl_t *hdl, fmd_case_t *cp, int close)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock const char *uuid = fmd_case_uuid(hdl, cp);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_case_closer_t *cl = fmd_case_getspecific(hdl, cp);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (close) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock fmd_hdl_debug(hdl, "closing case %s\n", uuid);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (fmd_serd_exists(hdl, uuid))
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock fmd_serd_destroy(hdl, uuid);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (fmd_buf_size(hdl, cp, uuid) != 0)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock fmd_buf_destroy(hdl, cp, uuid);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock fmd_case_setspecific(hdl, cp, NULL);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock fmd_case_close(hdl, cp);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (cl != NULL)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock fmd_hdl_free(hdl, cl, sizeof (cmd_case_closer_t));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock}
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock/* Must be in sync with cmd_nodetype_t */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockstatic cmd_case_restorer_f *const cmd_case_restorers[] = {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock NULL,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpu_restore, /* CMD_NT_CPU */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_dimm_restore, /* CMD_NT_DIMM */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_bank_restore, /* CMD_NT_BANK */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_page_restore, /* CMD_NT_PAGE */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#ifdef sun4u
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_dp_restore /* CMD_NT_DP */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#endif
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#ifdef sun4v
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_branch_restore /* CMD_NT_BRANCH */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#endif
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock};
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockint
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockcmd_state_restore(fmd_hdl_t *hdl)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock fmd_case_t *cp = NULL;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock while ((cp = fmd_case_next(hdl, cp)) != NULL) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock const char *uuid = fmd_case_uuid(hdl, cp);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_case_closer_t *cl;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_case_ptr_t ptr;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock void *thing;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock size_t sz;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if ((sz = fmd_buf_size(hdl, cp, uuid)) == 0)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock continue;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock else if (sz != sizeof (cmd_case_ptr_t))
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (cmd_set_errno(EINVAL));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock fmd_buf_read(hdl, cp, fmd_case_uuid(hdl, cp), &ptr,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock sizeof (cmd_case_ptr_t));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (ptr.ptr_type == 0 || ptr.ptr_type >
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock sizeof (cmd_case_restorers) /
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock sizeof (cmd_case_restorer_f *))
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (cmd_set_errno(EINVAL));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if ((thing = cmd_case_restorers[ptr.ptr_type](hdl,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cp, &ptr)) == NULL) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock fmd_hdl_debug(hdl, "Unable to restore case %s\n", uuid);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock continue;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cl = fmd_hdl_alloc(hdl, sizeof (cmd_case_closer_t), FMD_SLEEP);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cl->cl_func = cmd_case_closers[ptr.ptr_subtype];
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cl->cl_arg = thing;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock fmd_case_setspecific(hdl, cp, cl);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_trw_restore(hdl);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_cpu_validate(hdl);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_bank_validate(hdl);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_dimm_validate(hdl);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#ifdef sun4u
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock /*
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * cmd_dp_page_validate() must be done before cmd_dp_validate()
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * and cmd_page_validate()
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_dp_page_validate(hdl);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_dp_validate(hdl);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#endif
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_page_validate(hdl);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#ifdef sun4v
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmd_branch_validate(hdl);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#endif
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (0);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock}
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockvoid
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockcmd_case_restore(fmd_hdl_t *hdl, cmd_case_t *cc, fmd_case_t *cp, char *serdnm)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (!fmd_serd_exists(hdl, serdnm)) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock fmd_hdl_strfree(hdl, serdnm);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock serdnm = NULL;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cc->cc_cp = cp;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cc->cc_serdnm = serdnm;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock}
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock