Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 10 Jul 2015 08:36:22 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r285352 - in head/lib/libc: aarch64 aarch64/gen tests/sys
Message-ID:  <201507100836.t6A8aMCl029097@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Fri Jul 10 08:36:22 2015
New Revision: 285352
URL: https://svnweb.freebsd.org/changeset/base/285352

Log:
  Add support for makecontext. This supports up to 8 arguments as this
  simplifies the code, these can be passed in registers.
  
  Obtained from:	ABT Systems Ltd
  Sponsored by:	The FreeBSD Foundation

Added:
  head/lib/libc/aarch64/gen/_ctx_start.S   (contents, props changed)
  head/lib/libc/aarch64/gen/makecontext.c   (contents, props changed)
Modified:
  head/lib/libc/aarch64/Symbol.map
  head/lib/libc/aarch64/gen/Makefile.inc
  head/lib/libc/tests/sys/Makefile

Modified: head/lib/libc/aarch64/Symbol.map
==============================================================================
--- head/lib/libc/aarch64/Symbol.map	Fri Jul 10 07:13:14 2015	(r285351)
+++ head/lib/libc/aarch64/Symbol.map	Fri Jul 10 08:36:22 2015	(r285352)
@@ -28,6 +28,7 @@ FBSD_1.0 {
 	vfork;
 	brk;
 	sbrk;
+	makecontext;
 };
 
 FBSDprivate_1.0 {
@@ -35,4 +36,5 @@ FBSDprivate_1.0 {
 	_end;
 	curbrk;
 	minbrk;
+	__makecontext;
 };

Modified: head/lib/libc/aarch64/gen/Makefile.inc
==============================================================================
--- head/lib/libc/aarch64/gen/Makefile.inc	Fri Jul 10 07:13:14 2015	(r285351)
+++ head/lib/libc/aarch64/gen/Makefile.inc	Fri Jul 10 08:36:22 2015	(r285352)
@@ -1,10 +1,12 @@
 # $FreeBSD$
 
-SRCS+=	fabs.S \
+SRCS+=	_ctx_start.S \
+	fabs.S \
 	flt_rounds.c \
 	fpgetmask.c \
 	fpsetmask.c \
 	ldexp.c \
+	makecontext.c \
 	_setjmp.S \
 	_set_tp.c \
 	setjmp.S \

Added: head/lib/libc/aarch64/gen/_ctx_start.S
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libc/aarch64/gen/_ctx_start.S	Fri Jul 10 08:36:22 2015	(r285352)
@@ -0,0 +1,38 @@
+/*-
+ * Copyright (c) 2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Andrew Turner under
+ * sponsorship from the FreeBSD Foundation.
+ *
+ * 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 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 AUTHOR 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 <machine/asm.h>
+__FBSDID("$FreeBSD$");
+
+ENTRY(_ctx_start)
+	blr	x19		/* Call func from makecontext */
+	mov	x0, x20		/* Load ucp saved in makecontext */
+	bl	_C_LABEL(ctx_done)
+	bl	_C_LABEL(abort)
+END(_ctx_start)

Added: head/lib/libc/aarch64/gen/makecontext.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libc/aarch64/gen/makecontext.c	Fri Jul 10 08:36:22 2015	(r285352)
@@ -0,0 +1,86 @@
+/*-
+ * Copyright (c) 2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Andrew Turner under
+ * sponsorship from the FreeBSD Foundation.
+ *
+ * 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 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 AUTHOR 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>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+
+#include <machine/armreg.h>
+
+#include <inttypes.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <ucontext.h>
+
+void _ctx_start(void);
+
+void
+ctx_done(ucontext_t *ucp)
+{       
+	        
+	if (ucp->uc_link == NULL) {
+		exit(0);
+	} else {  
+		setcontext((const ucontext_t *)ucp->uc_link);
+		abort();
+	}                                                      
+}
+   
+__weak_reference(__makecontext, makecontext);
+
+void
+__makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...)
+{
+	struct gpregs *gp;
+	va_list ap;
+	int i;
+
+	/* A valid context is required. */
+	if (ucp == NULL)
+		return;
+
+	if ((argc < 0) || (argc > 8))
+		return;
+
+	gp = &ucp->uc_mcontext.mc_gpregs;
+
+	va_start(ap, argc);
+	/* Pass up to eight arguments in x0-7. */
+	for (i = 0; i < argc && i < 8; i++)
+		gp->gp_x[i] = va_arg(ap, uint64_t);
+	va_end(ap);
+
+	/* Set the stack */
+	gp->gp_sp = STACKALIGN(ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size);
+	/* Arrange for return via the trampoline code. */
+	gp->gp_elr = (__register_t)_ctx_start;
+	gp->gp_x[19] = (__register_t)func;
+	gp->gp_x[20] = (__register_t)ucp;
+}

Modified: head/lib/libc/tests/sys/Makefile
==============================================================================
--- head/lib/libc/tests/sys/Makefile	Fri Jul 10 07:13:14 2015	(r285351)
+++ head/lib/libc/tests/sys/Makefile	Fri Jul 10 08:36:22 2015	(r285352)
@@ -12,9 +12,7 @@ NETBSD_ATF_TESTS_C+=		clock_gettime_test
 NETBSD_ATF_TESTS_C+=		connect_test
 NETBSD_ATF_TESTS_C+=		dup_test
 NETBSD_ATF_TESTS_C+=		fsync_test
-.if ${MACHINE} != "arm64" # ARM64TODO: Missing makecontext
 NETBSD_ATF_TESTS_C+=		getcontext_test
-.endif
 NETBSD_ATF_TESTS_C+=		getgroups_test
 NETBSD_ATF_TESTS_C+=		getitimer_test
 NETBSD_ATF_TESTS_C+=		getlogin_test



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201507100836.t6A8aMCl029097>