diff options
author | Mark Kettenis <kettenis@cvs.openbsd.org> | 2007-03-22 19:26:29 +0000 |
---|---|---|
committer | Mark Kettenis <kettenis@cvs.openbsd.org> | 2007-03-22 19:26:29 +0000 |
commit | f9328a9d729c2c45cf9206acbd704286d906629e (patch) | |
tree | 2d3c92ac279f5e6884f2becbd6a8094b900be389 /sys/arch/powerpc | |
parent | 35dd6c7fe34fb7c7f20c55d57f526f32ac9d412f (diff) |
Move powerpc to __HAVE_MUTEX. With help from drahn@. Tested by nick@, xsa@,
deraadt@.
"reads right" deraadt@
Diffstat (limited to 'sys/arch/powerpc')
-rw-r--r-- | sys/arch/powerpc/conf/files.powerpc | 3 | ||||
-rw-r--r-- | sys/arch/powerpc/include/_types.h | 3 | ||||
-rw-r--r-- | sys/arch/powerpc/include/mutex.h | 52 | ||||
-rw-r--r-- | sys/arch/powerpc/powerpc/mutex.S | 84 |
4 files changed, 140 insertions, 2 deletions
diff --git a/sys/arch/powerpc/conf/files.powerpc b/sys/arch/powerpc/conf/files.powerpc index 2d87207aeb4..9bfb6960e27 100644 --- a/sys/arch/powerpc/conf/files.powerpc +++ b/sys/arch/powerpc/conf/files.powerpc @@ -1,4 +1,4 @@ -# $OpenBSD: files.powerpc,v 1.41 2005/11/08 20:30:47 kettenis Exp $ +# $OpenBSD: files.powerpc,v 1.42 2007/03/22 19:26:27 kettenis Exp $ # file arch/powerpc/powerpc/setjmp.S ddb @@ -13,6 +13,7 @@ file arch/powerpc/powerpc/process_machdep.c file arch/powerpc/powerpc/sys_machdep.c file arch/powerpc/powerpc/trap.c file arch/powerpc/powerpc/vm_machdep.c +file arch/powerpc/powerpc/mutex.S file arch/powerpc/ddb/db_memrw.c ddb file arch/powerpc/ddb/db_disasm.c ddb diff --git a/sys/arch/powerpc/include/_types.h b/sys/arch/powerpc/include/_types.h index d8cc81d4506..2704dabf203 100644 --- a/sys/arch/powerpc/include/_types.h +++ b/sys/arch/powerpc/include/_types.h @@ -1,4 +1,4 @@ -/* $OpenBSD: _types.h,v 1.3 2007/03/20 20:59:53 kettenis Exp $ */ +/* $OpenBSD: _types.h,v 1.4 2007/03/22 19:26:28 kettenis Exp $ */ /*- * Copyright (c) 1990, 1993 @@ -117,5 +117,6 @@ typedef void * __wctype_t; /* Feature test macros */ #define __HAVE_CPUINFO +#define __HAVE_MUTEX #endif /* _POWERPC__TYPES_H_ */ diff --git a/sys/arch/powerpc/include/mutex.h b/sys/arch/powerpc/include/mutex.h new file mode 100644 index 00000000000..5c7b60e9764 --- /dev/null +++ b/sys/arch/powerpc/include/mutex.h @@ -0,0 +1,52 @@ +/* $OpenBSD: mutex.h,v 1.1 2007/03/22 19:26:28 kettenis Exp $ */ + +/* + * Copyright (c) 2004 Artur Grabowski <art@openbsd.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _POWERPC_MUTEX_H_ +#define _POWERPC_MUTEX_H_ + +struct mutex { + int mtx_wantipl; + int mtx_oldcpl; + __volatile void *mtx_owner; +}; + +#define MUTEX_INITIALIZER(ipl) { (ipl), 0, NULL } + +#define MUTEX_ASSERT_LOCKED(mtx) do { \ + if ((mtx)->mtx_owner != curcpu()) \ + panic("mutex %p not held in %s", (mtx), __func__); \ +} while (0) + +#define MUTEX_ASSERT_UNLOCKED(mtx) do { \ + if ((mtx)->mtx_owner == curcpu()) \ + panic("mutex %p held in %s", (mtx), __func__); \ +} while (0) + +#if 0 +#define MUTEX_OLDIPL(mtx) (mtx)->mtx_oldipl +#endif + +#endif diff --git a/sys/arch/powerpc/powerpc/mutex.S b/sys/arch/powerpc/powerpc/mutex.S new file mode 100644 index 00000000000..24f0c4c6ad9 --- /dev/null +++ b/sys/arch/powerpc/powerpc/mutex.S @@ -0,0 +1,84 @@ +/* $OpenBSD: mutex.S,v 1.1 2007/03/22 19:26:28 kettenis Exp $ */ + +/* + * Copyright (c) 2007 Dale Rahn + * Copyright (c) 2007 Mark Kettenis + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "assym.h" + +#include <machine/asm.h> + +/* XXX */ +#define GET_CPUINFO(r) mfsprg r,0 + +ENTRY(mtx_init) + li %r5,0 + stw %r4,MTX_WANTIPL(%r3) + stw %r5,MTX_OLDCPL(%r3) + stw %r5,MTX_OWNER(%r3) + blr + + +ENTRY(mtx_enter) + stwu %r1,-32(%r1) # reserve stack + mflr %r0 + stw %r0,36(%r1) # save return address +.L_retry: + GET_CPUINFO(%r4) + lwz %r5,MTX_WANTIPL(%r3) # load new ipl + lis %r6,_C_LABEL(imask)@ha # convert into cpl + slwi %r5,%r5,2 + addi %r5,%r5,_C_LABEL(imask)@l + lwzx %r5,%r5,%r6 + lwz %r7,CI_CPL(%r4) # load current cpl + or %r6,%r5,%r7 # raise cpl + stw %r6,CI_CPL(%r4) # store new cpl + li %r5,MTX_OWNER # load offset constant + lwarx %r6,%r5,%r3 # load reserve owner + cmpwi 0,%r6,0 # test owner == 0 + beq+ 0,.L_mutex_free # if owner == 0 branch free +.L_mutex_locked: + stw %r3,28(%r1) # save mtx during lcsplx + la %r4,28(%r1) + stwcx. %r3,0,%r4 # unreserve owner + mr %r3,%r7 # move old cpl to arg0 + bl _C_LABEL(lcsplx) # call splx on old cpl + lwz %r3,28(%r1) + b .L_retry + +.L_mutex_free: + stwcx. %r4,%r5,%r3 # old owner was 0 cond store + bne- .L_mutex_locked # branch if reserve cancelled + stw %r7,MTX_OLDCPL(%r3) # save old ipl + lwz %r0,36(%r1) # load return address + mtlr %r0 + addi %r1,%r1,32 # restore stack + blr + + +ENTRY(mtx_leave) + li %r4,0 + lwz %r5,MTX_OLDCPL(%r3) + stw %r4,MTX_OLDCPL(%r3) + stw %r4,MTX_OWNER(%r3) + GET_CPUINFO(%r4) + mr %r3,%r5 + lwz %r5,CI_CPL(%r4) + cmpl 0,%r3,%r5 + beq 1f + b _C_LABEL(lcsplx) +1: + blr |