xref: /openbsd-src/sys/arch/hppa/include/mutex.h (revision 52ac02e4d7f3dc6035fb429a557276c9f267439a)
1*52ac02e4Skettenis /*	$OpenBSD: mutex.h,v 1.10 2024/05/16 09:30:03 kettenis Exp $	*/
26a55782fSmiod 
36a55782fSmiod /*
46a55782fSmiod  * Copyright (c) 2004 Artur Grabowski <art@openbsd.org>
56a55782fSmiod  * All rights reserved.
66a55782fSmiod  *
76a55782fSmiod  * Redistribution and use in source and binary forms, with or without
86a55782fSmiod  * modification, are permitted provided that the following conditions
96a55782fSmiod  * are met:
106a55782fSmiod  *
116a55782fSmiod  * 1. Redistributions of source code must retain the above copyright
126a55782fSmiod  *    notice, this list of conditions and the following disclaimer.
136a55782fSmiod  * 2. The name of the author may not be used to endorse or promote products
146a55782fSmiod  *    derived from this software without specific prior written permission.
156a55782fSmiod  *
166a55782fSmiod  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
176a55782fSmiod  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
186a55782fSmiod  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
196a55782fSmiod  * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
206a55782fSmiod  * EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLUDING, BUT NOT LIMITED TO,
216a55782fSmiod  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
226a55782fSmiod  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
236a55782fSmiod  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
246a55782fSmiod  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
256a55782fSmiod  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
266a55782fSmiod  */
276a55782fSmiod 
286a55782fSmiod #ifndef _MACHINE_MUTEX_H_
296a55782fSmiod #define _MACHINE_MUTEX_H_
306a55782fSmiod 
31c4925651Svisa #include <sys/_lock.h>
32c4925651Svisa 
33965f575bSkettenis #define	MUTEX_UNLOCKED	{ 1, 1, 1, 1 }
3423b21080Sjsing 
3523b21080Sjsing /* Note: mtx_lock must be 16-byte aligned. */
366a55782fSmiod struct mutex {
37423042ddSdlg #ifdef MULTIPROCESSOR
38965f575bSkettenis 	volatile int mtx_lock[4];
39423042ddSdlg #endif
406a55782fSmiod 	int mtx_wantipl;
416a55782fSmiod 	int mtx_oldipl;
424c6d9147Smpi 	volatile void *mtx_owner;
43c4925651Svisa #ifdef WITNESS
44c4925651Svisa 	struct lock_object mtx_lock_obj;
45c4925651Svisa #endif
46965f575bSkettenis };
476a55782fSmiod 
487c44c179Skettenis #ifdef MULTIPROCESSOR
49c4925651Svisa #ifdef WITNESS
50c4925651Svisa #define MUTEX_INITIALIZER_FLAGS(ipl, name, flags) \
51c4925651Svisa 	{ MUTEX_UNLOCKED, __MUTEX_IPL((ipl)), 0, NULL, \
52c4925651Svisa 	  MTX_LO_INITIALIZER(name, flags) }
53c4925651Svisa #else /* WITNESS */
54c4925651Svisa #define MUTEX_INITIALIZER_FLAGS(ipl, name, flags) \
55c4925651Svisa 	{ MUTEX_UNLOCKED, __MUTEX_IPL((ipl)), 0, NULL }
56c4925651Svisa #endif /* WITNESS */
57c4925651Svisa #else /* MULTIPROCESSOR */
58c4925651Svisa #define MUTEX_INITIALIZER_FLAGS(ipl, name, flags) \
59c4925651Svisa 	{ __MUTEX_IPL((ipl)), 0, NULL }
60c4925651Svisa #endif /* MULTIPROCESSOR */
616a55782fSmiod 
627c44c179Skettenis void __mtx_init(struct mutex *, int);
63c4925651Svisa #define _mtx_init(mtx, ipl) __mtx_init((mtx), __MUTEX_IPL((ipl)))
646a55782fSmiod 
656a55782fSmiod #ifdef DIAGNOSTIC
666a55782fSmiod #define MUTEX_ASSERT_LOCKED(mtx) do {					\
67423042ddSdlg 	if ((mtx)->mtx_owner != curcpu())				\
686a55782fSmiod 		panic("mutex %p not held in %s", (mtx), __func__);	\
696a55782fSmiod } while (0)
706a55782fSmiod 
716a55782fSmiod #define MUTEX_ASSERT_UNLOCKED(mtx) do {					\
72423042ddSdlg 	if ((mtx)->mtx_owner == curcpu())				\
736a55782fSmiod 		panic("mutex %p held in %s", (mtx), __func__);		\
746a55782fSmiod } while (0)
756a55782fSmiod #else
766a55782fSmiod #define MUTEX_ASSERT_LOCKED(mtx) do { } while (0)
776a55782fSmiod #define MUTEX_ASSERT_UNLOCKED(mtx) do { } while (0)
786a55782fSmiod #endif
796a55782fSmiod 
80c4925651Svisa #define MUTEX_LOCK_OBJECT(mtx)	(&(mtx)->mtx_lock_obj)
819f1a1266Smiod #define MUTEX_OLDIPL(mtx)	(mtx)->mtx_oldipl
829f1a1266Smiod 
836a55782fSmiod #endif
84