xref: /openbsd-src/sys/arch/hppa/include/mplock.h (revision 9593dc34da13a12012033a17061c846c208061c2)
1*9593dc34Smglocker /*	$OpenBSD: mplock.h,v 1.7 2024/09/04 07:54:51 mglocker Exp $	*/
2badffb03Sjsing 
3badffb03Sjsing /*
4badffb03Sjsing  * Copyright (c) 2004 Niklas Hallqvist.  All rights reserved.
5badffb03Sjsing  *
6badffb03Sjsing  * Redistribution and use in source and binary forms, with or without
7badffb03Sjsing  * modification, are permitted provided that the following conditions
8badffb03Sjsing  * are met:
9badffb03Sjsing  * 1. Redistributions of source code must retain the above copyright
10badffb03Sjsing  *    notice, this list of conditions and the following disclaimer.
11badffb03Sjsing  * 2. Redistributions in binary form must reproduce the above copyright
12badffb03Sjsing  *    notice, this list of conditions and the following disclaimer in the
13badffb03Sjsing  *    documentation and/or other materials provided with the distribution.
14badffb03Sjsing  *
15badffb03Sjsing  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16badffb03Sjsing  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17badffb03Sjsing  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18badffb03Sjsing  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19badffb03Sjsing  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20badffb03Sjsing  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21badffb03Sjsing  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22badffb03Sjsing  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23badffb03Sjsing  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24badffb03Sjsing  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25badffb03Sjsing  */
26badffb03Sjsing 
27badffb03Sjsing #ifndef _MACHINE_MPLOCK_H_
28badffb03Sjsing #define _MACHINE_MPLOCK_H_
29badffb03Sjsing 
30badffb03Sjsing /*
31badffb03Sjsing  * Really simple spinlock implementation with recursive capabilities.
32*9593dc34Smglocker  * Correctness is paramount, no fanciness allowed.
33badffb03Sjsing  */
34badffb03Sjsing 
35badffb03Sjsing #define	MPL_LOCKED	0
36badffb03Sjsing #define	MPL_UNLOCKED	1
37badffb03Sjsing 
38badffb03Sjsing struct __mp_lock {
39badffb03Sjsing 	volatile int mpl_lock[4];
40badffb03Sjsing 	volatile struct cpu_info *mpl_cpu;
41badffb03Sjsing 	volatile long mpl_count;
429856cad4Sguenther #ifdef WITNESS
439856cad4Sguenther 	struct lock_object	mpl_lock_obj;
449856cad4Sguenther #endif
45badffb03Sjsing };
46badffb03Sjsing 
47badffb03Sjsing #ifndef _LOCORE
48badffb03Sjsing 
499856cad4Sguenther void	___mp_lock_init(struct __mp_lock *);
508c00de5eSvisa void	__mp_lock(struct __mp_lock *);
518c00de5eSvisa void	__mp_unlock(struct __mp_lock *);
528c00de5eSvisa int	__mp_release_all(struct __mp_lock *);
538c00de5eSvisa void	__mp_acquire_count(struct __mp_lock *, int);
54ba0fc568Smpi int	__mp_lock_held(struct __mp_lock *, struct cpu_info *);
55badffb03Sjsing 
569856cad4Sguenther #ifdef WITNESS
579856cad4Sguenther 
589845d791Sguenther void	_mp_lock_init(struct __mp_lock *, const struct lock_type *);
599856cad4Sguenther 
609856cad4Sguenther #define __mp_lock_init(mpl) do {					\
619845d791Sguenther 	static const struct lock_type __lock_type = { .lt_name = #mpl };\
629856cad4Sguenther 	_mp_lock_init((mpl), &__lock_type);				\
639856cad4Sguenther } while (0)
649856cad4Sguenther 
659856cad4Sguenther #else /* WITNESS */
669856cad4Sguenther 
679856cad4Sguenther #define __mp_lock_init		___mp_lock_init
689856cad4Sguenther 
699856cad4Sguenther #endif /* WITNESS */
709856cad4Sguenther 
71badffb03Sjsing #endif
72badffb03Sjsing 
73badffb03Sjsing #endif /* !_MACHINE_MPLOCK_H */
74