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