diff options
Diffstat (limited to 'libc/sysdeps/linux/kvx/makecontext.c')
-rw-r--r-- | libc/sysdeps/linux/kvx/makecontext.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/kvx/makecontext.c b/libc/sysdeps/linux/kvx/makecontext.c new file mode 100644 index 000000000..a52eded9f --- /dev/null +++ b/libc/sysdeps/linux/kvx/makecontext.c @@ -0,0 +1,53 @@ +/* + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive for + * more details. + * + * Copyright (C) 2025 Kalray Inc. + * Author(s): Julian Vetter <jvetter@kalrayinc.com> + */ + +#include <stdarg.h> +#include <ucontext.h> + + +/* Number of arguments that go in registers. */ +#define NREG_ARGS 12 + +/* Take a context previously prepared via getcontext() and set to + call func() with the given int only args. */ +void +__makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...) +{ + extern void __startcontext (void); + unsigned long *funcstack; + va_list vl; + unsigned long *regptr; + unsigned int reg; + + /* Start at the top of stack. */ + funcstack = (unsigned long *) (ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size); + funcstack -= argc < NREG_ARGS ? 0 : argc - NREG_ARGS; + funcstack = (unsigned long *) (((uintptr_t) funcstack & -32L)); + + ucp->uc_mcontext.sc_regs.r12 = (unsigned long) funcstack; + /* Use $r20 and $r21 to pass some infos to __startcontext */ + ucp->uc_mcontext.sc_regs.r20 = (unsigned long) ucp->uc_link; + ucp->uc_mcontext.sc_regs.r21 = (unsigned long) func; + ucp->uc_mcontext.sc_regs.ra = (unsigned long) __startcontext; + + va_start (vl, argc); + + /* The first twelve arguments go into registers. */ + regptr = &(ucp->uc_mcontext.sc_regs.r0); + + for (reg = 0; (reg < argc) && (reg < NREG_ARGS); reg++) + *regptr++ = va_arg (vl, unsigned long); + + /* And the remainder on the stack. */ + for (; reg < argc; reg++) + *funcstack++ = va_arg (vl, unsigned long); + + va_end (vl); +} +weak_alias (__makecontext, makecontext) |