summaryrefslogtreecommitdiff
path: root/lib/libpthread/arch
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libpthread/arch')
-rw-r--r--lib/libpthread/arch/i386/uthread_machdep.h5
-rw-r--r--lib/libpthread/arch/mips/_atomic_lock.S35
-rw-r--r--lib/libpthread/arch/mips/uthread_machdep.h36
3 files changed, 75 insertions, 1 deletions
diff --git a/lib/libpthread/arch/i386/uthread_machdep.h b/lib/libpthread/arch/i386/uthread_machdep.h
index 2a296d3ae25..088ff200509 100644
--- a/lib/libpthread/arch/i386/uthread_machdep.h
+++ b/lib/libpthread/arch/i386/uthread_machdep.h
@@ -1,7 +1,7 @@
/*
* OpenBSD/i386 machine-dependent thread macros
*
- * $OpenBSD: uthread_machdep.h,v 1.1 1998/08/28 01:54:58 d Exp $
+ * $OpenBSD: uthread_machdep.h,v 1.2 1998/11/09 03:13:13 d Exp $
*/
/* save the floating point state of a thread */
@@ -29,6 +29,9 @@
- sizeof(double); \
}
+#define _thread_machdep_longjmp(a,v) longjmp(a,v)
+#define _thread_machdep_setjmp(a) setjmp(a)
+
struct _machdep_struct {
char saved_fp[108];
};
diff --git a/lib/libpthread/arch/mips/_atomic_lock.S b/lib/libpthread/arch/mips/_atomic_lock.S
new file mode 100644
index 00000000000..169852b9c75
--- /dev/null
+++ b/lib/libpthread/arch/mips/_atomic_lock.S
@@ -0,0 +1,35 @@
+/*
+ * $OpenBSD: _atomic_lock.S,v 1.1 1998/11/09 03:13:14 d Exp $
+ */
+
+#include "SYS.h"
+
+/*
+ * Atomicly lock a location with an identifier provided the location
+ * is not currently locked.
+ *
+ * long _atomic_lock(long *a0);
+ * v0 will contain the return value (zero if lock obtained).
+ */
+
+/*
+ * XXXXXX THIS IS LOCK FUNCTION IS TOTALLY BOGUS XXXXXXXXX
+ * pefo@ says that for R4000 processors, there is a way to do this
+ * atomically, but for R3000 you will need to context switch.
+ * Specifically he says the 'll' and 'sc' instructions can be used for mips2.
+ */
+LEAF(_atomic_lock)
+ .set noreorder
+ .set nomacro
+
+ /* Get the existing lock value and lock memory: */
+ ori t0,zero,1
+ lw v0,0(a0)
+ sw t0,0(a0)
+ j ra
+ nop
+
+ .set macro
+ .set reorder
+END(_atomic_lock)
+
diff --git a/lib/libpthread/arch/mips/uthread_machdep.h b/lib/libpthread/arch/mips/uthread_machdep.h
new file mode 100644
index 00000000000..605b900f8a7
--- /dev/null
+++ b/lib/libpthread/arch/mips/uthread_machdep.h
@@ -0,0 +1,36 @@
+/*
+ * OpenBSD/mips machine-dependent thread macros
+ *
+ * $OpenBSD: uthread_machdep.h,v 1.1 1998/11/09 03:13:14 d Exp $
+ */
+
+#include <machine/regnum.h>
+#include <machine/signal.h>
+
+/* floating point state is saved by setjmp/longjmp */
+
+#define _thread_machdep_save_float_state(thr) /* no need */
+#define _thread_machdep_restore_float_state(thr) /* no need */
+
+/* initialise the jmpbuf stack frame so it continues from entry */
+#define _thread_machdep_thread_create(thr, entry, pattr) \
+ { \
+ struct sigcontext *j = &(thr)->saved_jmp_buf; \
+ \
+ /* initialise to sane values */ \
+ _thread_machdep_setjmp(j); \
+ /* entry */ \
+ j->sc_regs[RA] = j->sc_pc; /* for gdb */ \
+ j->sc_pc = (int)entry; \
+ /* stack */ \
+ j->sc_regs[SP] = (int) (thr)->stack \
+ + (pattr)->stacksize_attr \
+ - sizeof(double); \
+ }
+
+#define _thread_machdep_longjmp(a,v) longjmp(a,v)
+#define _thread_machdep_setjmp(a) setjmp(a)
+
+struct _machdep_struct {
+ /* nothing needed */
+};