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>