1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport/*
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * CDDL HEADER START
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport *
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * The contents of this file are subject to the terms of the
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * Common Development and Distribution License (the "License").
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * You may not use this file except in compliance with the License.
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport *
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * or http://www.opensolaris.org/os/licensing.
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * See the License for the specific language governing permissions
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * and limitations under the License.
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport *
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * When distributing Covered Code, include this CDDL HEADER in each
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * If applicable, add the following below this CDDL HEADER, with the
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * fields enclosed by brackets "[]" replaced with your own identifying
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * information: Portions Copyright [yyyy] [name of copyright owner]
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport *
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * CDDL HEADER END
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport/*
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * Use is subject to license terms.
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport#ifndef _GMEM_STATE_H
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport#define _GMEM_STATE_H
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport/*
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * Case management and saved state restoration
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport#include <gmem_util.h>
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport#include <fm/fmd_api.h>
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport#ifdef __cplusplus
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenportextern "C" {
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport#endif
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport/*
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * Our maximum persistent buffer name length, used to allocate fixed-size
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * arrays for name storage.
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport/*
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * The current name DIMM_+serial number
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport#define GMEM_BUFNMLEN 48
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport/* gmem_evdisp_t, gmem_evdisp_stat_t, and gmem_evdisp_names must be in sync */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenporttypedef enum gmem_evdisp {
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport GMEM_EVD_OK,
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport GMEM_EVD_BAD,
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport GMEM_EVD_UNUSED,
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport GMEM_EVD_REDUND
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport} gmem_evdisp_t;
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport/*
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * Each handled ereport type has four statistics, designed to indicate the
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * eventual disposition of the ereport.
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenporttypedef struct gmem_evdisp_stat {
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport fmd_stat_t evs_ok; /* # of erpts processed successfully */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport fmd_stat_t evs_bad; /* # of malformed ereports */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport fmd_stat_t evs_unused; /* # of erpts unusable or not needed */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport fmd_stat_t evs_redund; /* # of erpts already explained */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport} gmem_evdisp_stat_t;
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport/* Must be in sync with gmem_case_restorers */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenporttypedef enum gmem_nodetype {
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport GMEM_NT_DIMM = 1,
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport GMEM_NT_PAGE
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport} gmem_nodetype_t;
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport/*
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * Must be in sync with gmem_case_closers. Additional types must be
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * appended to this enum otherwise interpretation of existing logs
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * and checkpoints will be confused.
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenporttypedef enum gmem_ptrsubtype {
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport GMEM_PTR_DIMM_CASE = 1,
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport GMEM_PTR_PAGE_CASE
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport} gmem_ptrsubtype_t;
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport/*
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * There are three types of general-purpose buffers, used to track DIMMs,
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * and pages. Created on-demand as ereports arrive, one buffer is created for
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * each thing tracked. The general-purpose buffers are used to track common
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * state, and are used to support case-specific buffers. Each open case has
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * a case-specific pointer buffer, used to aid in the rediscovery of the
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * associated general-purpose buffer. When restoration begins, we iterate
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * through each of the open cases, restoring the case-specific pointer buffers
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * for each. The pointer buffers are then used to restore the general-purpose
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * buffers.
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenporttypedef struct gmem_case_ptr {
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport gmem_nodetype_t ptr_type; /* The type of associated G.P. buffer */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport gmem_ptrsubtype_t ptr_subtype; /* The case within the G.P. buffer */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport char ptr_name[GMEM_BUFNMLEN]; /* G.P. buffer name */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport} gmem_case_ptr_t;
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport/*
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * All general-purpose buffers begin with a common header. This header contains
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * identification information used in the construction of new cases.
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport *
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * Note that versioned structs depend upon the size of
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * this struct remaining fixed.
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenporttypedef struct gmem_header {
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport gmem_list_t hdr_list; /* List of G.P. structs of this type */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport gmem_nodetype_t hdr_nodetype; /* Type of this G.P. struct */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport char hdr_bufname[GMEM_BUFNMLEN]; /* G.P. buffer name */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport} gmem_header_t;
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport/*
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * Per-case-subtype case closing routines. Stored in per-case state when the
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * case is generated, and regenerated from saved state upon restore.
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenporttypedef void gmem_case_closer_f(fmd_hdl_t *, void *);
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenporttypedef void *gmem_case_restorer_f(fmd_hdl_t *, fmd_case_t *,
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport gmem_case_ptr_t *);
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenporttypedef struct gmem_case_closer {
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport gmem_case_closer_f *cl_func;
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport void *cl_arg;
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport} gmem_case_closer_t;
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenporttypedef struct gmem_case {
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport fmd_case_t *cc_cp;
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport char *cc_serdnm;
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport} gmem_case_t;
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport/*
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * Utility functions which ease the management of cases.
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenportextern fmd_case_t *gmem_case_create(fmd_hdl_t *, gmem_header_t *,
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport gmem_ptrsubtype_t, const char **);
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenportextern void gmem_case_redirect(fmd_hdl_t *, fmd_case_t *, gmem_ptrsubtype_t);
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenportextern void gmem_case_fini(fmd_hdl_t *, fmd_case_t *, int);
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenportextern void gmem_case_restore(fmd_hdl_t *, gmem_case_t *, fmd_case_t *, char *);
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenportextern int gmem_state_restore(fmd_hdl_t *);
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport#ifdef __cplusplus
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport}
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport#endif
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport#endif /* _GMEM_STATE_H */