1 /* $OpenBSD: witness.h,v 1.5 2019/04/23 13:35:12 visa Exp $ */ 2 3 /*- 4 * Copyright (c) 1997 Berkeley Software Design, Inc. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. Berkeley Software Design Inc's name may not be used to endorse or 15 * promote products derived from this software without specific prior 16 * written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY BERKELEY SOFTWARE DESIGN INC ``AS IS'' AND 19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL BERKELEY SOFTWARE DESIGN INC BE LIABLE 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 * 30 * from BSDI Id: mutex.h,v 2.7.2.35 2000/04/27 03:10:26 cp 31 * $FreeBSD: head/sys/sys/lock.h 313908 2017-02-18 01:52:10Z mjg $ 32 */ 33 34 #ifndef _SYS_WITNESS_H_ 35 #define _SYS_WITNESS_H_ 36 37 #include <sys/_lock.h> 38 39 /* 40 * Lock classes are statically assigned an index into the global lock_classes 41 * array. Debugging code looks up the lock class for a given lock object 42 * by indexing the array. 43 */ 44 #define LO_CLASSINDEX(lock) \ 45 ((((lock)->lo_flags) & LO_CLASSMASK) >> LO_CLASSSHIFT) 46 #define LOCK_CLASS(lock) \ 47 (lock_classes[LO_CLASSINDEX((lock))]) 48 #define LOCK_CLASS_MAX \ 49 (LO_CLASSMASK >> LO_CLASSSHIFT) 50 51 /* 52 * Option flags passed to lock operations that witness also needs to know 53 * about or that are generic across all locks. 54 */ 55 #define LOP_NEWORDER 0x00000001 /* Define a new lock order. */ 56 #define LOP_QUIET 0x00000002 /* Don't log locking operations. */ 57 #define LOP_TRYLOCK 0x00000004 /* Don't check lock order. */ 58 #define LOP_EXCLUSIVE 0x00000008 /* Exclusive lock. */ 59 #define LOP_DUPOK 0x00000010 /* Don't check for duplicate acquires */ 60 61 /* Flags passed to witness_assert. */ 62 #define LA_MASKASSERT 0x000000ff /* Mask for witness defined asserts. */ 63 #define LA_UNLOCKED 0x00000000 /* Lock is unlocked. */ 64 #define LA_LOCKED 0x00000001 /* Lock is at least share locked. */ 65 #define LA_SLOCKED 0x00000002 /* Lock is exactly share locked. */ 66 #define LA_XLOCKED 0x00000004 /* Lock is exclusively locked. */ 67 #define LA_RECURSED 0x00000008 /* Lock is recursed. */ 68 #define LA_NOTRECURSED 0x00000010 /* Lock is not recursed. */ 69 70 #ifdef _KERNEL 71 72 void witness_initialize(void); 73 void witness_init(struct lock_object *, const struct lock_type *); 74 int witness_defineorder(struct lock_object *, struct lock_object *); 75 void witness_checkorder(struct lock_object *, int, struct lock_object *); 76 void witness_lock(struct lock_object *, int); 77 void witness_upgrade(struct lock_object *, int); 78 void witness_downgrade(struct lock_object *, int); 79 void witness_unlock(struct lock_object *, int); 80 int witness_warn(int, struct lock_object *, const char *, ...); 81 void witness_assert(const struct lock_object *, int); 82 void witness_display_spinlock(struct lock_object *, struct proc *, 83 int (*)(const char *, ...)); 84 int witness_line(struct lock_object *); 85 void witness_norelease(struct lock_object *); 86 void witness_releaseok(struct lock_object *); 87 const char *witness_file(struct lock_object *); 88 void witness_thread_exit(struct proc *); 89 int witness_sysctl(int *, u_int, void *, size_t *, void *, size_t); 90 int witness_sysctl_watch(void *, size_t *, void *, size_t); 91 92 #ifdef WITNESS 93 94 /* Flags for witness_warn(). */ 95 #define WARN_KERNELOK 0x01 /* Kernel lock is exempt from this check. */ 96 #define WARN_PANIC 0x02 /* Panic if check fails. */ 97 #define WARN_SLEEPOK 0x04 /* Sleepable locks are exempt from check. */ 98 99 #define WITNESS_INITIALIZE() \ 100 witness_initialize() 101 102 #define WITNESS_INIT(lock, type) \ 103 witness_init((lock), (type)) 104 105 #define WITNESS_CHECKORDER(lock, flags, interlock) \ 106 witness_checkorder((lock), (flags), (interlock)) 107 108 #define WITNESS_DEFINEORDER(lock1, lock2) \ 109 witness_defineorder((struct lock_object *)(lock1), \ 110 (struct lock_object *)(lock2)) 111 112 #define WITNESS_LOCK(lock, flags) \ 113 witness_lock((lock), (flags)) 114 115 #define WITNESS_UPGRADE(lock, flags) \ 116 witness_upgrade((lock), (flags)) 117 118 #define WITNESS_DOWNGRADE(lock, flags) \ 119 witness_downgrade((lock), (flags)) 120 121 #define WITNESS_UNLOCK(lock, flags) \ 122 witness_unlock((lock), (flags)) 123 124 #define WITNESS_CHECK(flags, lock, fmt, ...) \ 125 witness_warn((flags), (lock), (fmt), ## __VA_ARGS__) 126 127 #define WITNESS_WARN(flags, lock, fmt, ...) \ 128 witness_warn((flags), (lock), (fmt), ## __VA_ARGS__) 129 130 #define WITNESS_NORELEASE(lock) \ 131 witness_norelease(&(lock)->lock_object) 132 133 #define WITNESS_RELEASEOK(lock) \ 134 witness_releaseok(&(lock)->lock_object) 135 136 #define WITNESS_THREAD_EXIT(p) \ 137 witness_thread_exit((p)) 138 139 #else /* WITNESS */ 140 #define WITNESS_INITIALIZE() (void)0 141 #define WITNESS_INIT(lock, type) (void)0 142 #define WITNESS_DEFINEORDER(lock1, lock2) 0 143 #define WITNESS_CHECKORDER(lock, flagsi, interlock) (void)0 144 #define WITNESS_LOCK(lock, flags) (void)0 145 #define WITNESS_UPGRADE(lock, flags) (void)0 146 #define WITNESS_DOWNGRADE(lock, flags) (void)0 147 #define WITNESS_UNLOCK(lock, flags) (void)0 148 #define WITNESS_CHECK(flags, lock, fmt, ...) 0 149 #define WITNESS_WARN(flags, lock, fmt, ...) (void)0 150 #define WITNESS_NORELEASE(lock) (void)0 151 #define WITNESS_RELEASEOK(lock) (void)0 152 #define WITNESS_THREAD_EXIT(p) (void)0 153 #endif /* WITNESS */ 154 155 #endif /* _KERNEL */ 156 #endif /* _SYS_WITNESS_H_ */ 157