diff options
Diffstat (limited to 'sys/arch/m88k')
-rw-r--r-- | sys/arch/m88k/conf/files.m88k | 3 | ||||
-rw-r--r-- | sys/arch/m88k/include/mutex.h | 62 | ||||
-rw-r--r-- | sys/arch/m88k/include/types.h | 3 | ||||
-rw-r--r-- | sys/arch/m88k/m88k/genassym.cf | 12 | ||||
-rw-r--r-- | sys/arch/m88k/m88k/mutex.S | 148 |
5 files changed, 224 insertions, 4 deletions
diff --git a/sys/arch/m88k/conf/files.m88k b/sys/arch/m88k/conf/files.m88k index 924ea6f2662..86812f60371 100644 --- a/sys/arch/m88k/conf/files.m88k +++ b/sys/arch/m88k/conf/files.m88k @@ -1,4 +1,4 @@ -# $OpenBSD: files.m88k,v 1.15 2005/12/03 14:30:05 miod Exp $ +# $OpenBSD: files.m88k,v 1.16 2005/12/03 19:01:13 miod Exp $ file arch/m88k/m88k/db_disasm.c ddb file arch/m88k/m88k/db_interface.c ddb @@ -11,6 +11,7 @@ file arch/m88k/m88k/m88110_fp.S m88110 file arch/m88k/m88k/m88110_mmu.S m88110 file arch/m88k/m88k/m8820x_machdep.c m88100 file arch/m88k/m88k/m88k_machdep.c +file arch/m88k/m88k/mutex.S file arch/m88k/m88k/pmap.c file arch/m88k/m88k/process.S file arch/m88k/m88k/process_machdep.c diff --git a/sys/arch/m88k/include/mutex.h b/sys/arch/m88k/include/mutex.h new file mode 100644 index 00000000000..c3dd11a50e6 --- /dev/null +++ b/sys/arch/m88k/include/mutex.h @@ -0,0 +1,62 @@ +#ifndef _M88K_MUTEX_H_ +#define _M88K_MUTEX_H_ +/* $OpenBSD: mutex.h,v 1.1 2005/12/03 19:01:14 miod Exp $ */ + +/* + * Copyright (c) 2005, Miodrag Vallat. + * + * 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. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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. + */ + +struct mutex { + volatile int mtx_lock; /* mutex.S relies upon this field being first */ + int mtx_wantipl; + int mtx_oldipl; + void *mtx_cpu; +}; + +#define MUTEX_INITIALIZER(ipl) { 0, (ipl), IPL_NONE, NULL } + +#ifdef DIAGNOSTIC + +#define MUTEX_ASSERT_LOCKED(mtx) \ +do { \ + if ((mtx)->mtx_lock == 0 || (mtx)->mtx_cpu != curcpu()) \ + panic("mutex %p not held in %s", (mtx), __func__); \ +} while (0) + +#define MUTEX_ASSERT_UNLOCKED(mtx) \ +do { \ + if ((mtx)->mtx_lock != 0) \ + panic("mutex %p held in %s", (mtx), __func__); \ +} while (0) + +#else + +#define MUTEX_ASSERT_LOCKED(mtx) do { /* nothing */ } while (0) +#define MUTEX_ASSERT_UNLOCKED(mtx) do { /* nothing */ } while (0) + +#endif + +#define MUTEX_OLDIPL(mtx) (mtx)->mtx_oldipl + +#endif /* _M88K_MUTEX_H_ */ diff --git a/sys/arch/m88k/include/types.h b/sys/arch/m88k/include/types.h index a733ec54414..30527858837 100644 --- a/sys/arch/m88k/include/types.h +++ b/sys/arch/m88k/include/types.h @@ -1,5 +1,5 @@ /* $NetBSD: types.h,v 1.7 1995/07/05 17:46:11 pk Exp $ */ -/* $OpenBSD: types.h,v 1.4 2005/12/03 14:30:05 miod Exp $ */ +/* $OpenBSD: types.h,v 1.5 2005/12/03 19:01:14 miod Exp $ */ /* * Copyright (c) 1992, 1993 @@ -78,5 +78,6 @@ typedef unsigned long long uint64_t; typedef int32_t register_t; #define __HAVE_CPUINFO +#define __HAVE_MUTEX #endif /* _M88K_TYPES_H_ */ diff --git a/sys/arch/m88k/m88k/genassym.cf b/sys/arch/m88k/m88k/genassym.cf index 8e7b869bdb1..8f135f2bb92 100644 --- a/sys/arch/m88k/m88k/genassym.cf +++ b/sys/arch/m88k/m88k/genassym.cf @@ -1,4 +1,4 @@ -# $OpenBSD: genassym.cf,v 1.4 2005/12/03 14:30:06 miod Exp $ +# $OpenBSD: genassym.cf,v 1.5 2005/12/03 19:01:14 miod Exp $ # # Copyright (c) 1982, 1990 The Regents of the University of California. # All rights reserved. @@ -28,7 +28,7 @@ # SUCH DAMAGE. # # @(#)genassym.c 7.8 (Berkeley) 5/7/91 -# $Id: genassym.cf,v 1.4 2005/12/03 14:30:06 miod Exp $ +# $Id: genassym.cf,v 1.5 2005/12/03 19:01:14 miod Exp $ # include <sys/param.h> @@ -39,6 +39,7 @@ include <sys/mbuf.h> include <sys/msgbuf.h> include <machine/cpu.h> +include <machine/mutex.h> include <machine/trap.h> include <machine/psl.h> include <machine/vmparam.h> @@ -157,3 +158,10 @@ member pcb_r30 member pcb_sp member pcb_fcr62 member pcb_fcr63 + +# mutex fields +struct mutex +member mtx_lock +member mtx_wantipl +member mtx_oldipl +member mtx_cpu diff --git a/sys/arch/m88k/m88k/mutex.S b/sys/arch/m88k/m88k/mutex.S new file mode 100644 index 00000000000..f8b67d58400 --- /dev/null +++ b/sys/arch/m88k/m88k/mutex.S @@ -0,0 +1,148 @@ +/* $OpenBSD: mutex.S,v 1.1 2005/12/03 19:01:14 miod Exp $ */ + +/* + * Copyright (c) 2005, Miodrag Vallat. + * + * 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. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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. + */ + +#include "assym.h" +#if MTX_LOCK != 0 +#error Lack of Humppa in mutex code +#endif + +#include <machine/asm.h> + +/* + * void mtx_init(struct mutex *mtx, int ipl) + */ +ENTRY(mtx_init) + st r0, r2, MTX_LOCK /* mtx->mtx_lock = 0 */ + st r0, r2, MTX_OLDIPL /* mtx->mtx_oldipl = IPL_NONE */ + st r3, r2, MTX_WANTIPL /* mtx->mtx_wantipl = ipl */ + jmp.n r1 + st r0, r2, MTX_CPU /* mtx->mtx_cpu = NULL */ + +/* + * void mtx_enter(struct mutex *mtx) + */ +ENTRY(mtx_enter) + subu r31, r31, 8 + st r1, r31, 4 /* save return address */ + +#ifdef MULTIPROCESSOR + + st r2, r31, 0 /* save mtx */ +enter_again: + bsr.n _C_LABEL(raiseipl) /* raiseipl(mtx->mtx_wantipl) */ + ld r2, r2, MTX_WANTIPL + + ld r4, r31, 0 + or r3, r0, 1 + xmem r3, r4, r0 /* attempt to claim the lock, old */ + bcnd ne0, r3, enter_failed /* mtx->mtx_lock is 0 if successful */ + + st r2, r4, MTX_OLDIPL /* save into mtx_oldipl */ + ldcr r3, CPU + st r3, r4, MTX_CPU /* mtx->mtx_cpu = curcpu() */ + + ld r1, r31, 4 + jmp.n r1 + addu r31, r31, 8 + +enter_failed: /* the lock is not ours... */ + bcnd ne0, r2, 1f /* splx(oldipl) */ + bsr.n _C_LABEL(spl0) + addu r1, r1, 2f - . - 4 +1: + bsr _C_LABEL(setipl) +2: + ld r2, r31, 0 /* restore mtx */ +enter_spin: +#ifdef DIAGNOSTIC + ldcr r3, CPU + ld r4, r2, MTX_CPU + cmp r5, r3, r4 + bcnd eq0, r5, enter_panic +#endif + ld r3, r2, MTX_LOCK + bcnd eq0, r3, enter_again + br enter_spin + +#ifdef DIAGNOSTIC +enter_panic: + or.u r2, r0, hi16(9f) + bsr.n _C_LABEL(panic) + or r2, r2, lo16(9f) + + data +9: + string "mtx_enter: humpaan itsekseni" +#endif + +#else /* MULTIPROCESSOR */ + + st r2, r31, 0 /* save mtx */ + bsr.n _C_LABEL(raiseipl) /* raiseipl(mtx->mtx_wantipl) */ + ld r2, r2, MTX_WANTIPL + + ld r4, r31, 0 + or r3, r0, 1 + st r3, r4, MTX_LOCK /* locked! */ + + st r2, r4, MTX_OLDIPL /* save into mtx_oldipl */ + +#ifdef DIAGNOSTIC /* necessary for MUTEX_ASSERT_LOCKED */ + ldcr r3, CPU + st r3, r4, MTX_CPU /* mtx->mtx_cpu = curcpu() */ +#endif + + ld r1, r31, 4 + jmp.n r1 + addu r31, r31, 8 + +#endif /* MULTIPROCESSOR */ + +/* + * void mtx_leave(struct mutex *mtx) + */ +ENTRY(mtx_leave) + subu r31, r31, 8 + st r1, r31, 0 + + ld r3, r2, MTX_OLDIPL + st r0, r2, MTX_CPU /* mtx->mtx_cpu = NULL */ +#ifdef DEBUG + st r0, r2, MTX_OLDIPL /* mtx->mtx_oldipl = IPL_NONE */ +#endif + + bcnd.n ne0, r3, 1f /* splx(mtx->mtx_oldipl) */ + st r0, r2, MTX_LOCK /* mtx->mtx_lock = 0 */ + bsr.n _C_LABEL(spl0) + addu r1, r1, 2f - . - 4 +1: + bsr.n _C_LABEL(setipl) + or r2, r3, r0 +2: + ld r1, r31, 0 + jmp.n r1 + addu r31, r31, 8 |