xref: /illumos-gate/usr/src/uts/common/sys/bofi.h (revision 7c478bd95313f5f23a4c958a745db2134aa03244)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_SYS_BOFI_H
28 #define	_SYS_BOFI_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 /*
33  * header file for bus_ops fault injector
34  */
35 
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39 
40 #include <sys/feature_tests.h>
41 
42 /*
43  * ioctl command values
44  */
45 #define	BOFI_ADD_DEF 0
46 #define	BOFI_DEL_DEF 1
47 #define	BOFI_START 2
48 #define	BOFI_STOP 3
49 #define	BOFI_CHK_STATE 8
50 #define	BOFI_CHK_STATE_W 9
51 #define	BOFI_BROADCAST 10
52 #define	BOFI_CLEAR_ACC_CHK 11
53 #define	BOFI_CLEAR_ERRORS 12
54 #define	BOFI_CLEAR_ERRDEFS 13
55 #define	BOFI_GET_HANDLES 16
56 #define	BOFI_GET_HANDLE_INFO 17
57 
58 #define	NAMESIZE 256
59 #define	ERRMSGSIZE 256
60 
61 struct  acc_log_elem {
62     hrtime_t	access_time;	/* timestamp */
63     uint_t	access_type;	/* the type of access */
64     uint_t	_pad;		/* pad struct to multiple of 8 bytes for x86 */
65     offset_t 	offset;		/* the offset into handle */
66     uint64_t	value;		/* the value being read or written */
67     uint32_t 	size;		/* the size (in bytes) of the transaction */
68     uint32_t  	repcount;	/* repcount parameter of a ddi_repX routine */
69 };
70 
71 /* Access logging flags */
72 #define	BOFI_LOG_REPIO	0x1	/* log ddi_repX as multiple accesses */
73 #define	BOFI_LOG_WRAP	0x2	/* do continuous logging of accesses */
74 #define	BOFI_LOG_FULL	0x4	/* lets callers know if the log has wrapped */
75 #define	BOFI_LOG_TIMESTAMP	0x8 /* timestamp each log entry */
76 
77 struct  acc_log {
78     uint32_t	logsize;	/* length of the logbase array */
79     uint32_t	entries;	/* number of valid log elements */
80     uint_t	flags;		/* access logging flags */
81     uint_t	wrapcnt;	/* wrap cnt */
82     hrtime_t	start_time;	/* activation time */
83     hrtime_t	stop_time;	/* deactivation time (or time when full) */
84     caddr_t	logbase;	/* pointer to acc_log_elem struct */
85 };
86 #if defined(_SYSCALL32)
87 
88 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
89 #pragma pack(4)
90 #endif
91 
92 struct  acc_log32 {
93     uint32_t	logsize;	/* length of the logbase array */
94     uint32_t	entries;	/* number of valid log elements */
95     uint_t	flags;		/* access logging flags */
96     uint_t	wrapcnt;	/* wrap cnt */
97     hrtime_t	start_time;	/* activation time */
98     hrtime_t	stop_time;	/* deactivation time (or time when full) */
99     caddr32_t	logbase;	/* pointer to acc_log_elem struct */
100 };
101 
102 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
103 #pragma pack()
104 #endif
105 
106 #endif /* _SYSCALL32 */
107 
108 struct bofi_errdef {
109     uint_t 	namesize;
110     char 	name[NAMESIZE];		/* as returned by ddi_get_name() */
111 				/* pointer to char */
112     int 	instance;	/* as returned by ddi_get_instance() */
113     int		rnumber;	/* as used by ddi_regs_map_setup() */
114     offset_t 	offset;		/* as used by ddi_regs_map_setup() */
115     offset_t 	len;		/* as used by ddi_regs_map_setup() */
116     uint_t	access_type;
117     uint_t	access_count;
118     uint_t	fail_count;
119     uint_t	acc_chk;
120     uint_t	optype;
121     uint64_t	operand;
122     struct acc_log log;
123     uint64_t 	errdef_handle;	/* pointer to void */
124 };
125 #if defined(_SYSCALL32)
126 
127 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
128 #pragma pack(4)
129 #endif
130 
131 struct bofi_errdef32 {
132     uint_t 	namesize;
133     char 	name[NAMESIZE];		/* as returned by ddi_get_name() */
134 				/* pointer to char */
135     int 	instance;	/* as returned by ddi_get_instance() */
136     int		rnumber;	/* as used by ddi_regs_map_setup() */
137     offset_t 	offset;		/* as used by ddi_regs_map_setup() */
138     offset_t 	len;		/* as used by ddi_regs_map_setup() */
139     uint_t	access_type;
140     uint_t	access_count;
141     uint_t	fail_count;
142     uint_t	acc_chk;
143     uint_t	optype;
144     uint64_t	operand;
145     struct acc_log32 log;
146     uint64_t 	errdef_handle;	/* pointer to void */
147 };
148 
149 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
150 #pragma pack()
151 #endif
152 
153 #endif /* _SYSCALL32 */
154 
155 struct bofi_errctl {
156     uint_t 	namesize;
157     char 	name[NAMESIZE];		/* as returned by ddi_get_name() */
158     int 	instance;	/* as returned by ddi_get_instance() */
159 };
160 
161 struct bofi_get_handles {
162     uint_t 	namesize;
163     char 	name[NAMESIZE];		/* as returned by ddi_get_name() */
164     int 	instance;	/* as returned by ddi_get_instance() */
165     int 	count;
166     caddr_t 	buffer;
167 };
168 #if defined(_SYSCALL32)
169 struct bofi_get_handles32 {
170     uint_t 	namesize;
171     char 	name[NAMESIZE];		/* as returned by ddi_get_name() */
172     int 	instance;	/* as returned by ddi_get_instance() */
173     int 	count;
174     caddr32_t 	buffer;
175 };
176 #endif /* _SYSCALL32 */
177 
178 struct handle_info {
179     int 	instance;
180     uint_t 	access_type;
181     int 	rnumber;
182     int		_pad;		/* pad to 8 bytes for x86 */
183     offset_t 	len;
184     offset_t 	offset;
185     uint64_t 	addr_cookie;
186 };
187 
188 struct bofi_get_hdl_info {
189     uint_t 	namesize;
190     char 	name[NAMESIZE];		/* as returned by ddi_get_name() */
191     int 	count;		/* number of handle_info structures */
192     caddr_t 	hdli;		/* pointer to struct handle_info */
193 };
194 #if defined(_SYSCALL32)
195 struct bofi_get_hdl_info32 {
196     uint_t 	namesize;
197     char 	name[NAMESIZE];		/* as returned by ddi_get_name() */
198     int 	count;		/* number of handle_info structures */
199     caddr32_t 	hdli;		/* pointer to struct handle_info */
200 };
201 #endif /* _SYSCALL32 */
202 
203 /*
204  * values for optype
205  */
206 #define	BOFI_EQUAL 0
207 #define	BOFI_AND 1
208 #define	BOFI_OR 2
209 #define	BOFI_XOR 3
210 #define	BOFI_NO_TRANSFER 4
211 #define	BOFI_DELAY_INTR 5
212 #define	BOFI_LOSE_INTR 6
213 #define	BOFI_EXTRA_INTR 7
214 #define	BOFI_NOP 16
215 /*
216  * values for access_type
217  */
218 #define	BOFI_PIO_R 1
219 #define	BOFI_PIO_W 2
220 #define	BOFI_PIO_RW (BOFI_PIO_R|BOFI_PIO_W)
221 #define	BOFI_DMA_R 4
222 #define	BOFI_DMA_W 8
223 #define	BOFI_DMA_RW (BOFI_DMA_R|BOFI_DMA_W)
224 #define	BOFI_INTR 64
225 #define	BOFI_LOG 128
226 
227 struct bofi_errstate {
228     hrtime_t	fail_time;	/* time that count went to zero */
229     hrtime_t	msg_time;	/* time that ddi_report_error was called */
230     uint_t	access_count;
231     uint_t	fail_count;
232     uint_t	acc_chk;
233     uint_t 	errmsg_count;
234     char 	buffer[ERRMSGSIZE];
235     ddi_fault_impact_t severity;
236     struct acc_log log;
237     uint64_t 	errdef_handle;
238 };
239 #if defined(_SYSCALL32)
240 
241 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
242 #pragma pack(4)
243 #endif
244 
245 struct bofi_errstate32 {
246     hrtime_t	fail_time;	/* time that count went to zero */
247     hrtime_t	msg_time;	/* time that ddi_report_error was called */
248     uint_t	access_count;
249     uint_t	fail_count;
250     uint_t	acc_chk;
251     uint_t 	errmsg_count;
252     char 	buffer[ERRMSGSIZE];
253     ddi_fault_impact_t severity;
254     struct acc_log32 log;
255     uint64_t 	errdef_handle;
256 };
257 
258 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
259 #pragma pack()
260 #endif
261 
262 #endif /* _SYSCALL32 */
263 
264 #ifdef __cplusplus
265 }
266 #endif
267 
268 #endif	/* _SYS_BOFI_H */
269