[v6,08/13] ARC: Linux ABI
Commit Message
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
---
sysdeps/arc/nptl/pthreaddef.h | 32 +++++++
sysdeps/unix/sysv/linux/arc/bits/procfs.h | 35 +++++++
.../sysv/linux/arc/bits/types/__sigset_t.h | 12 +++
sysdeps/unix/sysv/linux/arc/getcontext.S | 63 +++++++++++++
sysdeps/unix/sysv/linux/arc/makecontext.c | 73 +++++++++++++++
sysdeps/unix/sysv/linux/arc/setcontext.S | 92 +++++++++++++++++++
sysdeps/unix/sysv/linux/arc/sigcontextinfo.h | 28 ++++++
sysdeps/unix/sysv/linux/arc/swapcontext.S | 92 +++++++++++++++++++
sysdeps/unix/sysv/linux/arc/sys/cachectl.h | 36 ++++++++
sysdeps/unix/sysv/linux/arc/sys/ucontext.h | 61 ++++++++++++
sysdeps/unix/sysv/linux/arc/sys/user.h | 31 +++++++
sysdeps/unix/sysv/linux/arc/ucontext-macros.h | 29 ++++++
sysdeps/unix/sysv/linux/arc/ucontext_i.sym | 20 ++++
13 files changed, 604 insertions(+)
create mode 100644 sysdeps/arc/nptl/pthreaddef.h
create mode 100644 sysdeps/unix/sysv/linux/arc/bits/procfs.h
create mode 100644 sysdeps/unix/sysv/linux/arc/bits/types/__sigset_t.h
create mode 100644 sysdeps/unix/sysv/linux/arc/getcontext.S
create mode 100644 sysdeps/unix/sysv/linux/arc/makecontext.c
create mode 100644 sysdeps/unix/sysv/linux/arc/setcontext.S
create mode 100644 sysdeps/unix/sysv/linux/arc/sigcontextinfo.h
create mode 100644 sysdeps/unix/sysv/linux/arc/swapcontext.S
create mode 100644 sysdeps/unix/sysv/linux/arc/sys/cachectl.h
create mode 100644 sysdeps/unix/sysv/linux/arc/sys/ucontext.h
create mode 100644 sysdeps/unix/sysv/linux/arc/sys/user.h
create mode 100644 sysdeps/unix/sysv/linux/arc/ucontext-macros.h
create mode 100644 sysdeps/unix/sysv/linux/arc/ucontext_i.sym
Comments
On 22/04/2020 22:41, Vineet Gupta via Libc-alpha wrote:
> Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
As prior patches we do not use DCO, but rather copyright assignment.
Looks good, some style issues below.
> ---
> sysdeps/arc/nptl/pthreaddef.h | 32 +++++++
> sysdeps/unix/sysv/linux/arc/bits/procfs.h | 35 +++++++
> .../sysv/linux/arc/bits/types/__sigset_t.h | 12 +++
> sysdeps/unix/sysv/linux/arc/getcontext.S | 63 +++++++++++++
> sysdeps/unix/sysv/linux/arc/makecontext.c | 73 +++++++++++++++
> sysdeps/unix/sysv/linux/arc/setcontext.S | 92 +++++++++++++++++++
> sysdeps/unix/sysv/linux/arc/sigcontextinfo.h | 28 ++++++
> sysdeps/unix/sysv/linux/arc/swapcontext.S | 92 +++++++++++++++++++
> sysdeps/unix/sysv/linux/arc/sys/cachectl.h | 36 ++++++++
> sysdeps/unix/sysv/linux/arc/sys/ucontext.h | 61 ++++++++++++
> sysdeps/unix/sysv/linux/arc/sys/user.h | 31 +++++++
> sysdeps/unix/sysv/linux/arc/ucontext-macros.h | 29 ++++++
> sysdeps/unix/sysv/linux/arc/ucontext_i.sym | 20 ++++
> 13 files changed, 604 insertions(+)
> create mode 100644 sysdeps/arc/nptl/pthreaddef.h
> create mode 100644 sysdeps/unix/sysv/linux/arc/bits/procfs.h
> create mode 100644 sysdeps/unix/sysv/linux/arc/bits/types/__sigset_t.h
> create mode 100644 sysdeps/unix/sysv/linux/arc/getcontext.S
> create mode 100644 sysdeps/unix/sysv/linux/arc/makecontext.c
> create mode 100644 sysdeps/unix/sysv/linux/arc/setcontext.S
> create mode 100644 sysdeps/unix/sysv/linux/arc/sigcontextinfo.h
> create mode 100644 sysdeps/unix/sysv/linux/arc/swapcontext.S
> create mode 100644 sysdeps/unix/sysv/linux/arc/sys/cachectl.h
> create mode 100644 sysdeps/unix/sysv/linux/arc/sys/ucontext.h
> create mode 100644 sysdeps/unix/sysv/linux/arc/sys/user.h
> create mode 100644 sysdeps/unix/sysv/linux/arc/ucontext-macros.h
> create mode 100644 sysdeps/unix/sysv/linux/arc/ucontext_i.sym
>
> diff --git a/sysdeps/arc/nptl/pthreaddef.h b/sysdeps/arc/nptl/pthreaddef.h
> new file mode 100644
> index 000000000000..b265bf1a052c
> --- /dev/null
> +++ b/sysdeps/arc/nptl/pthreaddef.h
> @@ -0,0 +1,32 @@
> +/* pthread machine parameter definitions, ARC version.
> + Copyright (C) 2002-2020 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library. If not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +/* Default stack size. */
> +#define ARCH_STACK_DEFAULT_SIZE (2 * 1024 * 1024)
> +
> +/* Required stack pointer alignment at beginning. */
> +#define STACK_ALIGN 4
> +
> +/* Minimal stack size after allocating thread descriptor and guard size. */
> +#define MINIMAL_REST_STACK 2048
> +
> +/* Alignment requirement for TCB. */
> +#define TCB_ALIGNMENT 4
> +
> +/* Location of current stack frame. */
> +#define CURRENT_STACK_FRAME __builtin_frame_address (0)
Ok.
> diff --git a/sysdeps/unix/sysv/linux/arc/bits/procfs.h b/sysdeps/unix/sysv/linux/arc/bits/procfs.h
> new file mode 100644
> index 000000000000..465c40c71bbd
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/arc/bits/procfs.h
> @@ -0,0 +1,35 @@
> +/* Types for registers for sys/procfs.h. ARC version.
> + Copyright (C) 1996-2020 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library. If not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#ifndef _SYS_PROCFS_H
> +# error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
> +#endif
> +
> +#include <sys/ucontext.h>
> +
> +/* And the whole bunch of them. We could have used `struct
> + user_regs' directly in the typedef, but tradition says that
> + the register set is an array, which does have some peculiar
> + semantics, so leave it that way. */
> +#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof (elf_greg_t))
> +
> +typedef unsigned long int elf_greg_t;
> +typedef unsigned long int elf_gregset_t[ELF_NGREG];
> +
> +/* There's no seperate floating point reg file in ARCv2. */
> +typedef struct { } elf_fpregset_t;
Ok.
> diff --git a/sysdeps/unix/sysv/linux/arc/bits/types/__sigset_t.h b/sysdeps/unix/sysv/linux/arc/bits/types/__sigset_t.h
> new file mode 100644
> index 000000000000..795638a30bd3
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/arc/bits/types/__sigset_t.h
> @@ -0,0 +1,12 @@
> +/* Architecture-specific __sigset_t definition. ARC version. */
> +#ifndef ____sigset_t_defined
> +#define ____sigset_t_defined
> +
> +/* Linux asm-generic syscall ABI expects sigset_t to hold 64 signals. */
> +#define _SIGSET_NWORDS (64 / (8 * sizeof (unsigned long int)))
> +typedef struct
> +{
> + unsigned long int __val[_SIGSET_NWORDS];
> +} __sigset_t;
> +
> +#endif
Ok.
> diff --git a/sysdeps/unix/sysv/linux/arc/getcontext.S b/sysdeps/unix/sysv/linux/arc/getcontext.S
> new file mode 100644
> index 000000000000..e00aeb1a6931
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/arc/getcontext.S
> @@ -0,0 +1,63 @@
> +/* Save current context for ARC.
> + Copyright (C) 2009-2020 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library. If not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#include "ucontext-macros.h"
> +
> +/* int getcontext (ucontext_t *ucp)
> + Save machine context in @ucp and return 0 on success, -1 on error
> + - saves callee saved registers only
> + - layout mandated by uncontext_t:m_context (hence different from setjmp). */
> +
> +ENTRY (__getcontext)
> +
> + /* Callee saved registers. */
> + SAVE_REG (r13, r0, 37)
> + SAVE_REG (r14, r0, 36)
> + SAVE_REG (r15, r0, 35)
> + SAVE_REG (r16, r0, 34)
> + SAVE_REG (r17, r0, 33)
> + SAVE_REG (r18, r0, 32)
> + SAVE_REG (r19, r0, 31)
> + SAVE_REG (r20, r0, 30)
> + SAVE_REG (r21, r0, 29)
> + SAVE_REG (r22, r0, 28)
> + SAVE_REG (r23, r0, 27)
> + SAVE_REG (r24, r0, 26)
> + SAVE_REG (r25, r0, 25)
> +
> + SAVE_REG (blink, r0, 7)
> + SAVE_REG (fp, r0, 8)
> + SAVE_REG (sp, r0, 23)
> +
> + /* Save 0 in r0 placeholder to return 0 when this @ucp activated. */
> + mov r9, 0
> + SAVE_REG (r9, r0, 22)
> +
> + /* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8). */
> + mov r3, _NSIG8
> + add r2, r0, UCONTEXT_SIGMASK
> + mov r1, 0
> + mov r0, SIG_BLOCK
> + mov r8, __NR_rt_sigprocmask
> + ARC_TRAP_INSN
> + brhi r0, -1024, .Lcall_syscall_err
> + j.d [blink]
> + mov r0, 0 /* Success, error handled in .Lcall_syscall_err. */
> +
> +PSEUDO_END (__getcontext)
> +weak_alias (__getcontext, getcontext)
Ok.
> diff --git a/sysdeps/unix/sysv/linux/arc/makecontext.c b/sysdeps/unix/sysv/linux/arc/makecontext.c
> new file mode 100644
> index 000000000000..2aa7f328f6f5
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/arc/makecontext.c
> @@ -0,0 +1,73 @@
> +/* Create new context for ARC.
> + Copyright (C) 2015-2020 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#include <sysdep.h>
> +#include <stdarg.h>
> +#include <stdint.h>
> +#include <sys/ucontext.h>
> +
> +void
> +__makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
> +{
> + extern void __startcontext (void) attribute_hidden;
> + unsigned long int sp, *r;
> + va_list vl;
> + int i, reg_args, stack_args;
> +
> + sp = ((unsigned long int) ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size) & ~7;
> +
> + ucp->uc_mcontext.__scratch.__sp = sp;
> + ucp->uc_mcontext.__scratch.__fp = 0;
> +
> + /* __startcontext is sort of trampoline to invoke @func
> + From setcontext pov, the resume address is __startcontext,
> + set it up in BLINK place holder. */
> +
> + ucp->uc_mcontext.__scratch.__blink = (unsigned long int) &__startcontext;
> +
> + /* __startcontext passed 2 types of args
> + - args to @func setup in canonical r0-r7
> + - @func itself in r9, and next function in r10. */
> +
> + ucp->uc_mcontext.__callee.__r13 = (unsigned long int) func;
> + ucp->uc_mcontext.__callee.__r14 = (unsigned long int) ucp->uc_link;
> +
> + r = &ucp->uc_mcontext.__scratch.__r0;
> +
> + va_start (vl, argc);
> +
> + reg_args = argc > 8 ? 8 : argc;
> + for (i = 0; i < reg_args; i++)
> + *r-- = va_arg (vl, unsigned long int);
> +
> + stack_args = argc - reg_args;
> +
> + if (__glibc_unlikely (stack_args > 0))
> + {
> + sp -= stack_args * sizeof (unsigned long int);
Extra space after '-='.
> + ucp->uc_mcontext.__scratch.__sp = sp;
> + r = (unsigned long int *)sp;
Space after cast.
> +
> + for (i = 0; i < stack_args; i++)
> + *r++ = va_arg (vl, unsigned long int);
> + }
> +
> + va_end (vl);
> +}
> +
> +weak_alias (__makecontext, makecontext)
Ok.
> diff --git a/sysdeps/unix/sysv/linux/arc/setcontext.S b/sysdeps/unix/sysv/linux/arc/setcontext.S
> new file mode 100644
> index 000000000000..0cc496be1060
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/arc/setcontext.S
> @@ -0,0 +1,92 @@
> +/* Set current context for ARC.
> + Copyright (C) 2009-2020 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library. If not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#include "ucontext-macros.h"
> +
> +/* int setcontext (const ucontext_t *ucp)
> + - Restores the machine context in @ucp and resumes execution
> + (doesn't return to caller). */
> +
> +ENTRY (__setcontext)
> +
> + mov r9, r0 /* Stash @ucp across syscall. */
> +
> + /* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, NULL, _NSIG8) */
Missing period and double space prior comment close.
> + mov r3, _NSIG8
> + mov r2, 0
> + add r1, r0, UCONTEXT_SIGMASK
> + mov r0, SIG_SETMASK
> + mov r8, __NR_rt_sigprocmask
> + ARC_TRAP_INSN
> + brhi r0, -1024, .Lcall_syscall_err
> +
> + /* Restore scratch/arg regs for makecontext case. */
> + LOAD_REG (r0, r9, 22)
> + LOAD_REG (r1, r9, 21)
> + LOAD_REG (r2, r9, 20)
> + LOAD_REG (r3, r9, 19)
> + LOAD_REG (r4, r9, 18)
> + LOAD_REG (r5, r9, 17)
> + LOAD_REG (r6, r9, 16)
> + LOAD_REG (r7, r9, 15)
> +
> + /* Restore callee saved registers. */
> + LOAD_REG (r13, r9, 37)
> + LOAD_REG (r14, r9, 36)
> + LOAD_REG (r15, r9, 35)
> + LOAD_REG (r16, r9, 34)
> + LOAD_REG (r17, r9, 33)
> + LOAD_REG (r18, r9, 32)
> + LOAD_REG (r19, r9, 31)
> + LOAD_REG (r20, r9, 30)
> + LOAD_REG (r21, r9, 29)
> + LOAD_REG (r22, r9, 28)
> + LOAD_REG (r23, r9, 27)
> + LOAD_REG (r24, r9, 26)
> + LOAD_REG (r25, r9, 25)
> +
> + LOAD_REG (blink, r9, 7)
> + LOAD_REG (fp, r9, 8)
> + LOAD_REG (sp, r9, 23)
> +
> + j [blink]
> +
> +PSEUDO_END (__setcontext)
> +weak_alias (__setcontext, setcontext)
> +
> +
> +/* Helper for activating makecontext created context
> + - r13 has @func, r14 has uc_link. */
> +
> +ENTRY (__startcontext)
> +
> + .cfi_label .Ldummy
> + cfi_undefined (blink)
> +
> + /* Call user @func, loaded in r13 by setcontext. */
> + jl [r13]
> +
> + /* If uc_link (r14) call setcontext with that. */
> + mov r0, r14
> + breq r0, 0, 1f
> +
> + bl __setcontext
> +1:
> + /* Exit with status 0. */
> + b HIDDEN_JUMPTARGET(exit)
> +END (__startcontext)
The identation seems off here compared to the rest of the file.
> diff --git a/sysdeps/unix/sysv/linux/arc/sigcontextinfo.h b/sysdeps/unix/sysv/linux/arc/sigcontextinfo.h
> new file mode 100644
> index 000000000000..551b4c9c1d2b
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/arc/sigcontextinfo.h
> @@ -0,0 +1,28 @@
> +/* ARC definitions for signal handling calling conventions.
> + Copyright (C) 2017-2020 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#ifndef _SIGCONTEXTINFO_H
> +#define _SIGCONTEXTINFO_H
> +
> +static inline uintptr_t
> +sigcontext_get_pc (const ucontext_t *ctx)
> +{
> + return ctx->uc_mcontext.__scratch.__ret;
> +}
> +
> +#endif
Ok.
> diff --git a/sysdeps/unix/sysv/linux/arc/swapcontext.S b/sysdeps/unix/sysv/linux/arc/swapcontext.S
> new file mode 100644
> index 000000000000..80ae73975af9
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/arc/swapcontext.S
> @@ -0,0 +1,92 @@
> +/* Save and set current context for ARC.
> + Copyright (C) 2009-2020 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library. If not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#include "ucontext-macros.h"
> +
> +/* int swapcontext (ucontext_t *oucp, const ucontext_t *ucp). */
> +
> +ENTRY (__swapcontext)
> +
> + /* Save context into @oucp pointed to by r0. */
> +
> + SAVE_REG (r13, r0, 37)
> + SAVE_REG (r14, r0, 36)
> + SAVE_REG (r15, r0, 35)
> + SAVE_REG (r16, r0, 34)
> + SAVE_REG (r17, r0, 33)
> + SAVE_REG (r18, r0, 32)
> + SAVE_REG (r19, r0, 31)
> + SAVE_REG (r20, r0, 30)
> + SAVE_REG (r21, r0, 29)
> + SAVE_REG (r22, r0, 28)
> + SAVE_REG (r23, r0, 27)
> + SAVE_REG (r24, r0, 26)
> + SAVE_REG (r25, r0, 25)
> +
> + SAVE_REG (blink, r0, 7)
> + SAVE_REG (fp, r0, 8)
> + SAVE_REG (sp, r0, 23)
> +
> + /* Save 0 in r0 placeholder to return 0 when @oucp activated. */
> + mov r9, 0
> + SAVE_REG (r9, r0, 22)
> +
> + /* Load context from @ucp. */
> +
> + mov r9, r1 /* Safekeep @ucp across syscall. */
> +
> + /* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, &oucp->uc_sigmask, _NSIG8) */
> + mov r3, _NSIG8
> + add r2, r0, UCONTEXT_SIGMASK
> + add r1, r1, UCONTEXT_SIGMASK
> + mov r0, SIG_SETMASK
> + mov r8, __NR_rt_sigprocmask
> + ARC_TRAP_INSN
> + brhi r0, -1024, .Lcall_syscall_err
> +
> + LOAD_REG (r0, r9, 22)
> + LOAD_REG (r1, r9, 21)
> + LOAD_REG (r2, r9, 20)
> + LOAD_REG (r3, r9, 19)
> + LOAD_REG (r4, r9, 18)
> + LOAD_REG (r5, r9, 17)
> + LOAD_REG (r6, r9, 16)
> + LOAD_REG (r7, r9, 15)
> +
> + LOAD_REG (r13, r9, 37)
> + LOAD_REG (r14, r9, 36)
> + LOAD_REG (r15, r9, 35)
> + LOAD_REG (r16, r9, 34)
> + LOAD_REG (r17, r9, 33)
> + LOAD_REG (r18, r9, 32)
> + LOAD_REG (r19, r9, 31)
> + LOAD_REG (r20, r9, 30)
> + LOAD_REG (r21, r9, 29)
> + LOAD_REG (r22, r9, 28)
> + LOAD_REG (r23, r9, 27)
> + LOAD_REG (r24, r9, 26)
> + LOAD_REG (r25, r9, 25)
> +
> + LOAD_REG (blink, r9, 7)
> + LOAD_REG (fp, r9, 8)
> + LOAD_REG (sp, r9, 23)
> +
> + j [blink]
> +
> +PSEUDO_END (__swapcontext)
> +weak_alias (__swapcontext, swapcontext)
Ok.
> diff --git a/sysdeps/unix/sysv/linux/arc/sys/cachectl.h b/sysdeps/unix/sysv/linux/arc/sys/cachectl.h
> new file mode 100644
> index 000000000000..1acb4018ae69
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/arc/sys/cachectl.h
> @@ -0,0 +1,36 @@
> +/* cacheflush - flush contents of instruction and/or data cache.
> + Copyright (C) 2017-2020 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library. If not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#ifndef _SYS_CACHECTL_H
> +#define _SYS_CACHECTL_H 1
> +
> +#include <features.h>
> +
> +/* Get the kernel definition for the op bits. */
> +#include <asm/cachectl.h>
> +
> +__BEGIN_DECLS
> +
> +#ifdef __USE_MISC
> +extern int cacheflush (void *__addr, const int __nbytes, const int __op) __THROW;
> +#endif
> +extern int _flush_cache (char *__addr, const int __nbytes, const int __op) __THROW;
Why do you need to export the _flush_cache as well?
> +
> +__END_DECLS
> +
> +#endif /* sys/cachectl.h */
Missing period and double space prior comment close.
> diff --git a/sysdeps/unix/sysv/linux/arc/sys/ucontext.h b/sysdeps/unix/sysv/linux/arc/sys/ucontext.h
> new file mode 100644
> index 000000000000..efbb9b2d20a7
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/arc/sys/ucontext.h
> @@ -0,0 +1,61 @@
> +/* struct ucontext definition, ARC version.
> + Copyright (C) 2017-2020 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +/* System V/ARC ABI compliant context switching support. */
> +
> +#ifndef _SYS_UCONTEXT_H
> +#define _SYS_UCONTEXT_H 1
> +
> +#include <features.h>
> +
> +#include <bits/types/sigset_t.h>
> +#include <bits/types/stack_t.h>
> +
> +typedef struct
> + {
> + unsigned long int __pad;
> + struct {
> + unsigned long int __bta;
> + unsigned long int __lp_start, __lp_end, __lp_count;
> + unsigned long int __status32, __ret, __blink;
> + unsigned long int __fp, __gp;
> + unsigned long int __r12, __r11, __r10, __r9, __r8, __r7;
> + unsigned long int __r6, __r5, __r4, __r3, __r2, __r1, __r0;
> + unsigned long int __sp;
> + } __scratch;
> + unsigned long int __pad2;
> + struct {
> + unsigned long int __r25, __r24, __r23, __r22, __r21, __r20;
> + unsigned long int __r19, __r18, __r17, __r16, __r15, __r14, __r13;
> + } __callee;
> + unsigned long int __efa;
> + unsigned long int __stop_pc;
> + unsigned long int __r30, __r58, __r59;
> + } mcontext_t;
> +
> +/* Userlevel context. */
> +typedef struct ucontext_t
> + {
> + unsigned long int __uc_flags;
> + struct ucontext_t *uc_link;
> + stack_t uc_stack;
> + mcontext_t uc_mcontext;
> + sigset_t uc_sigmask;
> + } ucontext_t;
> +
> +#endif /* sys/ucontext.h */
Missing period and double space prior comment close.
> diff --git a/sysdeps/unix/sysv/linux/arc/sys/user.h b/sysdeps/unix/sysv/linux/arc/sys/user.h
> new file mode 100644
> index 000000000000..a556d2113d9c
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/arc/sys/user.h
> @@ -0,0 +1,31 @@
> +/* ptrace register data format definitions.
> + Copyright (C) 1998-2020 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#ifndef _SYS_USER_H
> +#define _SYS_USER_H 1
> +
> +/* Struct user_regs_struct is exported by kernel header
> + However apps like strace also expect a struct user, so it's better to
> + have a dummy implementation. */
> +#include <asm/ptrace.h>
> +
> +struct user {
> + int dummy;
Indentation seems off here.
> +};
> +
> +#endif /* sys/user.h */
Missing period and double space prior comment close.
> diff --git a/sysdeps/unix/sysv/linux/arc/ucontext-macros.h b/sysdeps/unix/sysv/linux/arc/ucontext-macros.h
> new file mode 100644
> index 000000000000..4427be5dedd6
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/arc/ucontext-macros.h
> @@ -0,0 +1,29 @@
> +/* Macros for ucontext routines, ARC version.
> + Copyright (C) 2017-2020 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library. If not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#ifndef _LINUX_ARC_UCONTEXT_MACROS_H
> +#define _LINUX_ARC_UCONTEXT_MACROS_H
> +
> +#include <sysdep.h>
> +
> +#include "ucontext_i.h"
> +
> +#define SAVE_REG(reg, rbase, off) st reg, [rbase, UCONTEXT_MCONTEXT + off * 4]
> +#define LOAD_REG(reg, rbase, off) ld reg, [rbase, UCONTEXT_MCONTEXT + off * 4]
> +
> +#endif
Ok.
> diff --git a/sysdeps/unix/sysv/linux/arc/ucontext_i.sym b/sysdeps/unix/sysv/linux/arc/ucontext_i.sym
> new file mode 100644
> index 000000000000..d84e92f9f543
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/arc/ucontext_i.sym
> @@ -0,0 +1,20 @@
> +#include <inttypes.h>
> +#include <signal.h>
> +#include <stddef.h>
> +#include <sys/ucontext.h>
> +
> +SIG_BLOCK
> +SIG_SETMASK
> +
> +-- sizeof(sigset_t) expected by kernel: see comment in ARC sigaction.c for details
> +_NSIG8 (_NSIG / 8)
> +
> +-- Offsets of the fields in the ucontext_t structure.
> +#define ucontext(member) offsetof (ucontext_t, member)
> +
> +UCONTEXT_FLAGS ucontext (__uc_flags)
> +UCONTEXT_LINK ucontext (uc_link)
> +UCONTEXT_STACK ucontext (uc_stack)
> +UCONTEXT_MCONTEXT ucontext (uc_mcontext)
> +UCONTEXT_SIGMASK ucontext (uc_sigmask)
> +UCONTEXT_SIZE sizeof (ucontext_t)
>
Ok.
On 5/29/20 10:05 AM, Adhemerval Zanella via Libc-alpha wrote:
>
>
> On 22/04/2020 22:41, Vineet Gupta via Libc-alpha wrote:
>> Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
>
> As prior patches we do not use DCO, but rather copyright assignment.
>
> Looks good, some style issues below.
>> diff --git a/sysdeps/unix/sysv/linux/arc/makecontext.c b/sysdeps/unix/sysv/linux/arc/makecontext.c
>> +
>> + if (__glibc_unlikely (stack_args > 0))
>> + {
>> + sp -= stack_args * sizeof (unsigned long int);
>
> Extra space after '-='.
Fixed.
>> + ucp->uc_mcontext.__scratch.__sp = sp;
>> + r = (unsigned long int *)sp;
>
> Space after cast.
Fixed.
>
>> diff --git a/sysdeps/unix/sysv/linux/arc/setcontext.S b/sysdeps/unix/sysv/linux/arc/setcontext.S
>> +
>> +#include "ucontext-macros.h"
>> +
>> +/* int setcontext (const ucontext_t *ucp)
>> + - Restores the machine context in @ucp and resumes execution
>> + (doesn't return to caller). */
>> +
>> +ENTRY (__setcontext)
>> +
>> + mov r9, r0 /* Stash @ucp across syscall. */
>> +
>> + /* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, NULL, _NSIG8) */
>
> Missing period and double space prior comment close.
Fixed.
>> +
>> + LOAD_REG (blink, r9, 7)
>> + LOAD_REG (fp, r9, 8)
>> + LOAD_REG (sp, r9, 23)
FWIW, I'll just open code these macros.
>> + /* Exit with status 0. */
>> + b HIDDEN_JUMPTARGET(exit)
>> +END (__startcontext)
>
> The identation seems off here compared to the rest of the file.
Fixed.
>> diff --git a/sysdeps/unix/sysv/linux/arc/sys/cachectl.h b/sysdeps/unix/sysv/linux/arc/sys/cachectl.h
>> +
>> +#ifdef __USE_MISC
>> +extern int cacheflush (void *__addr, const int __nbytes, const int __op) __THROW;
>> +#endif
>> +extern int _flush_cache (char *__addr, const int __nbytes, const int __op) __THROW;
>
> Why do you need to export the _flush_cache as well?
copy/paste from MIPS maybe. I'll drop from here and assume the strong reference
in arc/syscalls.list would work still ?
>
>> +
>> +__END_DECLS
>> +
>> +#endif /* sys/cachectl.h */
>
> Missing period and double space prior comment close.
Fixed.
>
>> diff --git a/sysdeps/unix/sysv/linux/arc/sys/ucontext.h b/sysdeps/unix/sysv/linux/arc/sys/ucontext.h
>> +
>> +typedef struct
>> + {
>> + unsigned long int __pad;
>> + struct {
>> + unsigned long int __bta;
>> + unsigned long int __lp_start, __lp_end, __lp_count;
>> + unsigned long int __status32, __ret, __blink;
>> + unsigned long int __fp, __gp;
>> + unsigned long int __r12, __r11, __r10, __r9, __r8, __r7;
>> + unsigned long int __r6, __r5, __r4, __r3, __r2, __r1, __r0;
>> + unsigned long int __sp;
>> + } __scratch;
>> + unsigned long int __pad2;
>> + struct {
>> + unsigned long int __r25, __r24, __r23, __r22, __r21, __r20;
>> + unsigned long int __r19, __r18, __r17, __r16, __r15, __r14, __r13;
>> + } __callee;
>> + unsigned long int __efa;
>> + unsigned long int __stop_pc;
>> + unsigned long int __r30, __r58, __r59;
>> + } mcontext_t;
I will rework this a bit by removing __scratch and __callee containers for future
64-bit port with slighty different ABI.
>> +
>> +/* Userlevel context. */
>> +typedef struct ucontext_t
>> + {
>> + unsigned long int __uc_flags;
>> + struct ucontext_t *uc_link;
>> + stack_t uc_stack;
>> + mcontext_t uc_mcontext;
>> + sigset_t uc_sigmask;
>> + } ucontext_t;
>> +
>> +#endif /* sys/ucontext.h */
>
> Missing period and double space prior comment close.
Fixed.
>> diff --git a/sysdeps/unix/sysv/linux/arc/sys/user.h b/sysdeps/unix/sysv/linux/arc/sys/user.h
>> +
>> +#ifndef _SYS_USER_H
>> +#define _SYS_USER_H 1
>> +
>> +/* Struct user_regs_struct is exported by kernel header
>> + However apps like strace also expect a struct user, so it's better to
>> + have a dummy implementation. */
>> +#include <asm/ptrace.h>
>> +
>> +struct user {
>> + int dummy;
>
> Indentation seems off here.
Fixed.
>> +};
>> +
>> +#endif /* sys/user.h */
>
> Missing period and double space prior comment close.
Fixed.
new file mode 100644
@@ -0,0 +1,32 @@
+/* pthread machine parameter definitions, ARC version.
+ Copyright (C) 2002-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library. If not, see
+ <https://www.gnu.org/licenses/>. */
+
+/* Default stack size. */
+#define ARCH_STACK_DEFAULT_SIZE (2 * 1024 * 1024)
+
+/* Required stack pointer alignment at beginning. */
+#define STACK_ALIGN 4
+
+/* Minimal stack size after allocating thread descriptor and guard size. */
+#define MINIMAL_REST_STACK 2048
+
+/* Alignment requirement for TCB. */
+#define TCB_ALIGNMENT 4
+
+/* Location of current stack frame. */
+#define CURRENT_STACK_FRAME __builtin_frame_address (0)
new file mode 100644
@@ -0,0 +1,35 @@
+/* Types for registers for sys/procfs.h. ARC version.
+ Copyright (C) 1996-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library. If not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _SYS_PROCFS_H
+# error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
+#endif
+
+#include <sys/ucontext.h>
+
+/* And the whole bunch of them. We could have used `struct
+ user_regs' directly in the typedef, but tradition says that
+ the register set is an array, which does have some peculiar
+ semantics, so leave it that way. */
+#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof (elf_greg_t))
+
+typedef unsigned long int elf_greg_t;
+typedef unsigned long int elf_gregset_t[ELF_NGREG];
+
+/* There's no seperate floating point reg file in ARCv2. */
+typedef struct { } elf_fpregset_t;
new file mode 100644
@@ -0,0 +1,12 @@
+/* Architecture-specific __sigset_t definition. ARC version. */
+#ifndef ____sigset_t_defined
+#define ____sigset_t_defined
+
+/* Linux asm-generic syscall ABI expects sigset_t to hold 64 signals. */
+#define _SIGSET_NWORDS (64 / (8 * sizeof (unsigned long int)))
+typedef struct
+{
+ unsigned long int __val[_SIGSET_NWORDS];
+} __sigset_t;
+
+#endif
new file mode 100644
@@ -0,0 +1,63 @@
+/* Save current context for ARC.
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library. If not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include "ucontext-macros.h"
+
+/* int getcontext (ucontext_t *ucp)
+ Save machine context in @ucp and return 0 on success, -1 on error
+ - saves callee saved registers only
+ - layout mandated by uncontext_t:m_context (hence different from setjmp). */
+
+ENTRY (__getcontext)
+
+ /* Callee saved registers. */
+ SAVE_REG (r13, r0, 37)
+ SAVE_REG (r14, r0, 36)
+ SAVE_REG (r15, r0, 35)
+ SAVE_REG (r16, r0, 34)
+ SAVE_REG (r17, r0, 33)
+ SAVE_REG (r18, r0, 32)
+ SAVE_REG (r19, r0, 31)
+ SAVE_REG (r20, r0, 30)
+ SAVE_REG (r21, r0, 29)
+ SAVE_REG (r22, r0, 28)
+ SAVE_REG (r23, r0, 27)
+ SAVE_REG (r24, r0, 26)
+ SAVE_REG (r25, r0, 25)
+
+ SAVE_REG (blink, r0, 7)
+ SAVE_REG (fp, r0, 8)
+ SAVE_REG (sp, r0, 23)
+
+ /* Save 0 in r0 placeholder to return 0 when this @ucp activated. */
+ mov r9, 0
+ SAVE_REG (r9, r0, 22)
+
+ /* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8). */
+ mov r3, _NSIG8
+ add r2, r0, UCONTEXT_SIGMASK
+ mov r1, 0
+ mov r0, SIG_BLOCK
+ mov r8, __NR_rt_sigprocmask
+ ARC_TRAP_INSN
+ brhi r0, -1024, .Lcall_syscall_err
+ j.d [blink]
+ mov r0, 0 /* Success, error handled in .Lcall_syscall_err. */
+
+PSEUDO_END (__getcontext)
+weak_alias (__getcontext, getcontext)
new file mode 100644
@@ -0,0 +1,73 @@
+/* Create new context for ARC.
+ Copyright (C) 2015-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <sys/ucontext.h>
+
+void
+__makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
+{
+ extern void __startcontext (void) attribute_hidden;
+ unsigned long int sp, *r;
+ va_list vl;
+ int i, reg_args, stack_args;
+
+ sp = ((unsigned long int) ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size) & ~7;
+
+ ucp->uc_mcontext.__scratch.__sp = sp;
+ ucp->uc_mcontext.__scratch.__fp = 0;
+
+ /* __startcontext is sort of trampoline to invoke @func
+ From setcontext pov, the resume address is __startcontext,
+ set it up in BLINK place holder. */
+
+ ucp->uc_mcontext.__scratch.__blink = (unsigned long int) &__startcontext;
+
+ /* __startcontext passed 2 types of args
+ - args to @func setup in canonical r0-r7
+ - @func itself in r9, and next function in r10. */
+
+ ucp->uc_mcontext.__callee.__r13 = (unsigned long int) func;
+ ucp->uc_mcontext.__callee.__r14 = (unsigned long int) ucp->uc_link;
+
+ r = &ucp->uc_mcontext.__scratch.__r0;
+
+ va_start (vl, argc);
+
+ reg_args = argc > 8 ? 8 : argc;
+ for (i = 0; i < reg_args; i++)
+ *r-- = va_arg (vl, unsigned long int);
+
+ stack_args = argc - reg_args;
+
+ if (__glibc_unlikely (stack_args > 0))
+ {
+ sp -= stack_args * sizeof (unsigned long int);
+ ucp->uc_mcontext.__scratch.__sp = sp;
+ r = (unsigned long int *)sp;
+
+ for (i = 0; i < stack_args; i++)
+ *r++ = va_arg (vl, unsigned long int);
+ }
+
+ va_end (vl);
+}
+
+weak_alias (__makecontext, makecontext)
new file mode 100644
@@ -0,0 +1,92 @@
+/* Set current context for ARC.
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library. If not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include "ucontext-macros.h"
+
+/* int setcontext (const ucontext_t *ucp)
+ - Restores the machine context in @ucp and resumes execution
+ (doesn't return to caller). */
+
+ENTRY (__setcontext)
+
+ mov r9, r0 /* Stash @ucp across syscall. */
+
+ /* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, NULL, _NSIG8) */
+ mov r3, _NSIG8
+ mov r2, 0
+ add r1, r0, UCONTEXT_SIGMASK
+ mov r0, SIG_SETMASK
+ mov r8, __NR_rt_sigprocmask
+ ARC_TRAP_INSN
+ brhi r0, -1024, .Lcall_syscall_err
+
+ /* Restore scratch/arg regs for makecontext case. */
+ LOAD_REG (r0, r9, 22)
+ LOAD_REG (r1, r9, 21)
+ LOAD_REG (r2, r9, 20)
+ LOAD_REG (r3, r9, 19)
+ LOAD_REG (r4, r9, 18)
+ LOAD_REG (r5, r9, 17)
+ LOAD_REG (r6, r9, 16)
+ LOAD_REG (r7, r9, 15)
+
+ /* Restore callee saved registers. */
+ LOAD_REG (r13, r9, 37)
+ LOAD_REG (r14, r9, 36)
+ LOAD_REG (r15, r9, 35)
+ LOAD_REG (r16, r9, 34)
+ LOAD_REG (r17, r9, 33)
+ LOAD_REG (r18, r9, 32)
+ LOAD_REG (r19, r9, 31)
+ LOAD_REG (r20, r9, 30)
+ LOAD_REG (r21, r9, 29)
+ LOAD_REG (r22, r9, 28)
+ LOAD_REG (r23, r9, 27)
+ LOAD_REG (r24, r9, 26)
+ LOAD_REG (r25, r9, 25)
+
+ LOAD_REG (blink, r9, 7)
+ LOAD_REG (fp, r9, 8)
+ LOAD_REG (sp, r9, 23)
+
+ j [blink]
+
+PSEUDO_END (__setcontext)
+weak_alias (__setcontext, setcontext)
+
+
+/* Helper for activating makecontext created context
+ - r13 has @func, r14 has uc_link. */
+
+ENTRY (__startcontext)
+
+ .cfi_label .Ldummy
+ cfi_undefined (blink)
+
+ /* Call user @func, loaded in r13 by setcontext. */
+ jl [r13]
+
+ /* If uc_link (r14) call setcontext with that. */
+ mov r0, r14
+ breq r0, 0, 1f
+
+ bl __setcontext
+1:
+ /* Exit with status 0. */
+ b HIDDEN_JUMPTARGET(exit)
+END (__startcontext)
new file mode 100644
@@ -0,0 +1,28 @@
+/* ARC definitions for signal handling calling conventions.
+ Copyright (C) 2017-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _SIGCONTEXTINFO_H
+#define _SIGCONTEXTINFO_H
+
+static inline uintptr_t
+sigcontext_get_pc (const ucontext_t *ctx)
+{
+ return ctx->uc_mcontext.__scratch.__ret;
+}
+
+#endif
new file mode 100644
@@ -0,0 +1,92 @@
+/* Save and set current context for ARC.
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library. If not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include "ucontext-macros.h"
+
+/* int swapcontext (ucontext_t *oucp, const ucontext_t *ucp). */
+
+ENTRY (__swapcontext)
+
+ /* Save context into @oucp pointed to by r0. */
+
+ SAVE_REG (r13, r0, 37)
+ SAVE_REG (r14, r0, 36)
+ SAVE_REG (r15, r0, 35)
+ SAVE_REG (r16, r0, 34)
+ SAVE_REG (r17, r0, 33)
+ SAVE_REG (r18, r0, 32)
+ SAVE_REG (r19, r0, 31)
+ SAVE_REG (r20, r0, 30)
+ SAVE_REG (r21, r0, 29)
+ SAVE_REG (r22, r0, 28)
+ SAVE_REG (r23, r0, 27)
+ SAVE_REG (r24, r0, 26)
+ SAVE_REG (r25, r0, 25)
+
+ SAVE_REG (blink, r0, 7)
+ SAVE_REG (fp, r0, 8)
+ SAVE_REG (sp, r0, 23)
+
+ /* Save 0 in r0 placeholder to return 0 when @oucp activated. */
+ mov r9, 0
+ SAVE_REG (r9, r0, 22)
+
+ /* Load context from @ucp. */
+
+ mov r9, r1 /* Safekeep @ucp across syscall. */
+
+ /* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, &oucp->uc_sigmask, _NSIG8) */
+ mov r3, _NSIG8
+ add r2, r0, UCONTEXT_SIGMASK
+ add r1, r1, UCONTEXT_SIGMASK
+ mov r0, SIG_SETMASK
+ mov r8, __NR_rt_sigprocmask
+ ARC_TRAP_INSN
+ brhi r0, -1024, .Lcall_syscall_err
+
+ LOAD_REG (r0, r9, 22)
+ LOAD_REG (r1, r9, 21)
+ LOAD_REG (r2, r9, 20)
+ LOAD_REG (r3, r9, 19)
+ LOAD_REG (r4, r9, 18)
+ LOAD_REG (r5, r9, 17)
+ LOAD_REG (r6, r9, 16)
+ LOAD_REG (r7, r9, 15)
+
+ LOAD_REG (r13, r9, 37)
+ LOAD_REG (r14, r9, 36)
+ LOAD_REG (r15, r9, 35)
+ LOAD_REG (r16, r9, 34)
+ LOAD_REG (r17, r9, 33)
+ LOAD_REG (r18, r9, 32)
+ LOAD_REG (r19, r9, 31)
+ LOAD_REG (r20, r9, 30)
+ LOAD_REG (r21, r9, 29)
+ LOAD_REG (r22, r9, 28)
+ LOAD_REG (r23, r9, 27)
+ LOAD_REG (r24, r9, 26)
+ LOAD_REG (r25, r9, 25)
+
+ LOAD_REG (blink, r9, 7)
+ LOAD_REG (fp, r9, 8)
+ LOAD_REG (sp, r9, 23)
+
+ j [blink]
+
+PSEUDO_END (__swapcontext)
+weak_alias (__swapcontext, swapcontext)
new file mode 100644
@@ -0,0 +1,36 @@
+/* cacheflush - flush contents of instruction and/or data cache.
+ Copyright (C) 2017-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library. If not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _SYS_CACHECTL_H
+#define _SYS_CACHECTL_H 1
+
+#include <features.h>
+
+/* Get the kernel definition for the op bits. */
+#include <asm/cachectl.h>
+
+__BEGIN_DECLS
+
+#ifdef __USE_MISC
+extern int cacheflush (void *__addr, const int __nbytes, const int __op) __THROW;
+#endif
+extern int _flush_cache (char *__addr, const int __nbytes, const int __op) __THROW;
+
+__END_DECLS
+
+#endif /* sys/cachectl.h */
new file mode 100644
@@ -0,0 +1,61 @@
+/* struct ucontext definition, ARC version.
+ Copyright (C) 2017-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+/* System V/ARC ABI compliant context switching support. */
+
+#ifndef _SYS_UCONTEXT_H
+#define _SYS_UCONTEXT_H 1
+
+#include <features.h>
+
+#include <bits/types/sigset_t.h>
+#include <bits/types/stack_t.h>
+
+typedef struct
+ {
+ unsigned long int __pad;
+ struct {
+ unsigned long int __bta;
+ unsigned long int __lp_start, __lp_end, __lp_count;
+ unsigned long int __status32, __ret, __blink;
+ unsigned long int __fp, __gp;
+ unsigned long int __r12, __r11, __r10, __r9, __r8, __r7;
+ unsigned long int __r6, __r5, __r4, __r3, __r2, __r1, __r0;
+ unsigned long int __sp;
+ } __scratch;
+ unsigned long int __pad2;
+ struct {
+ unsigned long int __r25, __r24, __r23, __r22, __r21, __r20;
+ unsigned long int __r19, __r18, __r17, __r16, __r15, __r14, __r13;
+ } __callee;
+ unsigned long int __efa;
+ unsigned long int __stop_pc;
+ unsigned long int __r30, __r58, __r59;
+ } mcontext_t;
+
+/* Userlevel context. */
+typedef struct ucontext_t
+ {
+ unsigned long int __uc_flags;
+ struct ucontext_t *uc_link;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext;
+ sigset_t uc_sigmask;
+ } ucontext_t;
+
+#endif /* sys/ucontext.h */
new file mode 100644
@@ -0,0 +1,31 @@
+/* ptrace register data format definitions.
+ Copyright (C) 1998-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _SYS_USER_H
+#define _SYS_USER_H 1
+
+/* Struct user_regs_struct is exported by kernel header
+ However apps like strace also expect a struct user, so it's better to
+ have a dummy implementation. */
+#include <asm/ptrace.h>
+
+struct user {
+ int dummy;
+};
+
+#endif /* sys/user.h */
new file mode 100644
@@ -0,0 +1,29 @@
+/* Macros for ucontext routines, ARC version.
+ Copyright (C) 2017-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library. If not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _LINUX_ARC_UCONTEXT_MACROS_H
+#define _LINUX_ARC_UCONTEXT_MACROS_H
+
+#include <sysdep.h>
+
+#include "ucontext_i.h"
+
+#define SAVE_REG(reg, rbase, off) st reg, [rbase, UCONTEXT_MCONTEXT + off * 4]
+#define LOAD_REG(reg, rbase, off) ld reg, [rbase, UCONTEXT_MCONTEXT + off * 4]
+
+#endif
new file mode 100644
@@ -0,0 +1,20 @@
+#include <inttypes.h>
+#include <signal.h>
+#include <stddef.h>
+#include <sys/ucontext.h>
+
+SIG_BLOCK
+SIG_SETMASK
+
+-- sizeof(sigset_t) expected by kernel: see comment in ARC sigaction.c for details
+_NSIG8 (_NSIG / 8)
+
+-- Offsets of the fields in the ucontext_t structure.
+#define ucontext(member) offsetof (ucontext_t, member)
+
+UCONTEXT_FLAGS ucontext (__uc_flags)
+UCONTEXT_LINK ucontext (uc_link)
+UCONTEXT_STACK ucontext (uc_stack)
+UCONTEXT_MCONTEXT ucontext (uc_mcontext)
+UCONTEXT_SIGMASK ucontext (uc_sigmask)
+UCONTEXT_SIZE sizeof (ucontext_t)