summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/panic.h
blob: 9dd04a062682c8f58c532fbf9c7500d6875fb8cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_SYS_PANIC_H
#define	_SYS_PANIC_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#if !defined(_ASM)
#include <sys/types.h>
#include <sys/thread.h>
#include <sys/cpuvar.h>
#endif	/* !_ASM */

#ifdef	__cplusplus
extern "C" {
#endif

#ifdef _LP64
#define	PANICSTKSIZE	16384
#else
#define	PANICSTKSIZE	8192
#endif

#define	PANICBUFSIZE	8192
#define	PANICBUFVERS	1

#define	PANICNVNAMELEN	16

/*
 * Panicbuf Format:
 *
 * The kernel records the formatted panic message and an optional array of
 * name/value pairs into panicbuf[], a fixed-size buffer which is saved in
 * the crash dump and, on some platforms, is persistent across reboots.
 * The initial part of the buffer is a struct of type panic_data_t, which
 * includes a version number for identifying the format of subsequent data.
 *
 * The pd_msgoff word identifies the byte offset into panicbuf[] at which the
 * null-terminated panic message is located.  This is followed by an optional
 * variable-sized array of panic_nv_t items, which are used to record CPU
 * register values.  The number of items in pd_nvdata is computed as follows:
 *
 * (pd_msgoff - (sizeof (panic_data_t) - sizeof (panic_nv_t))) /
 * 	sizeof (panic_nv_t);
 *
 * In addition to panicbuf, debuggers can access the panic_* variables shown
 * below to determine more information about the initiator of the panic.
 */

#if !defined(_ASM)

typedef struct panic_nv {
	char pnv_name[PANICNVNAMELEN];	/* String name */
	uint64_t pnv_value;		/* Value */
} panic_nv_t;

typedef struct panic_data {
	uint32_t pd_version;		/* Version number of panic_data_t */
	uint32_t pd_msgoff;		/* Message byte offset in panicbuf */
	panic_nv_t pd_nvdata[1];	/* Array of named data */
} panic_data_t;

#if defined(_KERNEL)

/*
 * Kernel macros for adding information to pd_nvdata[].  PANICNVGET() returns
 * a panic_nv_t pointer (pnv) after the end of the existing data, PANICNVADD()
 * modifies the current item and increments pnv, and PANICNVSET() rewrites
 * pd_msgoff to indicate the end of pd_nvdata[].
 */
#define	PANICNVGET(pdp)							\
	((pdp)->pd_nvdata + (((pdp)->pd_msgoff -			\
	(sizeof (panic_data_t) - sizeof (panic_nv_t))) / sizeof (panic_nv_t)))

#define	PANICNVADD(pnv, n, v)						\
	{								\
		(void) strncpy((pnv)->pnv_name, (n), PANICNVNAMELEN);	\
		(pnv)->pnv_value = (uint64_t)(v); (pnv)++;		\
	}

#define	PANICNVSET(pdp, pnv) \
	(pdp)->pd_msgoff = (uint32_t)((char *)(pnv) - (char *)(pdp));

/*
 * Kernel panic data; preserved in crash dump for debuggers.
 */
#pragma align 8(panicbuf)
extern char panicbuf[PANICBUFSIZE];
extern kthread_t *panic_thread;
extern cpu_t panic_cpu;
extern hrtime_t panic_hrtime;
extern timespec_t panic_hrestime;

/*
 * Forward declarations for types:
 */
struct panic_trap_info;
struct regs;

/*
 * Miscellaneous state variables defined in or used by the panic code:
 */
extern char *panic_bootstr;
extern int panic_bootfcn;
extern int panic_forced;
extern int halt_on_panic;
extern int nopanicdebug;
extern int do_polled_io;
extern int obpdebug;
extern int in_sync;
extern int panic_quiesce;
extern int panic_sync;
extern int panic_dump;
extern int64_t panic_lbolt64;
extern label_t panic_regs;
extern struct regs *panic_reg;

/*
 * Panic functions called from the common panic code which must be
 * implemented by architecture or platform-specific code:
 */
extern void panic_saveregs(panic_data_t *, struct regs *);
extern void panic_savetrap(panic_data_t *, struct panic_trap_info *);
extern void panic_showtrap(struct panic_trap_info *);
extern void panic_stopcpus(cpu_t *, kthread_t *, int);
extern void panic_enter_hw(int);
extern void panic_quiesce_hw(panic_data_t *);
extern void panic_dump_hw(int);
extern int panic_trigger(int *);

#endif /* _KERNEL */
#endif /* !_ASM */

#ifdef	__cplusplus
}
#endif

#endif	/* _SYS_PANIC_H */