Module Name: src
Committed By: christos
Date: Wed Jun 3 01:02:29 UTC 2009
Modified Files:
src/lib/libc/arch/vax/gen: Makefile.inc
Added Files:
src/lib/libc/arch/vax/gen: _lwp.c
Log Message:
add _lwp_makecontext for the vax.
To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/lib/libc/arch/vax/gen/Makefile.inc
cvs rdiff -u -r0 -r1.1 src/lib/libc/arch/vax/gen/_lwp.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libc/arch/vax/gen/Makefile.inc
diff -u src/lib/libc/arch/vax/gen/Makefile.inc:1.14 src/lib/libc/arch/vax/gen/Makefile.inc:1.15
--- src/lib/libc/arch/vax/gen/Makefile.inc:1.14 Thu Mar 4 18:42:39 2004
+++ src/lib/libc/arch/vax/gen/Makefile.inc Tue Jun 2 21:02:28 2009
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.inc,v 1.14 2004/03/04 23:42:39 kleink Exp $
+# $NetBSD: Makefile.inc,v 1.15 2009/06/03 01:02:28 christos Exp $
SRCS+= byte_swap_2.S byte_swap_4.S bswap64.S \
fabs.S frexp.c \
@@ -11,7 +11,7 @@
signbitf.c signbitd.c \
swapcontext.S \
udiv.S urem.S \
- __setjmp14.S __sigsetjmp14.S _setjmp.S
+ __setjmp14.S __sigsetjmp14.S _lwp.c _setjmp.S
# ABI compatibility for libc.so.12
SRCS+= isinf.c isnan.c
Added files:
Index: src/lib/libc/arch/vax/gen/_lwp.c
diff -u /dev/null src/lib/libc/arch/vax/gen/_lwp.c:1.1
--- /dev/null Tue Jun 2 21:02:29 2009
+++ src/lib/libc/arch/vax/gen/_lwp.c Tue Jun 2 21:02:28 2009
@@ -0,0 +1,79 @@
+/* $NetBSD: _lwp.c,v 1.1 2009/06/03 01:02:28 christos Exp $ */
+
+/*-
+ * Copyright (c) 2009 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Christos Zoulas
+ *
+ * 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``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 FOUNDATION OR CONTRIBUTORS
+ * 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 <sys/cdefs.h>
+#if defined(LIBC_SCCS) && !defined(lint)
+__RCSID("$NetBSD: _lwp.c,v 1.1 2009/06/03 01:02:28 christos Exp $");
+#endif /* LIBC_SCCS and not lint */
+
+#include "namespace.h"
+#include <sys/types.h>
+#include <inttypes.h>
+#include <ucontext.h>
+#include <lwp.h>
+#include <stdlib.h>
+
+void
+_lwp_makecontext(ucontext_t *u, void (*start)(void *),
+ void *arg, void *private, caddr_t stack_base, size_t stack_size)
+{
+ __greg_t *gr = u->uc_mcontext.__gregs;
+ int *sp;
+
+ getcontext(u);
+ u->uc_link = NULL;
+
+ u->uc_stack.ss_sp = stack_base;
+ u->uc_stack.ss_size = stack_size;
+
+ /* Align to a word */
+ /* LINTED uintptr_t is safe */
+ sp = (int *)((uintptr_t)(stack_base + stack_size) & ~0x3);
+
+ /*
+ * Allocate necessary stack space for arguments including arg count
+ * and call frame
+ */
+ sp -= 1 + 1 + 5;
+
+ sp[0] = 0; /* condition handler is null */
+ sp[1] = 0x20000000; /* make this a CALLS frame */
+ sp[2] = 0; /* saved argument pointer */
+ sp[3] = 0; /* saved frame pointer */
+ sp[4] = (intptr_t)_lwp_exit + 2;/* return via _lwp_exit */
+ sp[5] = 1; /* argc */
+ sp[6] = (intptr_t)arg; /* argv */
+
+ gr[_REG_AP] = (__greg_t)(sp + 5);
+ gr[_REG_SP] = (__greg_t)sp;
+ gr[_REG_FP] = (__greg_t)sp;
+ gr[_REG_PC] = (__greg_t)start + 2;
+}