Home | History | Annotate | Line # | Download | only in include
lock.h revision 1.1.6.1
      1  1.1.6.1  thorpej /*	$NetBSD: lock.h,v 1.1.6.1 2002/01/10 19:37:54 thorpej Exp $	*/
      2      1.1    bjh21 
      3      1.1    bjh21 /*-
      4  1.1.6.1  thorpej  * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc.
      5      1.1    bjh21  * All rights reserved.
      6      1.1    bjh21  *
      7      1.1    bjh21  * This code is derived from software contributed to The NetBSD Foundation
      8      1.1    bjh21  * by Jason R. Thorpe.
      9      1.1    bjh21  *
     10      1.1    bjh21  * Redistribution and use in source and binary forms, with or without
     11      1.1    bjh21  * modification, are permitted provided that the following conditions
     12      1.1    bjh21  * are met:
     13      1.1    bjh21  * 1. Redistributions of source code must retain the above copyright
     14      1.1    bjh21  *    notice, this list of conditions and the following disclaimer.
     15      1.1    bjh21  * 2. Redistributions in binary form must reproduce the above copyright
     16      1.1    bjh21  *    notice, this list of conditions and the following disclaimer in the
     17      1.1    bjh21  *    documentation and/or other materials provided with the distribution.
     18      1.1    bjh21  * 3. All advertising materials mentioning features or use of this software
     19      1.1    bjh21  *    must display the following acknowledgement:
     20      1.1    bjh21  *	This product includes software developed by the NetBSD
     21      1.1    bjh21  *	Foundation, Inc. and its contributors.
     22      1.1    bjh21  * 4. Neither the name of The NetBSD Foundation nor the names of its
     23      1.1    bjh21  *    contributors may be used to endorse or promote products derived
     24      1.1    bjh21  *    from this software without specific prior written permission.
     25      1.1    bjh21  *
     26      1.1    bjh21  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27      1.1    bjh21  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28      1.1    bjh21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29      1.1    bjh21  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30      1.1    bjh21  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31      1.1    bjh21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32      1.1    bjh21  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33      1.1    bjh21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34      1.1    bjh21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35      1.1    bjh21  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36      1.1    bjh21  * POSSIBILITY OF SUCH DAMAGE.
     37      1.1    bjh21  */
     38      1.1    bjh21 
     39      1.1    bjh21 /*
     40      1.1    bjh21  * Machine-dependent spin lock operations.
     41  1.1.6.1  thorpej  *
     42  1.1.6.1  thorpej  * NOTE: The SWP insn used here is available only on ARM architecture
     43  1.1.6.1  thorpej  * version 3 and later (as well as 2a).  What we are going to do is
     44  1.1.6.1  thorpej  * expect that the kernel will trap and emulate the insn.  That will
     45  1.1.6.1  thorpej  * be slow, but give us the atomicity that we need.
     46      1.1    bjh21  */
     47      1.1    bjh21 
     48  1.1.6.1  thorpej #ifndef _ARM_LOCK_H_
     49  1.1.6.1  thorpej #define	_ARM_LOCK_H_
     50      1.1    bjh21 
     51  1.1.6.1  thorpej typedef	__volatile int		__cpu_simple_lock_t;
     52      1.1    bjh21 
     53      1.1    bjh21 #define	__SIMPLELOCK_LOCKED	1
     54      1.1    bjh21 #define	__SIMPLELOCK_UNLOCKED	0
     55      1.1    bjh21 
     56  1.1.6.1  thorpej static __inline void __attribute__((__unused__))
     57  1.1.6.1  thorpej __cpu_simple_lock_init(__cpu_simple_lock_t *alp)
     58  1.1.6.1  thorpej {
     59  1.1.6.1  thorpej 
     60  1.1.6.1  thorpej 	*alp = __SIMPLELOCK_UNLOCKED;
     61  1.1.6.1  thorpej }
     62  1.1.6.1  thorpej 
     63  1.1.6.1  thorpej static __inline void __attribute__((__unused__))
     64  1.1.6.1  thorpej __cpu_simple_lock(__cpu_simple_lock_t *alp)
     65  1.1.6.1  thorpej {
     66  1.1.6.1  thorpej 	int __val = __SIMPLELOCK_LOCKED;
     67  1.1.6.1  thorpej 
     68  1.1.6.1  thorpej 	do {
     69  1.1.6.1  thorpej 		__asm __volatile("swp %0, %1, [%2]"
     70  1.1.6.1  thorpej 			: "=r" (__val)
     71  1.1.6.1  thorpej 			: "0" (__val), "r" (alp)
     72  1.1.6.1  thorpej 			: "memory");
     73  1.1.6.1  thorpej 	} while (__val != __SIMPLELOCK_UNLOCKED);
     74  1.1.6.1  thorpej }
     75  1.1.6.1  thorpej 
     76  1.1.6.1  thorpej static __inline int __attribute__((__unused__))
     77  1.1.6.1  thorpej __cpu_simple_lock_try(__cpu_simple_lock_t *alp)
     78  1.1.6.1  thorpej {
     79  1.1.6.1  thorpej 	int __val = __SIMPLELOCK_LOCKED;
     80  1.1.6.1  thorpej 
     81  1.1.6.1  thorpej 	__asm __volatile("swp %0, %1, [%2]"
     82  1.1.6.1  thorpej 		: "=r" (__val)
     83  1.1.6.1  thorpej 		: "0" (__val), "r" (alp)
     84  1.1.6.1  thorpej 		: "memory");
     85  1.1.6.1  thorpej 
     86  1.1.6.1  thorpej 	return ((__val == __SIMPLELOCK_UNLOCKED) ? 1 : 0);
     87  1.1.6.1  thorpej }
     88  1.1.6.1  thorpej 
     89  1.1.6.1  thorpej static __inline void __attribute__((__unused__))
     90  1.1.6.1  thorpej __cpu_simple_unlock(__cpu_simple_lock_t *alp)
     91  1.1.6.1  thorpej {
     92  1.1.6.1  thorpej 
     93  1.1.6.1  thorpej 	*alp = __SIMPLELOCK_UNLOCKED;
     94  1.1.6.1  thorpej }
     95  1.1.6.1  thorpej 
     96  1.1.6.1  thorpej #endif /* _ARM_LOCK_H_ */
     97