All of lore.kernel.org
 help / color / mirror / Atom feed
From: vineet.gupta1@synopsys.com (Vineet Gupta)
To: linux-snps-arc@lists.infradead.org
Subject: [PATCH v2 08/15] ARC: Linux ABI
Date: Tue, 29 Jan 2019 17:25:48 -0800	[thread overview]
Message-ID: <1548811555-24373-9-git-send-email-vgupta@synopsys.com> (raw)
In-Reply-To: <1548811555-24373-1-git-send-email-vgupta@synopsys.com>

Signed-off-by: Vineet Gupta <vgupta at synopsys.com>
---
 ChangeLog                                          | 15 ++++
 sysdeps/arc/nptl/pthread-offsets.h                 |  5 ++
 sysdeps/arc/nptl/pthreaddef.h                      | 32 ++++++++
 sysdeps/unix/sysv/linux/arc/bits/procfs.h          | 35 ++++++++
 .../unix/sysv/linux/arc/bits/types/__sigset_t.h    | 12 +++
 sysdeps/unix/sysv/linux/arc/getcontext.S           | 63 +++++++++++++++
 sysdeps/unix/sysv/linux/arc/ipc_priv.h             | 21 +++++
 sysdeps/unix/sysv/linux/arc/makecontext.c          | 75 ++++++++++++++++++
 sysdeps/unix/sysv/linux/arc/setcontext.S           | 92 ++++++++++++++++++++++
 sysdeps/unix/sysv/linux/arc/sigcontextinfo.h       | 23 ++++++
 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         | 63 +++++++++++++++
 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 +++++
 16 files changed, 644 insertions(+)
 create mode 100644 sysdeps/arc/nptl/pthread-offsets.h
 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/ipc_priv.h
 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/ChangeLog b/ChangeLog
index b5da8c28e64c..e0f2c3372e31 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -52,6 +52,21 @@
 	* sysdeps/unix/sysv/linux/arc/sysdep.c: New file.
 	* sysdeps/unix/sysv/linux/arc/sysdep.h: New file.
 	* sysdeps/unix/sysv/linux/arc/vfork.S: New file.
+	* sysdeps/arc/nptl/pthread-offsets.h: New file.
+	* sysdeps/arc/nptl/pthreaddef.h: New file.
+	* sysdeps/unix/sysv/linux/arc/bits/procfs.h: New file.
+	* sysdeps/unix/sysv/linux/arc/bits/types/__sigset_t.h: New file.
+	* sysdeps/unix/sysv/linux/arc/getcontext.S: New file.
+	* sysdeps/unix/sysv/linux/arc/ipc_priv.h: New file.
+	* sysdeps/unix/sysv/linux/arc/makecontext.c: New file.
+	* sysdeps/unix/sysv/linux/arc/setcontext.S: New file.
+	* sysdeps/unix/sysv/linux/arc/sigcontextinfo.h: New file.
+	* sysdeps/unix/sysv/linux/arc/swapcontext.S: New file.
+	* sysdeps/unix/sysv/linux/arc/sys/cachectl.h: New file.
+	* sysdeps/unix/sysv/linux/arc/sys/ucontext.h: New file.
+	* sysdeps/unix/sysv/linux/arc/sys/user.h: New file.
+	* sysdeps/unix/sysv/linux/arc/ucontext-macros.h: New file.
+	* sysdeps/unix/sysv/linux/arc/ucontext_i.sym: New file.
 
 2019-01-25  Siddhesh Poyarekar  <siddhesh at sourceware.org>
 
diff --git a/sysdeps/arc/nptl/pthread-offsets.h b/sysdeps/arc/nptl/pthread-offsets.h
new file mode 100644
index 000000000000..9617354dc7e3
--- /dev/null
+++ b/sysdeps/arc/nptl/pthread-offsets.h
@@ -0,0 +1,5 @@
+#define __PTHREAD_MUTEX_NUSERS_OFFSET   16
+#define __PTHREAD_MUTEX_KIND_OFFSET     12
+#define __PTHREAD_MUTEX_SPINS_OFFSET    20
+#define __PTHREAD_MUTEX_ELISION_OFFSET  22
+#define __PTHREAD_MUTEX_LIST_OFFSET     20
diff --git a/sysdeps/arc/nptl/pthreaddef.h b/sysdeps/arc/nptl/pthreaddef.h
new file mode 100644
index 000000000000..80a109bbd52a
--- /dev/null
+++ b/sysdeps/arc/nptl/pthreaddef.h
@@ -0,0 +1,32 @@
+/* pthread machine parameter definitions, ARC version.
+   Copyright (C) 2002-2019 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
+   <http://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)
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..b37deaee5873
--- /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-2019 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
+   <http://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;
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
diff --git a/sysdeps/unix/sysv/linux/arc/getcontext.S b/sysdeps/unix/sysv/linux/arc/getcontext.S
new file mode 100644
index 000000000000..723cc237d87f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arc/getcontext.S
@@ -0,0 +1,63 @@
+/* Save current context for ARC.
+   Copyright (C) 2009-2019 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
+   <http://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)
diff --git a/sysdeps/unix/sysv/linux/arc/ipc_priv.h b/sysdeps/unix/sysv/linux/arc/ipc_priv.h
new file mode 100644
index 000000000000..309eb3064e9f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arc/ipc_priv.h
@@ -0,0 +1,21 @@
+/* Old SysV permission definition for Linux.  ARC version.
+   Copyright (C) 2016-2019 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
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sys/ipc.h>  /* For __key_t  */
+
+#define __IPC_64	0x0
diff --git a/sysdeps/unix/sysv/linux/arc/makecontext.c b/sysdeps/unix/sysv/linux/arc/makecontext.c
new file mode 100644
index 000000000000..3d46452e1755
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arc/makecontext.c
@@ -0,0 +1,75 @@
+/* Create new context for ARC.
+   Copyright (C) 2015-2019 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
+   <http://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)
diff --git a/sysdeps/unix/sysv/linux/arc/setcontext.S b/sysdeps/unix/sysv/linux/arc/setcontext.S
new file mode 100644
index 000000000000..8cf4ffcaf5ac
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arc/setcontext.S
@@ -0,0 +1,92 @@
+/* Set current context for ARC.
+   Copyright (C) 2009-2019 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
+   <http://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)
diff --git a/sysdeps/unix/sysv/linux/arc/sigcontextinfo.h b/sysdeps/unix/sysv/linux/arc/sigcontextinfo.h
new file mode 100644
index 000000000000..acf03c6afd97
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arc/sigcontextinfo.h
@@ -0,0 +1,23 @@
+/* ARC definitions for signal handling calling conventions.
+   Copyright (C) 2017-2019 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
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sys/ucontext.h>
+#include "kernel-features.h"
+
+#define SIGCONTEXT	int _code, struct ucontext_t *
+#define GET_PC(ctx)	((void *) (ctx)->uc_mcontext.__scratch.__ret)
diff --git a/sysdeps/unix/sysv/linux/arc/swapcontext.S b/sysdeps/unix/sysv/linux/arc/swapcontext.S
new file mode 100644
index 000000000000..853d3805de65
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arc/swapcontext.S
@@ -0,0 +1,92 @@
+/* Save and set current context for ARC.
+   Copyright (C) 2009-2019 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
+   <http://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)
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..2d93e49e6a99
--- /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-2019 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
+   <http://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 */
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..7e357bcd65e1
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arc/sys/ucontext.h
@@ -0,0 +1,63 @@
+/* struct ucontext definition, ARC version.
+   Copyright (C) 2017-2019 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
+   <http://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;
+
+#undef __ctx
+
+#endif /* sys/ucontext.h */
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..50d0dc7827a0
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arc/sys/user.h
@@ -0,0 +1,31 @@
+/* ptrace register data format definitions.
+   Copyright (C) 1998-2019 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
+   <http://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 */
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..ed261399c987
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arc/ucontext-macros.h
@@ -0,0 +1,29 @@
+/* Macros for ucontext routines, ARC version.
+   Copyright (C) 2017-2019 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
+   <http://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
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)
-- 
2.7.4

  parent reply	other threads:[~2019-01-30  1:25 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-30  1:25 [PATCH v2 00/15] glibc port to ARC processors Vineet Gupta
2019-01-30  1:25 ` [PATCH v2 01/15] ARC: add definitions to elf/elf.h Vineet Gupta
2019-01-30  1:25 ` [PATCH v2 02/15] ARC: ABI Implementation Vineet Gupta
2019-01-30  1:25 ` [PATCH v2 03/15] ARC: startup and dynamic linking code Vineet Gupta
2019-01-30  1:25 ` [PATCH v2 04/15] ARC: Thread Local Storage support Vineet Gupta
2019-01-30  1:25 ` [PATCH v2 05/15] ARC: Atomics and Locking primitives Vineet Gupta
2019-01-30  8:28   ` Andreas Schwab
2019-01-30 17:40     ` Vineet Gupta
2019-02-01  1:57       ` Need for arch pthread-offsets.h (was Re: [PATCH v2 05/15] ARC: Atomics and Locking primitives) Vineet Gupta
2019-02-04 10:02         ` Andreas Schwab
2019-01-30 21:04     ` [PATCH v2 05/15] ARC: Atomics and Locking primitives Joseph Myers
2019-01-30 21:35       ` Vineet Gupta
2019-01-30 21:50         ` Joseph Myers
2019-01-30 22:02           ` Vineet Gupta
2019-01-30 22:05             ` Joseph Myers
2019-01-30  1:25 ` [PATCH v2 06/15] ARC: math soft float support Vineet Gupta
2019-01-30  1:25 ` [PATCH v2 07/15] ARC: Linux Syscall Interface Vineet Gupta
2019-01-30  1:25 ` Vineet Gupta [this message]
2019-01-30  1:25 ` [PATCH v2 09/15] ARC: Linux Startup and Dynamic Loading Vineet Gupta
2019-01-30  1:25 ` [PATCH v2 10/15] ARC: ABI lists Vineet Gupta
2019-01-30  1:25 ` [PATCH v2 11/15] ARC: Update syscall-names.list for ARC specific syscalls Vineet Gupta
2019-01-30  1:25 ` [PATCH v2 12/15] ARC: Build Infrastructure Vineet Gupta
2019-01-30  1:25 ` [PATCH v2 13/15] build-many-glibcs.py: Enable ARC builds Vineet Gupta
2019-01-30  1:25 ` [PATCH v2 14/15] NEWS: mention ARC port Vineet Gupta
2019-01-30  1:25 ` [PATCH v2 15/15] make-syscalls.sh: fix comment referencing syscall-template Vineet Gupta
2019-01-30  2:20   ` Joseph Myers
2019-01-30  2:29 ` [PATCH v2 00/15] glibc port to ARC processors Joseph Myers
2019-01-30 18:15   ` Vineet Gupta
2019-01-30 21:19     ` Joseph Myers
2020-01-17 19:34     ` ARCv2 Public PRM (was Re: [PATCH v2 00/15] glibc port to ARC processors) Vineet Gupta
2020-01-17 21:56       ` Joseph Myers
2020-02-06 17:19         ` Vineet Gupta
2020-02-06 21:51           ` Joseph Myers
2020-02-06 22:06             ` Alistair Francis
2020-02-06 22:41               ` Vineet Gupta
2020-02-09 12:27                 ` Lukasz Majewski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1548811555-24373-9-git-send-email-vgupta@synopsys.com \
    --to=vineet.gupta1@synopsys.com \
    --cc=linux-snps-arc@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.