zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

mutex.h (3007B) - Raw


      1 /*	$NetBSD: mutex.h,v 1.27.4.1 2023/08/09 17:42:01 martin Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2002, 2007 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Jason R. Thorpe and Andrew Doran.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  * POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 #ifndef _ARM_MUTEX_H_
     33 #define	_ARM_MUTEX_H_
     34 
     35 #include <sys/types.h>
     36 
     37 #ifdef _KERNEL
     38 #include <machine/intr.h>
     39 #endif
     40 
     41 /*
     42  * The ARM mutex implementation is troublesome, because pre-v6 ARM lacks a
     43  * compare-and-swap operation.  However, there aren't any MP pre-v6 ARM
     44  * systems to speak of.
     45  *
     46  * ARMv6 and later, however, does have ldrex/strex, and can thus implement an
     47  * MP-safe compare-and-swap.
     48  *
     49  * So, what we have done is implement simple mutexes using a compare-and-swap.
     50  * We support pre-ARMv6 by implementing CAS as a restartable atomic sequence
     51  * that is checked by the IRQ vector.
     52  *
     53  */
     54 
     55 struct kmutex {
     56 	union {
     57 		/* Adaptive mutex */
     58 		volatile uintptr_t	mtxa_owner;	/* 0-3 */
     59 
     60 #ifdef _KERNEL
     61 		/* Spin mutex */
     62 		struct {
     63 			/*
     64 			 * Since the low bit of mtxa_owner is used to flag this
     65 			 * mutex as a spin mutex, we can't use the first byte
     66 			 * or the last byte to store the ipl or lock values.
     67 			 */
     68 			volatile uint8_t	mtxs_dummy;
     69 			ipl_cookie_t		mtxs_ipl;
     70 			__cpu_simple_lock_t	mtxs_lock;
     71 			volatile uint8_t	mtxs_unused;
     72 		} s;
     73 #endif
     74 	} u;
     75 };
     76 
     77 #ifdef __MUTEX_PRIVATE
     78 
     79 #define	mtx_owner		u.mtxa_owner
     80 #define	mtx_ipl			u.s.mtxs_ipl
     81 #define	mtx_lock		u.s.mtxs_lock
     82 
     83 #if 0
     84 #define	__HAVE_MUTEX_STUBS		1
     85 #define	__HAVE_SPIN_MUTEX_STUBS		1
     86 #endif
     87 #define	__HAVE_SIMPLE_MUTEXES		1
     88 
     89 #endif	/* __MUTEX_PRIVATE */
     90 
     91 __CTASSERT(sizeof(struct kmutex) == sizeof(uintptr_t));
     92 
     93 #endif /* _ARM_MUTEX_H_ */