summaryrefslogtreecommitdiff
path: root/lib/librthread/arch/alpha
diff options
context:
space:
mode:
authorPhilip Guenthe <guenther@cvs.openbsd.org>2011-10-17 06:39:21 +0000
committerPhilip Guenthe <guenther@cvs.openbsd.org>2011-10-17 06:39:21 +0000
commit82cbd469f12cd3a22be520db0de2ead1449f271e (patch)
tree7f405c5d2faa96148d6ed5ebe126425e978967c4 /lib/librthread/arch/alpha
parent2f6d2040683851ec94ddc66982fcddb408ea5eb2 (diff)
Use __tfork, __get_tcb, and __set_tcb to have a real TCB and per-thread
errno. The ASM bits for _cerror are sketchy or missing for some archs but that can be corrected in-tree.
Diffstat (limited to 'lib/librthread/arch/alpha')
-rw-r--r--lib/librthread/arch/alpha/cerror.S54
-rw-r--r--lib/librthread/arch/alpha/rfork_thread.S10
2 files changed, 59 insertions, 5 deletions
diff --git a/lib/librthread/arch/alpha/cerror.S b/lib/librthread/arch/alpha/cerror.S
new file mode 100644
index 00000000000..af21adebee7
--- /dev/null
+++ b/lib/librthread/arch/alpha/cerror.S
@@ -0,0 +1,54 @@
+/* $OpenBSD: cerror.S,v 1.1 2011/10/17 06:39:20 guenther Exp $ */
+/* $NetBSD: cerror.S,v 1.3 1996/10/17 03:08:17 cgd Exp $ */
+
+/*
+ * Copyright (c) 1994, 1995 Carnegie-Mellon University.
+ * All rights reserved.
+ *
+ * Author: Chris G. Demetriou
+ *
+ * Permission to use, copy, modify and distribute this software and
+ * its documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
+ * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
+ * School of Computer Science
+ * Carnegie Mellon University
+ * Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+
+#include "SYS.h"
+
+#define FRAME_SIZE 16
+#define FRAME_RA_OFFSET 0
+#define FRAME_V0_OFFSET 8
+
+NESTED(__cerror, 0, FRAME_SIZE, ra, IM_RA|IM_V0, 0)
+LEAF_NOPROFILE(__cerror, 0)
+ br t0, L1
+L1: LDGP(t0)
+
+ lda sp, -FRAME_SIZE(sp)
+ stq ra, FRAME_RA_OFFSET(sp)
+ stq v0, FRAME_V0_OFFSET(sp)
+
+ CALL(__errno)
+
+ ldq t0, FRAME_V0_OFFSET(sp)
+ stl t0, 0(v0)
+ ldiq v0, -1
+ ldq ra, FRAME_RA_OFFSET(sp)
+ lda sp, FRAME_SIZE(sp)
+ RET
+END(__cerror)
diff --git a/lib/librthread/arch/alpha/rfork_thread.S b/lib/librthread/arch/alpha/rfork_thread.S
index 8bbe879967d..3205958f6a9 100644
--- a/lib/librthread/arch/alpha/rfork_thread.S
+++ b/lib/librthread/arch/alpha/rfork_thread.S
@@ -1,4 +1,4 @@
-/* $OpenBSD: rfork_thread.S,v 1.2 2005/12/25 00:21:59 miod Exp $ */
+/* $OpenBSD: rfork_thread.S,v 1.3 2011/10/17 06:39:20 guenther Exp $ */
/*
* Copyright (c) 2005, Miodrag Vallat
@@ -28,12 +28,12 @@
#include "../../../libc/arch/alpha/SYS.h"
/*
- * int rfork_thread(int flags, void *stack, void (*func)(void *), void *arg);
+ * int __tfork_thread(const struct __tfork *param, void *stack, void (*func)(void *), void *arg);
*/
-LEAF(rfork_thread,0)
+LEAF(__tfork_thread,0)
/* a0 = flags, a1 = stack, a2 = func, a3 = arg */
mov a3, a5
- CALLSYS_ERROR(rfork)
+ CALLSYS_ERROR(__tfork)
beq v0, 1f
@@ -54,4 +54,4 @@ LEAF(rfork_thread,0)
mov zero, a0
CALLSYS_NOERROR(threxit)
-END(rfork_thread)
+END(__tfork_thread)