lock.h revision 1.3
11.3Stsubai/*	$NetBSD: lock.h,v 1.3 2000/07/06 03:52:25 tsubai Exp $	*/
21.1Sthorpej
31.1Sthorpej/*-
41.1Sthorpej * Copyright (c) 2000 The NetBSD Foundation, Inc.
51.1Sthorpej * All rights reserved.
61.1Sthorpej *
71.1Sthorpej * This code is derived from software contributed to The NetBSD Foundation
81.1Sthorpej * by Jason R. Thorpe.
91.1Sthorpej *
101.1Sthorpej * Redistribution and use in source and binary forms, with or without
111.1Sthorpej * modification, are permitted provided that the following conditions
121.1Sthorpej * are met:
131.1Sthorpej * 1. Redistributions of source code must retain the above copyright
141.1Sthorpej *    notice, this list of conditions and the following disclaimer.
151.1Sthorpej * 2. Redistributions in binary form must reproduce the above copyright
161.1Sthorpej *    notice, this list of conditions and the following disclaimer in the
171.1Sthorpej *    documentation and/or other materials provided with the distribution.
181.1Sthorpej * 3. All advertising materials mentioning features or use of this software
191.1Sthorpej *    must display the following acknowledgement:
201.1Sthorpej *	This product includes software developed by the NetBSD
211.1Sthorpej *	Foundation, Inc. and its contributors.
221.1Sthorpej * 4. Neither the name of The NetBSD Foundation nor the names of its
231.1Sthorpej *    contributors may be used to endorse or promote products derived
241.1Sthorpej *    from this software without specific prior written permission.
251.1Sthorpej *
261.1Sthorpej * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
271.1Sthorpej * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
281.1Sthorpej * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
291.1Sthorpej * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
301.1Sthorpej * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
311.1Sthorpej * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
321.1Sthorpej * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
331.1Sthorpej * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
341.1Sthorpej * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
351.1Sthorpej * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
361.1Sthorpej * POSSIBILITY OF SUCH DAMAGE.
371.1Sthorpej */
381.1Sthorpej
391.1Sthorpej/*
401.1Sthorpej * Machine-dependent spin lock operations.
411.1Sthorpej */
421.1Sthorpej
431.1Sthorpej#ifndef _POWERPC_LOCK_H_
441.3Stsubai#define _POWERPC_LOCK_H_
451.2Sthorpej
461.3Stsubaitypedef __volatile int __cpu_simple_lock_t;
471.1Sthorpej
481.3Stsubai#define __SIMPLELOCK_LOCKED	1
491.3Stsubai#define __SIMPLELOCK_UNLOCKED	0
501.3Stsubai
511.3Stsubaistatic __inline void
521.3Stsubai__cpu_simple_lock_init(__cpu_simple_lock_t *alp)
531.3Stsubai{
541.3Stsubai	*alp = __SIMPLELOCK_UNLOCKED;
551.3Stsubai	__asm __volatile ("sync");
561.3Stsubai}
571.3Stsubai
581.3Stsubaistatic __inline void
591.3Stsubai__cpu_simple_lock(__cpu_simple_lock_t *alp)
601.3Stsubai{
611.3Stsubai	int old;
621.3Stsubai
631.3Stsubai	__asm __volatile ("	\n\
641.3Stsubai				\n\
651.3Stsubai1:	lwarx	%0,0,%1		\n\
661.3Stsubai	cmpwi	%0,%2		\n\
671.3Stsubai	beq+	3f		\n\
681.3Stsubai2:	lwz	%0,0(%1)	\n\
691.3Stsubai	cmpwi	%0,%2		\n\
701.3Stsubai	beq+	1b		\n\
711.3Stsubai	b	2b		\n\
721.3Stsubai3:	stwcx.	%3,0,%1		\n\
731.3Stsubai	bne-	1b		\n\
741.3Stsubai	isync			\n\
751.3Stsubai				\n"
761.3Stsubai	: "=&r"(old)
771.3Stsubai	: "r"(alp), "I"(__SIMPLELOCK_UNLOCKED), "r"(__SIMPLELOCK_LOCKED)
781.3Stsubai	: "memory");
791.3Stsubai}
801.3Stsubai
811.3Stsubaistatic __inline int
821.3Stsubai__cpu_simple_lock_try(__cpu_simple_lock_t *alp)
831.3Stsubai{
841.3Stsubai	int old;
851.3Stsubai
861.3Stsubai	__asm __volatile ("	\n\
871.3Stsubai				\n\
881.3Stsubai1:	lwarx	%0,0,%1		\n\
891.3Stsubai	cmpwi	%0,%2		\n\
901.3Stsubai	bne	2f		\n\
911.3Stsubai	stwcx.	%3,0,%1		\n\
921.3Stsubai	bne-	1b		\n\
931.3Stsubai	isync			\n\
941.3Stsubai2:				\n"
951.3Stsubai	: "=&r"(old)
961.3Stsubai	: "r"(alp), "I"(__SIMPLELOCK_UNLOCKED), "r"(__SIMPLELOCK_LOCKED)
971.3Stsubai	: "memory");
981.3Stsubai
991.3Stsubai	return (old == __SIMPLELOCK_UNLOCKED);
1001.3Stsubai}
1011.3Stsubai
1021.3Stsubaistatic __inline void
1031.3Stsubai__cpu_simple_unlock(__cpu_simple_lock_t *alp)
1041.3Stsubai{
1051.3Stsubai	__asm __volatile ("sync");
1061.3Stsubai	*alp = __SIMPLELOCK_UNLOCKED;
1071.3Stsubai}
1081.1Sthorpej
1091.1Sthorpej#endif /* _POWERPC_LOCK_H_ */
110