This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH v4 08/11] nds32: Linux ABI
- From: Vincent Chen <vincentc at andestech dot com>
- To: <libc-alpha at sourceware dot org>, <joseph at codesourcery dot com>
- Cc: <deanbo422 at gmail dot com>, <cnoize at andestech dot com>, <vincentc at andestech dot com>
- Date: Wed, 5 Jun 2019 19:56:52 +0800
- Subject: [PATCH v4 08/11] nds32: Linux ABI
- References: <1559735815-20093-1-git-send-email-vincentc@andestech.com>
Linux-specific code that is required for maintaining ABI compatibility.
This doesn't contain the actual system call interface, that is split out
in order to avoid having a patch that's too big.
2019-06-03 Vincent Chen <vincentc@andestech.com>
2019-06-03 CheWei Chuang <cnoize@andestech.com>
* sysdeps/unix/sysv/linux/nds32/bits/fcntl.h: New file.
* sysdeps/unix/sysv/linux/nds32/bits/procfs.h: Likewise.
* sysdeps/unix/sysv/linux/nds32/bits/shmlba.h: Likewise.
* sysdeps/unix/sysv/linux/nds32/fpu/Makefile: Likewise.
* sysdeps/unix/sysv/linux/nds32/fpu/ioctl.c: Likewise.
* sysdeps/unix/sysv/linux/nds32/fpu/mremap.c: Likewise.
* sysdeps/unix/sysv/linux/nds32/fpu/prctl.c: Likewise.
* sysdeps/unix/sysv/linux/nds32/fpu/setfpucw.c: Likewise.
* sysdeps/unix/sysv/linux/nds32/getcontext.S: Likewise.
* sysdeps/unix/sysv/linux/nds32/init-first.c: Likewise.
* sysdeps/unix/sysv/linux/nds32/ipc_priv.h: Likewise.
* sysdeps/unix/sysv/linux/nds32/kernel-features.h: Likewise.
* sysdeps/unix/sysv/linux/nds32/libc-vdso.h: Likewise.
* sysdeps/unix/sysv/linux/nds32/makecontext.c: Likewise.
* sysdeps/unix/sysv/linux/nds32/setcontext.S: Likewise.
* sysdeps/unix/sysv/linux/nds32/sigcontextinfo.h: Likewise.
* sysdeps/unix/sysv/linux/nds32/swapcontext.S: Likewise.
* sysdeps/unix/sysv/linux/nds32/sys/cachectl.h: Likewise.
* sysdeps/unix/sysv/linux/nds32/sys/ucontext.h: Likewise.
* sysdeps/unix/sysv/linux/nds32/sys/user.h: Likewise.
* sysdeps/unix/sysv/linux/nds32/sysctl.mk: Likewise.
* sysdeps/unix/sysv/linux/nds32/ucontext_i.sym: Likewise.
* sysdeps/unix/sysv/linux/nds32/vfork.S: Likewise.
---
sysdeps/unix/sysv/linux/nds32/bits/fcntl.h | 53 ++++++++
sysdeps/unix/sysv/linux/nds32/bits/procfs.h | 40 ++++++
sysdeps/unix/sysv/linux/nds32/bits/shmlba.h | 24 ++++
sysdeps/unix/sysv/linux/nds32/fpu/Makefile | 3 +
sysdeps/unix/sysv/linux/nds32/fpu/ioctl.c | 37 ++++++
sysdeps/unix/sysv/linux/nds32/fpu/mremap.c | 37 ++++++
sysdeps/unix/sysv/linux/nds32/fpu/prctl.c | 40 ++++++
sysdeps/unix/sysv/linux/nds32/fpu/setfpucw.c | 50 ++++++++
sysdeps/unix/sysv/linux/nds32/getcontext.S | 102 ++++++++++++++++
sysdeps/unix/sysv/linux/nds32/init-first.c | 48 ++++++++
sysdeps/unix/sysv/linux/nds32/ipc_priv.h | 22 ++++
sysdeps/unix/sysv/linux/nds32/kernel-features.h | 31 +++++
sysdeps/unix/sysv/linux/nds32/libc-vdso.h | 32 +++++
sysdeps/unix/sysv/linux/nds32/makecontext.c | 57 +++++++++
sysdeps/unix/sysv/linux/nds32/setcontext.S | 111 +++++++++++++++++
sysdeps/unix/sysv/linux/nds32/sigcontextinfo.h | 35 ++++++
sysdeps/unix/sysv/linux/nds32/swapcontext.S | 154 ++++++++++++++++++++++++
sysdeps/unix/sysv/linux/nds32/sys/cachectl.h | 33 +++++
sysdeps/unix/sysv/linux/nds32/sys/ucontext.h | 88 ++++++++++++++
sysdeps/unix/sysv/linux/nds32/sys/user.h | 22 ++++
sysdeps/unix/sysv/linux/nds32/sysctl.mk | 1 +
sysdeps/unix/sysv/linux/nds32/ucontext_i.sym | 28 +++++
sysdeps/unix/sysv/linux/nds32/vfork.S | 46 +++++++
23 files changed, 1094 insertions(+)
create mode 100644 sysdeps/unix/sysv/linux/nds32/bits/fcntl.h
create mode 100644 sysdeps/unix/sysv/linux/nds32/bits/procfs.h
create mode 100644 sysdeps/unix/sysv/linux/nds32/bits/shmlba.h
create mode 100644 sysdeps/unix/sysv/linux/nds32/fpu/Makefile
create mode 100644 sysdeps/unix/sysv/linux/nds32/fpu/ioctl.c
create mode 100644 sysdeps/unix/sysv/linux/nds32/fpu/mremap.c
create mode 100644 sysdeps/unix/sysv/linux/nds32/fpu/prctl.c
create mode 100644 sysdeps/unix/sysv/linux/nds32/fpu/setfpucw.c
create mode 100644 sysdeps/unix/sysv/linux/nds32/getcontext.S
create mode 100644 sysdeps/unix/sysv/linux/nds32/init-first.c
create mode 100644 sysdeps/unix/sysv/linux/nds32/ipc_priv.h
create mode 100644 sysdeps/unix/sysv/linux/nds32/kernel-features.h
create mode 100644 sysdeps/unix/sysv/linux/nds32/libc-vdso.h
create mode 100644 sysdeps/unix/sysv/linux/nds32/makecontext.c
create mode 100644 sysdeps/unix/sysv/linux/nds32/setcontext.S
create mode 100644 sysdeps/unix/sysv/linux/nds32/sigcontextinfo.h
create mode 100644 sysdeps/unix/sysv/linux/nds32/swapcontext.S
create mode 100644 sysdeps/unix/sysv/linux/nds32/sys/cachectl.h
create mode 100644 sysdeps/unix/sysv/linux/nds32/sys/ucontext.h
create mode 100644 sysdeps/unix/sysv/linux/nds32/sys/user.h
create mode 100644 sysdeps/unix/sysv/linux/nds32/sysctl.mk
create mode 100644 sysdeps/unix/sysv/linux/nds32/ucontext_i.sym
create mode 100644 sysdeps/unix/sysv/linux/nds32/vfork.S
diff --git a/sysdeps/unix/sysv/linux/nds32/bits/fcntl.h b/sysdeps/unix/sysv/linux/nds32/bits/fcntl.h
new file mode 100644
index 0000000..1b27ebe
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/bits/fcntl.h
@@ -0,0 +1,53 @@
+/* O_*, F_*, FD_* bit values. Andes Linux/nds32 version.
+ Copyright (C) 2018-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 _FCNTL_H
+# error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead."
+#endif
+
+#include <sys/types.h>
+
+typedef struct flock
+ {
+ short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
+ short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
+#ifndef __USE_FILE_OFFSET64
+ __off_t l_start; /* Offset where the lock begins. */
+ __off_t l_len; /* Size of the locked area; zero means until EOF. */
+#else
+ __off64_t l_start; /* Offset where the lock begins. */
+ __off64_t l_len; /* Size of the locked area; zero means until EOF. */
+#endif
+ __pid_t l_pid; /* Process holding the lock. */
+} flock_t;
+
+#ifdef __USE_LARGEFILE64
+struct flock64
+ {
+ short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
+ short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
+ __off64_t l_start; /* Offset where the lock begins. */
+ __off64_t l_len; /* Size of the locked area; zero means until EOF. */
+ __pid_t l_pid; /* Process holding the lock. */
+ };
+#endif
+
+
+/* Include generic Linux declarations. */
+#include <bits/fcntl-linux.h>
+
diff --git a/sysdeps/unix/sysv/linux/nds32/bits/procfs.h b/sysdeps/unix/sysv/linux/nds32/bits/procfs.h
new file mode 100644
index 0000000..94a3893
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/bits/procfs.h
@@ -0,0 +1,40 @@
+/* Types for registers for sys/procfs.h. Andes nds32 version.
+ Copyright (C) 2018-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 <asm/ptrace.h>
+
+/* Type for a general-purpose register. */
+typedef unsigned long elf_greg_t;
+/* Type for a floating-point registers. */
+typedef long long elf_fpreg_t;
+
+/* 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_pt_regs)/sizeof(elf_greg_t))
+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+
+/* Register set for the floating-point registers. */
+#define ELF_NFPREG 33
+typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
diff --git a/sysdeps/unix/sysv/linux/nds32/bits/shmlba.h b/sysdeps/unix/sysv/linux/nds32/bits/shmlba.h
new file mode 100644
index 0000000..2a1e0d6
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/bits/shmlba.h
@@ -0,0 +1,24 @@
+/* Define SHMLBA. Andes nds32 version.
+ Copyright (C) 2018-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_SHM_H
+# error "Never use <bits/shmlba.h> directly; include <sys/shm.h> instead."
+#endif
+
+/* Segment low boundary address multiple. */
+#define SHMLBA 0x8000
diff --git a/sysdeps/unix/sysv/linux/nds32/fpu/Makefile b/sysdeps/unix/sysv/linux/nds32/fpu/Makefile
new file mode 100644
index 0000000..7d96145
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/fpu/Makefile
@@ -0,0 +1,3 @@
+ifeq ($(subdir),math)
+libm-support += fp_udfiex_crtl
+endif
diff --git a/sysdeps/unix/sysv/linux/nds32/fpu/ioctl.c b/sysdeps/unix/sysv/linux/nds32/fpu/ioctl.c
new file mode 100644
index 0000000..bb8268b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/fpu/ioctl.c
@@ -0,0 +1,37 @@
+/* Control device.
+ Copyright (C) 2018-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 <errno.h>
+#include <stdarg.h>
+#include <sysdep.h>
+
+#include <sys/ioctl.h>
+#include <sys/syscall.h>
+
+int __ioctl (int __fd, unsigned long int __request, ...)
+{
+ unsigned long arg1;
+ va_list arg;
+ va_start (arg, __request);
+ arg1 = va_arg (arg, unsigned long);
+ va_end (arg);
+ return INLINE_SYSCALL(ioctl,3,__fd,__request,arg1);
+}
+libc_hidden_def (__ioctl)
+weak_alias (__ioctl, ioctl)
diff --git a/sysdeps/unix/sysv/linux/nds32/fpu/mremap.c b/sysdeps/unix/sysv/linux/nds32/fpu/mremap.c
new file mode 100644
index 0000000..21dc5f2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/fpu/mremap.c
@@ -0,0 +1,37 @@
+/* Re-map a virtual memory address.
+ Copyright (C) 2018-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 <errno.h>
+#include <stdarg.h>
+#include <sysdep.h>
+#include <sys/mman.h>
+#include <sys/syscall.h>
+
+void *__mremap (void *__addr, size_t __old_len, size_t __new_len, int __flags, ...)
+{
+ unsigned long arg1;
+ va_list arg;
+ va_start (arg, __flags);
+ arg1 = va_arg (arg, int);
+ va_end (arg);
+ return (void *)INLINE_SYSCALL(mremap,5,__addr,__old_len,__new_len,__flags,arg1);
+}
+weak_alias (__mremap, mremap)
+libc_hidden_def (__mremap)
diff --git a/sysdeps/unix/sysv/linux/nds32/fpu/prctl.c b/sysdeps/unix/sysv/linux/nds32/fpu/prctl.c
new file mode 100644
index 0000000..150a453
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/fpu/prctl.c
@@ -0,0 +1,40 @@
+/* Operations on a process.
+ Copyright (C) 2018-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 <errno.h>
+#include <stdarg.h>
+#include <sysdep.h>
+#include <sys/prctl.h>
+#include <sys/syscall.h>
+int prctl (int __option, ...);
+libc_hidden_proto(prctl)
+
+int __prctl (int __option, ...)
+{
+ unsigned long arg1,arg2,arg3,arg4;
+ va_list arg;
+ va_start (arg, __option);
+ arg1 = va_arg (arg, unsigned long);
+ arg2 = va_arg (arg, unsigned long);
+ arg3 = va_arg (arg, unsigned long);
+ arg4 = va_arg (arg, unsigned long);
+ va_end (arg);
+ return INLINE_SYSCALL(prctl,5,__option,arg1,arg2,arg3,arg4);
+}
+weak_alias( __prctl,prctl)
+libc_hidden_weak (prctl)
diff --git a/sysdeps/unix/sysv/linux/nds32/fpu/setfpucw.c b/sysdeps/unix/sysv/linux/nds32/fpu/setfpucw.c
new file mode 100644
index 0000000..dfc1aac
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/fpu/setfpucw.c
@@ -0,0 +1,50 @@
+/* Set the FPU control word. Andes nds32 version
+ Copyright (C) 2018-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 <math.h>
+#include <ldsodefs.h>
+#include <fpu_control.h>
+#include <libc-internal.h>
+
+void
+__setfpucw (fpu_control_t set)
+{
+
+ fpu_control_t cw;
+ /* Fetch the current control word. */
+ _FPU_GETCW (cw);
+
+ /* Preserve the reserved bits, and set the rest as the user
+ specified (or the default, if the user gave zero). */
+ cw &= _FPU_RESERVED;
+ cw |= set & ~_FPU_RESERVED;
+
+
+ /* GLRO(dl_fpu_control) == _FPU_DEFAULT_SUPPORT_SUBNORMAL_OUTPUT indicates
+ * Kernel will recalculate the underflow operation to support denormalize
+ * output. To ensure each that an underflow exception is issued each time a
+ * denormalize output occurs, the enable bit of underflow exception in
+ * $fpcsr shall be set by default.
+ */
+ if (GLRO(dl_fpu_control) == _FPU_DEFAULT_SUPPORT_SUBNORMAL_OUTPUT) {
+ __fpu_control = GLRO(dl_fpu_control);
+ cw |= FPU_MASK_SUBOUT;
+ }
+ _FPU_SETCW (cw);
+
+}
diff --git a/sysdeps/unix/sysv/linux/nds32/getcontext.S b/sysdeps/unix/sysv/linux/nds32/getcontext.S
new file mode 100644
index 0000000..8d29096
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/getcontext.S
@@ -0,0 +1,102 @@
+/* Save current context. Andes LINUX/nds32 version.
+ Copyright (C) 2018-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 <asm/fp_udfiex_crtl.h>
+
+#include "ucontext_i.h"
+
+/* __getcontext (const ucontext_t *ucp). */
+
+ENTRY(__getcontext)
+ swi $lp, [$r0 + UCONTEXT_PC]
+ addi $r15, $r0, UCONTEXT_GREGS
+ xor $r1, $r1, $r1
+ smw.bim $r1, [$r15], $r1
+ addi $r15, $r15, 20
+ smw.bim $r6, [$r15], $r14
+ addi $r15, $r15, 4
+ smw.bim $r16, [$r15], $r25, #0xf
+#ifdef __NDS32_ABI_2FP_PLUS__
+ move $r4, $r0
+#endif
+
+/* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8). */
+ move $r3, _NSIG8
+ addi $r2, $r0, UCONTEXT_SIGMASK
+ movi $r1, 0
+ movi $r0, SIG_BLOCK
+ movi $r15, SYS_ify(rt_sigprocmask)
+ syscall 0x0
+ bnez $r0, .err
+
+
+#ifdef __NDS32_ABI_2FP_PLUS__
+ addi $r2, $r4, UCONTEXT_FDREGS
+/* Process for FPU registers. */
+ fmfcfg $r20 /* Keep $fpcfg in $r20. */
+ slli $r20, $r20, #28
+ srli $r20, $r20, #30 /* Set $r20 as $fpcfg.freg. */
+
+ /* Case switch for $r20 as $fpcfg.freg. */
+ beqz $r20, .LCFG0 /* Branch if $fpcfg.freg = 0b00. */
+ xori $r15, $r20, #0b10
+ beqz $r15, .LCFG2 /* Branch if $fpcfg.freg = 0b10. */
+ srli $r20, $r20, #0b01
+ beqz $r20, .LCFG1 /* Branch if $fpcfg.freg = 0b01. */
+ /* Fall-through if $fpcfg.freg = 0b11. */
+.LCFG3:
+ fsdi $fd31, [$r2 + 248]
+ fsdi $fd30, [$r2 + 240]
+ fsdi $fd29, [$r2 + 232]
+ fsdi $fd28, [$r2 + 224]
+ fsdi $fd27, [$r2 + 216]
+ fsdi $fd26, [$r2 + 208]
+ fsdi $fd25, [$r2 + 200]
+ fsdi $fd24, [$r2 + 192]
+.LCFG2:
+ fsdi $fd10, [$r2 + 80]
+ fsdi $fd9, [$r2 + 72]
+ fsdi $fd8, [$r2 + 64]
+.LCFG1:
+ fsdi $fd7, [$r2 + 56]
+ fsdi $fd6, [$r2 + 48]
+ fsdi $fd5, [$r2 + 40]
+ fsdi $fd4, [$r2 + 32]
+.LCFG0:
+ fsdi $fd3, [$r2 + 24]
+ /* save fpcsr. */
+ fmfcsr $r1
+ swi $r1, [$r2 + 0x100]
+ /* save the status of udf and iex trap. */
+ movi $r0, GET_UDF_IEX_TRAP
+ movi $r15, SYS_ify(fp_udfiex_crtl)
+ syscall SYS_ify(fp_udfiex_crtl)
+ bltz $r0, .err
+ swi $r0, [$r2 + 0x104]
+ movi $r0, 0
+#endif /* __NDS32_ABI_2FP_PLUS__. */
+ ret
+
+.err:
+ j SYSCALL_ERROR_LABEL
+
+PSEUDO_END(__getcontext)
+
+weak_alias (__getcontext, getcontext)
+
diff --git a/sysdeps/unix/sysv/linux/nds32/init-first.c b/sysdeps/unix/sysv/linux/nds32/init-first.c
new file mode 100644
index 0000000..aada091
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/init-first.c
@@ -0,0 +1,48 @@
+/* VDSO initialization. Andes Nds32 version
+ Copyright (C) 2018-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 <dl-vdso.h>
+# include <libc-vdso.h>
+
+int (*VDSO_SYMBOL(gettimeofday)) (struct timeval *, void *) attribute_hidden;
+int (*VDSO_SYMBOL(clock_getres)) (clockid_t, struct timespec *);
+int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *);
+
+static inline void
+_libc_vdso_platform_setup (void)
+{
+ PREPARE_VERSION (linux4, "LINUX_4", 14921332);
+
+ void *p = _dl_vdso_vsym ("__vdso_gettimeofday", &linux4);
+ PTR_MANGLE (p);
+ VDSO_SYMBOL(gettimeofday) = p;
+
+ p = _dl_vdso_vsym ("__vdso_clock_getres", &linux4);
+ PTR_MANGLE (p);
+ VDSO_SYMBOL(clock_getres) = p;
+
+ p = _dl_vdso_vsym ("__vdso_clock_gettime", &linux4);
+ PTR_MANGLE (p);
+ VDSO_SYMBOL(clock_gettime) = p;
+
+}
+
+# define VDSO_SETUP _libc_vdso_platform_setup
+
+#include <csu/init-first.c>
diff --git a/sysdeps/unix/sysv/linux/nds32/ipc_priv.h b/sysdeps/unix/sysv/linux/nds32/ipc_priv.h
new file mode 100644
index 0000000..c88bbb1
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/ipc_priv.h
@@ -0,0 +1,22 @@
+/* Old SysV permission definition for Linux. Andes nds32 version.
+ Copyright (C) 2018-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/nds32/kernel-features.h b/sysdeps/unix/sysv/linux/nds32/kernel-features.h
new file mode 100644
index 0000000..4ab663e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/kernel-features.h
@@ -0,0 +1,31 @@
+/* Set flags signalling availability of kernel features based on given
+ kernel version number. Andes nds32 version.
+ Copyright (C) 2018-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_next <kernel-features.h>
+
+
+#undef __ASSUME_CLONE_DEFAULT
+#define __ASSUME_CLONE_BACKWARDS 1
+
+/* Define this if your 32-bit syscall API requires 64-bit register
+ pairs to start with an even-number register. */
+#define __ASSUME_ALIGNED_REGISTER_PAIRS 1
+
+/* nds32 fadvise64_64 reorganize the syscall arguments. */
+#define __ASSUME_FADVISE64_64_6ARG 1
diff --git a/sysdeps/unix/sysv/linux/nds32/libc-vdso.h b/sysdeps/unix/sysv/linux/nds32/libc-vdso.h
new file mode 100644
index 0000000..3247e09
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/libc-vdso.h
@@ -0,0 +1,32 @@
+/* VDSO function declaration, Andes nds32 version.
+ Copyright (C) 2018-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 _LIBC_VDSO_H
+#define _LIBC_VDSO_H
+
+# include <sysdep-vdso.h>
+
+extern int (*VDSO_SYMBOL (gettimeofday)) (struct timeval *, void *)
+ attribute_hidden;
+extern int (*VDSO_SYMBOL (clock_gettime)) (clockid_t, struct timespec *)
+ attribute_hidden;
+extern int (*VDSO_SYMBOL (clock_getres)) (clockid_t, struct timespec *)
+ attribute_hidden;
+
+#endif /* _LIBC_VDSO_H. */
diff --git a/sysdeps/unix/sysv/linux/nds32/makecontext.c b/sysdeps/unix/sysv/linux/nds32/makecontext.c
new file mode 100644
index 0000000..de01d16
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/makecontext.c
@@ -0,0 +1,57 @@
+/* Create new context. Andes nds32 version.
+ Copyright (C) 2018-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 <stdarg.h>
+#include <stdint.h>
+#include <sys/ucontext.h>
+
+void
+__makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
+{
+ extern void __startcontext (void);
+ unsigned long int *sp;
+ unsigned long int *regptr;
+ va_list ap;
+ int i;
+
+ sp = (unsigned long int *)
+ ((uintptr_t) ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size);
+
+ /* Allocate stack for 7-th, 8-th, ..., n-th arguments. */
+ sp -= argc <= 6 ? 0 : argc - 6;
+
+ /* Keep the stack aligned. */
+ sp = (unsigned long int *) (((uintptr_t) sp) & -8L);
+
+ ucp->uc_mcontext.nds32_r6 = (uintptr_t) ucp->uc_link;
+ ucp->uc_mcontext.nds32_sp = (uintptr_t) sp;
+ ucp->uc_mcontext.nds32_ipc = (uintptr_t) func;
+ ucp->uc_mcontext.nds32_lp = (uintptr_t) &__startcontext;
+
+ va_start (ap, argc);
+ regptr = &ucp->uc_mcontext.nds32_r0;
+ for (i = 0; i < argc; ++i)
+ if (i < 6)
+ *regptr++ = va_arg (ap, unsigned long int);
+ else
+ sp[i - 6] = va_arg (ap, unsigned long int);
+
+ va_end (ap);
+
+}
+weak_alias (__makecontext, makecontext)
diff --git a/sysdeps/unix/sysv/linux/nds32/setcontext.S b/sysdeps/unix/sysv/linux/nds32/setcontext.S
new file mode 100644
index 0000000..f1d2fd7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/setcontext.S
@@ -0,0 +1,111 @@
+/* Set current context. Andes nds32 version.
+ Copyright (C) 2018-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 "ucontext_i.h"
+
+/* int __setcontext (const ucontext_t *ucp). */
+
+ENTRY(__setcontext)
+ move $r4, $r0
+
+/* sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, NULL, _NSIG8). */
+ move $r0, SIG_SETMASK
+ addi $r1, $r4, UCONTEXT_SIGMASK
+ movi $r2, 0
+ movi $r3, _NSIG8
+ movi $r15, SYS_ify(rt_sigprocmask)
+ syscall SYS_ify(rt_sigprocmask)
+ bnez $r0, .err
+
+#ifdef __NDS32_ABI_2FP_PLUS__
+ addi $r3, $r4, UCONTEXT_FDREGS
+
+ fmfcfg $r20 /* Keep $fpcfg in $r20. */
+ slli $r20, $r20, #28
+ srli $r20, $r20, #30 /* Set $r20 as $fpcfg.freg. */
+
+
+ /* Case switch for $r20 as $fpcfg.freg. */
+ beqz $r20, .LCFG0 /* Branch if $fpcfg.freg = 0b00. */
+ xori $r15, $r20, #0b10
+ beqz $r15, .LCFG2 /* Branch if $fpcfg.freg = 0b10. */
+ srli $r20, $r20, #0b01
+ beqz $r20, .LCFG1 /* Branch if $fpcfg.freg = 0b01. */
+ /* Fall-through if $fpcfg.freg = 0b11. */
+.LCFG3:
+ fldi $fd31, [$r3 + 248]
+ fldi $fd30, [$r3 + 240]
+ fldi $fd29, [$r3 + 232]
+ fldi $fd28, [$r3 + 224]
+ fldi $fd27, [$r3 + 216]
+ fldi $fd26, [$r3 + 208]
+ fldi $fd25, [$r3 + 200]
+ fldi $fd24, [$r3 + 192]
+.LCFG2:
+ fldi $fd10, [$r3 + 80]
+ fldi $fd9, [$r3 + 72]
+ fldi $fd8, [$r3 + 64]
+.LCFG1:
+ fldi $fd7, [$r3 + 56]
+ fldi $fd6, [$r3 + 48]
+ fldi $fd5, [$r3 + 40]
+ fldi $fd4, [$r3 + 32]
+.LCFG0:
+ fldi $fd3, [$r3 + 24]
+ /* save fpcsr. */
+ lwi $r1, [$r3 + 0x100]
+ fmtcsr $r1
+ /* save the status of udf and iex trap. */
+ lwi $r0, [$r3 + 0x104]
+ bltz $r0, 1f
+ movi $r15, SYS_ify(fp_udfiex_crtl)
+ syscall SYS_ify(fp_udfiex_crtl)
+1:
+#endif /* __NDS32_ABI_2FP_PLUS__. */
+
+ move $r0, $r4
+ addi $r15, $r0, UCONTEXT_GREGS + 4
+ lmw.bim $r1, [$r15], $r14
+ addi $r15, $r15, 4
+ lmw.bim $r16, [$r15], $r25, #0xf
+ lwi $r15, [$r0 + UCONTEXT_PC]
+ lwi $r0, [$r0 + UCONTEXT_GREGS]
+ jr $r15
+.err:
+ j SYSCALL_ERROR_LABEL
+PSEUDO_END(__setcontext)
+
+weak_alias (__setcontext, setcontext)
+
+ cfi_startproc
+ cfi_undefined (lp)
+ nop16
+ cfi_endproc
+ENTRY (__startcontext)
+ beqz $r6, 1f
+ move $r0, $r6
+ jal __setcontext
+1:
+ move $r0, 0
+ j HIDDEN_JUMPTARGET(exit)
+END (__startcontext)
+
+.hidden __startcontext
+
diff --git a/sysdeps/unix/sysv/linux/nds32/sigcontextinfo.h b/sysdeps/unix/sysv/linux/nds32/sigcontextinfo.h
new file mode 100644
index 0000000..b3faade
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/sigcontextinfo.h
@@ -0,0 +1,35 @@
+/* Definitions for signal handling calling conventions. Andes nds32 version.
+ Copyright (C) 2018-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>
+
+#define SIGCONTEXT siginfo_t *_si, struct ucontext_t *
+#define GET_PC(ctx) ((void *) (ctx)->uc_mcontext.nds32_ipc)
+
+
+/* There is no reliable way to get the sigcontext unless we use a
+ three-argument signal handler. */
+#define __sigaction(sig, act, oact) ({ \
+ (act)->sa_flags |= SA_SIGINFO; \
+ (__sigaction) (sig, act, oact); \
+})
+
+#define sigaction(sig, act, oact) ({ \
+ (act)->sa_flags |= SA_SIGINFO; \
+ (sigaction) (sig, act, oact); \
+})
diff --git a/sysdeps/unix/sysv/linux/nds32/swapcontext.S b/sysdeps/unix/sysv/linux/nds32/swapcontext.S
new file mode 100644
index 0000000..9f489fd
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/swapcontext.S
@@ -0,0 +1,154 @@
+/* Save and set current context. Andes nds32 version
+ Copyright (C) 2018-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 <asm/fp_udfiex_crtl.h>
+#include "ucontext_i.h"
+
+/* int swapcontext (ucontext_t *oucp, const ucontext_t *ucp). */
+
+ENTRY(__swapcontext)
+ move $r5, $r1
+ swi $lp, [$r0 + UCONTEXT_PC]
+ addi $r15, $r0, UCONTEXT_GREGS
+ xor $r1, $r1, $r1
+ smw.bim $r1, [$r15], $r1
+ addi $r15, $r15, 20
+ smw.bim $r6, [$r15], $r14
+ addi $r15, $r15, 4
+ smw.bim $r16, [$r15], $r25, #0xf
+#ifdef __NDS32_ABI_2FP_PLUS__
+ addi $r4, $r0, UCONTEXT_FDREGS
+#endif /* __NDS32_ABI_2FP_PLUS__. */
+
+/* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, &oucp->uc_sigmask, _NSIG8). */
+ move $r3, _NSIG8
+ addi $r2, $r0, UCONTEXT_SIGMASK
+ addi $r1, $r5, UCONTEXT_SIGMASK
+ move $r0, SIG_SETMASK
+ movi $r15, SYS_ify(rt_sigprocmask)
+ syscall SYS_ify(rt_sigprocmask)
+ bnez $r0, .err
+
+#ifdef __NDS32_ABI_2FP_PLUS__
+/* Process for FPU registers. */
+ fmfcfg $r20 /* Keep $fpcfg in $r20. */
+ slli $r20, $r20, #28
+ srli $r20, $r20, #30 /* Set $r20 as $fpcfg.freg. */
+
+ /* Case switch for $r20 as $fpcfg.freg. */
+ beqz $r20, .LCFG0 /* Branch if $fpcfg.freg = 0b00. */
+ xori $r15, $r20, #0b10
+ beqz $r15, .LCFG2 /* Branch if $fpcfg.freg = 0b10. */
+ srli $r20, $r20, #0b01
+ beqz $r20, .LCFG1 /* Branch if $fpcfg.freg = 0b01. */
+ /* Fall-through if $fpcfg.freg = 0b11. */
+.LCFG3:
+ fsdi $fd31, [$r4 + 248]
+ fsdi $fd30, [$r4 + 240]
+ fsdi $fd29, [$r4 + 232]
+ fsdi $fd28, [$r4 + 224]
+ fsdi $fd27, [$r4 + 216]
+ fsdi $fd26, [$r4 + 208]
+ fsdi $fd25, [$r4 + 200]
+ fsdi $fd24, [$r4 + 192]
+.LCFG2:
+ fsdi $fd10, [$r4 + 80]
+ fsdi $fd9, [$r4 + 72]
+ fsdi $fd8, [$r4 + 64]
+.LCFG1:
+ fsdi $fd7, [$r4 + 56]
+ fsdi $fd6, [$r4 + 48]
+ fsdi $fd5, [$r4 + 40]
+ fsdi $fd4, [$r4 + 32]
+.LCFG0:
+ fsdi $fd3, [$r4 + 24]
+ /* save fpcsr. */
+ fmfcsr $r1
+ swi $r1, [$r4 + 0x100]
+ /* save the status of udf and iex trap. */
+ movi $r0, GET_UDF_IEX_TRAP
+ movi $r15, SYS_ify(fp_udfiex_crtl)
+ syscall SYS_ify(fp_udfiex_crtl)
+ swi $r0, [$r4 + 0x104]
+#endif /* __NDS32_ABI_2FP_PLUS__. */
+
+
+
+#ifdef __NDS32_ABI_2FP_PLUS__
+ addi $r0, $r5, UCONTEXT_FDREGS
+ fmfcfg $r20 /* Keep $fpcfg in $r20. */
+ slli $r20, $r20, #28
+ srli $r20, $r20, #30 /* Set $r20 as $fpcfg.freg. */
+
+ fmfcfg $r20 /* Keep $fpcfg in $r20. */
+ slli $r20, $r20, #28
+ srli $r20, $r20, #30 /* Set $r20 as $fpcfg.freg. */
+
+ /* Case switch for $r20 as $fpcfg.freg. */
+ beqz $r20, .LCFG4 /* Branch if $fpcfg.freg = 0b00. */
+ xori $r15, $r20, #0b10
+ beqz $r15, .LCFG6 /* Branch if $fpcfg.freg = 0b10. */
+ srli $r20, $r20, #0b01
+ beqz $r20, .LCFG5 /* Branch if $fpcfg.freg = 0b01. */
+ /* Fall-through if $fpcfg.freg = 0b11. */
+.LCFG7:
+ fldi $fd31, [$r0 + 248]
+ fldi $fd30, [$r0 + 240]
+ fldi $fd29, [$r0 + 232]
+ fldi $fd28, [$r0 + 224]
+ fldi $fd27, [$r0 + 216]
+ fldi $fd26, [$r0 + 208]
+ fldi $fd25, [$r0 + 200]
+ fldi $fd24, [$r0 + 192]
+.LCFG6:
+ fldi $fd10, [$r0 + 80]
+ fldi $fd9, [$r0 + 72]
+ fldi $fd8, [$r0 + 64]
+.LCFG5:
+ fldi $fd7, [$r0 + 56]
+ fldi $fd6, [$r0 + 48]
+ fldi $fd5, [$r0 + 40]
+ fldi $fd4, [$r0 + 32]
+.LCFG4:
+ fldi $fd3, [$r0 + 24]
+ /* save fpcsr. */
+ lwi $r1, [$r0 + 0x100]
+ fmtcsr $r1
+ /* save the status of udf and iex trap. */
+ lwi $r0, [$r0 + 0x104]
+ bltz $r0, 1f
+ movi $r15, SYS_ify(fp_udfiex_crtl)
+ syscall SYS_ify(fp_udfiex_crtl)
+1:
+#endif /* __NDS32_ABI_2FP_PLUS__. */
+
+ move $r0, $r5
+ addi $r15, $r5, UCONTEXT_GREGS + 4
+ lmw.bim $r1, [$r15], $r14
+ addi $r15, $r15, 4
+ lmw.bim $r16, [$r15], $r25, #0xf
+ lwi $r15, [$r0 + UCONTEXT_PC]
+ lwi $r0, [$r0 + UCONTEXT_GREGS]
+ jr $r15
+
+.err:
+ j SYSCALL_ERROR_LABEL
+PSEUDO_END(__swapcontext)
+
+weak_alias (__swapcontext, swapcontext)
diff --git a/sysdeps/unix/sysv/linux/nds32/sys/cachectl.h b/sysdeps/unix/sysv/linux/nds32/sys/cachectl.h
new file mode 100644
index 0000000..412b46f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/sys/cachectl.h
@@ -0,0 +1,33 @@
+/* Andes nds32 cache flushing interface
+ Copyright (C) 2018-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 argument. */
+#include <asm/cachectl.h>
+
+__BEGIN_DECLS
+
+extern int cacheflush (void *__addr, const int __end, const int __op) __THROW;
+
+__END_DECLS
+
+#endif /* sys/cachectl.h */
diff --git a/sysdeps/unix/sysv/linux/nds32/sys/ucontext.h b/sysdeps/unix/sysv/linux/nds32/sys/ucontext.h
new file mode 100644
index 0000000..dc6bab4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/sys/ucontext.h
@@ -0,0 +1,88 @@
+/* struct ucontext definition, Andes nds32 version.
+ Copyright (C) 2018-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_UCONTEXT_H
+#define _SYS_UCONTEXT_H 1
+
+#include <features.h>
+#include <bits/types/sigset_t.h>
+#include <bits/types/stack_t.h>
+
+
+#ifdef __USE_MISC
+# define __ctx(fld) fld
+#else
+# define __ctx(fld) __ ## fld
+#endif
+
+/* Context to describe whole processor state. */
+
+typedef struct {
+ unsigned long int __ctx(trap_no);
+ unsigned long int __ctx(error_code);
+ unsigned long int __ctx(oldmask);
+ unsigned long int __ctx(nds32_r0);
+ unsigned long int __ctx(nds32_r1);
+ unsigned long int __ctx(nds32_r2);
+ unsigned long int __ctx(nds32_r3);
+ unsigned long int __ctx(nds32_r4);
+ unsigned long int __ctx(nds32_r5);
+ unsigned long int __ctx(nds32_r6);
+ unsigned long int __ctx(nds32_r7);
+ unsigned long int __ctx(nds32_r8);
+ unsigned long int __ctx(nds32_r9);
+ unsigned long int __ctx(nds32_r10);
+ unsigned long int __ctx(nds32_r11);
+ unsigned long int __ctx(nds32_r12);
+ unsigned long int __ctx(nds32_r13);
+ unsigned long int __ctx(nds32_r14);
+ unsigned long int __ctx(nds32_r15);
+ unsigned long int __ctx(nds32_r16);
+ unsigned long int __ctx(nds32_r17);
+ unsigned long int __ctx(nds32_r18);
+ unsigned long int __ctx(nds32_r19);
+ unsigned long int __ctx(nds32_r20);
+ unsigned long int __ctx(nds32_r21);
+ unsigned long int __ctx(nds32_r22);
+ unsigned long int __ctx(nds32_r23);
+ unsigned long int __ctx(nds32_r24);
+ unsigned long int __ctx(nds32_r25);
+ unsigned long int __ctx(nds32_fp);
+ unsigned long int __ctx(nds32_gp);
+ unsigned long int __ctx(nds32_lp);
+ unsigned long int __ctx(nds32_sp);
+ unsigned long int __ctx(nds32_ipc);
+ unsigned long int __ctx(fault_address);
+ unsigned long int __ctx(used_math_flag);
+ unsigned long long __ctx(fd_regs)[32];
+ unsigned long int __ctx(fpcsr);
+ unsigned long int __ctx(UDF_trap);
+ unsigned long int __ctx(zol)[3];
+} mcontext_t;
+
+
+/* Userlevel context. */
+typedef struct ucontext_t
+ {
+ unsigned long int __ctx(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. */
diff --git a/sysdeps/unix/sysv/linux/nds32/sys/user.h b/sysdeps/unix/sysv/linux/nds32/sys/user.h
new file mode 100644
index 0000000..b529a0b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/sys/user.h
@@ -0,0 +1,22 @@
+/* Copyright (C) 2018-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
+
+
+#endif /* _SYS_USER_H. */
diff --git a/sysdeps/unix/sysv/linux/nds32/sysctl.mk b/sysdeps/unix/sysv/linux/nds32/sysctl.mk
new file mode 100644
index 0000000..cd10656
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/sysctl.mk
@@ -0,0 +1 @@
+# nds32 doesn't support sysctl.
diff --git a/sysdeps/unix/sysv/linux/nds32/ucontext_i.sym b/sysdeps/unix/sysv/linux/nds32/ucontext_i.sym
new file mode 100644
index 0000000..266a158
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/ucontext_i.sym
@@ -0,0 +1,28 @@
+#include <stddef.h>
+#include <signal.h>
+#include <sys/ucontext.h>
+
+--
+
+SIG_BLOCK
+SIG_SETMASK
+
+_NSIG8 (_NSIG / 8)
+
+-- Offsets of the fields in the ucontext_t structure.
+#define ucontext(member) offsetof (ucontext_t, member)
+#define mcontext(member) ucontext (uc_mcontext.member)
+
+
+UCONTEXT_GREGS mcontext (nds32_r0)
+#ifdef __NDS32_ABI_2FP_PLUS__
+UCONTEXT_FDREGS mcontext (fd_regs)
+#endif
+UCONTEXT_PC mcontext (nds32_ipc)
+
+
+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)
diff --git a/sysdeps/unix/sysv/linux/nds32/vfork.S b/sysdeps/unix/sysv/linux/nds32/vfork.S
new file mode 100644
index 0000000..412706f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/vfork.S
@@ -0,0 +1,46 @@
+/* vfork for Linux. Andes Linux/nds32 version.
+ Copyright (C) 2018-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>
+#define _ERRNO_H 1
+#include <bits/errno.h>
+
+
+ENTRY (__libc_vfork)
+#ifdef PIC
+.pic
+#endif
+
+ movi $r0, #0x4111 /* 0x4111 = CLONE_VM | CLONE_VFORK | SIGCHLD. */
+ move $r1, $sp
+ movi $r15, __NR_clone
+ syscall #0x0
+ bltz $r0, 2f
+1:
+ ret
+2:
+ sltsi $r1, $r0, -4096
+ bnez $r1, 1b;
+
+ j SYSCALL_ERROR_LABEL
+
+PSEUDO_END (__libc_vfork)
+
+weak_alias (__libc_vfork, vfork)
+strong_alias (__libc_vfork, __vfork)
+libc_hidden_def (__vfork)
--
1.9.5