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 /*
23*c84b7bbeSAdrian Frost  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
2420c794b3Sgavinm  */
2520c794b3Sgavinm 
2620c794b3Sgavinm #ifndef	_CPU_MODULE_MS_H
2720c794b3Sgavinm #define	_CPU_MODULE_MS_H
2820c794b3Sgavinm 
2920c794b3Sgavinm #include <sys/types.h>
3020c794b3Sgavinm #include <sys/cpuvar.h>
3120c794b3Sgavinm #include <sys/nvpair.h>
3220c794b3Sgavinm #include <sys/cpu_module.h>
3320c794b3Sgavinm 
3420c794b3Sgavinm #ifdef  __cplusplus
3520c794b3Sgavinm extern "C" {
3620c794b3Sgavinm #endif
3720c794b3Sgavinm 
3820c794b3Sgavinm #ifdef _KERNEL
3920c794b3Sgavinm 
4020c794b3Sgavinm #define	CMSERR_BASE 0xe000
4120c794b3Sgavinm 
4220c794b3Sgavinm typedef enum cms_errno {
4320c794b3Sgavinm 	CMS_SUCCESS = 0,
4420c794b3Sgavinm 	CMSERR_UNKNOWN = CMSERR_BASE,	/* No specific error reason given */
4520c794b3Sgavinm 	CMSERR_NOTSUP,			/* Unsupported operation */
4620c794b3Sgavinm 	CMSERR_BADMSRWRITE		/* Error on wrmsr */
4720c794b3Sgavinm 
4820c794b3Sgavinm } cms_errno_t;
4920c794b3Sgavinm 
5020c794b3Sgavinm extern void cms_init(cmi_hdl_t);
5120c794b3Sgavinm extern boolean_t cms_present(cmi_hdl_t);
5220c794b3Sgavinm extern void *cms_hdl_getcmsdata(cmi_hdl_t);
5320c794b3Sgavinm extern void cms_post_startup(cmi_hdl_t);
5420c794b3Sgavinm extern void cms_post_mpstartup(cmi_hdl_t);
5520c794b3Sgavinm 
5620c794b3Sgavinm extern size_t cms_logout_size(cmi_hdl_t);
5720c794b3Sgavinm 
5820c794b3Sgavinm extern uint64_t cms_mcgctl_val(cmi_hdl_t, int, uint64_t);
5920c794b3Sgavinm 
6020c794b3Sgavinm extern boolean_t cms_bankctl_skipinit(cmi_hdl_t, int);
6120c794b3Sgavinm extern uint64_t cms_bankctl_val(cmi_hdl_t, int, uint64_t);
6220c794b3Sgavinm extern boolean_t cms_bankstatus_skipinit(cmi_hdl_t, int);
6320c794b3Sgavinm extern uint64_t cms_bankstatus_val(cmi_hdl_t, int, uint64_t);
6420c794b3Sgavinm 
6520c794b3Sgavinm extern void cms_mca_init(cmi_hdl_t, int);
6620c794b3Sgavinm 
6720c794b3Sgavinm extern uint64_t cms_poll_ownermask(cmi_hdl_t, hrtime_t);
6820c794b3Sgavinm 
6920c794b3Sgavinm extern void cms_bank_logout(cmi_hdl_t, int, uint64_t, uint64_t, uint64_t,
7020c794b3Sgavinm     void *);
7120c794b3Sgavinm 
7220c794b3Sgavinm extern cms_errno_t cms_msrinject(cmi_hdl_t, uint_t, uint64_t);
7320c794b3Sgavinm 
7420c794b3Sgavinm extern void cms_fini(cmi_hdl_t);
7520c794b3Sgavinm 
7620c794b3Sgavinm /*
7720c794b3Sgavinm  * Return flags for cms_error_action.  The model-specific implementation
7820c794b3Sgavinm  * can perform additional error handling during this call (e.g., cache
7920c794b3Sgavinm  * flush). but it needs to return an indication to the caller as to
8020c794b3Sgavinm  * the high-level impact of the error.
8120c794b3Sgavinm  *
8220c794b3Sgavinm  * CMS_ERRSCOPE_CLEAREDUC indicates that a UC error has in some way
8320c794b3Sgavinm  * been cleared by the model-specific handling, and that no bad data
8420c794b3Sgavinm  * remains in the system as far as this error is concerned.
8520c794b3Sgavinm  *
8620c794b3Sgavinm  * CMS_ERRSCOPE_POISONED indicates that the uncorrected data has
8720c794b3Sgavinm  * been marked in some way to ensure that is cannot subsequently be mistaken
8820c794b3Sgavinm  * for good data.
8920c794b3Sgavinm  *
9020c794b3Sgavinm  * CMS_ERRSCOPE_CURCONTEXT_OK indicates that the interrupted context is
9120c794b3Sgavinm  * unaffected by the uncorrected error.
9220c794b3Sgavinm  *
9320c794b3Sgavinm  * CMS_ERRSCOPE_IGNORE_ERR indicates that the error should be ignored,
9420c794b3Sgavinm  * regardless of apparent current context status and presence of uncorrected
9520c794b3Sgavinm  * data.
9620c794b3Sgavinm  *
9720c794b3Sgavinm  * CMS_ERRSCOPE_FORCE_FATAL indicates that the error should be considered
9820c794b3Sgavinm  * terminal, even if no uncorrected data is present and context appears ok
9920c794b3Sgavinm  */
10020c794b3Sgavinm 
10120c794b3Sgavinm #define	CMS_ERRSCOPE_CLEARED_UC		0x01
10220c794b3Sgavinm #define	CMS_ERRSCOPE_POISONED		0x02
10320c794b3Sgavinm #define	CMS_ERRSCOPE_CURCONTEXT_OK	0x04
10420c794b3Sgavinm #define	CMS_ERRSCOPE_IGNORE_ERR		0x08
10520c794b3Sgavinm #define	CMS_ERRSCOPE_FORCE_FATAL	0x10
10620c794b3Sgavinm 
10720c794b3Sgavinm typedef void *cms_cookie_t;
10820c794b3Sgavinm 
10920c794b3Sgavinm extern uint32_t cms_error_action(cmi_hdl_t, int, int, uint64_t, uint64_t,
11020c794b3Sgavinm     uint64_t, void *);
11120c794b3Sgavinm 
112*c84b7bbeSAdrian Frost extern cms_cookie_t cms_disp_match(cmi_hdl_t, int, int, uint64_t, uint64_t,
113*c84b7bbeSAdrian Frost     uint64_t, void *);
11420c794b3Sgavinm extern void cms_ereport_class(cmi_hdl_t, cms_cookie_t, const char **,
11520c794b3Sgavinm     const char **);
116491f61a1SYanmin Sun extern nvlist_t *cms_ereport_detector(cmi_hdl_t, int, cms_cookie_t,
117491f61a1SYanmin Sun     nv_alloc_t *);
11820c794b3Sgavinm extern boolean_t cms_ereport_includestack(cmi_hdl_t, cms_cookie_t);
11920c794b3Sgavinm extern void cms_ereport_add_logout(cmi_hdl_t, nvlist_t *, nv_alloc_t *, int,
12020c794b3Sgavinm     uint64_t, uint64_t, uint64_t, void *, cms_cookie_t);
12120c794b3Sgavinm 
12220c794b3Sgavinm #endif /* _KERNEL */
12320c794b3Sgavinm 
12420c794b3Sgavinm #ifdef	__cplusplus
12520c794b3Sgavinm }
12620c794b3Sgavinm #endif
12720c794b3Sgavinm 
12820c794b3Sgavinm #endif /* _CPU_MODULE_MS_H */
129