Mercurial > illumos > illumos-gate
annotate usr/src/uts/common/sys/debug.h @ 13765:9410cf539b11
backout 3006: causes 3046 (panics after mounting root)
author | Richard Lowe <richlowe@richlowe.net> |
---|---|
date | Wed, 01 Aug 2012 16:40:39 -0400 |
parents | 38b4aca480b3 |
children | e3a9ae14a119 |
rev | line source |
---|---|
0 | 1 /* |
2 * CDDL HEADER START | |
3 * | |
4 * The contents of this file are subject to the terms of the | |
8269
03a7e9050cfd
6674216 "zfs share" doesn't work, but "zfs set sharenfs=on" does
Mark J Musante <Mark.Musante@Sun.COM>
parents:
1110
diff
changeset
|
5 * Common Development and Distribution License (the "License"). |
03a7e9050cfd
6674216 "zfs share" doesn't work, but "zfs set sharenfs=on" does
Mark J Musante <Mark.Musante@Sun.COM>
parents:
1110
diff
changeset
|
6 * You may not use this file except in compliance with the License. |
0 | 7 * |
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | |
9 * or http://www.opensolaris.org/os/licensing. | |
10 * See the License for the specific language governing permissions | |
11 * and limitations under the License. | |
12 * | |
13 * When distributing Covered Code, include this CDDL HEADER in each | |
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | |
15 * If applicable, add the following below this CDDL HEADER, with the | |
16 * fields enclosed by brackets "[]" replaced with your own identifying | |
17 * information: Portions Copyright [yyyy] [name of copyright owner] | |
18 * | |
19 * CDDL HEADER END | |
20 */ | |
21 /* | |
11474
857f9db4ef05
4517853 debug.h should include macros to assert implication and equivalence
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11173
diff
changeset
|
22 * Copyright 2010 Sun Microsystems, Inc. All rights reserved. |
0 | 23 * Use is subject to license terms. |
24 */ | |
25 | |
26 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ | |
789 | 27 /* All Rights Reserved */ |
0 | 28 |
29 #ifndef _SYS_DEBUG_H | |
30 #define _SYS_DEBUG_H | |
31 | |
32 #include <sys/isa_defs.h> | |
789 | 33 #include <sys/types.h> |
11173
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
8269
diff
changeset
|
34 #include <sys/note.h> |
0 | 35 |
36 #ifdef __cplusplus | |
37 extern "C" { | |
38 #endif | |
39 | |
40 /* | |
41 * ASSERT(ex) causes a panic or debugger entry if expression ex is not | |
42 * true. ASSERT() is included only for debugging, and is a no-op in | |
43 * production kernels. VERIFY(ex), on the other hand, behaves like | |
789 | 44 * ASSERT and is evaluated on both debug and non-debug kernels. |
0 | 45 */ |
46 | |
47 #if defined(__STDC__) | |
48 extern int assfail(const char *, const char *, int); | |
789 | 49 #define VERIFY(EX) ((void)((EX) || assfail(#EX, __FILE__, __LINE__))) |
0 | 50 #if DEBUG |
8269
03a7e9050cfd
6674216 "zfs share" doesn't work, but "zfs set sharenfs=on" does
Mark J Musante <Mark.Musante@Sun.COM>
parents:
1110
diff
changeset
|
51 #define ASSERT(EX) ((void)((EX) || assfail(#EX, __FILE__, __LINE__))) |
0 | 52 #else |
53 #define ASSERT(x) ((void)0) | |
54 #endif | |
55 #else /* defined(__STDC__) */ | |
56 extern int assfail(); | |
789 | 57 #define VERIFY(EX) ((void)((EX) || assfail("EX", __FILE__, __LINE__))) |
0 | 58 #if DEBUG |
8269
03a7e9050cfd
6674216 "zfs share" doesn't work, but "zfs set sharenfs=on" does
Mark J Musante <Mark.Musante@Sun.COM>
parents:
1110
diff
changeset
|
59 #define ASSERT(EX) ((void)((EX) || assfail("EX", __FILE__, __LINE__))) |
0 | 60 #else |
61 #define ASSERT(x) ((void)0) | |
62 #endif | |
63 #endif /* defined(__STDC__) */ | |
64 | |
65 /* | |
66 * Assertion variants sensitive to the compilation data model | |
67 */ | |
68 #if defined(_LP64) | |
69 #define ASSERT64(x) ASSERT(x) | |
70 #define ASSERT32(x) | |
71 #else | |
72 #define ASSERT64(x) | |
73 #define ASSERT32(x) ASSERT(x) | |
74 #endif | |
75 | |
789 | 76 /* |
11474
857f9db4ef05
4517853 debug.h should include macros to assert implication and equivalence
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11173
diff
changeset
|
77 * IMPLY and EQUIV are assertions of the form: |
857f9db4ef05
4517853 debug.h should include macros to assert implication and equivalence
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11173
diff
changeset
|
78 * |
857f9db4ef05
4517853 debug.h should include macros to assert implication and equivalence
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11173
diff
changeset
|
79 * if (a) then (b) |
857f9db4ef05
4517853 debug.h should include macros to assert implication and equivalence
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11173
diff
changeset
|
80 * and |
857f9db4ef05
4517853 debug.h should include macros to assert implication and equivalence
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11173
diff
changeset
|
81 * if (a) then (b) *AND* if (b) then (a) |
857f9db4ef05
4517853 debug.h should include macros to assert implication and equivalence
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11173
diff
changeset
|
82 */ |
857f9db4ef05
4517853 debug.h should include macros to assert implication and equivalence
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11173
diff
changeset
|
83 #if DEBUG |
857f9db4ef05
4517853 debug.h should include macros to assert implication and equivalence
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11173
diff
changeset
|
84 #define IMPLY(A, B) \ |
857f9db4ef05
4517853 debug.h should include macros to assert implication and equivalence
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11173
diff
changeset
|
85 ((void)(((!(A)) || (B)) || \ |
857f9db4ef05
4517853 debug.h should include macros to assert implication and equivalence
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11173
diff
changeset
|
86 assfail("(" #A ") implies (" #B ")", __FILE__, __LINE__))) |
857f9db4ef05
4517853 debug.h should include macros to assert implication and equivalence
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11173
diff
changeset
|
87 #define EQUIV(A, B) \ |
857f9db4ef05
4517853 debug.h should include macros to assert implication and equivalence
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11173
diff
changeset
|
88 ((void)((!!(A) == !!(B)) || \ |
857f9db4ef05
4517853 debug.h should include macros to assert implication and equivalence
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11173
diff
changeset
|
89 assfail("(" #A ") is equivalent to (" #B ")", __FILE__, __LINE__))) |
857f9db4ef05
4517853 debug.h should include macros to assert implication and equivalence
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11173
diff
changeset
|
90 #else |
857f9db4ef05
4517853 debug.h should include macros to assert implication and equivalence
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11173
diff
changeset
|
91 #define IMPLY(A, B) ((void)0) |
857f9db4ef05
4517853 debug.h should include macros to assert implication and equivalence
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11173
diff
changeset
|
92 #define EQUIV(A, B) ((void)0) |
857f9db4ef05
4517853 debug.h should include macros to assert implication and equivalence
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11173
diff
changeset
|
93 #endif |
857f9db4ef05
4517853 debug.h should include macros to assert implication and equivalence
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11173
diff
changeset
|
94 |
857f9db4ef05
4517853 debug.h should include macros to assert implication and equivalence
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11173
diff
changeset
|
95 /* |
789 | 96 * ASSERT3() behaves like ASSERT() except that it is an explicit conditional, |
97 * and prints out the values of the left and right hand expressions as part of | |
98 * the panic message to ease debugging. The three variants imply the type | |
99 * of their arguments. ASSERT3S() is for signed data types, ASSERT3U() is | |
100 * for unsigned, and ASSERT3P() is for pointers. The VERIFY3*() macros | |
101 * have the same relationship as above. | |
102 */ | |
103 extern void assfail3(const char *, uintmax_t, const char *, uintmax_t, | |
104 const char *, int); | |
105 #define VERIFY3_IMPL(LEFT, OP, RIGHT, TYPE) do { \ | |
106 const TYPE __left = (TYPE)(LEFT); \ | |
107 const TYPE __right = (TYPE)(RIGHT); \ | |
108 if (!(__left OP __right)) \ | |
109 assfail3(#LEFT " " #OP " " #RIGHT, \ | |
110 (uintmax_t)__left, #OP, (uintmax_t)__right, \ | |
111 __FILE__, __LINE__); \ | |
112 _NOTE(CONSTCOND) } while (0) | |
113 | |
114 #define VERIFY3S(x, y, z) VERIFY3_IMPL(x, y, z, int64_t) | |
115 #define VERIFY3U(x, y, z) VERIFY3_IMPL(x, y, z, uint64_t) | |
116 #define VERIFY3P(x, y, z) VERIFY3_IMPL(x, y, z, uintptr_t) | |
117 #if DEBUG | |
8269
03a7e9050cfd
6674216 "zfs share" doesn't work, but "zfs set sharenfs=on" does
Mark J Musante <Mark.Musante@Sun.COM>
parents:
1110
diff
changeset
|
118 #define ASSERT3S(x, y, z) VERIFY3_IMPL(x, y, z, int64_t) |
03a7e9050cfd
6674216 "zfs share" doesn't work, but "zfs set sharenfs=on" does
Mark J Musante <Mark.Musante@Sun.COM>
parents:
1110
diff
changeset
|
119 #define ASSERT3U(x, y, z) VERIFY3_IMPL(x, y, z, uint64_t) |
03a7e9050cfd
6674216 "zfs share" doesn't work, but "zfs set sharenfs=on" does
Mark J Musante <Mark.Musante@Sun.COM>
parents:
1110
diff
changeset
|
120 #define ASSERT3P(x, y, z) VERIFY3_IMPL(x, y, z, uintptr_t) |
789 | 121 #else |
122 #define ASSERT3S(x, y, z) ((void)0) | |
123 #define ASSERT3U(x, y, z) ((void)0) | |
124 #define ASSERT3P(x, y, z) ((void)0) | |
125 #endif | |
126 | |
0 | 127 #ifdef _KERNEL |
128 | |
129 extern void abort_sequence_enter(char *); | |
130 extern void debug_enter(char *); | |
131 | |
132 #endif /* _KERNEL */ | |
133 | |
134 #if defined(DEBUG) && !defined(__sun) | |
135 /* CSTYLED */ | |
136 #define STATIC | |
137 #else | |
138 /* CSTYLED */ | |
139 #define STATIC static | |
140 #endif | |
141 | |
142 #ifdef __cplusplus | |
143 } | |
144 #endif | |
145 | |
146 #endif /* _SYS_DEBUG_H */ |