summaryrefslogtreecommitdiff
path: root/sys/arch/m88k
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/m88k')
-rw-r--r--sys/arch/m88k/conf/files.m88k3
-rw-r--r--sys/arch/m88k/include/mutex.h62
-rw-r--r--sys/arch/m88k/include/types.h3
-rw-r--r--sys/arch/m88k/m88k/genassym.cf12
-rw-r--r--sys/arch/m88k/m88k/mutex.S148
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