[PATCH v6 08/13] ARC: Linux ABI

Adhemerval Zanella adhemerval.zanella@linaro.org
Fri May 29 17:05:24 GMT 2020



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.


More information about the Libc-alpha mailing list