public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 00/11] nds32 glibc Port v1
@ 2018-05-06 14:41 vincentc
  2018-05-06 14:42 ` [PATCH 04/11] nds32: Startup and Dynamic Loader vincentc
                   ` (11 more replies)
  0 siblings, 12 replies; 31+ messages in thread
From: vincentc @ 2018-05-06 14:41 UTC (permalink / raw)
  To: libc-alpha; +Cc: deanbo422, cnoize, vincentc

   Hi, this serious of patch contains glibc port for Andes nds32 ISA. This is a
32 bit target using Linux-generic. The nds32 port for Linux had been included in
4.17-rc1. For testing convenience, the minimum kernel version is temporarily set
as 4.16. The nds32 ports for GCC and Binutils in upstream are too old to compile
this patchset. My colleagues are trying to upload the latest patch to upstream.
Before they finish, we put workable GCC and Binutils in the private git
repository and people can use them to build nds32 glibc toolchain. By the way,
the patch of build-many-glibcs.py for Andes nds32 port does not be included in
this patchest because we need to replace all download path with our private git
repository in build-many-glibcs.py. Therefore, we provide another
build-many-glibcs.py whose name is nds32-build-many-glibcs.py for nds32 in
the nds32 glibc git repository. The git repository path of each component for
nds32 is listed as below.

1. GCC git repo path:
  path: https://github.com/andestech/gcc.git
  branch: nds32-6.3.0-open
2. Binutils git repo path:
  path: https://github.com/andestech/binutils.git 
  branch: nds32-binutils-2.30-branch-open
3. Glibc git repo
  path: https://github.com/andestech/glibc.git 
  branch: nds32-glibc-2.27-v0
  i. nds32's build-many-glibcs.py
     https://github.com/andestech/glibc/blob/nds32-glibc-2.27-v0/sysdeps/nds32/misc/nds32-build-many-glibcs.py
4. Linux git repo
  path: https://github.com/andestech/linux/commits/master 
  branch: master

  In this patchset, the port for nds32 FPU extension is not included. We plan to
add it after the FPU ports for nds32 is accepted by Linux. Therefore, we keep
some flexibility in code for the ports of nds32 FPU extension.
  The port has been cross-tested on the FPGA board running Linux 4.17-rc2. In
order to avoid false timeout, we set a large number to TIMEOUTFACTOR. In
addition, we found many testcases in conform fails because some nds32 predefined
macro lack double underscore prefix in this version nds32 gcc. This bug will be
fixed in newer nds32 gcc version which is based on gcc 8.1.0 and we will upload
it after few weeks. For testing convenience, we create a temporary patch which
add these illegal macros to ISO C90 keywords in conform/conformtest.pl to skip
these failures. This temporary patch will be removed after we upload newer nds32
gcc version to our private github. 
(Temporary patch: https://github.com/andestech/glibc/commit/8b76851ba91eed053 )

The summary of glibc testsuite is listed as follows which includs the above 
temporary patch:

Summary of test results that the extra tests are included:
    14 FAIL
  4886 PASS
    10 UNSUPPORTED

Detail result:
https://github.com/andestech/glibc/blob/nds32-glibc-2.27-v0/sysdeps/nds32/misc/glibc_final_testing_result

The reasons for the 14 FAIL cases are listed as bellow.
1. nptl (8 FAIL cases)
   i. The following 6 testcase fail because the testing environment lacks native
      python: 
      ./nptl/test-condattr-printers.test-result
      ./nptl/test-cond-printers.test-result
      ./nptl/test-mutexattr-printers.test-result
      ./nptl/test-mutex-printers.test-result
      ./nptl/test-rwlockattr-printers.test-result
      ./nptl/test-rwlock-printers.test-result

   ii.The tst-cancel7 and tst-cancel7x fails because the 1 second timeout, at
      108-th line in tst-cancel7.c, is not enough for child thread to finish all
      work before system(). In other words, parent thread executes
      xpthread_cancel () before child thread executes system(). Therefore, child
      thread cannot write self-pid on pidfile and error message 'could not read
      pid' is got. The nds32 port can pass this testing after we extend the
      timeout to 5 seconds.
2. misc (3 FAIL cases)
   i. A new flag, RWF_APPEND, for preadv2/pwritev2 is added in Linux 4.16. This
      change causes expected ENOTSUP does not be caught in misc/tst-preadvwritev2
      and misc/tst-preadvwritev64v2. The nds32 ports can pass these two cases
      after adding the new flag RWF_APPEND to sysdeps/unix/sysv/linux/bits/uio-ext.h
      and misc/ tst-preadvwritev2-common.c.
   ii.The misc/test-errno-linux occasionally fails in sendfile function because
      EINVAL is caught rather than EBADF. The reason is due to uninitialized
      local variable 'off'. When 'off' is a negative number, the errno is set as
      EINVAL in glibc sendfile function before issuing sendfile syscall. The
      nds32 port can always pass the testing after initializing variable 'off'
      to zero.
3. stdio-common (1 FAIL case)
   i. The required memory size for stdio-common/bug22 testcase is more than 2 GB
      but the DRAM size on our FPGA is just 2GB. Therefore, the errno is set as
      ENOMEM instead of EOVERFLOW.
4. sunrpc (1 FAIL case)
   i. sunrpc/bug20790 fails because the testing environment lacks native cpp
5. malloc(1 FAIL case)
   i. malloc/tst-malloc-usable-tunables randomly fails. We hadn't found the root
      causes but we found some people encountered the same failure on the
      Internet. They think this failure is due to kernel bug. Therefore, we
      temporarily treat it as a false positive case for glibc.
      (https://www.mail-archive.com/debian-glibc@lists.debian.org/msg57118.html)

We imitate the RISC-V patchset to create our patches. Che-Wei and I volunteer to
be port maintainer. Thanks to everyone who helped us and contributed to it. :)
Any feedback is welcome.

^ permalink raw reply	[flat|nested] 31+ messages in thread

* [PATCH 11/11] Add nds32 entries to config.h.in
  2018-05-06 14:41 [PATCH 00/11] nds32 glibc Port v1 vincentc
                   ` (9 preceding siblings ...)
  2018-05-06 14:42 ` [PATCH 02/11] nds32: ABI Implementation vincentc
@ 2018-05-06 14:42 ` vincentc
  2018-05-08 14:46 ` [PATCH 00/11] nds32 glibc Port v1 Joseph Myers
  11 siblings, 0 replies; 31+ messages in thread
From: vincentc @ 2018-05-06 14:42 UTC (permalink / raw)
  To: libc-alpha; +Cc: deanbo422, cnoize, vincentc

---
 config.h.in | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/config.h.in b/config.h.in
index b0b7cf2..42065c8 100644
--- a/config.h.in
+++ b/config.h.in
@@ -106,6 +106,9 @@
 /* RISC-V floating-point ABI for ld.so.  */
 #undef RISCV_ABI_FLEN
 
+/* NDS32 floating-point ABI for ld.so.  */
+#undef NDS32_ABI_TYPE
+
 /* Linux specific: minimum supported kernel version.  */
 #undef	__LINUX_KERNEL_VERSION
 
-- 
2.7.4

^ permalink raw reply	[flat|nested] 31+ messages in thread

* [PATCH 01/11] nds32: Build Infastructure
  2018-05-06 14:41 [PATCH 00/11] nds32 glibc Port v1 vincentc
  2018-05-06 14:42 ` [PATCH 04/11] nds32: Startup and Dynamic Loader vincentc
@ 2018-05-06 14:42 ` vincentc
  2018-05-08 14:49   ` Joseph Myers
  2018-05-06 14:42 ` [PATCH 07/11] nds32: Linux Syscall Interface vincentc
                   ` (9 subsequent siblings)
  11 siblings, 1 reply; 31+ messages in thread
From: vincentc @ 2018-05-06 14:42 UTC (permalink / raw)
  To: libc-alpha; +Cc: deanbo422, cnoize, vincentc

This patch contains all needed Implies, configure and Makefile for nds32
port.
---
 sysdeps/nds32/Implies                        |  3 +++
 sysdeps/nds32/Makefile                       |  9 +++++++
 sysdeps/nds32/configure                      | 35 ++++++++++++++++++++++++++++
 sysdeps/nds32/configure.ac                   | 14 +++++++++++
 sysdeps/nds32/nofpu/Implies                  |  1 +
 sysdeps/nds32/nptl/Makefile                  |  4 ++++
 sysdeps/nds32/preconfigure                   | 20 ++++++++++++++++
 sysdeps/unix/sysv/linux/nds32/Implies        |  3 +++
 sysdeps/unix/sysv/linux/nds32/Makefile       | 17 ++++++++++++++
 sysdeps/unix/sysv/linux/nds32/Versions       | 11 +++++++++
 sysdeps/unix/sysv/linux/nds32/configure      |  4 ++++
 sysdeps/unix/sysv/linux/nds32/configure.ac   |  4 ++++
 sysdeps/unix/sysv/linux/nds32/shlib-versions |  7 ++++++
 13 files changed, 132 insertions(+)
 create mode 100644 sysdeps/nds32/Implies
 create mode 100644 sysdeps/nds32/Makefile
 create mode 100755 sysdeps/nds32/configure
 create mode 100644 sysdeps/nds32/configure.ac
 create mode 100644 sysdeps/nds32/nofpu/Implies
 create mode 100644 sysdeps/nds32/nptl/Makefile
 create mode 100644 sysdeps/nds32/preconfigure
 create mode 100644 sysdeps/unix/sysv/linux/nds32/Implies
 create mode 100644 sysdeps/unix/sysv/linux/nds32/Makefile
 create mode 100644 sysdeps/unix/sysv/linux/nds32/Versions
 create mode 100755 sysdeps/unix/sysv/linux/nds32/configure
 create mode 100644 sysdeps/unix/sysv/linux/nds32/configure.ac
 create mode 100644 sysdeps/unix/sysv/linux/nds32/shlib-versions

diff --git a/sysdeps/nds32/Implies b/sysdeps/nds32/Implies
new file mode 100644
index 0000000..387a0ca
--- /dev/null
+++ b/sysdeps/nds32/Implies
@@ -0,0 +1,3 @@
+wordsize-32
+ieee754/dbl-64
+ieee754/flt-32
diff --git a/sysdeps/nds32/Makefile b/sysdeps/nds32/Makefile
new file mode 100644
index 0000000..5651161
--- /dev/null
+++ b/sysdeps/nds32/Makefile
@@ -0,0 +1,9 @@
+ifeq ($(subdir),elf)
+sysdep-dl-routines += tlsdesc dl-tlsdesc
+sysdep_routines += tlsdesc dl-tlsdesc
+sysdep-rtld-routines += tlsdesc dl-tlsdesc
+endif
+
+ifeq ($(subdir),csu)
+gen-as-const-headers += tlsdesc.sym
+endif
diff --git a/sysdeps/nds32/configure b/sysdeps/nds32/configure
new file mode 100755
index 0000000..42eb9bb
--- /dev/null
+++ b/sysdeps/nds32/configure
@@ -0,0 +1,35 @@
+# This file is generated from configure.ac by Autoconf.  DO NOT EDIT!
+ # Local configure fragment for sysdeps/nds32.
+CFLAGS="$CFLAGS -minline-asm-r15"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc support option -mno-scalbn-transform" >&5
+$as_echo_n "checking whether gcc support option -mno-scalbn-transform... " >&6; }
+if ${libc_cv_scalbn_transform+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -mno-scalbn-transform"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  libc_cv_scalbn_transform=yes
+else
+  libc_cv_scalbn_transform=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+CFLAGS="$save_CFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_scalbn_transform" >&5
+$as_echo "$libc_cv_scalbn_transform" >&6; }
+if test "$libc_cv_scalbn_transform" = yes; then
+CFLAGS="$CFLAGS -mno-scalbn-transform"
+fi
diff --git a/sysdeps/nds32/configure.ac b/sysdeps/nds32/configure.ac
new file mode 100644
index 0000000..4ca57b8
--- /dev/null
+++ b/sysdeps/nds32/configure.ac
@@ -0,0 +1,14 @@
+GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
+# Local configure fragment for sysdeps/nds32.
+CFLAGS="$CFLAGS -minline-asm-r15"
+AC_CACHE_CHECK(whether gcc support option -mno-scalbn-transform,
+	       libc_cv_scalbn_transform, [dnl
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -mno-scalbn-transform"
+AC_TRY_COMPILE(,,
+	       libc_cv_scalbn_transform=yes,
+	       libc_cv_scalbn_transform=no)
+CFLAGS="$save_CFLAGS"])
+if test "$libc_cv_scalbn_transform" = yes; then
+CFLAGS="$CFLAGS -mno-scalbn-transform"
+fi
diff --git a/sysdeps/nds32/nofpu/Implies b/sysdeps/nds32/nofpu/Implies
new file mode 100644
index 0000000..abcbadb
--- /dev/null
+++ b/sysdeps/nds32/nofpu/Implies
@@ -0,0 +1 @@
+ieee754/soft-fp
diff --git a/sysdeps/nds32/nptl/Makefile b/sysdeps/nds32/nptl/Makefile
new file mode 100644
index 0000000..6f553d6
--- /dev/null
+++ b/sysdeps/nds32/nptl/Makefile
@@ -0,0 +1,4 @@
+
+ifeq ($(subdir),csu)
+gen-as-const-headers += tcb-offsets.sym
+endif
diff --git a/sysdeps/nds32/preconfigure b/sysdeps/nds32/preconfigure
new file mode 100644
index 0000000..9154423
--- /dev/null
+++ b/sysdeps/nds32/preconfigure
@@ -0,0 +1,20 @@
+case "$machine" in
+nds32*)
+    float_abi_type=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __NDS32_EXT_FPU_\([S|D]P*\) 1/\1/p' | wc -l`
+
+    case "$float_abi_type" in
+    0)
+       with_fp_cond=0
+       ;;
+    *)
+       echo "glibc does not yet support systems with FP instructions" >&2
+       exit 1
+       ;;
+    esac
+
+    base_machine=nds32
+    machine=nds32
+
+    $as_echo "#define NDS32_ABI_TYPE $float_abi_type" >>confdefs.h
+    ;;
+esac
diff --git a/sysdeps/unix/sysv/linux/nds32/Implies b/sysdeps/unix/sysv/linux/nds32/Implies
new file mode 100644
index 0000000..91b4e1e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/Implies
@@ -0,0 +1,3 @@
+nds32/nptl
+unix/sysv/linux/generic/wordsize-32
+unix/sysv/linux/generic
diff --git a/sysdeps/unix/sysv/linux/nds32/Makefile b/sysdeps/unix/sysv/linux/nds32/Makefile
new file mode 100644
index 0000000..2709916
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/Makefile
@@ -0,0 +1,17 @@
+ifeq ($(subdir),misc)
+sysdep_headers += sys/cachectl.h
+sysdep_routines += cacheflush prctl mremap
+endif
+
+
+ifeq ($(subdir),stdlib)
+gen-as-const-headers += ucontext_i.sym
+endif
+
+ifeq ($(subdir),elf)
+sysdep_routines += dl-vdso
+ifeq ($(build-shared),yes)
+# This is needed for DSO loading from static binaries.
+sysdep-dl-routines += dl-static
+endif
+endif
diff --git a/sysdeps/unix/sysv/linux/nds32/Versions b/sysdeps/unix/sysv/linux/nds32/Versions
new file mode 100644
index 0000000..abe47ce
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/Versions
@@ -0,0 +1,11 @@
+ld {
+  GLIBC_PRIVATE {
+  # used for loading by static libraries
+    _dl_var_init;
+  }
+}
+libc {
+  GLIBC_2.28 {
+    cacheflush;
+  }
+}
diff --git a/sysdeps/unix/sysv/linux/nds32/configure b/sysdeps/unix/sysv/linux/nds32/configure
new file mode 100755
index 0000000..e815611
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/configure
@@ -0,0 +1,4 @@
+# This file is generated from configure.ac by Autoconf.  DO NOT EDIT!
+ # Local configure fragment for sysdeps/unix/sysv/linux/nds32.
+
+arch_minimum_kernel=4.16.0
diff --git a/sysdeps/unix/sysv/linux/nds32/configure.ac b/sysdeps/unix/sysv/linux/nds32/configure.ac
new file mode 100644
index 0000000..a5a0593
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/configure.ac
@@ -0,0 +1,4 @@
+GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
+# Local configure fragment for sysdeps/unix/sysv/linux/nds32.
+
+arch_minimum_kernel=4.16.0
diff --git a/sysdeps/unix/sysv/linux/nds32/shlib-versions b/sysdeps/unix/sysv/linux/nds32/shlib-versions
new file mode 100644
index 0000000..2131996
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/shlib-versions
@@ -0,0 +1,7 @@
+DEFAULT			GLIBC_2.28
+
+%if NDS32_ABI_TYPE == 0
+ld=ld-linux-nds32.so.1
+%else
+%error cannot determine ABI
+%endif
-- 
2.7.4

^ permalink raw reply	[flat|nested] 31+ messages in thread

* [PATCH 06/11] nds32: Atomic and Locking Routines
  2018-05-06 14:41 [PATCH 00/11] nds32 glibc Port v1 vincentc
                   ` (4 preceding siblings ...)
  2018-05-06 14:42 ` [PATCH 10/11] Add Andes nds32 dynamic relocation type to elf/elf.h vincentc
@ 2018-05-06 14:42 ` vincentc
  2018-05-06 14:42 ` [PATCH 08/11] nds32: Linux ABI vincentc
                   ` (5 subsequent siblings)
  11 siblings, 0 replies; 31+ messages in thread
From: vincentc @ 2018-05-06 14:42 UTC (permalink / raw)
  To: libc-alpha; +Cc: deanbo422, cnoize, vincentc

All atomic and locking routines on nds32 are implemented in this patch.
---
 sysdeps/nds32/atomic-machine.h              | 163 ++++++++++++++++++++++++++++
 sysdeps/nds32/nptl/bits/pthreadtypes-arch.h |  71 ++++++++++++
 sysdeps/nds32/nptl/bits/semaphore.h         |  32 ++++++
 sysdeps/nds32/nptl/pthread-offsets.h        |  24 ++++
 4 files changed, 290 insertions(+)
 create mode 100644 sysdeps/nds32/atomic-machine.h
 create mode 100644 sysdeps/nds32/nptl/bits/pthreadtypes-arch.h
 create mode 100644 sysdeps/nds32/nptl/bits/semaphore.h
 create mode 100644 sysdeps/nds32/nptl/pthread-offsets.h

diff --git a/sysdeps/nds32/atomic-machine.h b/sysdeps/nds32/atomic-machine.h
new file mode 100644
index 0000000..9866c62
--- /dev/null
+++ b/sysdeps/nds32/atomic-machine.h
@@ -0,0 +1,163 @@
+/* Atomic machine setting for Andes nds32.
+   Copyright (C) 2003-2018 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 _NDS32_ATOMIC_MACHINE_H
+#define _NDS32_ATOMIC_MACHINE_H 1
+
+#include <stdint.h>
+
+typedef int8_t  atomic8_t;
+typedef int16_t atomic16_t;
+typedef int32_t atomic32_t;
+typedef int64_t atomic64_t;
+
+typedef uint8_t  uatomic8_t;
+typedef uint16_t uatomic16_t;
+typedef uint32_t uatomic32_t;
+typedef uint64_t uatomic64_t;
+
+typedef intptr_t atomicptr_t;
+typedef uintptr_t uatomicptr_t;
+typedef intmax_t atomic_max_t;
+typedef uintmax_t uatomic_max_t;
+
+#define __HAVE_64B_ATOMICS 0
+#define USE_ATOMIC_COMPILER_BUILTINS 1
+#define ATOMIC_EXCHANGE_USES_CAS 0
+
+void __nds32_link_error (void);
+
+#ifndef atomic_full_barrier
+# define atomic_full_barrier() __asm ("dsb" ::: "memory")
+#endif
+
+/* Atomic exchange (without compare).  */
+
+#define __arch_exchange_8_int(mem, newval, model)	\
+  __atomic_exchange_n (mem, newval, model)
+
+#define __arch_exchange_16_int(mem, newval, model)	\
+  __atomic_exchange_n (mem, newval, model)
+
+#define __arch_exchange_32_int(mem, newval, model)	\
+  __atomic_exchange_n (mem, newval, model)
+
+#define __arch_exchange_64_int(mem, newval, model)	\
+  (__nds32_link_error (), (typeof (*mem)) 0)
+
+#define atomic_exchange_acq(mem, value)				\
+  __atomic_val_bysize (__arch_exchange, int, mem, value, __ATOMIC_ACQUIRE)
+
+#define atomic_exchange_rel(mem, value)				\
+  __atomic_val_bysize (__arch_exchange, int, mem, value, __ATOMIC_RELEASE)
+
+
+/* Compare and exchange.
+   For all "bool" routines, we return FALSE if exchange succesful.  */
+
+#define __arch_compare_and_exchange_bool_8_int(mem, newval, oldval, model) \
+  ({									\
+    typeof (*mem) __oldval = (oldval);					\
+    (int)!__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0,	\
+				  model, __ATOMIC_RELAXED);		\
+  })
+
+#define __arch_compare_and_exchange_bool_16_int(mem, newval, oldval, model) \
+  ({									\
+    typeof (*mem) __oldval = (oldval);					\
+    (int)!__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0,	\
+				  model, __ATOMIC_RELAXED);		\
+  })
+
+#define __arch_compare_and_exchange_bool_32_int(mem, newval, oldval, model) \
+  ({									\
+    typeof (*mem) __oldval = (oldval);					\
+    (int)!__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0,	\
+				  model, __ATOMIC_RELAXED);		\
+  })
+
+#define __arch_compare_and_exchange_bool_64_int(mem, newval, oldval, model) \
+  ({__nds32_link_error (); (int) 0;})
+
+#define __arch_compare_and_exchange_val_8_int(mem, newval, oldval, model) \
+  ({									\
+    typeof (*mem) __oldval = (oldval);					\
+    __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0,	\
+				 model, __ATOMIC_RELAXED);		\
+    __oldval;								\
+  })
+
+#define __arch_compare_and_exchange_val_16_int(mem, newval, oldval, model) \
+  ({									\
+    typeof (*mem) __oldval = (oldval);					\
+    __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0,	\
+				 model, __ATOMIC_RELAXED);		\
+    __oldval;								\
+  })
+
+#define __arch_compare_and_exchange_val_32_int(mem, newval, oldval, model) \
+  ({									\
+    typeof (*mem) __oldval = (oldval);					\
+    __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0,	\
+				 model, __ATOMIC_RELAXED);		\
+    __oldval;								\
+  })
+
+#define __arch_compare_and_exchange_val_64_int(mem, newval, oldval, model) \
+  ({__nds32_link_error (); (typeof (*mem)) 0;})
+
+
+/* Compare and exchange with "acquire" semantics, ie barrier after.  */
+
+#define atomic_compare_and_exchange_bool_acq(mem, new, old)	\
+  __atomic_bool_bysize (__arch_compare_and_exchange_bool, int,	\
+			mem, new, old, __ATOMIC_ACQUIRE)
+
+#define atomic_compare_and_exchange_val_acq(mem, new, old)	\
+  __atomic_val_bysize (__arch_compare_and_exchange_val, int,	\
+		       mem, new, old, __ATOMIC_ACQUIRE)
+
+/* Compare and exchange with "release" semantics, ie barrier before.  */
+
+#define atomic_compare_and_exchange_val_rel(mem, new, old)	 \
+  __atomic_val_bysize (__arch_compare_and_exchange_val, int,    \
+                       mem, new, old, __ATOMIC_RELEASE)
+
+/* Atomically add value and return the previous (unincremented) value.  */
+
+#define __arch_exchange_and_add_8_int(mem, value, model)	\
+  __atomic_fetch_add (mem, value, model)
+
+#define __arch_exchange_and_add_16_int(mem, value, model)	\
+  __atomic_fetch_add (mem, value, model)
+
+#define __arch_exchange_and_add_32_int(mem, value, model)	\
+  __atomic_fetch_add (mem, value, model)
+
+#define __arch_exchange_and_add_64_int(mem, value, model)	\
+  (__nds32_link_error (), (typeof (*mem)) 0)
+
+#define atomic_exchange_and_add_acq(mem, value)			\
+  __atomic_val_bysize (__arch_exchange_and_add, int, mem, value,	\
+		       __ATOMIC_ACQUIRE)
+
+#define atomic_exchange_and_add_rel(mem, value)			\
+  __atomic_val_bysize (__arch_exchange_and_add, int, mem, value,	\
+		       __ATOMIC_RELEASE)
+#endif /* nds32/atomic-machine.h*/
diff --git a/sysdeps/nds32/nptl/bits/pthreadtypes-arch.h b/sysdeps/nds32/nptl/bits/pthreadtypes-arch.h
new file mode 100644
index 0000000..27b6fae
--- /dev/null
+++ b/sysdeps/nds32/nptl/bits/pthreadtypes-arch.h
@@ -0,0 +1,71 @@
+/* Machine-specific pthread type layouts, Andes nds32 version.
+   Copyright (C) 2012-2018 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 _BITS_PTHREADTYPES_H
+#define _BITS_PTHREADTYPES_H	1
+
+#include <endian.h>
+
+#define __SIZEOF_PTHREAD_ATTR_T 32
+#define __SIZEOF_PTHREAD_MUTEX_T 32
+#define __SIZEOF_PTHREAD_MUTEXATTR_T 4
+#define __SIZEOF_PTHREAD_COND_T 48
+#define __SIZEOF_PTHREAD_CONDATTR_T 4
+#define __SIZEOF_PTHREAD_RWLOCK_T 32
+#define __SIZEOF_PTHREAD_RWLOCKATTR_T 8
+#define __SIZEOF_PTHREAD_BARRIER_T 20
+#define __SIZEOF_PTHREAD_BARRIERATTR_T 4
+
+
+
+#define __PTHREAD_COMPAT_PADDING_MID
+#define __PTHREAD_COMPAT_PADDING_END
+#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0
+#define __PTHREAD_MUTEX_USE_UNION 0
+#define __PTHREAD_MUTEX_LOCK_ELISION 0
+
+
+#define __LOCK_ALIGNMENT
+#define __ONCE_ALIGNMENT
+
+struct __pthread_rwlock_arch_t
+{
+  unsigned int __readers;
+  unsigned int __writers;
+  unsigned int __wrphase_futex;
+  unsigned int __writers_futex;
+  unsigned int __pad3;
+  unsigned int __pad4;
+#if __BYTE_ORDER == __BIG_ENDIAN
+  unsigned char __pad1;
+  unsigned char __pad2;
+  unsigned char __shared;
+  unsigned char __flags;
+#else
+  unsigned char __flags;
+  unsigned char __shared;
+  unsigned char __pad1;
+  unsigned char __pad2;
+#endif
+  int __cur_writer;
+};
+
+#define __PTHREAD_RWLOCK_ELISION_EXTRA 0
+
+
+#endif	/* bits/pthreadtypes.h */
diff --git a/sysdeps/nds32/nptl/bits/semaphore.h b/sysdeps/nds32/nptl/bits/semaphore.h
new file mode 100644
index 0000000..fe6c4a4
--- /dev/null
+++ b/sysdeps/nds32/nptl/bits/semaphore.h
@@ -0,0 +1,32 @@
+/* Machine-specific POSIX semaphore type layouts, Andes nds32 version.
+   Copyright (C) 2002-2018 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 _SEMAPHORE_H
+# error "Never use <bits/semaphore.h> directly; include <semaphore.h> instead."
+#endif
+
+#define __SIZEOF_SEM_T 16
+
+/* Value returned if `sem_open' failed.  */
+#define SEM_FAILED      ((sem_t *) 0)
+
+typedef union
+{
+  char __size[__SIZEOF_SEM_T];
+  long int __align;
+} sem_t;
diff --git a/sysdeps/nds32/nptl/pthread-offsets.h b/sysdeps/nds32/nptl/pthread-offsets.h
new file mode 100644
index 0000000..5558c75
--- /dev/null
+++ b/sysdeps/nds32/nptl/pthread-offsets.h
@@ -0,0 +1,24 @@
+/* pthread offsets for Andes nds32.
+   Copyright (C) 2017-2018 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/>.  */
+
+#define __PTHREAD_MUTEX_NUSERS_OFFSET   12
+#define __PTHREAD_MUTEX_KIND_OFFSET     16
+#define __PTHREAD_MUTEX_SPINS_OFFSET    20
+#define __PTHREAD_MUTEX_ELISION_OFFSET  22
+#define __PTHREAD_MUTEX_LIST_OFFSET     24
-- 
2.7.4

^ permalink raw reply	[flat|nested] 31+ messages in thread

* [PATCH 04/11] nds32: Startup and Dynamic Loader
  2018-05-06 14:41 [PATCH 00/11] nds32 glibc Port v1 vincentc
@ 2018-05-06 14:42 ` vincentc
  2018-05-06 14:42 ` [PATCH 01/11] nds32: Build Infastructure vincentc
                   ` (10 subsequent siblings)
  11 siblings, 0 replies; 31+ messages in thread
From: vincentc @ 2018-05-06 14:42 UTC (permalink / raw)
  To: libc-alpha; +Cc: deanbo422, cnoize, vincentc

This patch contains crti.S, crtn.S and the dynamic loader
for nds32 system.
---
 sysdeps/nds32/crti.S                      |  77 ++++++
 sysdeps/nds32/crtn.S                      |  53 ++++
 sysdeps/nds32/dl-machine.h                | 410 ++++++++++++++++++++++++++++++
 sysdeps/nds32/dl-sysdep.h                 |  22 ++
 sysdeps/nds32/dl-trampoline.S             | 164 ++++++++++++
 sysdeps/nds32/ldsodefs.h                  |  44 ++++
 sysdeps/nds32/start.S                     | 124 +++++++++
 sysdeps/unix/sysv/linux/nds32/dl-static.c |  84 ++++++
 sysdeps/unix/sysv/linux/nds32/ldconfig.h  |  27 ++
 sysdeps/unix/sysv/linux/nds32/ldsodefs.h  |  32 +++
 10 files changed, 1037 insertions(+)
 create mode 100644 sysdeps/nds32/crti.S
 create mode 100644 sysdeps/nds32/crtn.S
 create mode 100644 sysdeps/nds32/dl-machine.h
 create mode 100644 sysdeps/nds32/dl-sysdep.h
 create mode 100644 sysdeps/nds32/dl-trampoline.S
 create mode 100644 sysdeps/nds32/ldsodefs.h
 create mode 100644 sysdeps/nds32/start.S
 create mode 100644 sysdeps/unix/sysv/linux/nds32/dl-static.c
 create mode 100644 sysdeps/unix/sysv/linux/nds32/ldconfig.h
 create mode 100644 sysdeps/unix/sysv/linux/nds32/ldsodefs.h

diff --git a/sysdeps/nds32/crti.S b/sysdeps/nds32/crti.S
new file mode 100644
index 0000000..662b988
--- /dev/null
+++ b/sysdeps/nds32/crti.S
@@ -0,0 +1,77 @@
+/* Special .init and .fini section support for Andes nds32.
+   Copyright (C) 2012-2018 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.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file with other
+   programs, and to distribute those programs without any restriction
+   coming from the use of this file. (The GNU Lesser General Public
+   License restrictions do apply in other respects; for example, they
+   cover modification of the file, and distribution when not linked
+   into another program.)
+
+   Note that people who make modified versions of this file are not
+   obligated to grant this special exception for their modified
+   versions; it is their choice whether to do so. The GNU Lesser
+   General Public License gives permission to release a modified
+   version without this exception; this exception also makes it
+   possible to release a modified version which carries forward this
+   exception.
+
+   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/>.  */
+
+/* crti.S puts a function prologue at the beginning of the .init and
+   .fini sections and defines global symbols for those addresses, so
+   they can be called as functions.  The symbols _init and _fini are
+   magic and cause the linker to emit DT_INIT and DT_FINI.  */
+
+#include <libc-symbols.h>
+#include <sysdep.h>
+
+#ifndef PREINIT_FUNCTION
+# define PREINIT_FUNCTION __gmon_start__
+#endif
+
+#ifndef PREINIT_FUNCTION_WEAK
+# define PREINIT_FUNCTION_WEAK 1
+#endif
+
+#if PREINIT_FUNCTION_WEAK
+        weak_extern (PREINIT_FUNCTION)
+#else
+        .hidden PREINIT_FUNCTION
+#endif
+	.abi_2
+	.pic
+	.section .init
+	.align  2
+	.globl	_init
+	.type	_init, @function
+_init:
+	smw.adm	$sp, [$sp], $sp, 6
+	sethi	$gp, hi20(_GLOBAL_OFFSET_TABLE_ - 8)
+	ori	$gp, $gp, lo12(_GLOBAL_OFFSET_TABLE_ - 4)
+	add5.pc $gp
+	la	$r0, PREINIT_FUNCTION@GOT
+	jralnez	$r0
+
+	.section .fini
+	.align	2
+	.globl	_fini
+	.type	_fini, @function
+_fini:
+	smw.adm	$sp, [$sp], $sp, 6
+	GET_GTABLE ($gp)
diff --git a/sysdeps/nds32/crtn.S b/sysdeps/nds32/crtn.S
new file mode 100644
index 0000000..073d5b4
--- /dev/null
+++ b/sysdeps/nds32/crtn.S
@@ -0,0 +1,53 @@
+/* Special .init and .fini section support for Andes nds32.
+   Copyright (C) 2012-2018 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.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file with other
+   programs, and to distribute those programs without any restriction
+   coming from the use of this file. (The GNU Lesser General Public
+   License restrictions do apply in other respects; for example, they
+   cover modification of the file, and distribution when not linked
+   into another program.)
+
+   Note that people who make modified versions of this file are not
+   obligated to grant this special exception for their modified
+   versions; it is their choice whether to do so. The GNU Lesser
+   General Public License gives permission to release a modified
+   version without this exception; this exception also makes it
+   possible to release a modified version which carries forward this
+   exception.
+
+   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/>.  */
+
+/* crtn.S puts function epilogues in the .init and .fini sections
+   corresponding to the prologues in crti.S. */
+
+	.abi_2
+	.pic
+	.section .init
+
+	lmw.bim	$sp, [$sp], $sp, 6
+	.hint_func_args 63
+	ret
+
+	.section .fini
+
+	lmw.bim	$sp, [$sp], $sp, 6
+	.hint_func_args 63
+	ret
+
+	.weak	__gmon_start__
diff --git a/sysdeps/nds32/dl-machine.h b/sysdeps/nds32/dl-machine.h
new file mode 100644
index 0000000..0e60019
--- /dev/null
+++ b/sysdeps/nds32/dl-machine.h
@@ -0,0 +1,410 @@
+/* Machine-dependent ELF dynamic relocation inline functions, Andes nds32 version.
+   Copyright (C) 2013-2014 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 dl_machine_h
+#define dl_machine_h
+
+#define ELF_MACHINE_NAME "NDS32"
+
+#include <tls.h>
+#include <dl-tlsdesc.h>
+#include <ldsodefs.h>
+
+/* Return nonzero iff ELF header is compatible with the running host.  */
+static inline int __attribute__ ((unused))
+elf_machine_matches_host(const ElfW(Ehdr) *ehdr)
+{
+  return ehdr->e_machine == EM_NDS32;
+}
+
+
+/* Return the link-time address of _DYNAMIC.  Conveniently, this is the
+   first element of the GOT, a special entry that is never relocated.  */
+static inline ElfW(Addr) __attribute__ ((unused, const))
+elf_machine_dynamic (void)
+{
+  /* This produces a GOTOFF reloc that resolves to some offset at link time, so in
+     fact just loads from the GOT register directly.  By doing it without
+     an asm we can let the compiler choose any register.  */
+  extern const ElfW(Addr) _GLOBAL_OFFSET_TABLE_[] attribute_hidden;
+  return _GLOBAL_OFFSET_TABLE_[0];
+}
+
+/* Return the run-time load address of the shared object.  */
+static inline ElfW(Addr) __attribute__ ((unused))
+elf_machine_load_address (void)
+{
+  /* Compute the difference between the runtime address of _DYNAMIC as seen
+     by a GOTOFF reference, and the link-time address found in the special
+     unrelocated first GOT entry.  */
+  extern ElfW(Dyn) bygotoff[] asm ("_DYNAMIC") attribute_hidden;
+  return (ElfW(Addr)) &bygotoff - elf_machine_dynamic ();
+}
+
+
+
+/* Set up the loaded object described by L so its unrelocated PLT
+   entries will jump to the on-demand fixup code in dl-runtime.c.  */
+
+static inline int __attribute__ ((unused, always_inline))
+elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
+{
+
+  if (l->l_info[DT_JMPREL] && lazy)
+    {
+      ElfW(Addr) *got;
+      extern void _dl_runtime_resolve (ElfW(Word)) attribute_hidden;
+      extern void _dl_runtime_profile (ElfW(Word)) attribute_hidden;
+      /* The GOT entries for functions in the PLT have not yet been filled
+	 in.  Their initial contents will arrange when called to push an
+	 offset into the .rel.plt section, push _GLOBAL_OFFSET_TABLE_[1],
+	 and then jump to _GLOBAL_OFFSET_TABLE[2].  */
+      got = (ElfW(Addr) *) D_PTR (l, l_info[DT_PLTGOT]);
+      /* If a library is prelinked but we have to relocate anyway,
+	 we have to be able to undo the prelinking of .got.plt.
+	 The prelinker saved us here address of .plt + 0x28.  */
+      if (got[1])
+	{
+	  l->l_mach.plt = got[1] + l->l_addr;
+	  l->l_mach.gotplt = (ElfW(Addr)) &got[3];
+	}
+      got[1] = (ElfW(Addr)) l;	/* Identify this shared object.  */
+
+      /* The got[2] entry contains the address of a function which gets
+	 called to get the address of a so far unresolved function and
+	 jump to it.  The profiling extension of the dynamic linker allows
+	 to intercept the calls to collect information.  In this case we
+	 don't store the address in the GOT so that all future calls also
+	 end in this function.  */
+      if (__builtin_expect (profile, 0))
+	{
+	  got[2] = (ElfW(Addr)) &_dl_runtime_profile;
+
+	  if (GLRO(dl_profile) != NULL && _dl_name_match_p (GLRO(dl_profile), l))
+	    /* This is the object we are looking for.  Say that we really
+	       want profiling and the timers are started.  */
+	    GL(dl_profile_map) = l;
+	}
+      else
+	/* This function will get called to fix up the GOT entry indicated by
+	   the offset on the stack, and then jump to the resolved address.  */
+	got[2] = (ElfW(Addr)) &_dl_runtime_resolve;
+    }
+
+  return lazy;
+}
+
+/* Initial entry point code for the dynamic linker.
+   The C function `_dl_start' is the real entry point;
+   its return value is the user program's entry point.  */
+#define RTLD_START asm ("						\
+	.text								\n\
+	.globl _start							\n\
+	.align	4							\n\
+_start:									\n\
+	/* We are PIC code, so get global offset table.  */		\n\
+	mfusr 	$r15, $PC 						\n\
+	sethi	$gp, HI20(_GLOBAL_OFFSET_TABLE_ + 4)			\n\
+	ori	$gp, $gp, LO12(_GLOBAL_OFFSET_TABLE_ + 8)		\n\
+	add	$gp, $r15, $gp						\n\
+									\n\
+	/* At start time, all the args are on the stack.  */		\n\
+	addi	$r0,	$sp,	0					\n\
+	bal	_dl_start@PLT						\n\
+	/* Save user entry point in $r6 which is callee saved.  */	\n\
+	addi	$r6,	$r0,	0					\n\
+	/* See if we were run as a command with the executable file	\n\
+	   name as an extra leading argument.				\n\
+	   skip these arguments.  */					\n\
+	l.w	$r2,	_dl_skip_args@GOTOFF	/* Args to skip.  */	\n\
+	bnez	$r2,	2f						\n\
+	/* Prepare args to call _dl_init.  */				\n\
+	addi	$r2,	$sp,	4		/* argv.  */		\n\
+1:									\n\
+	l.w	$r0,	_rtld_local@GOTOFF				\n\
+	lwi	$r1,	[$sp+0]			/* argc.  */		\n\
+	/* envp =sp +argc * 4 + 8.  */					\n\
+	slli	$r3,	$r1,	2                                       \n\
+	addi	$r3,	$r3,	8					\n\
+	add	$r3,	$r3,	$sp		/* envp.  */		\n\
+	bal	_dl_init@PLT						\n\
+									\n\
+	/* Load address of _dl_fini finalizer function.  */		\n\
+	la		$r5, _dl_fini@GOTOFF				\n\
+	/* Jump to the user_s entry point.  */				\n\
+	jr	$r6							\n\
+2:									\n\
+	lwi	$r0,	[$sp+0]			/* Original argc.  */	\n\
+	/* Offset for new $sp.  */					\n\
+	slli	$r1,	$r2,	2					\n\
+	/* Adjust sp to skip args.  */					\n\
+	add	$sp,	$sp,	$r1					\n\
+	sub	$r0,	$r0,	$r2		/* Set new argc.  */	\n\
+	swi	$r0,	[$sp+0]			/* Save new argc.  */	\n\
+	andi	$r0,	$sp,	7					\n\
+	beqz	$r0,	1b						\n\
+									\n\
+	/* Make stack 8-byte aligned.  */				\n\
+	bitci	$sp,	$sp,	7					\n\
+	move	$r2,	$sp						\n\
+3:	/* argc and argv.  */						\n\
+	lwi	$r0,	[$r2+4]						\n\
+	smw.bim $r0,[$r2],$r0,#0					\n\
+	bnez	$r0,	3b						\n\
+									\n\
+3:	/* envp.  */							\n\
+	lwi	$r0,	[$r2+4]						\n\
+	smw.bim $r0,[$r2],$r0,#0					\n\
+	bnez	$r0,	3b						\n\
+									\n\
+3:	/* auxv.  */							\n\
+	lmw.ai	$r0,[$r2],$r1,#0					\n\
+	smw.bim	$r0,[$r2],$r1,#0					\n\
+	bnez	$r0,	3b						\n\
+									\n\
+	/* Update _dl_argv.  */						\n\
+	addi	$r2,	$sp,	4					\n\
+	s.w	$r2,	_dl_argv@GOTOFF		/* Args to skip.  */	\n\
+	j	1b							\n\
+	.previous							\n\
+");
+
+# define elf_machine_type_class(type) 					\
+  (((((type) == R_NDS32_JMP_SLOT) 					\
+      || ((type)== R_NDS32_TLS_TPOFF) 					\
+      || ((type)== R_NDS32_TLS_DESC)) * ELF_RTYPE_CLASS_PLT)		\
+   | (((type) == R_NDS32_COPY) * ELF_RTYPE_CLASS_COPY) 			\
+   | (((type) == R_NDS32_GLOB_DAT) * ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA))
+
+
+/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
+#define ELF_MACHINE_JMP_SLOT	R_NDS32_JMP_SLOT
+
+/* nds32 uses ElfW(Rela) no ElfW(Rel) */
+#define ELF_MACHINE_NO_REL 1
+#define ELF_MACHINE_NO_RELA 0
+
+/* We define an initialization functions.  This is called very early in
+   _dl_sysdep_start.  */
+#define DL_PLATFORM_INIT dl_platform_init ()
+
+static inline void __attribute__ ((unused))
+dl_platform_init (void)
+{
+  if (GLRO(dl_platform) != NULL && *GLRO(dl_platform) == '\0')
+    /* Avoid an empty string which would disturb us.  */
+    GLRO(dl_platform) = NULL;
+}
+
+/* Fixup a PLT entry to bounce directly to the function at VALUE.  */
+static inline ElfW(Addr)
+elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+		       const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
+		       const ElfW(Rela) *reloc,
+		       ElfW(Addr) *reloc_addr, ElfW(Addr) value)
+{
+  return *reloc_addr = value;
+}
+
+static inline ElfW(Addr)
+elf_machine_plt_value (struct link_map *map, const ElfW(Rela) *reloc,
+		       ElfW(Addr) value)
+{
+  return value + reloc->r_addend ;
+}
+
+/* Names of the architecture-specific auditing callback functions.  */
+#define ARCH_LA_PLTENTER nds32_gnu_pltenter
+#define ARCH_LA_PLTEXIT nds32_gnu_pltexit
+
+#endif /* dl_machine_h */
+
+
+#ifdef RESOLVE_MAP
+
+# define COPY_UNALIGNED_WORD(swp, twp) \
+  { \
+    unsigned int __tmp = __builtin_nds32_unaligned_load_w (swp); \
+    __builtin_nds32_unaligned_store_w (twp, __tmp); \
+  }
+/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
+   MAP is the object containing the reloc.  */
+
+auto inline void
+elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
+                  const ElfW(Sym) *sym, const struct r_found_version *version,
+                  void *const reloc_addr_arg, int skip_ifunc)
+{
+
+  ElfW(Addr) *const reloc_addr = reloc_addr_arg;
+  const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
+  ElfW(Addr) value;
+
+# if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
+  if (__builtin_expect (r_type == R_NDS32_RELATIVE, 0))
+    {
+#  if !defined RTLD_BOOTSTRAP && !defined HAVE_Z_COMBRELOC
+      /* This is defined in rtld.c, but nowhere in the static libc.a;
+	 make the reference weak so static programs can still link.
+	 This declaration cannot be done when compiling rtld.c
+	 (i.e. #ifdef RTLD_BOOTSTRAP) because rtld.c contains the
+	 common defn for _dl_rtld_map, which is incompatible with a
+	 weak decl in the same file.  */
+#   ifndef SHARED
+      weak_extern (_dl_rtld_map);
+#   endif
+      if (map != &GL(dl_rtld_map)) /* Already done in rtld itself.  */
+#  endif
+        *reloc_addr = map->l_addr + reloc->r_addend;
+    }
+# endif
+  else if (__builtin_expect (r_type == R_NDS32_NONE, 0))
+    return;
+  else
+    {
+      const ElfW(Sym) *const refsym = sym;
+      struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
+      value = sym_map == NULL ? 0 : sym_map->l_addr + sym->st_value + reloc->r_addend;
+      switch (r_type)
+	{
+	case R_NDS32_COPY:
+	  if (sym == NULL)
+	    /* This can happen in trace mode if an object could not be
+	       found.  */
+	    break;
+	  if (sym->st_size > refsym->st_size
+	      || (sym->st_size < refsym->st_size && GLRO(dl_verbose)))
+	    {
+	      const char *strtab;
+
+	      strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
+	      _dl_error_printf ("\
+%s: Symbol `%s' has different size in shared object, consider re-linking\n",
+				rtld_progname ?: "<program name unknown>",
+				strtab + refsym->st_name);
+	    }
+	  memcpy (reloc_addr_arg, (void *) value,
+		  MIN (sym->st_size, refsym->st_size));
+	  break;
+	case R_NDS32_GLOB_DAT:
+	case R_NDS32_JMP_SLOT:
+	  /* These addresses are always aligned.  */
+	  *reloc_addr = value;
+	  break;
+        case R_NDS32_32_RELA:
+	  COPY_UNALIGNED_WORD (&value, reloc_addr);
+	  break;
+	case R_NDS32_TLS_TPOFF:
+          {
+# ifdef RTLD_BOOTSTRAP
+	    *reloc_addr = map->l_tls_offset + sym->st_value + reloc->r_addend;
+# else
+	    if (sym != NULL)
+	      {
+                CHECK_STATIC_TLS (map, sym_map);
+                *reloc_addr = sym_map->l_tls_offset + sym->st_value + reloc->r_addend;
+              }
+            else
+              _dl_error_printf ("sym is NULL in R_NDS32_TLS_TPOFF\n");
+# endif
+	}
+	break;
+
+	case R_NDS32_TLS_DESC:
+	{
+	    struct tlsdesc volatile *td =
+	      (struct tlsdesc volatile *)reloc_addr;
+# ifndef RTLD_BOOTSTRAP
+		if(!sym)
+		{
+			td->argument.value = reloc->r_addend;
+			td->entry = _dl_tlsdesc_undefweak;
+		}
+		else
+# endif
+		{
+			value=sym->st_value + reloc->r_addend;
+# ifndef RTLD_BOOTSTRAP
+#   ifndef SHARED
+			CHECK_STATIC_TLS (map, sym_map);
+#   else
+			if (!TRY_STATIC_TLS (map, sym_map))
+		  	{
+		    		td->argument.pointer = _dl_make_tlsdesc_dynamic(sym_map, value);
+		    		td->entry = _dl_tlsdesc_dynamic;
+		  	}
+			else
+#   endif
+# endif
+		  	{
+		    		td->argument.value = value + sym_map->l_tls_offset;
+		    		td->entry = _dl_tlsdesc_return;
+		  	}
+		}
+	}
+	break;
+
+	default:
+	  _dl_reloc_bad_type (map, r_type, 0);
+	  break;
+	}
+    }
+}
+
+auto inline void
+__attribute__ ((always_inline))
+elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
+			   void *const reloc_addr_arg)
+{
+  ElfW(Addr) value;
+
+  if (reloc->r_addend)
+    value = l_addr + reloc->r_addend;
+  else
+    {
+      COPY_UNALIGNED_WORD (reloc_addr_arg, &value);
+      value += l_addr;
+    }
+  COPY_UNALIGNED_WORD (&value, reloc_addr_arg);
+
+# undef COPY_UNALIGNED_WORD
+}
+
+auto inline void
+__attribute__ ((always_inline))
+elf_machine_lazy_rel (struct link_map *map,
+		      ElfW(Addr) l_addr, const ElfW(Rela) *reloc, int skip_ifunc)
+{
+  ElfW(Addr) *const reloc_addr = (void *) (l_addr + reloc->r_offset);
+  /* Check for unexpected PLT reloc type.  */
+  if (ELF32_R_TYPE (reloc->r_info) == R_NDS32_JMP_SLOT)
+    {
+      if (__builtin_expect (map->l_mach.plt, 0) == 0)
+	*reloc_addr += l_addr;
+      else
+	*reloc_addr =
+	  map->l_mach.plt
+	  + (((ElfW(Addr)) reloc_addr) - map->l_mach.gotplt) * 6;
+    }
+  else if (ELF32_R_TYPE (reloc->r_info) == R_NDS32_NONE) {
+    }
+  else
+    _dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 1);
+}
+#endif /* RESOLVE_MAP  */
+
diff --git a/sysdeps/nds32/dl-sysdep.h b/sysdeps/nds32/dl-sysdep.h
new file mode 100644
index 0000000..080acb8
--- /dev/null
+++ b/sysdeps/nds32/dl-sysdep.h
@@ -0,0 +1,22 @@
+/* System-specific settings for dynamic linker code.  Andes nds32 version.
+   Copyright (C) 2002-2018 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 <dl-sysdep.h>
+
+#define DL_ARGV_NOT_RELRO 1
+#define DL_EXTERN_PROTECTED_DATA
diff --git a/sysdeps/nds32/dl-trampoline.S b/sysdeps/nds32/dl-trampoline.S
new file mode 100644
index 0000000..9141e6d
--- /dev/null
+++ b/sysdeps/nds32/dl-trampoline.S
@@ -0,0 +1,164 @@
+/* PLT trampolines.  Andes nds32 version.
+   Copyright (C) 2006-2018 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 <libc-symbols.h>
+
+ENTRY(_dl_runtime_resolve)
+
+	/* We get called with:
+	   $lp contains the return address from this call.
+	   $r16 contains offset to target reloc entry.
+	   $r17 contains GOT[1] (identity of taget lib).
+	   $r15 is GOT[2] (starting address of _dl_runtime_resolve).  */
+
+	/* Save arguments $r0 - $r3.  */
+	smw.adm $r0,	[$sp],	$r5,	6
+	.cfi_adjust_cfa_offset 32
+	.cfi_rel_offset lp, 28 
+	.cfi_rel_offset gp, 24
+
+	GET_GTABLE ($gp)
+
+	move	$r0,	$r17
+	/* Sizeof (ElfW(Rela)) is 12.  */
+	slli    $r1,    $r16,   2
+	slli    $r16,   $r16,   3
+	add     $r1,    $r1,    $r16
+	addi	$r2,	$lp,	0
+	bal	_dl_fixup
+	/* Save the return.  */
+	addi	$r15,	$r0,	0
+	
+	lmw.bim	$r0,	[$sp],	$r5,	6
+	.cfi_adjust_cfa_offset -32
+	.cfi_restore lp
+	.cfi_restore gp
+
+	/* Jump to the newly found address.  */
+	jr		$r15
+END(_dl_runtime_resolve)
+ENTRY(_dl_runtime_profile)
+
+	/* We get called with:
+	   $lp contains the return address from this call.
+	   $r16 contains offset to target reloc entry.
+	   $r17 contains GOT[1] (identity of taget lib).
+	   $r15 is GOT[2] (starting address of this function).
+
+	   Stack layout:
+	   12 - La_nds32_regs (9 registers).
+	   4 - Saved two arguments to _dl_profile_fixup.
+	   0 - framesize returned from pltenter.  */
+
+	/* Save La_nds32_regs arguments: $r0 - $r5, $gp, $lp, $sp.  */
+	move 	$r15,	$sp
+	smw.adm $r0,	[$r15],	$r5,	7
+	move	$sp,	$r15
+	.cfi_adjust_cfa_offset 36
+	.cfi_rel_offset gp, 24
+	.cfi_rel_offset lp, 28
+
+	GET_GTABLE ($gp)
+
+	addi	$r0,	$r17,	0
+	slli	$r1,	$r16,	2
+	slli	$r16,	$r16,	3
+	add	$r1,	$r1,	$r16
+
+	smw.adm $r0,    [$sp],  $r1,    0
+	.cfi_adjust_cfa_offset 4
+
+	xor	$r4,	$r4,	$r4
+	push	$r4
+
+	move	$r2,	$lp
+	addi	$r3,	$sp,	12
+	move	$r4,	$sp
+
+	bal	_dl_profile_fixup
+	lw	$r2,	[$sp]
+	sw	$r0,	[$sp]
+	bgez	$r2,	1f
+	cfi_remember_state
+
+	addi	$r15,	$sp,	12
+	lmw.bim	$r0,	[$r15],	$r5,	7
+	.cfi_adjust_cfa_offset -48
+	.cfi_restore gp
+	.cfi_restore lp
+	lwi	$r15,	[$sp + (-48)]
+
+	/* Jump to the newly found address.  */
+	jr	$r15
+1:
+	/* The new frame size is in $r2.
+
+	   New stack layout:
+	   16 - La_nds32_regs (9 registers).
+	   8 - Saved two arguments to _dl_profile_fixup.
+	   4 - Saved result of _dl_profile_fixup.
+	   0 - saved $r6.  */
+
+	cfi_restore_state
+	push	$r6
+
+	/* Make new frame size 8-byte aligned.  */
+	bitci	$r6,	$r2,	7
+
+
+	/* Copy stack argument.  */
+	sub	$r0,	$sp,	$r6
+	addi	$r1,	$sp,	48
+	bal	memcpy
+
+	/* Jump to the newly found address.  */
+	addi	$r15,	$sp,	16
+	lmw.bim	$r0,	[$r15],	$r5,	0
+	lwi	$r15,	[$sp +4]
+	sub	$sp,	$sp,	$r6
+	jral	$r15
+	add	$sp,	$sp,	$r6
+	pop	$r6	
+	cfi_def_cfa_register (sp)
+	/* New stack layout:
+	   24 - La_nds32_regs (9 registers).
+	   16 - Saved two arguments to _dl_profile_fixup.
+	   12 - Saved result of _dl_profile_fixup.
+	   8 - one dummy word for stack aligned.
+	   0 - La_nds32_retval.  */
+	
+	/* Push $r0, $r1 for La_nds32_retval.  */
+	/* Push $r2 for dummy word.  */
+	smw.adm	$r0,	[$sp],	$r2
+	.cfi_adjust_cfa_offset 12
+	addi	$r15,	$sp,	16
+	lmw.bim $r0,    [$r15],  $r1	
+	addi	$r2,	$sp,	24
+	/* $r3 contains outregs.  */
+	move	$r3,	$sp
+	bal	_dl_call_pltexit
+
+	lmw.bim $r0,    [$sp],  $r1
+	addi	$r15,	$sp,	24
+	lmw.bim	$r2,	[$r15],	$r5,	7
+	.cfi_adjust_cfa_offset -48
+	.cfi_restore gp
+	.cfi_restore lp
+	ret
+END(_dl_runtime_profile)
diff --git a/sysdeps/nds32/ldsodefs.h b/sysdeps/nds32/ldsodefs.h
new file mode 100644
index 0000000..b674e79
--- /dev/null
+++ b/sysdeps/nds32/ldsodefs.h
@@ -0,0 +1,44 @@
+/* Run-time dynamic linker data structures for loaded ELF shared objects.
+   Copyright (C) 2011-2018 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	_NDS32_LDSODEFS_H
+#define	_NDS32_LDSODEFS_H	1
+
+#include <elf.h>
+
+struct La_nds32_regs;
+struct La_nds32_retval;
+
+#define ARCH_PLTENTER_MEMBERS						\
+    ElfW(Addr) (*nds32_gnu_pltenter) (ElfW(Sym) *, unsigned int, 	\
+				      uintptr_t *, uintptr_t *,		\
+				      struct La_nds32_regs *,		\
+				      unsigned int *, const char *name,	\
+				      long int *framesizep)
+
+#define ARCH_PLTEXIT_MEMBERS						\
+    unsigned int (*nds32_gnu_pltexit) (ElfW(Sym) *, unsigned int,	\
+				       uintptr_t *, uintptr_t *,	\
+				       const struct La_nds32_regs *,	\
+				       struct La_nds32_retval *, 	\
+				       const char *)
+
+#include_next <ldsodefs.h>
+
+#endif /* nds32/ldsodefs.h */
diff --git a/sysdeps/nds32/start.S b/sysdeps/nds32/start.S
new file mode 100644
index 0000000..3952736
--- /dev/null
+++ b/sysdeps/nds32/start.S
@@ -0,0 +1,124 @@
+/* Startup code compliant to the ELF nds32 ABI.
+   Copyright (C) 1995-2018 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.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file with other
+   programs, and to distribute those programs without any restriction
+   coming from the use of this file. (The GNU Lesser General Public
+   License restrictions do apply in other respects; for example, they
+   cover modification of the file, and distribution when not linked
+   into another program.)
+
+   Note that people who make modified versions of this file are not
+   obligated to grant this special exception for their modified
+   versions; it is their choice whether to do so. The GNU Lesser
+   General Public License gives permission to release a modified
+   version without this exception; this exception also makes it
+   possible to release a modified version which carries forward this
+   exception.
+
+   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/>.  */
+
+/* This is the canonical entry point, usually the first thing in the text
+   segment.
+
+	Note that the code in the .init section has already been run.
+	This includes _init and _libc_init
+
+
+	At this entry point, most registers' values are unspecified, except:
+
+   $r5		Contains a function pointer to be registered with `atexit'.
+		This is how the dynamic linker arranges to have DT_FINI
+		functions called for shared libraries that have been loaded
+		before this code runs.
+
+   sp		The stack contains the arguments and environment:
+		0(sp)			argc
+		4(sp)			argv[0]
+		...
+		(4*argc)(sp)		NULL
+		(4*(argc+1))(sp)	envp[0]
+		...
+					NULL
+*/
+#include <sysdep.h>
+	.text
+	.align	4
+	.globl _start
+	.type  _start, @function
+#ifdef SHARED
+	.pic
+#endif
+_start:
+	/* clear FP.  */
+	movi    $fp,	0
+	/* $r1 = argc.  */
+	lwi	$r1,	[$sp + 0]
+	/* $r2 = argv.  */
+	addi	$r2,	$sp,	4
+	
+	/* align sp to 8-byte boundary.  */
+	movi	$r0,	-8
+	and	$sp,	$sp,	$r0
+	/* $r6 = stack top.  */
+	addi	$r6,	$sp,	0
+	
+#ifdef SHARED
+	/* set $gp register.  */
+	GET_GTABLE ($gp)
+	
+	la	$r3,	__libc_csu_init@GOTOFF
+	la	$r4,	__libc_csu_fini@GOTOFF
+	la	$r0,	main@GOT
+	
+	/* push everything to stack.
+           $r5 is rtld_fini, $r7 is used to keep stack align.  */
+	pushm	$r0,	$r7
+	
+	/* now start it up.  */
+	bal	__libc_start_main@PLT
+	
+	/* should never get here.  */
+	bal	abort@PLT
+#else
+	/* init $gp for small data access.  */
+	la	$gp, _SDA_BASE_
+	
+	la	$r3,	__libc_csu_init
+	la 	$r4,	__libc_csu_fini
+	la	$r0,	main
+	
+	/* push everything to stack, $r5 is rtld_fini and $r7 is garbage */
+	pushm	$r0,	$r7
+	
+	/* now start it up */
+	bal	__libc_start_main
+	
+	/* should never get here */
+	bal	abort
+#endif
+
+	ret
+	
+	/* Define a symbol for the first piece of initialized data.  */
+	.data
+	.globl __data_start
+__data_start:
+	.long	0
+	.weak data_start
+	data_start = __data_start
diff --git a/sysdeps/unix/sysv/linux/nds32/dl-static.c b/sysdeps/unix/sysv/linux/nds32/dl-static.c
new file mode 100644
index 0000000..2e1608a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/dl-static.c
@@ -0,0 +1,84 @@
+/* Variable initialization, Andes nds32 version.
+   Copyright (C) 2001-2018 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 <ldsodefs.h>
+
+#ifdef SHARED
+
+void
+_dl_var_init (void *array[])
+{
+  /* It has to match "variables" below.  */
+  enum
+    {
+      DL_PAGESIZE = 0
+    };
+
+  GLRO(dl_pagesize) = *((size_t *) array[DL_PAGESIZE]);
+}
+
+#else
+
+static void *variables[] =
+{
+  &GLRO(dl_pagesize)
+};
+
+static void
+_dl_unprotect_relro (struct link_map *l)
+{
+  ElfW(Addr) start = ((l->l_addr + l->l_relro_addr)
+		      & ~(GLRO(dl_pagesize) - 1));
+  ElfW(Addr) end = ((l->l_addr + l->l_relro_addr + l->l_relro_size)
+		    & ~(GLRO(dl_pagesize) - 1));
+
+  if (start != end)
+    __mprotect ((void *) start, end - start, PROT_READ | PROT_WRITE);
+}
+
+void
+_dl_static_init (struct link_map *l)
+{
+  struct link_map *rtld_map = l;
+  struct r_scope_elem **scope;
+  const ElfW(Sym) *ref = NULL;
+  lookup_t loadbase;
+  void (*f) (void *[]);
+  size_t i;
+
+  loadbase = _dl_lookup_symbol_x ("_dl_var_init", l, &ref, l->l_local_scope,
+				  NULL, 0, 1, NULL);
+
+  for (scope = l->l_local_scope; *scope != NULL; scope++)
+    for (i = 0; i < (*scope)->r_nlist; i++)
+      if ((*scope)->r_list[i] == loadbase)
+	{
+	  rtld_map = (*scope)->r_list[i];
+	  break;
+	}
+
+  if (ref != NULL)
+    {
+      f = (void (*) (void *[])) DL_SYMBOL_ADDRESS (loadbase, ref);
+      _dl_unprotect_relro (rtld_map);
+      f (variables);
+      _dl_protect_relro (rtld_map);
+    }
+}
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/nds32/ldconfig.h b/sysdeps/unix/sysv/linux/nds32/ldconfig.h
new file mode 100644
index 0000000..b99d034
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/ldconfig.h
@@ -0,0 +1,27 @@
+/* ldconfig default paths and libraries, Andes Linux/nds32 version.
+   Copyright (C) 2001-2018 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 <sysdeps/generic/ldconfig.h>
+
+
+#define SYSDEP_KNOWN_INTERPRETER_NAMES				\
+  { "ld-linux-nds32.so.1", FLAG_ELF_LIBC6 }
+
+#define SYSDEP_KNOWN_LIBRARY_NAMES	\
+  { "libc.so.6", FLAG_ELF_LIBC6 },	\
+  { "libm.so.6", FLAG_ELF_LIBC6 },
diff --git a/sysdeps/unix/sysv/linux/nds32/ldsodefs.h b/sysdeps/unix/sysv/linux/nds32/ldsodefs.h
new file mode 100644
index 0000000..30e868e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/ldsodefs.h
@@ -0,0 +1,32 @@
+/* Andes nds32 dynamic linker data structures for loaded ELF shared objects.
+   Copyright (C) 2001-2018 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 _LDSODEFS_H
+
+/* Get the real definitions.  */
+#include_next <ldsodefs.h>
+
+/* Now define our stuff.  */
+
+/* We need special support to initialize DSO loaded for statically linked
+   binaries.  */
+extern void _dl_static_init (struct link_map *map);
+#undef DL_STATIC_INIT
+#define DL_STATIC_INIT(map) _dl_static_init (map)
+
+#endif /* ldsodefs.h */
-- 
2.7.4

^ permalink raw reply	[flat|nested] 31+ messages in thread

* [PATCH 02/11] nds32: ABI Implementation
  2018-05-06 14:41 [PATCH 00/11] nds32 glibc Port v1 vincentc
                   ` (8 preceding siblings ...)
  2018-05-06 14:42 ` [PATCH 09/11] nds32: Add ABI list vincentc
@ 2018-05-06 14:42 ` vincentc
  2018-05-12  7:15   ` Florian Weimer
  2018-05-06 14:42 ` [PATCH 11/11] Add nds32 entries to config.h.in vincentc
  2018-05-08 14:46 ` [PATCH 00/11] nds32 glibc Port v1 Joseph Myers
  11 siblings, 1 reply; 31+ messages in thread
From: vincentc @ 2018-05-06 14:42 UTC (permalink / raw)
  To: libc-alpha; +Cc: deanbo422, cnoize, vincentc

The implementation of these files in this patch is dependent
on nds32-ABI convention.
---
 sysdeps/nds32/__longjmp.S                      |  64 +++++++++++++
 sysdeps/nds32/backtrace.c                      |   1 +
 sysdeps/nds32/bits/endian.h                    |  27 ++++++
 sysdeps/nds32/bits/link.h                      |  54 +++++++++++
 sysdeps/nds32/bits/setjmp.h                    |  37 ++++++++
 sysdeps/nds32/bsd-_setjmp.S                    |   1 +
 sysdeps/nds32/bsd-setjmp.S                     |   1 +
 sysdeps/nds32/gccframe.h                       |  21 +++++
 sysdeps/nds32/jmpbuf-offsets.h                 |  34 +++++++
 sysdeps/nds32/jmpbuf-unwind.h                  |  47 ++++++++++
 sysdeps/nds32/linkmap.h                        |  26 ++++++
 sysdeps/nds32/machine-gmon.h                   |  32 +++++++
 sysdeps/nds32/memcpy.S                         | 123 +++++++++++++++++++++++++
 sysdeps/nds32/memset.S                         |  59 ++++++++++++
 sysdeps/nds32/memusage.h                       |  21 +++++
 sysdeps/nds32/nptl/pthreaddef.h                |  33 +++++++
 sysdeps/nds32/setjmp.S                         |  66 +++++++++++++
 sysdeps/nds32/sotruss-lib.c                    |  50 ++++++++++
 sysdeps/nds32/stackinfo.h                      |  32 +++++++
 sysdeps/nds32/strcmp.S                         | 105 +++++++++++++++++++++
 sysdeps/nds32/strcpy.S                         |  75 +++++++++++++++
 sysdeps/nds32/sysdep.h                         |  70 ++++++++++++++
 sysdeps/nds32/tst-audit.h                      |  23 +++++
 sysdeps/unix/sysv/linux/nds32/jmp_buf-macros.h |  26 ++++++
 sysdeps/unix/sysv/linux/nds32/localplt.data    |  19 ++++
 25 files changed, 1047 insertions(+)
 create mode 100644 sysdeps/nds32/__longjmp.S
 create mode 100644 sysdeps/nds32/backtrace.c
 create mode 100644 sysdeps/nds32/bits/endian.h
 create mode 100644 sysdeps/nds32/bits/link.h
 create mode 100644 sysdeps/nds32/bits/setjmp.h
 create mode 100644 sysdeps/nds32/bsd-_setjmp.S
 create mode 100644 sysdeps/nds32/bsd-setjmp.S
 create mode 100644 sysdeps/nds32/gccframe.h
 create mode 100644 sysdeps/nds32/jmpbuf-offsets.h
 create mode 100644 sysdeps/nds32/jmpbuf-unwind.h
 create mode 100644 sysdeps/nds32/linkmap.h
 create mode 100644 sysdeps/nds32/machine-gmon.h
 create mode 100644 sysdeps/nds32/memcpy.S
 create mode 100644 sysdeps/nds32/memset.S
 create mode 100644 sysdeps/nds32/memusage.h
 create mode 100644 sysdeps/nds32/nptl/pthreaddef.h
 create mode 100644 sysdeps/nds32/setjmp.S
 create mode 100644 sysdeps/nds32/sotruss-lib.c
 create mode 100644 sysdeps/nds32/stackinfo.h
 create mode 100644 sysdeps/nds32/strcmp.S
 create mode 100644 sysdeps/nds32/strcpy.S
 create mode 100644 sysdeps/nds32/sysdep.h
 create mode 100644 sysdeps/nds32/tst-audit.h
 create mode 100644 sysdeps/unix/sysv/linux/nds32/jmp_buf-macros.h
 create mode 100644 sysdeps/unix/sysv/linux/nds32/localplt.data

diff --git a/sysdeps/nds32/__longjmp.S b/sysdeps/nds32/__longjmp.S
new file mode 100644
index 0000000..608216c
--- /dev/null
+++ b/sysdeps/nds32/__longjmp.S
@@ -0,0 +1,64 @@
+/* longjmp, Andes nds32 version.
+   Copyright (C) 1996-2018 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/>.  */
+
+/*
+  $r0 - $r5 are for paramter passing - no need to save.
+  $r6 - $r14 are callee saved - needs to save.
+  $r15 is temp register for assembler - no need to save.
+  $r16 - $r25 are caller saved - no need to save.
+  $r26 - $r27 are temp registers for OS - no need to save.
+  $r28 is $fp - need to save.
+  $r29 is $gp - need to save.
+  $r30 is $ra - need to save.
+  $r31 is $sp - need to save.
+  So we need to save $r6 - $r14 and $r28 - $r31.
+  The jmpbuf looks like this:
+  $r6
+  $r7
+  $r8
+  $r9
+  $r10
+  $r11
+  $r12
+  $r13
+  $r14
+  $fp
+  $gp
+  $ra
+  $sp
+  Reserved(For 8-byte align if needed)
+*/
+
+#include <sysdep.h>
+#define _SETJMP_H
+#define _ASM
+#include <bits/setjmp.h>
+	.section .text
+
+/* __longjmp (env[0].__jmpbuf, val ?: 1);  */
+ENTRY(__longjmp)
+	/* Restore registers.  */
+	lmw.bim  $r6, [$r0], $r14, #0xf
+
+	/* Return error code. Make sure error code is not 0.  */
+	bnez  $r1, .Ldone
+	movi  $r1, #1
+.Ldone:
+	addi  $r0, $r1, #0
+	ret
+END(__longjmp)
diff --git a/sysdeps/nds32/backtrace.c b/sysdeps/nds32/backtrace.c
new file mode 100644
index 0000000..27ce597
--- /dev/null
+++ b/sysdeps/nds32/backtrace.c
@@ -0,0 +1 @@
+#include <sysdeps/x86_64/backtrace.c>
diff --git a/sysdeps/nds32/bits/endian.h b/sysdeps/nds32/bits/endian.h
new file mode 100644
index 0000000..262ffea
--- /dev/null
+++ b/sysdeps/nds32/bits/endian.h
@@ -0,0 +1,27 @@
+/* Define __BYTE_ORDER. Andes nds32 version
+   Copyright (C) 1997-2018 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 _ENDIAN_H
+# error "Never use <bits/endian.h> directly; include <endian.h> instead."
+#endif
+
+#if defined __NDS32_EB__
+# define __BYTE_ORDER __BIG_ENDIAN
+#else
+# define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
diff --git a/sysdeps/nds32/bits/link.h b/sysdeps/nds32/bits/link.h
new file mode 100644
index 0000000..7b3f078
--- /dev/null
+++ b/sysdeps/nds32/bits/link.h
@@ -0,0 +1,54 @@
+/* Machine-specific declarations for dynamic linker interface.  Andes nds32 version.
+   Copyright (C) 2005-2018 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	_LINK_H
+# error "Never include <bits/link.h> directly; use <link.h> instead."
+#endif
+
+/* Registers for entry into PLT on NDS32.  */
+typedef struct La_nds32_regs
+{
+  uint32_t lr_reg[6];
+  uint32_t lr_gp;
+  uint32_t lr_lp;
+  uint32_t lr_sp;
+} La_nds32_regs;
+
+/* Return values for calls from PLT on NDS32.  */
+typedef struct La_nds32_retval
+{
+  uint32_t lrv_reg[2];
+} La_nds32_retval;
+
+__BEGIN_DECLS
+
+extern ElfW(Addr) la_nds32_gnu_pltenter (ElfW(Sym) *__sym, unsigned int __ndx,
+					 uintptr_t *__refcook,
+					 uintptr_t *__defcook,
+					 La_nds32_regs *__regs,
+					 unsigned int *__flags,
+					 const char *__symname,
+					 long int *__framesizep);
+extern unsigned int la_nds32_gnu_pltexit (ElfW(Sym) *__sym, unsigned int __ndx,
+					  uintptr_t *__refcook,
+					  uintptr_t *__defcook,
+					  const La_nds32_regs *__inregs,
+					  La_nds32_retval *__outregs,
+					  const char *__symname);
+
+__END_DECLS
diff --git a/sysdeps/nds32/bits/setjmp.h b/sysdeps/nds32/bits/setjmp.h
new file mode 100644
index 0000000..5ac5217
--- /dev/null
+++ b/sysdeps/nds32/bits/setjmp.h
@@ -0,0 +1,37 @@
+/* Define the machine-dependent type `jmp_buf'.  Andes nds32 version.
+   Copyright (C) 2003-2018 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 Library General Public License as
+   published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _BITS_SETJMP_H
+#define _BITS_SETJMP_H  1
+
+#if !defined _SETJMP_H && !defined _PTHREAD_H
+# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
+#endif
+
+#ifndef _ASM
+
+typedef struct __jmp_buf_internal_tag
+  {
+    /* Callee-saved registers: $r6 - $r14, $fp, $gp, $lp, $sp: $r28 - $r31.  */
+    int __regs[13];
+  } __jmp_buf[1] __attribute__((__aligned__ (8)));
+
+#endif
+
+#endif  /* bits/setjmp.h */
diff --git a/sysdeps/nds32/bsd-_setjmp.S b/sysdeps/nds32/bsd-_setjmp.S
new file mode 100644
index 0000000..90b99cd
--- /dev/null
+++ b/sysdeps/nds32/bsd-_setjmp.S
@@ -0,0 +1 @@
+/* _setjmp is in setjmp.S.  */
diff --git a/sysdeps/nds32/bsd-setjmp.S b/sysdeps/nds32/bsd-setjmp.S
new file mode 100644
index 0000000..d3b823c
--- /dev/null
+++ b/sysdeps/nds32/bsd-setjmp.S
@@ -0,0 +1 @@
+/* setjmp is in setjmp.S.  */
diff --git a/sysdeps/nds32/gccframe.h b/sysdeps/nds32/gccframe.h
new file mode 100644
index 0000000..2ef5bc2
--- /dev/null
+++ b/sysdeps/nds32/gccframe.h
@@ -0,0 +1,21 @@
+/* Definition of object in frame unwind info.  Andes nds32 version.
+   Copyright (C) 2001-2018 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/>.  */
+
+#define FIRST_PSEUDO_REGISTER 34
+
+#include <sysdeps/generic/gccframe.h>
diff --git a/sysdeps/nds32/jmpbuf-offsets.h b/sysdeps/nds32/jmpbuf-offsets.h
new file mode 100644
index 0000000..7026c90
--- /dev/null
+++ b/sysdeps/nds32/jmpbuf-offsets.h
@@ -0,0 +1,34 @@
+/* Private macros for accessing __jmp_buf contents. Andes nds32 version.
+   Copyright (C) 2018 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/>.  */
+
+#define JB_R6   0
+#define JB_R7   1
+#define JB_R8   2
+#define JB_R9   3
+#define JB_R10  4
+#define JB_R11  5
+#define JB_R12  6
+#define JB_R13  7
+#define JB_R14  8
+#define JB_FP   9
+#define JB_GP   10
+#define JB_LP   11
+#define JB_SP   12
+
+#define JB_FRAME_ADDRESS(buf) \
+	 ((void *)buf[0].__regs[JB_SP])
diff --git a/sysdeps/nds32/jmpbuf-unwind.h b/sysdeps/nds32/jmpbuf-unwind.h
new file mode 100644
index 0000000..373f114
--- /dev/null
+++ b/sysdeps/nds32/jmpbuf-unwind.h
@@ -0,0 +1,47 @@
+/* Examine __jmp_buf for unwinding frames.  Andes nds32 version.
+   Copyright (C) 2003-2018 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 <setjmp.h>
+#include <jmpbuf-offsets.h>
+#include <stdint.h>
+#include <unwind.h>
+#include <sysdep.h>
+
+/* Test if longjmp to JMPBUF would unwind the frame
+   containing a local variable at ADDRESS.  */
+#define _JMPBUF_UNWINDS(jmpbuf, address, demangle) \
+  ((void *) (address) < &(jmpbuf)[0].__regs[JB_SP])
+
+#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
+  _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
+
+static inline uintptr_t __attribute__ ((unused))
+_jmpbuf_sp (__jmp_buf regs)
+{
+  uintptr_t sp = (uintptr_t) &(regs)[0].__regs[JB_SP];
+#ifdef PTR_DEMANGLE
+  PTR_DEMANGLE (sp);
+#endif
+  return sp;
+}
+
+#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
+  ((uintptr_t) (_address) - (_adj) < _jmpbuf_sp (_jmpbuf) - (_adj))
+
+/* We use the normal longjmp for unwinding.  */
+#define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val)
diff --git a/sysdeps/nds32/linkmap.h b/sysdeps/nds32/linkmap.h
new file mode 100644
index 0000000..89e912a
--- /dev/null
+++ b/sysdeps/nds32/linkmap.h
@@ -0,0 +1,26 @@
+/* Define nds32 link_map_machine
+   Copyright (C) 2018 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/>.  */
+
+struct link_map_machine
+  {
+    ElfW(Addr) plt; /* Address of .plt.  */
+    ElfW(Addr) gotplt; /* Address of .got.  */
+    void *tlsdesc_table;
+  };
+
diff --git a/sysdeps/nds32/machine-gmon.h b/sysdeps/nds32/machine-gmon.h
new file mode 100644
index 0000000..64679d9
--- /dev/null
+++ b/sysdeps/nds32/machine-gmon.h
@@ -0,0 +1,32 @@
+/* profiling support for Andes nds32 version
+   Copyright (C) 1996-2018 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>
+
+static void __mcount_internal (u_long frompc, u_long selfpc) __attribute_used__;
+
+#define _MCOUNT_DECL(frompc, selfpc) \
+static void __mcount_internal (u_long frompc, u_long selfpc)
+
+
+#define MCOUNT							\
+void _mcount (u_long frompc)		      			\
+{								\
+  __mcount_internal (frompc, (u_long) RETURN_ADDRESS (0));	\
+}
+
diff --git a/sysdeps/nds32/memcpy.S b/sysdeps/nds32/memcpy.S
new file mode 100644
index 0000000..80d38ef
--- /dev/null
+++ b/sysdeps/nds32/memcpy.S
@@ -0,0 +1,123 @@
+/* Memory copy, Andes nds32 version
+   Copyright (C) 2009-2018 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/>.  */
+
+/* void *memcpy(void *dst, const void *src, int n);
+
+   dst: $r0
+   src: $r1
+   n  : $r2
+   ret: $r0 - pointer to the memory area dst.  */
+
+
+#include <sysdep.h>
+	.text
+
+ENTRY(memcpy)
+	beq	$r0, $r1, .Lquit_memcpy2
+	beqz	$r2, .Lquit_memcpy2
+	move	$r5, $r0
+	srli    $r3, $r2, #5	/* Check if len < cache-line size 32.  */
+	beqz	$r3, .Lword_copy_entry
+	andi	$r4, $r0, #0x3	/* Check byte-align.  */
+	beqz	$r4, .Lunalign_word_copy_entry
+
+	addi	$r4, $r4,#-4
+	abs	$r4, $r4	/* Check how many un-align byte to copy.  */
+	sub	$r2, $r2, $r4	/* Update $r2.  */
+
+.Lunalign_byte_copy:
+	lbi.bi	$r3, [$r1], #1
+	addi	$r4, $r4, #-1
+	sbi.bi	$r3, [$r0], #1
+	bnez	$r4, .Lunalign_byte_copy
+	beqz	$r2, .Lquit_memcpy
+
+.Lunalign_word_copy_entry:
+	andi	$r3, $r0, 0x1f	/* Check cache-line unaligncount.  */
+	beqz	$r3, .Lcache_copy
+
+	addi	$r3, $r3, #-32
+	abs	$r3, $r3
+	sub	$r2, $r2, $r3	/* Update $r2.  */
+
+.Lunalign_word_copy:
+	lmw.bim	$r4, [$r1], $r4
+	addi	$r3, $r3, #-4
+	smw.bim	$r4, [$r0], $r4
+	bnez	$r3, .Lunalign_word_copy
+	beqz	$r2, .Lquit_memcpy
+	
+	addi	$r3, $r2, #-32	/* To check $r2 < cache_line, than go to .Lword_copy.  */
+	bltz	$r3, .Lword_copy_entry
+.Lcache_copy:
+	srli	$r3, $r2, #5
+	beqz	$r3, .Lword_copy_entry
+	pushm	$r6, $r13
+	.cfi_adjust_cfa_offset 32
+	.cfi_rel_offset r6, 0
+	.cfi_rel_offset r7, 4
+	.cfi_rel_offset r8, 8
+	.cfi_rel_offset r9, 12
+	.cfi_rel_offset r10, 16
+	.cfi_rel_offset r11, 20
+	.cfi_rel_offset r12, 24
+	.cfi_rel_offset r13, 28
+3:
+	lmw.bim	$r6, [$r1], $r13
+	addi	$r3, $r3, #-1
+	smw.bim	$r6, [$r0], $r13
+	bnez	$r3, 3b
+	popm	$r6, $r13
+	.cfi_adjust_cfa_offset -32
+	.cfi_restore r6
+	.cfi_restore r7
+	.cfi_restore r8
+	.cfi_restore r9
+	.cfi_restore r10
+	.cfi_restore r11
+	.cfi_restore r12
+	.cfi_restore r13
+
+.Lword_copy_entry:
+	andi	$r2, $r2, #31
+
+	beqz	$r2, .Lquit_memcpy 
+	srli	$r3, $r2, #2
+	beqz	$r3, .Lbyte_copy
+.Lword_copy:
+	lmw.bim	$r4, [$r1], $r4
+	addi	$r3, $r3, #-1
+	smw.bim	$r4, [$r0], $r4
+	bnez	$r3, .Lword_copy
+	andi	$r2, $r2, #3
+	beqz	$r2, .Lquit_memcpy
+.Lbyte_copy:
+	lbi.bi	$r3, [$r1], #1
+	addi	$r2, $r2, #-1
+
+	sbi.bi	$r3, [$r0], #1
+	bnez	$r2, .Lbyte_copy
+.Lquit_memcpy:
+	move	$r0, $r5
+.Lquit_memcpy2:
+	ret
+
+END(memcpy)
+libc_hidden_builtin_def (memcpy)
+
diff --git a/sysdeps/nds32/memset.S b/sysdeps/nds32/memset.S
new file mode 100644
index 0000000..74e7852
--- /dev/null
+++ b/sysdeps/nds32/memset.S
@@ -0,0 +1,59 @@
+/* Optimized version for Andes nds32.
+   Copyright (C) 2006-2018 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>
+
+/* void *memset(void *dst, int val, int len);
+ 
+         dst: $r0
+         val: $r1
+         len: $r2
+         ret: $r0 - pointer to the memory area dst.  */
+
+ENTRY(memset)
+	move	$r5, $r0		/* Return value.  */
+	beqz    $r2, .Lend_memset	/* Exit when len = 0.  */
+	srli	$r3, $r2, 2		/* $r3 is how many words to copy.  */
+	andi	$r2, $r2, 3		/* How many bytes are less than a word.  */
+	beqz	$r3, .Lbyte_set		/* When n is less than a word.  */
+
+	/* set $r1 from ??????ab to abababab.  */
+	andi    $r1, $r1, 0x00ff	/* $r1 = 000000ab.  */
+	slli    $r4, $r1, 8		/* $r4 = 0000ab00.  */
+	or      $r1, $r1, $r4		/* $r1 = 0000abab.  */
+	slli    $r4, $r1, 16		/* $r4 = abab0000.  */
+	or      $r1, $r1, $r4		/* $r1 = abababab.  */
+
+.Lword_set:
+	addi	$r3, $r3, -1		/* How many words left to copy.  */
+	smw.bim $r1, [$r5], $r1		/* Copy the word to det.  */
+	bnez    $r3, .Lword_set		/* Still words to set, continue looping.  */
+	beqz	$r2, .Lend_memset	/* No left byte to set.  */
+
+.Lbyte_set:				/* Less than 4 bytes left to set.  */
+	addi	$r2, $r2, -1		/* Decrease len by 1.  */
+	sbi.p	$r1, [$r5], 1		/* Set data of the next byte to $r1.  */
+	bnez	$r2, .Lbyte_set		/* Still bytes left to set.  */
+
+.Lend_memset:
+	ret
+
+END(memset)
+libc_hidden_builtin_def (memset)
+
diff --git a/sysdeps/nds32/memusage.h b/sysdeps/nds32/memusage.h
new file mode 100644
index 0000000..e227c90
--- /dev/null
+++ b/sysdeps/nds32/memusage.h
@@ -0,0 +1,21 @@
+/* Machine-specific definitions for memory usage profiling, Andes nds32 version.
+   Copyright (C) 2000-2018 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/>.  */
+
+#define GETSP() ({ register uintptr_t stack_ptr asm ("$sp"); stack_ptr; })
+
+#include <sysdeps/generic/memusage.h>
diff --git a/sysdeps/nds32/nptl/pthreaddef.h b/sysdeps/nds32/nptl/pthreaddef.h
new file mode 100644
index 0000000..6ba4596
--- /dev/null
+++ b/sysdeps/nds32/nptl/pthreaddef.h
@@ -0,0 +1,33 @@
+/* pthread machine parameter definitions,  Andes nds32 version.
+   Copyright (C) 2011-2018 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		16
+
+/* Minimal stack size after allocating thread descriptor and guard size.  */
+#define MINIMAL_REST_STACK	2048
+
+/* Alignment requirement for TCB.  */
+#define TCB_ALIGNMENT		16
+
+
+/* Location of current stack frame.  */
+#define CURRENT_STACK_FRAME	__builtin_frame_address (0)
diff --git a/sysdeps/nds32/setjmp.S b/sysdeps/nds32/setjmp.S
new file mode 100644
index 0000000..dc9c658
--- /dev/null
+++ b/sysdeps/nds32/setjmp.S
@@ -0,0 +1,66 @@
+/* setjmp for Andes nds32.
+   Copyright (C) 1996-2018 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 _SETJMP_H
+#define _ASM
+#include <bits/setjmp.h>
+	.section .text
+#ifdef PIC
+# define JMP_BY_R2(symbol)						\
+	sethi   $r3, hi20(symbol@PLT);					\
+	ori     $r3, $r3, lo12(symbol@PLT);				\
+	add     $r3, $r3, $r2;						\
+	jr      $r3
+# define TCALL_SIGJMP_SAVE						\
+	GET_GTABLE ($r2);						\
+	JMP_BY_R2 (__sigjmp_save)
+#else
+# define JMP_BY_R2(symbol)						\
+	la	$r15, C_SYMBOL_NAME(symbol);				\
+	jr	$r15
+# define TCALL_SIGJMP_SAVE						\
+	JMP_BY_R2 (__sigjmp_save)
+#endif
+
+ENTRY(_setjmp)
+	move	$r1, #0
+	/* Initialize $r2 as $gp value.  */
+	GET_GTABLE ($r2)
+        /* Make a tail call to __sigsetjmp.  */
+	JMP_BY_R2 (HIDDEN_JUMPTARGET (__sigsetjmp))
+END(_setjmp)
+ENTRY(setjmp)
+	move	$r1, #1
+	/* Initialize $r2 as $gp value.  */
+	GET_GTABLE ($r2)
+        /* Make a tail call to __sigsetjmp.  */
+	JMP_BY_R2 (HIDDEN_JUMPTARGET (__sigsetjmp))
+END(setjmp)
+
+ENTRY(__sigsetjmp)
+	move	$r2, $r0
+	/* Save callee-saved registers into buffer.  */
+	smw.bim	$r6, [$r2], $r14, #0xf
+        /* Make a tail call to __sigjmp_save.  */
+	TCALL_SIGJMP_SAVE
+
+END(__sigsetjmp)
+hidden_def(__sigsetjmp)
+weak_alias (_setjmp, __GI__setjmp)
diff --git a/sysdeps/nds32/sotruss-lib.c b/sysdeps/nds32/sotruss-lib.c
new file mode 100644
index 0000000..d77b7fa
--- /dev/null
+++ b/sysdeps/nds32/sotruss-lib.c
@@ -0,0 +1,50 @@
+/* Override generic sotruss-lib.c to define actual functions for Andes nds32.
+   Copyright (C) 2013-2018 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/>.  */
+
+#define HAVE_ARCH_PLTENTER
+#define HAVE_ARCH_PLTEXIT
+
+#include <elf/sotruss-lib.c>
+
+
+ElfW(Addr)
+la_nds32_gnu_pltenter (ElfW(Sym) *sym __attribute__ ((unused)),
+		       unsigned int ndx __attribute__ ((unused)),
+		       uintptr_t *refcook, uintptr_t *defcook,
+		       La_nds32_regs *regs, unsigned int *flags,
+		       const char *symname, long int *framesizep)
+{
+  print_enter (refcook, defcook, symname,
+	       regs->lr_reg[0], regs->lr_reg[1], regs->lr_reg[2],
+	       *flags);
+
+  /* No need to copy anything, we will not need the parameters in any case.  */
+  *framesizep = 0;
+
+  return sym->st_value;
+}
+
+unsigned int
+la_nds32_gnu_pltexit (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook,
+		      uintptr_t *defcook, const struct La_nds32_regs *inregs,
+		      struct La_nds32_retval *outregs, const char *symname)
+{
+  print_exit (refcook, defcook, symname, outregs->lrv_reg[0]);
+
+  return 0;
+}
diff --git a/sysdeps/nds32/stackinfo.h b/sysdeps/nds32/stackinfo.h
new file mode 100644
index 0000000..51790e7
--- /dev/null
+++ b/sysdeps/nds32/stackinfo.h
@@ -0,0 +1,32 @@
+/* Stack environment definitions for Andes nds32.
+   Copyright (C) 2011-2018 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/>.  */
+
+/* This file contains a bit of information about the stack allocation
+   of the processor.  */
+
+#ifndef _STACKINFO_H
+#define _STACKINFO_H 1
+
+#include <elf.h>
+
+#define _STACK_GROWS_DOWN 1
+
+/* Default to a non-executable stack.  */
+#define DEFAULT_STACK_PERMS (PF_R|PF_W)
+
+#endif /* stackinfo.h  */
diff --git a/sysdeps/nds32/strcmp.S b/sysdeps/nds32/strcmp.S
new file mode 100644
index 0000000..4462354
--- /dev/null
+++ b/sysdeps/nds32/strcmp.S
@@ -0,0 +1,105 @@
+/* Optimized version for Andes nds32.
+   Copyright (C) 2015-2018 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/>.  */
+
+/*
+    Function:
+       strcmp - compare two strings.
+    Syntax:
+       int strcmp(const char *s1, const char *s2);
+    Description:
+       The strcmp function compares the string pointed to by s1 to the string
+       pointed to by s2.
+    Return value:
+       Return n integer greater than, equal to, or less than zero, accordingly
+       as the string pointed to by s1 is greater than, equal to, or less than
+       the string pointed to by s2.
+*/
+#include <sysdep.h>
+        .text
+
+ENTRY(strcmp)
+#if defined (__NDS32_EXT_STRING__)
+1:
+	lmwzb.bm	$r2, [$r0], $r2, #0
+	lmwzb.bm	$r3, [$r1], $r3, #0
+	ffzmism	$r4, $r2, $r3
+	beqz	$r4, 1b
+	lb	$r2, [$r0+$r4]
+	lb	$r3, [$r1+$r4]
+	sub	$r0, $r2, $r3
+	ret $lp
+#else /* not (__NDS32_EXT_STRING__) */
+	/* If s1 or s2 are unaligned, then compare bytes.  */
+	or	$r5, $r1, $r0
+	andi    $r5, $r5, #3
+	bnez    $r5, .Lbyte_mode
+
+	/* If s1 and s2 are word-aligned, compare them a word at a time.  */
+	lwi	$r5, [$r0+(0)]
+	lwi	$r3, [$r1+(0)]
+.off_16bit	/* Dedicate 4-byte to eliminate NOP caused by ".align 2".  */
+	bne	$r5, $r3, .Lbyte_mode	/* A difference was detected, so
+					   search bytewise. */
+.restore_16bit
+
+
+	/* It's more efficient to set bit mask outside the word_mode loop.  */
+	sethi	$r4, hi20(0xFEFEFEFF)	/* Set $r4 as -0x01010101.  */
+	ori	$r4, $r4, lo12(0xFEFEFEFF)
+	sethi	$r2, hi20(0x80808080)	/* Set $r2 as 0x80808080.  */
+	ori	$r2, $r2, lo12(0x80808080)
+
+.align	2
+.Lword_mode_loop:
+	/* #define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080)
+	   DETECTNULL returns nonzero if (long)X contains a NULL byte.  */
+
+/* Force 32-bit instruction to gain better performance.  */
+.off_16bit
+	nor	$r3, $r5, $r5		/* $r3 = ~(X).  */
+	add	$r5, $r5, $r4		/* $r5 = ((X) - 0x01010101).  */
+	and	$r5, $r5, $r3		/* $r5 = ~(X) & ((X) - 0x01010101).  */
+	and	$r5, $r5, $r2		/* $r5= r5 & 0x80808080.  */
+.restore_16bit
+
+	bnez	$r5, .Lfound_null	/* Branch if $r5 is nonzero.  */
+	lmw.aim	$r5, [$r0], $r5, 0
+	lmw.aim	$r3, [$r1], $r3, 0
+	beq	$r5, $r3, .Lword_mode_loop
+
+.align	2
+.Lbyte_mode:
+	/* Byte-mode compare.  */
+	lbi.bi	$r5, [$r0], #1
+	lbi.bi	$r3, [$r1], #1
+	bne	$r5, $r3, 1f	/* Mismatch, done.  */
+	bnez	$r5, .Lbyte_mode
+1:
+	sub $r0, $r5, $r3
+	ret $lp
+
+.align	2
+.Lfound_null:
+	/* To get here, *a1 == *a2, thus if we find a null in *a1,
+	   then the strings must be equal, so return zero.  */
+	movi	$r0, #0
+	ret $lp
+
+#endif /* not (__NDS32_EXT_STRING__) */
+END(strcmp)
+libc_hidden_builtin_def (strcmp)
diff --git a/sysdeps/nds32/strcpy.S b/sysdeps/nds32/strcpy.S
new file mode 100644
index 0000000..31fc282
--- /dev/null
+++ b/sysdeps/nds32/strcpy.S
@@ -0,0 +1,75 @@
+/* Optimized version for Andes nds32.
+   Copyright (C) 2013-2018 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/>.  */
+
+/*  Function:
+       strcpy - copy a string.
+    Syntax:
+       char *strcpy(char *dest, const char *src);
+    Description:
+       This function copies the string pointed to by src into the array
+       point to by dest (include the teminating null character).
+    Return value:
+       strcpy returns the dest as given.  */
+#include <sysdep.h>
+        .text
+
+ENTRY(strcpy)
+	move	$r3, $r0	/* Keep $r0 as reture value.  */
+#if defined (__NDS32_EXT_STRING__)
+1:
+	lmwzb.bm	$r4, [$r1], $r4, #0
+	smwzb.bm	$r4, [$r3], $r4, #0
+	ffzmism	$r2, $r4, $r4
+	beqz	$r2, 1b		/* $r2 = 0, no zero byte exist.  */
+	ret $lp
+
+#else /* not (__NDS32_EXT_STRING__) */
+	GET_GTABLE ($gp)
+	/* If SRC or DEST is unaligned, then copy bytes.  */
+	or	$r2, $r1, $r0
+	andi	$r2, $r2, #3
+	bnez	$r2, .Lbyte_mode
+
+.Lword_mode:
+	/* SRC and DEST are both "long int" aligned, try to do "long int"
+	   sized copies.  */
+	/* #define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080)
+	   DETECTNULL returns nonzero if (long)X contains a NULL byte.  */
+	lwi	$r2, [$r1+(0)]		/* $r2 is X.  */
+	sethi	$r4, hi20(0xFEFEFEFF)
+	ori	$r4, $r4, lo12(0xFEFEFEFF)
+	add	$r4, $r2, $r4		/* $r4 = ((X) - 0x01010101).  */
+	nor	$r5, $r2, $r2		/* $r5 = ~(X).  */
+	and	$r4, $r5, $r4		/* $r4 = ~(X) & ((X) - 0x01010101).  */
+	sethi	$r5, hi20(0x80808080)
+	ori	$r5, $r5, lo12(0x80808080)
+	and	$r4, $r4, $r5		/* $r4 = $r4 & 0x80808080.  */
+	bnez	$r4, .Lbyte_mode	/* Contains a NULL byte.  */
+	swi.bi	$r2, [$r3], #4
+	addi	$r1, $r1, #4
+	b	.Lword_mode
+
+.Lbyte_mode:
+	lbi.bi	$r4, [$r1], #1		/* $r4  <- *src++.  */
+	sbi.bi	$r4, [$r3], #1		/* $r4  -> *dest++.  */
+	bnez	$r4, .Lbyte_mode
+	ret $lp
+#endif /* not (__NDS32_EXT_STRING__) */
+END(strcpy)
+libc_hidden_builtin_def (strcpy)
diff --git a/sysdeps/nds32/sysdep.h b/sysdeps/nds32/sysdep.h
new file mode 100644
index 0000000..e82121c
--- /dev/null
+++ b/sysdeps/nds32/sysdep.h
@@ -0,0 +1,70 @@
+/* Assembler macros for Andes nds32.
+   Copyright (C) 2015-2018 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 <sysdeps/generic/sysdep.h>
+
+#ifdef	__ASSEMBLER__
+
+/* Define an entry point visible from C.  */
+# ifdef PIC
+#  define ENTRY(name)                     \
+   .pic					  \
+   .align 2;                              \
+   .globl C_SYMBOL_NAME(name);            \
+   .func  C_SYMBOL_NAME(name);            \
+   .type  C_SYMBOL_NAME(name), @function; \
+   C_SYMBOL_NAME(name):			  \
+   cfi_startproc;
+# else
+#  define ENTRY(name)                     \
+   .align 2;                              \
+   .globl C_SYMBOL_NAME(name);            \
+   .func  C_SYMBOL_NAME(name);            \
+   .type  C_SYMBOL_NAME(name), @function; \
+   C_SYMBOL_NAME(name):			  \
+   cfi_startproc;
+# endif
+
+
+# undef END
+# define END(name)    \
+  cfi_endproc;	      \
+  .endfunc;           \
+  .size C_SYMBOL_NAME(name), .-C_SYMBOL_NAME(name)
+
+/* If compiled for profiling, call `mcount' at the start of each function.  */
+# ifdef HAVE_ELF
+#  undef NO_UNDERSCORES
+#  define NO_UNDERSCORES
+# endif
+
+# ifdef NO_UNDERSCORES
+#  define syscall_error __syscall_error
+# endif
+
+
+# define GET_GTABLE(reg)					\
+	sethi	reg,	hi20(_GLOBAL_OFFSET_TABLE_ - 8);	\
+	ori	reg,	reg,	lo12(_GLOBAL_OFFSET_TABLE_ - 4);\
+	add5.pc reg;
+
+
+
+#endif	/* __ASSEMBLER__ */
+  
+
diff --git a/sysdeps/nds32/tst-audit.h b/sysdeps/nds32/tst-audit.h
new file mode 100644
index 0000000..4294bc0
--- /dev/null
+++ b/sysdeps/nds32/tst-audit.h
@@ -0,0 +1,23 @@
+/* Definitions for testing PLT entry/exit auditing.  Andes nds32 version.
+   Copyright (C) 2013-2018 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/>.  */
+
+#define pltenter la_nds32_gnu_pltenter
+#define pltexit la_nds32_gnu_pltexit
+#define La_regs La_nds32_regs
+#define La_retval La_nds32_retval
+#define int_retval lrv_reg[0]
diff --git a/sysdeps/unix/sysv/linux/nds32/jmp_buf-macros.h b/sysdeps/unix/sysv/linux/nds32/jmp_buf-macros.h
new file mode 100644
index 0000000..7d7a141
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/jmp_buf-macros.h
@@ -0,0 +1,26 @@
+/* jump buffer constants, Andes nds32.
+   Copyright (C) 2017-2018 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/>.  */
+
+#define JMP_BUF_SIZE 184
+#define SIGJMP_BUF_SIZE 184
+#define JMP_BUF_ALIGN 8
+#define SIGJMP_BUF_ALIGN 8
+#define MASK_WAS_SAVED_OFFSET 52
+#define SAVED_MASK_OFFSET 56
+
diff --git a/sysdeps/unix/sysv/linux/nds32/localplt.data b/sysdeps/unix/sysv/linux/nds32/localplt.data
new file mode 100644
index 0000000..14c02cb
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/localplt.data
@@ -0,0 +1,19 @@
+# See scripts/check-localplt.awk for how this file is processed.
+# PLT use is required for the malloc family and for matherr because
+# users can define their own functions and have library internals call them.
+libc.so: calloc
+libc.so: free
+libc.so: malloc
+libc.so: memalign
+libc.so: realloc
+# The main malloc is interposed into the dynamic linker, for
+# allocations after the initial link (when dlopen is used).
+ld.so: malloc
+ld.so: calloc
+ld.so: realloc
+ld.so: free
+# The TLS-enabled version of these functions is interposed from libc.so.
+ld.so: _dl_signal_error
+ld.so: _dl_catch_error
+ld.so: _dl_signal_exception
+ld.so: _dl_catch_exception
-- 
2.7.4

^ permalink raw reply	[flat|nested] 31+ messages in thread

* [PATCH 10/11] Add Andes nds32 dynamic relocation type to elf/elf.h.
  2018-05-06 14:41 [PATCH 00/11] nds32 glibc Port v1 vincentc
                   ` (3 preceding siblings ...)
  2018-05-06 14:42 ` [PATCH 03/11] nds32: Thread-Local Storage Support vincentc
@ 2018-05-06 14:42 ` vincentc
  2018-05-06 14:42 ` [PATCH 06/11] nds32: Atomic and Locking Routines vincentc
                   ` (6 subsequent siblings)
  11 siblings, 0 replies; 31+ messages in thread
From: vincentc @ 2018-05-06 14:42 UTC (permalink / raw)
  To: libc-alpha; +Cc: deanbo422, cnoize, vincentc

---
 elf/elf.h | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/elf/elf.h b/elf/elf.h
index 954f326..27add77 100644
--- a/elf/elf.h
+++ b/elf/elf.h
@@ -3855,6 +3855,16 @@ enum
 #define R_METAG_TLS_LE_HI16	60
 #define R_METAG_TLS_LE_LO16	61
 
+/* NDS32 relocations.  */
+#define R_NDS32_NONE		0
+#define R_NDS32_32_RELA 	20
+#define R_NDS32_COPY		39
+#define R_NDS32_GLOB_DAT	40
+#define R_NDS32_JMP_SLOT	41
+#define R_NDS32_RELATIVE	42
+#define R_NDS32_TLS_TPOFF	102
+#define R_NDS32_TLS_DESC	119
+
 __END_DECLS
 
 #endif	/* elf.h */
-- 
2.7.4

^ permalink raw reply	[flat|nested] 31+ messages in thread

* [PATCH 07/11] nds32: Linux Syscall Interface
  2018-05-06 14:41 [PATCH 00/11] nds32 glibc Port v1 vincentc
  2018-05-06 14:42 ` [PATCH 04/11] nds32: Startup and Dynamic Loader vincentc
  2018-05-06 14:42 ` [PATCH 01/11] nds32: Build Infastructure vincentc
@ 2018-05-06 14:42 ` vincentc
  2018-05-08 21:27   ` Adhemerval Zanella
  2018-05-06 14:42 ` [PATCH 03/11] nds32: Thread-Local Storage Support vincentc
                   ` (8 subsequent siblings)
  11 siblings, 1 reply; 31+ messages in thread
From: vincentc @ 2018-05-06 14:42 UTC (permalink / raw)
  To: libc-alpha; +Cc: deanbo422, cnoize, vincentc

This patch contains the Linux system call interface, as well as the
definitions of a handful of system calls.
---
 sysdeps/unix/sysv/linux/nds32/arch-fork.h      |  27 ++
 sysdeps/unix/sysv/linux/nds32/clone.S          |  66 +++++
 sysdeps/unix/sysv/linux/nds32/profil-counter.h |  31 +++
 sysdeps/unix/sysv/linux/nds32/pt-vfork.S       |   1 +
 sysdeps/unix/sysv/linux/nds32/readahead.c      |  36 +++
 sysdeps/unix/sysv/linux/nds32/syscall.c        |  39 +++
 sysdeps/unix/sysv/linux/nds32/syscalls.list    |   2 +
 sysdeps/unix/sysv/linux/nds32/sysdep.c         |  30 +++
 sysdeps/unix/sysv/linux/nds32/sysdep.h         | 337 +++++++++++++++++++++++++
 9 files changed, 569 insertions(+)
 create mode 100644 sysdeps/unix/sysv/linux/nds32/arch-fork.h
 create mode 100644 sysdeps/unix/sysv/linux/nds32/clone.S
 create mode 100644 sysdeps/unix/sysv/linux/nds32/profil-counter.h
 create mode 100644 sysdeps/unix/sysv/linux/nds32/pt-vfork.S
 create mode 100644 sysdeps/unix/sysv/linux/nds32/readahead.c
 create mode 100644 sysdeps/unix/sysv/linux/nds32/syscall.c
 create mode 100644 sysdeps/unix/sysv/linux/nds32/syscalls.list
 create mode 100644 sysdeps/unix/sysv/linux/nds32/sysdep.c
 create mode 100644 sysdeps/unix/sysv/linux/nds32/sysdep.h

diff --git a/sysdeps/unix/sysv/linux/nds32/arch-fork.h b/sysdeps/unix/sysv/linux/nds32/arch-fork.h
new file mode 100644
index 0000000..e86143a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/arch-fork.h
@@ -0,0 +1,27 @@
+/* ARCH_FORK definition for Linux fork implementation, Andes Linux/nds32 version.
+   Copyright (C) 2002-2018 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 <sched.h>
+#include <sysdep.h>
+#include <tls.h>
+
+#define ARCH_FORK() \
+  INLINE_SYSCALL (clone, 5,                                                  \
+                 CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, 0,     \
+                 NULL, NULL, &THREAD_SELF->tid)
+
diff --git a/sysdeps/unix/sysv/linux/nds32/clone.S b/sysdeps/unix/sysv/linux/nds32/clone.S
new file mode 100644
index 0000000..c7ce891
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/clone.S
@@ -0,0 +1,66 @@
+/* Wrapper around clone system call, Andes nds32 version.
+   Copyright (C) 1996-2018 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/>.  */
+
+/* clone() is even more special than fork() as it mucks with stacks
+   and invokes a function in the right context after its all over.  */
+
+#include <sysdep.h>
+#define _ERRNO_H	1
+#include <bits/errno.h>
+
+/* int clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
+	    void *parent_tidptr, void *tls, void *child_tidptr).  */
+
+ENTRY(__clone)
+	/* Sanity check arguments.  */
+	beqz	$r0, 1f
+	bnez	$r1, 2f
+1:
+	movi	$r0, -EINVAL
+5:
+	j	SYSCALL_ERROR_LABEL
+2:
+	/* Child's $sp will be $r1, push to child's stack only.  */
+	addi	$r1, $r1, -4
+	swi.p	$r3, [$r1], -4
+	swi	$r0, [$r1]
+
+	/* Do the system call.  */
+	move	$r0, $r2
+	move    $r3, $r5
+	move    $r2, $r4
+        lwi     $r4, [$sp]
+	__do_syscall (clone)
+
+	beqz    $r0, 4f
+	bltz    $r0, 5b
+	ret
+4:
+	.cfi_undefined lp
+        /* Restore the arg for user's function.  */
+	pop	$r1	/* Function pointer.  */
+	pop	$r0	/* Argument pointer.  */
+
+        /* Call the user's function.  */
+	bral	$r1
+
+	__do_syscall (exit)
+
+PSEUDO_END (__clone)
+libc_hidden_def (__clone)
+weak_alias (__clone, clone)
diff --git a/sysdeps/unix/sysv/linux/nds32/profil-counter.h b/sysdeps/unix/sysv/linux/nds32/profil-counter.h
new file mode 100644
index 0000000..106371a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/profil-counter.h
@@ -0,0 +1,31 @@
+/* Low-level statistical profiling support function, Andes Linux/nds32 version.
+   Copyright (C) 1996-2018 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 <signal.h>
+#include <sigcontextinfo.h>
+
+static void
+__profil_counter (int signo, struct ucontext_t * scp)
+{
+  profil_count ((void *) GET_PC (scp));
+
+  /* This is a hack to prevent the compiler from implementing the
+   * above function call as a sibcall.  The sibcall would overwrite
+   * the signal context.  */
+  asm volatile ("");
+}
diff --git a/sysdeps/unix/sysv/linux/nds32/pt-vfork.S b/sysdeps/unix/sysv/linux/nds32/pt-vfork.S
new file mode 100644
index 0000000..1cc8931
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/pt-vfork.S
@@ -0,0 +1 @@
+/* Not needed.  */
diff --git a/sysdeps/unix/sysv/linux/nds32/readahead.c b/sysdeps/unix/sysv/linux/nds32/readahead.c
new file mode 100644
index 0000000..5559619
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/readahead.c
@@ -0,0 +1,36 @@
+/* Provide kernel hint to read ahead, Andes nds32 version.
+   Copyright (C) 2002-2018 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 <fcntl.h>
+#include <sys/types.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+
+
+ssize_t
+__readahead (int fd, off64_t offset, size_t count)
+{
+  return INLINE_SYSCALL (readahead, 5, fd, 0,
+			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
+					   (off_t) (offset & 0xffffffff)),
+			 count);
+}
+
+weak_alias (__readahead, readahead)
diff --git a/sysdeps/unix/sysv/linux/nds32/syscall.c b/sysdeps/unix/sysv/linux/nds32/syscall.c
new file mode 100644
index 0000000..77af6bb
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/syscall.c
@@ -0,0 +1,39 @@
+/* System call interface, Andes nds32 version.
+   Copyright (C) 2001-2018 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>
+long int syscall (long int __sysno, ...)
+{
+
+	int result;
+	unsigned long arg1,arg2,arg3,arg4,arg5,arg6;
+	va_list arg;
+	va_start (arg, __sysno);
+	arg1 = va_arg (arg, unsigned long);
+	arg2 = va_arg (arg, unsigned long);
+	arg3 = va_arg (arg, unsigned long);
+	arg4 = va_arg (arg, unsigned long);
+	arg5 = va_arg (arg, unsigned long);
+	arg6 = va_arg (arg, unsigned long);
+	va_end (arg);
+	__asm__ volatile ( "" ::: "memory" );
+	result = INLINE_SYSCALL_NCS(__sysno,6,arg1,arg2,arg3,arg4,arg5,arg6);
+	return result;
+}
diff --git a/sysdeps/unix/sysv/linux/nds32/syscalls.list b/sysdeps/unix/sysv/linux/nds32/syscalls.list
new file mode 100644
index 0000000..11cd965
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/syscalls.list
@@ -0,0 +1,2 @@
+# File name	Caller	Syscall name	Args	Strong name
+cacheflush	-	cacheflush	i:pii	cacheflush	
diff --git a/sysdeps/unix/sysv/linux/nds32/sysdep.c b/sysdeps/unix/sysv/linux/nds32/sysdep.c
new file mode 100644
index 0000000..9bcf642
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/sysdep.c
@@ -0,0 +1,30 @@
+/* Stach an error number into errno
+   Copyright (C) 2011-2018 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 <errno.h>
+
+/* This routine is jumped to by all the syscall handlers, to stash
+   an error number into errno.  */
+long
+__syscall_error (long err)
+{
+  __set_errno (- err);
+  return -1;
+}
diff --git a/sysdeps/unix/sysv/linux/nds32/sysdep.h b/sysdeps/unix/sysv/linux/nds32/sysdep.h
new file mode 100644
index 0000000..20a06a4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/sysdep.h
@@ -0,0 +1,337 @@
+/* Assembly macros for Andes nds32.
+   Copyright (C) 2011-2018
+   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_NDS32_SYSDEP_H
+#define _LINUX_NDS32_SYSDEP_H 1
+
+#include <sysdeps/unix/sysdep.h>
+#include <sysdeps/nds32/sysdep.h>
+#include <sysdeps/unix/sysv/linux/generic/sysdep.h>
+
+#include <dl-sysdep.h>
+
+#include <tls.h>
+
+/* In order to get __set_errno() definition in INLINE_SYSCALL.  */
+#ifndef __ASSEMBLER__
+# include <errno.h>
+#endif
+
+#undef SYS_ify
+#define SYS_ify(syscall_name) __NR_##syscall_name
+
+#ifdef __ASSEMBLER__
+
+# define __do_syscall(syscall_name)		\
+  movi	$r15,	SYS_ify (syscall_name);		\
+  syscall	0x0;
+
+# define ADJUST_GP				\
+	smw.adm $sp,[$sp],$sp,#0x6;		\
+	cfi_startproc;				\
+	.cfi_adjust_cfa_offset 8;		\
+	.cfi_rel_offset gp, 0;			\
+	.cfi_rel_offset lp, 4;			\
+	GET_GTABLE ($gp)
+
+# define RECOVER_GP				\
+	lmw.bim $sp,[$sp],$sp,#0x6;		\
+	.cfi_adjust_cfa_offset -8;		\
+	.cfi_restore gp;			\
+	.cfi_restore lp;			\
+	cfi_endproc;
+
+# undef PSEUDO
+# define PSEUDO(name, syscall_name, args)	\
+  .align 2;					\
+	ENTRY(name);                          	\
+	__do_syscall (syscall_name);            \
+	bgez $r0, 2f;				\
+	sltsi	$r1, $r0, -4096;		\
+	beqz	$r1, SYSCALL_ERROR_LABEL;	\
+  2:
+
+# undef PSEUDO_END
+# define PSEUDO_END(sym)			\
+	cfi_endproc;				\
+	SYSCALL_ERROR_HANDLER			\
+	cfi_startproc;				\
+	END(sym)
+
+/* Performs a system call, not setting errno.  */
+# define PSEUDO_NOERRNO(name, syscall_name, args) \
+  ENTRY (name);                                  \
+  __do_syscall (syscall_name);
+
+# undef PSEUDO_END_NOERRNO
+# define PSEUDO_END_NOERRNO(name)                \
+  END (name)
+
+/* Perfroms a system call, returning the error code.  */
+# undef PSEUDO_ERRVAL
+# define PSEUDO_ERRVAL(name, syscall_name, args) \
+  PSEUDO_NOERRNO (name, syscall_name, args)	\
+  neg $r0, $r0;
+
+# undef PSEUDO_END_ERRVAL
+# define PSEUDO_END_ERRVAL(sym) END (sym)
+
+# define ret_ERRVAL ret
+
+# define ret_NOERRNO ret
+
+# if !IS_IN (libc)
+#  if RTLD_PRIVATE_ERRNO
+#   define SYSCALL_ERROR_HANDLER			\
+SYSCALL_ERROR_LABEL:					\
+	ADJUST_GP					\
+	la	$r1,	(rtld_errno@GOT);		\
+	neg	$r0, 	$r0;				\
+	sw 	$r0,	[$r1];				\
+	li	$r0, 	-1;				\
+	RECOVER_GP					\
+	ret;
+#  else
+#   ifdef PIC
+#    define SYSCALL_ERROR_HANDLER			\
+SYSCALL_ERROR_LABEL:					\
+	ADJUST_GP					\
+	neg	$r0,	$r0;				\
+        sethi   $r15, 	hi20(errno@GOTTPOFF);		\
+        ori     $r15, 	$r15, lo12(errno@GOTTPOFF);	\
+	lw	$r15,	[$r15 + $gp];			\
+	sw	$r0,	[$r25 + $r15];			\
+	li	$r0,	-1;				\
+	RECOVER_GP					\
+	ret;
+#   else
+#    define SYSCALL_ERROR_HANDLER			\
+SYSCALL_ERROR_LABEL:					\
+	neg	$r0,	$r0;				\
+        sethi 	$r15, 	hi20(errno@GOTTPOFF);		\
+        lwi 	$r15, 	[$r15 + lo12(errno@GOTTPOFF)];	\
+	sw	$r0,	[$r25 + $r15];			\
+	li	$r0,	-1;				\
+	ret;
+#   endif /* !PIC */
+#  endif
+# else
+#  ifdef PIC
+#   define SYSCALL_ERROR_HANDLER			\
+SYSCALL_ERROR_LABEL:					\
+	ADJUST_GP					\
+	bal	__syscall_error;			\
+	RECOVER_GP					\
+	ret;
+#  else
+#   define SYSCALL_ERROR_HANDLER			\
+SYSCALL_ERROR_LABEL:					\
+	b	__syscall_error;
+#  endif /* !PIC */
+# endif /* In LIBC */
+
+#else
+
+/* List of system calls which are supported as vsyscalls.  */
+# define HAVE_GETTIMEOFDAY_VSYSCALL	1
+# define HAVE_CLOCK_GETRES_VSYSCALL	1
+# define HAVE_CLOCK_GETTIME_VSYSCALL	1
+
+# define __issue_syscall(syscall_name)                   \
+"       syscall  0x0;\n"
+
+/* Define a macro which expands into the inline wrapper code for a system
+   call.  */
+# undef INLINE_SYSCALL
+# define INLINE_SYSCALL(name, nr, args...)                       \
+  ({                                                             \
+     INTERNAL_SYSCALL_DECL (err);                                \
+     long result_var = INTERNAL_SYSCALL (name, err, nr, args);   \
+     if (INTERNAL_SYSCALL_ERROR_P (result_var, err))             \
+       {                                                         \
+         __set_errno (INTERNAL_SYSCALL_ERRNO (result_var, err)); \
+			result_var = -1 ;			 \
+       }                                                         \
+     result_var;                                                 \
+  })
+
+# undef INLINE_SYSCALL_NC
+# define INLINE_SYSCALL_NCS(name, nr, args...)                     \
+  ({                                                               \
+     INTERNAL_SYSCALL_DECL (err);                                  \
+     long result_var = INTERNAL_SYSCALL_NCS (name, err, nr, args); \
+     if (INTERNAL_SYSCALL_ERROR_P (result_var, err))               \
+       {                                                           \
+         __set_errno (INTERNAL_SYSCALL_ERRNO (result_var, err));   \
+			result_var = -1 ;			   \
+       }                                                           \
+     result_var;                                                   \
+  })
+# undef INTERNAL_SYSCALL_DECL
+# define INTERNAL_SYSCALL_DECL(err) do { } while (0)
+
+# undef INTERNAL_SYSCALL_ERROR_P
+# define INTERNAL_SYSCALL_ERROR_P(val, err) \
+       ((unsigned int) (val) >= 0xfffff001u)
+
+# undef INTERNAL_SYSCALL_ERRNO
+# define INTERNAL_SYSCALL_ERRNO(val, err) (-(val))
+
+# undef INTERNAL_SYSCALL
+# define INTERNAL_SYSCALL(name, err, nr, args...) \
+       internal_syscall##nr (__NR_##name, err, args)
+
+# undef INTERNAL_SYSCALL_NCS
+# define INTERNAL_SYSCALL_NCS(syscallno, err, nr, args...) \
+       internal_syscall##nr (syscallno, err, args)
+
+# define internal_syscall0(name, err, dummy...)                  \
+  ({                                                             \
+       register long __res  asm ("$r0");                         \
+       register long __num asm ("$r15") = (long) (name);   	 \
+       __asm__ volatile (                                        \
+       __issue_syscall (name)                                    \
+       : "=r" (__res)                                            \
+       : "r" (__num)                                             \
+       : __SYSCALL_CLOBBERS);                                    \
+       __res;							 \
+  })
+
+# define internal_syscall1(name, err, arg1)                      \
+  ({                                                             \
+       register long __res  asm ("$r0");                         \
+       register long __num asm ("$r15") = (long) (name);   	 \
+       register long __arg1 asm ("$r0") = (long) (arg1);         \
+       __asm__ volatile (                                        \
+       __issue_syscall (name)                                    \
+       : "=r" (__res)                                            \
+       : "r" (__num)                                             \
+       , "r" (__arg1)                                            \
+       : __SYSCALL_CLOBBERS);                                    \
+        __res;                                                   \
+  })
+
+# define internal_syscall2(name, err, arg1, arg2)                \
+  ({                                                             \
+       register long __res  asm ("$r0");                         \
+       register long __num asm ("$r15") = (long) (name);   	 \
+       register long __arg1 asm ("$r0") = (long) (arg1);         \
+       register long __arg2 asm ("$r1") = (long) (arg2);         \
+       __asm__ volatile (                                        \
+       __issue_syscall (name)                                    \
+       : "=r" (__res)                                            \
+       : "r" (__num)                                             \
+       , "r" (__arg1)                                            \
+       , "r" (__arg2)                                            \
+       : __SYSCALL_CLOBBERS);                                    \
+        __res;                                                   \
+  })
+
+# define internal_syscall3(name, err, arg1, arg2, arg3)          \
+  ({                                                             \
+       register long __res  asm ("$r0");                         \
+       register long __num asm ("$r15") = (long) (name);   	 \
+       register long __arg1 asm ("$r0") = (long) (arg1);         \
+       register long __arg2 asm ("$r1") = (long) (arg2);         \
+       register long __arg3 asm ("$r2") = (long) (arg3);         \
+       __asm__ volatile (                                        \
+       __issue_syscall (name)                                    \
+       : "=r" (__res)                                            \
+       : "r" (__num)                                             \
+       , "r" (__arg1)                                            \
+       , "r" (__arg2)                                            \
+       , "r" (__arg3)                                            \
+       : __SYSCALL_CLOBBERS);                                    \
+        __res;                                                   \
+  })
+
+# define internal_syscall4(name, err, arg1, arg2, arg3, arg4)    \
+  ({                                                             \
+       register long __res  asm ("$r0");                         \
+       register long __num asm ("$r15") = (long) (name);   	 \
+       register long __arg1 asm ("$r0") = (long) (arg1);         \
+       register long __arg2 asm ("$r1") = (long) (arg2);         \
+       register long __arg3 asm ("$r2") = (long) (arg3);         \
+       register long __arg4 asm ("$r3") = (long) (arg4);         \
+       __asm__ volatile (                                        \
+       __issue_syscall (name)                                    \
+       : "=r" (__res)                                            \
+       : "r" (__num)                                             \
+       , "r" (__arg1)                                            \
+       , "r" (__arg2)                                            \
+       , "r" (__arg3)                                            \
+       , "r" (__arg4)                                            \
+       : __SYSCALL_CLOBBERS);                                    \
+        __res;                                                   \
+  })
+
+# define internal_syscall5(name, err, arg1, arg2, arg3, arg4, arg5) \
+  ({                                                             \
+       register long __res  asm ("$r0");                         \
+       register long __num asm ("$r15") = (long) (name);   	 \
+       register long __arg1 asm ("$r0") = (long) (arg1);         \
+       register long __arg2 asm ("$r1") = (long) (arg2);         \
+       register long __arg3 asm ("$r2") = (long) (arg3);         \
+       register long __arg4 asm ("$r3") = (long) (arg4);         \
+       register long __arg5 asm ("$r4") = (long) (arg5);         \
+       __asm__ volatile (                                        \
+       __issue_syscall (name)                                    \
+       : "=r" (__res)                                            \
+       : "r" (__num)                                             \
+       , "r" (__arg1)                                            \
+       , "r" (__arg2)                                            \
+       , "r" (__arg3)                                            \
+       , "r" (__arg4)                                            \
+       , "r" (__arg5)                                            \
+       : __SYSCALL_CLOBBERS);                                    \
+        __res;                                                   \
+  })
+
+# define internal_syscall6(name, err, arg1, arg2, arg3, arg4, arg5, arg6) \
+  ({                                                             \
+       register long __res  asm ("$r0");                         \
+       register long __num asm ("$r15") = (long) (name);   	 \
+       register long __arg1 asm ("$r0") = (long) (arg1);         \
+       register long __arg2 asm ("$r1") = (long) (arg2);         \
+       register long __arg3 asm ("$r2") = (long) (arg3);         \
+       register long __arg4 asm ("$r3") = (long) (arg4);         \
+       register long __arg5 asm ("$r4") = (long) (arg5);         \
+       register long __arg6 asm ("$r5") = (long) (arg6);         \
+       __asm__ volatile (                                        \
+       __issue_syscall (name)                                    \
+       : "=r" (__res)                                            \
+       : "r" (__num)                                             \
+       , "r" (__arg1)                                            \
+       , "r" (__arg2)                                            \
+       , "r" (__arg3)                                            \
+       , "r" (__arg4)                                            \
+       , "r" (__arg5)                                            \
+       , "r" (__arg6)                                            \
+       : __SYSCALL_CLOBBERS);                                    \
+        __res;                                                   \
+  })
+
+#define __SYSCALL_CLOBBERS "memory"
+
+#endif /* !__ASSEMBLER__  */
+
+#define PTR_MANGLE(var) (void) (var)
+#define PTR_DEMANGLE(var) (void) (var)
+
+#endif /* linux/nds32/sysdep.h  */
-- 
2.7.4

^ permalink raw reply	[flat|nested] 31+ messages in thread

* [PATCH 05/11] nds32: Generic <math.h> and soft-fp Routines
  2018-05-06 14:41 [PATCH 00/11] nds32 glibc Port v1 vincentc
                   ` (6 preceding siblings ...)
  2018-05-06 14:42 ` [PATCH 08/11] nds32: Linux ABI vincentc
@ 2018-05-06 14:42 ` vincentc
  2018-05-06 14:42 ` [PATCH 09/11] nds32: Add ABI list vincentc
                   ` (3 subsequent siblings)
  11 siblings, 0 replies; 31+ messages in thread
From: vincentc @ 2018-05-06 14:42 UTC (permalink / raw)
  To: libc-alpha; +Cc: deanbo422, cnoize, vincentc

This patch contains the miscellaneous math headers and ulps file
for Andes nds32 port.
---
 sysdeps/nds32/bits/fenv.h               |  49 ++++
 sysdeps/nds32/math-tests.h              |  29 +++
 sysdeps/nds32/math_private.h            |  52 +++++
 sysdeps/nds32/nofpu/libm-test-ulps      | 380 ++++++++++++++++++++++++++++++++
 sysdeps/nds32/nofpu/libm-test-ulps-name |   1 +
 sysdeps/nds32/sfp-machine.h             |  69 ++++++
 6 files changed, 580 insertions(+)
 create mode 100644 sysdeps/nds32/bits/fenv.h
 create mode 100644 sysdeps/nds32/math-tests.h
 create mode 100644 sysdeps/nds32/math_private.h
 create mode 100644 sysdeps/nds32/nofpu/libm-test-ulps
 create mode 100644 sysdeps/nds32/nofpu/libm-test-ulps-name
 create mode 100644 sysdeps/nds32/sfp-machine.h

diff --git a/sysdeps/nds32/bits/fenv.h b/sysdeps/nds32/bits/fenv.h
new file mode 100644
index 0000000..c3ce648
--- /dev/null
+++ b/sysdeps/nds32/bits/fenv.h
@@ -0,0 +1,49 @@
+/* Floating point environment, Andes nds32 version.
+   Copyright (C) 2012-2018 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 _FENV_H
+# error "Never use <bits/fenv.h> directly; include <fenv.h> instead."
+#endif
+
+#define FE_ALL_EXCEPT	0
+
+enum
+  {
+    __FE_UNDEFINED = 0,
+
+    FE_TONEAREST =
+#define FE_TONEAREST	1
+      FE_TONEAREST,
+  };
+
+/* Type representing exception flags. */
+typedef unsigned int fexcept_t;
+
+/* Type representing floating-point environment.  */
+typedef unsigned int fenv_t;
+
+/* If the default argument is used we use this value.  */
+#define FE_DFL_ENV	((const fenv_t *) -1)
+
+#if __GLIBC_USE (IEC_60559_BFP_EXT)
+/* Type representing floating-point control modes.  */
+typedef unsigned int femode_t;
+
+/* Default floating-point control modes.  */
+# define FE_DFL_MODE	((const femode_t *) -1L)
+#endif
diff --git a/sysdeps/nds32/math-tests.h b/sysdeps/nds32/math-tests.h
new file mode 100644
index 0000000..f0c2a3b
--- /dev/null
+++ b/sysdeps/nds32/math-tests.h
@@ -0,0 +1,29 @@
+/* Configuration for math tests. Andes nds32 version.
+   Copyright (C) 2014-2018 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/>.  */
+
+
+/* Current nds32 soft-float does not support exceptions or rounding
+   modes.  */
+# define ROUNDING_TESTS_float(MODE)	((MODE) == FE_TONEAREST)
+# define ROUNDING_TESTS_double(MODE)	((MODE) == FE_TONEAREST)
+# define ROUNDING_TESTS_long_double(MODE)	((MODE) == FE_TONEAREST)
+# define EXCEPTION_TESTS_float	0
+# define EXCEPTION_TESTS_double	0
+# define EXCEPTION_TESTS_long_double	0
+
+#include_next <math-tests.h>
diff --git a/sysdeps/nds32/math_private.h b/sysdeps/nds32/math_private.h
new file mode 100644
index 0000000..6160237
--- /dev/null
+++ b/sysdeps/nds32/math_private.h
@@ -0,0 +1,52 @@
+/* Private floating point rounding and exceptions handling. Andes nds32 version.
+   Copyright (C) 2014-2018 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 NDS32_MATH_PRIVATE_H
+#define NDS32_MATH_PRIVATE_H 1
+
+/* Suppress use of exceptions here to avoid build errors if the FE_*
+   macros aren't defined.
+
+   This does mean that some code will silently fail to report exceptions,
+   set rounding mode as expected, etc., but it allows math code to compile
+   that otherwise wouldn't (such as math/s_fma.c) and so is valuable.
+
+   We intentionally ignore the "exception" arguments of functions that
+   take an exception, since we can't even evaluate the argument
+   without causing a build failure.  The extra level of statement
+   expression wrapping avoids "statement with no effect" warnings.
+   Since the callers don't check for errors anyway, we just claim
+   success in every case.
+
+   The overrides for libc_ functions must happen before we include
+   the generic math_private.h, and the overrides for regular
+   <fenv.h> functions must happen afterwards, to avoid clashing with
+   the declarations of those functions.  */
+
+#define libc_fesetround(rnd)                   ({ 0; })
+#define libc_fetestexcept(exc)                 ({ 0; })
+#define libc_feholdexcept_setround(env, exc)   ({ (void) (env); 0; })
+#define libc_feupdateenv_test(env, exc)        ({ (void) (env); 0; })
+
+#include_next <math_private.h>
+
+#define feraiseexcept(excepts)                 ({ 0; })
+#define __feraiseexcept(excepts)               ({ 0; })
+#define feclearexcept(exc)                     ({ 0; })
+
+#endif /* nds32/math_private.h.  */
diff --git a/sysdeps/nds32/nofpu/libm-test-ulps b/sysdeps/nds32/nofpu/libm-test-ulps
new file mode 100644
index 0000000..ba87887
--- /dev/null
+++ b/sysdeps/nds32/nofpu/libm-test-ulps
@@ -0,0 +1,380 @@
+# Begin of automatic generation
+
+# Maximal error of functions:
+Function: "acos":
+float: 1
+ifloat: 1
+
+Function: "acosh":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "asin":
+float: 1
+ifloat: 1
+
+Function: "asinh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "atan":
+float: 1
+ifloat: 1
+
+Function: "atan2":
+float: 1
+ifloat: 1
+
+Function: "atanh":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "cabs":
+double: 1
+idouble: 1
+
+Function: Real part of "cacos":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Imaginary part of "cacos":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Real part of "cacosh":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Imaginary part of "cacosh":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "carg":
+float: 1
+ifloat: 1
+
+Function: Real part of "casin":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "casin":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Real part of "casinh":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Imaginary part of "casinh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "catan":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "catan":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "catanh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "catanh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "cbrt":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+
+Function: Real part of "ccos":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "ccos":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "ccosh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "ccosh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "cexp":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: Imaginary part of "cexp":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Real part of "clog":
+double: 3
+float: 3
+idouble: 3
+ifloat: 3
+
+Function: Imaginary part of "clog":
+float: 1
+ifloat: 1
+
+Function: Real part of "clog10":
+double: 3
+float: 4
+idouble: 4
+ifloat: 4
+
+Function: Imaginary part of "clog10":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "cos":
+float: 1
+ifloat: 1
+
+Function: "cosh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "cpow":
+double: 2
+float: 5
+idouble: 2
+ifloat: 5
+
+Function: Imaginary part of "cpow":
+float: 2
+ifloat: 2
+
+Function: Real part of "csin":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "csinh":
+float: 1
+ifloat: 1
+
+Function: Imaginary part of "csinh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "csqrt":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Imaginary part of "csqrt":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Real part of "ctan":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "ctan":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Real part of "ctanh":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Imaginary part of "ctanh":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "erf":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "erfc":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+Function: "exp10":
+double: 2
+idouble: 2
+
+Function: "exp2":
+double: 1
+idouble: 1
+
+Function: "expm1":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "gamma":
+double: 4
+float: 3
+idouble: 4
+ifloat: 3
+
+Function: "hypot":
+double: 1
+idouble: 1
+
+Function: "j0":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "j1":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "jn":
+double: 4
+float: 4
+idouble: 4
+ifloat: 4
+
+Function: "lgamma":
+double: 4
+float: 3
+idouble: 4
+ifloat: 3
+
+Function: "log10":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "log1p":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "log2":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: "sin":
+float: 1
+ifloat: 1
+
+Function: "sincos":
+float: 1
+ifloat: 1
+
+Function: "sinh":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "tan":
+float: 1
+ifloat: 1
+
+Function: "tanh":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "tgamma":
+double: 5
+float: 4
+idouble: 5
+ifloat: 4
+
+Function: "y0":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: "y1":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+Function: "yn":
+double: 3
+float: 3
+idouble: 3
+ifloat: 3
+
+# end of automatic generation
diff --git a/sysdeps/nds32/nofpu/libm-test-ulps-name b/sysdeps/nds32/nofpu/libm-test-ulps-name
new file mode 100644
index 0000000..e136775
--- /dev/null
+++ b/sysdeps/nds32/nofpu/libm-test-ulps-name
@@ -0,0 +1 @@
+nds32 soft-fp
diff --git a/sysdeps/nds32/sfp-machine.h b/sysdeps/nds32/sfp-machine.h
new file mode 100644
index 0000000..4907007
--- /dev/null
+++ b/sysdeps/nds32/sfp-machine.h
@@ -0,0 +1,69 @@
+/* Andes nds32 softfloat definitions
+   Copyright (C) 2018 Free Software Foundation, Inc.
+
+   This file is part of 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/>.  */
+
+#define _FP_W_TYPE_SIZE		32
+#define _FP_W_TYPE		unsigned long
+#define _FP_WS_TYPE		signed long
+#define _FP_I_TYPE		long
+
+#define _FP_MUL_MEAT_S(R,X,Y)				\
+  _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
+#define _FP_MUL_MEAT_D(R,X,Y)				\
+  _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
+#define _FP_MUL_MEAT_Q(R,X,Y)				\
+  _FP_MUL_MEAT_4_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm)
+
+#define _FP_MUL_MEAT_DW_S(R,X,Y)			\
+  _FP_MUL_MEAT_DW_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
+#define _FP_MUL_MEAT_DW_D(R,X,Y)			\
+  _FP_MUL_MEAT_DW_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
+#define _FP_MUL_MEAT_DW_Q(R,X,Y)			\
+  _FP_MUL_MEAT_DW_4_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm)
+
+#define _FP_DIV_MEAT_S(R,X,Y)	_FP_DIV_MEAT_1_loop(S,R,X,Y)
+#define _FP_DIV_MEAT_D(R,X,Y)	_FP_DIV_MEAT_2_udiv(D,R,X,Y)
+#define _FP_DIV_MEAT_Q(R,X,Y)	_FP_DIV_MEAT_4_udiv(Q,R,X,Y)
+
+#define _FP_NANFRAC_S		((_FP_QNANBIT_S << 1) - 1)
+#define _FP_NANFRAC_D		((_FP_QNANBIT_D << 1) - 1), -1
+#define _FP_NANFRAC_Q		((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
+#define _FP_NANSIGN_S		0
+#define _FP_NANSIGN_D		0
+#define _FP_NANSIGN_Q		0
+
+#define _FP_KEEPNANFRACP 1
+#define _FP_QNANNEGATEDP 0
+
+#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)			\
+  do {								\
+    if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs)		\
+	&& !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs))	\
+      {								\
+	R##_s = Y##_s;						\
+	_FP_FRAC_COPY_##wc(R,Y);				\
+      }								\
+    else							\
+      {								\
+	R##_s = X##_s;						\
+	_FP_FRAC_COPY_##wc(R,X);				\
+      }								\
+    R##_c = FP_CLS_NAN;						\
+  } while (0)
+
+#define _FP_TININESS_AFTER_ROUNDING 0
-- 
2.7.4

^ permalink raw reply	[flat|nested] 31+ messages in thread

* [PATCH 08/11] nds32: Linux ABI
  2018-05-06 14:41 [PATCH 00/11] nds32 glibc Port v1 vincentc
                   ` (5 preceding siblings ...)
  2018-05-06 14:42 ` [PATCH 06/11] nds32: Atomic and Locking Routines vincentc
@ 2018-05-06 14:42 ` vincentc
  2018-05-08 21:18   ` Adhemerval Zanella
  2018-05-06 14:42 ` [PATCH 05/11] nds32: Generic <math.h> and soft-fp Routines vincentc
                   ` (4 subsequent siblings)
  11 siblings, 1 reply; 31+ messages in thread
From: vincentc @ 2018-05-06 14:42 UTC (permalink / raw)
  To: libc-alpha; +Cc: deanbo422, cnoize, vincentc

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.
---
 sysdeps/unix/sysv/linux/nds32/bits/fcntl.h       |  54 ++++++++++
 sysdeps/unix/sysv/linux/nds32/bits/mman.h        |  36 +++++++
 sysdeps/unix/sysv/linux/nds32/bits/shm.h         | 102 +++++++++++++++++++
 sysdeps/unix/sysv/linux/nds32/getcontext.S       |  52 ++++++++++
 sysdeps/unix/sysv/linux/nds32/init-first.c       |  50 +++++++++
 sysdeps/unix/sysv/linux/nds32/ipc_priv.h         |  22 ++++
 sysdeps/unix/sysv/linux/nds32/kernel-features.h  |  29 ++++++
 sysdeps/unix/sysv/linux/nds32/kernel_sigaction.h |  30 ++++++
 sysdeps/unix/sysv/linux/nds32/libc-vdso.h        |  36 +++++++
 sysdeps/unix/sysv/linux/nds32/makecontext.c      |  57 +++++++++++
 sysdeps/unix/sysv/linux/nds32/setcontext.S       |  65 ++++++++++++
 sysdeps/unix/sysv/linux/nds32/sigcontextinfo.h   |  40 ++++++++
 sysdeps/unix/sysv/linux/nds32/swapcontext.S      |  57 +++++++++++
 sysdeps/unix/sysv/linux/nds32/sys/cachectl.h     |  34 +++++++
 sysdeps/unix/sysv/linux/nds32/sys/procfs.h       | 123 +++++++++++++++++++++++
 sysdeps/unix/sysv/linux/nds32/sys/ucontext.h     |  85 ++++++++++++++++
 sysdeps/unix/sysv/linux/nds32/sys/user.h         |  26 +++++
 sysdeps/unix/sysv/linux/nds32/sysctl.mk          |   1 +
 sysdeps/unix/sysv/linux/nds32/ucontext_i.sym     |  25 +++++
 sysdeps/unix/sysv/linux/nds32/vfork.S            |  46 +++++++++
 20 files changed, 970 insertions(+)
 create mode 100644 sysdeps/unix/sysv/linux/nds32/bits/fcntl.h
 create mode 100644 sysdeps/unix/sysv/linux/nds32/bits/mman.h
 create mode 100644 sysdeps/unix/sysv/linux/nds32/bits/shm.h
 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/kernel_sigaction.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/procfs.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..6a4a5b7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/bits/fcntl.h
@@ -0,0 +1,54 @@
+/* O_*, F_*, FD_* bit values for Andes Linux/nds32.
+   Copyright (C) 2011-2018 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/mman.h b/sysdeps/unix/sysv/linux/nds32/bits/mman.h
new file mode 100644
index 0000000..045be1f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/bits/mman.h
@@ -0,0 +1,36 @@
+/* Definitions for POSIX memory map interface, Andes Linux/nds32 version.
+   Copyright (C) 1997-2018 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_MMAN_H
+# error "Never use <bits/mman.h> directly; include <sys/mman.h> instead."
+#endif
+
+#ifdef __USE_MISC
+# define MAP_GROWSDOWN  0x00100         /* stack-like segment.  */
+# define MAP_DENYWRITE  0x00800         /* ETXTBSY.  */
+# define MAP_EXECUTABLE 0x01000         /* mark it as an executable.  */
+# define MAP_LOCKED     0x02000         /* pages are locked.  */
+# define MAP_NORESERVE  0x04000         /* don't check for reservations.  */
+# define MAP_POPULATE   0x08000         /* populate (prefault) pagetables.  */
+# define MAP_NONBLOCK   0x10000         /* do not block on IO.  */
+# define MAP_STACK      0x20000         /* Allocation is for a stack.  */
+# define MAP_HUGETLB    0x40000         /* Create huge page mapping.  */
+#endif
+
+/* Include generic Linux declarations.  */
+#include <bits/mman-linux.h>
diff --git a/sysdeps/unix/sysv/linux/nds32/bits/shm.h b/sysdeps/unix/sysv/linux/nds32/bits/shm.h
new file mode 100644
index 0000000..fe96fa2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/bits/shm.h
@@ -0,0 +1,102 @@
+/* The definition for POSIX shared memory, Andes nds32 version
+   Copyright (C) 1995-2018 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 include <bits/shm.h> directly; use <sys/shm.h> instead."
+#endif
+
+#include <bits/types.h>
+
+/* Permission flag for shmget.  */
+#define SHM_R		0400		/* or S_IRUGO from <linux/stat.h>.  */
+#define SHM_W		0200		/* or S_IWUGO from <linux/stat.h>.  */
+
+/* Flags for `shmat'.  */
+#define SHM_RDONLY	010000		/* attach read-only else read-write.  */
+#define SHM_RND		020000		/* round attach address to SHMLBA.  */
+#define SHM_REMAP	040000		/* take-over region on attach.  */
+#define SHM_EXEC	0100000		/* execution access.  */
+
+/* Commands for `shmctl'.  */
+#define SHM_LOCK	11		/* lock segment (root only).  */
+#define SHM_UNLOCK	12		/* unlock segment (root only).  */
+
+__BEGIN_DECLS
+
+/* Segment low boundary address multiple.  */
+#define SHMLBA		0x8000
+
+/* Type to count number of attaches.  */
+typedef unsigned long int shmatt_t;
+
+/* Data structure describing a shared memory segment.  */
+struct shmid_ds
+  {
+    struct ipc_perm shm_perm;		/* operation permission struct.  */
+    size_t shm_segsz;			/* size of segment in bytes.  */
+    __time_t shm_atime;			/* time of last shmat().  */
+    unsigned long int __glibc_reserved1;
+    __time_t shm_dtime;			/* time of last shmdt().  */
+    unsigned long int __glibc_reserved2;
+    __time_t shm_ctime;			/* time of last change by shmctl().  */
+    unsigned long int __glibc_reserved3;
+    __pid_t shm_cpid;			/* pid of creator.  */
+    __pid_t shm_lpid;			/* pid of last shmop.  */
+    shmatt_t shm_nattch;		/* number of current attaches.  */
+    unsigned long int __glibc_reserved4;
+    unsigned long int __glibc_reserved5;
+  };
+
+#ifdef __USE_MISC
+
+/* ipcs ctl commands.  */
+# define SHM_STAT 	13
+# define SHM_INFO 	14
+
+/* shm_mode upper byte flags.  */
+# define SHM_DEST	01000	/* segment will be destroyed on last detach.  */
+# define SHM_LOCKED	02000   /* segment will not be swapped.  */
+# define SHM_HUGETLB	04000	/* segment is mapped via hugetlb.  */
+# define SHM_NORESERVE	010000	/* don't check for reservations.  */
+
+struct	shminfo
+  {
+    unsigned long int shmmax;
+    unsigned long int shmmin;
+    unsigned long int shmmni;
+    unsigned long int shmseg;
+    unsigned long int shmall;
+    unsigned long int __glibc_reserved1;
+    unsigned long int __glibc_reserved2;
+    unsigned long int __glibc_reserved3;
+    unsigned long int __glibc_reserved4;
+  };
+
+struct shm_info
+  {
+    int used_ids;
+    unsigned long int shm_tot;	/* total allocated shm.  */
+    unsigned long int shm_rss;	/* total resident shm.  */
+    unsigned long int shm_swp;	/* total swapped shm.  */
+    unsigned long int swap_attempts;
+    unsigned long int swap_successes;
+  };
+
+#endif /* __USE_MISC */
+
+__END_DECLS
diff --git a/sysdeps/unix/sysv/linux/nds32/getcontext.S b/sysdeps/unix/sysv/linux/nds32/getcontext.S
new file mode 100644
index 0000000..e0b4c63
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/getcontext.S
@@ -0,0 +1,52 @@
+/* Save current context.
+   Copyright (C) 2009-2018 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"
+
+/*  __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
+
+/* 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, 1f
+
+        ret
+
+1:
+	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..0a2b916
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/init-first.c
@@ -0,0 +1,50 @@
+/* VDSO initialization. Andes Nds32 version
+   Copyright (C) 2007-2018 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/>.  */
+
+#ifdef SHARED
+# 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
+#endif /* SHARED */
+
+#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..e0732b9
--- /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 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..c2bbd38
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/kernel-features.h
@@ -0,0 +1,29 @@
+/* Set flags signalling availability of kernel features based on given
+   kernel version number, Andes nds32 version.
+   Copyright (C) 2006-2018 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>
+
+
+
+/* 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/kernel_sigaction.h b/sysdeps/unix/sysv/linux/nds32/kernel_sigaction.h
new file mode 100644
index 0000000..d7fab19
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/kernel_sigaction.h
@@ -0,0 +1,30 @@
+/* Define struct old_kernel_sigaction and kernel_sigaction for Andes nds32.
+   Copyright (C) 2006-2018 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/>.  */
+
+
+struct old_kernel_sigaction {
+	__sighandler_t k_sa_handler;
+	unsigned long sa_mask;
+	unsigned long sa_flags;
+};
+
+struct kernel_sigaction {
+	__sighandler_t k_sa_handler;
+	unsigned long sa_flags;
+	sigset_t sa_mask;
+};
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..bbc709b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/libc-vdso.h
@@ -0,0 +1,36 @@
+/* VDSO function declaration, Andes nds32 version.
+   Copyright (C) 2017-2018 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
+
+#ifdef SHARED
+
+# 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
+
+#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..1be7f54
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/makecontext.c
@@ -0,0 +1,57 @@
+/* Create new context, Andes nds32 version.
+   Copyright (C) 2001-2018 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 *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..808cbb6
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/setcontext.S
@@ -0,0 +1,65 @@
+/* Set current context.
+   Copyright (C) 2009-2018 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, 1f
+
+        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
+1:
+	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..e96e737
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/sigcontextinfo.h
@@ -0,0 +1,40 @@
+/* Definitions for signal handling calling conventions, Andes nds32 version.
+   Copyright (C) 2000-2018 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 SIGCONTEXT_EXTRA_ARGS _si,
+#define GET_PC(ctx)	((void *) (ctx)->uc_mcontext.nds32_ipc)
+#define GET_FRAME(ctx)	((void *) (ctx)->uc_mcontext.nds32_fp)
+#define GET_STACK(ctx)	((void *) (ctx)->uc_mcontext.nds32_sp)
+
+#define CALL_SIGHANDLER(handler, signo, ctx) \
+  (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx))
+
+/* 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..dd4929c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/swapcontext.S
@@ -0,0 +1,57 @@
+/* Save and set current context.
+   Copyright (C) 2009-2018 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 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
+
+/* 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, 1f
+
+        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
+
+1:
+	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..2f24724
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/sys/cachectl.h
@@ -0,0 +1,34 @@
+/* Andes nds32 cache flushing interface
+   Copyright (C) 2017-2018 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/procfs.h b/sysdeps/unix/sysv/linux/nds32/sys/procfs.h
new file mode 100644
index 0000000..06dce6b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/sys/procfs.h
@@ -0,0 +1,123 @@
+/* Core image file related definitions, Andes nds32 version.
+   Copyright (C) 1996-2018 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
+#define _SYS_PROCFS_H	1
+
+/* This is somewhat modelled after the file of the same name on SVR4
+   systems.  It provides a definition of the core file format for ELF
+   used on Linux.  It doesn't have anything to do with the /proc file
+   system, even though Linux has one.
+
+   Anyway, the whole purpose of this file is for GDB and GDB only.
+   Don't read too much into it.  Don't use it for anything other than
+   GDB unless you know what you are doing.  */
+
+#include <features.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/user.h>
+
+__BEGIN_DECLS
+
+/* Type for a general-purpose register.  */
+typedef unsigned long elf_greg_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.  */
+typedef struct user_fpregs elf_fpregset_t;
+
+/* Signal info.  */
+struct elf_siginfo
+  {
+    int si_signo;			/* Signal number.  */
+    int si_code;			/* Extra code.  */
+    int si_errno;			/* Errno.  */
+  };
+
+/* Definitions to generate Intel SVR4-like core files.  These mostly
+   have the same names as the SVR4 types with "elf_" tacked on the
+   front to prevent clashes with Linux definitions, and the typedef
+   forms have been avoided.  This is mostly like the SVR4 structure,
+   but more Linuxy, with things that Linux does not support and which
+   GDB doesn't really use excluded.  */
+
+struct elf_prstatus
+  {
+    struct elf_siginfo pr_info;		/* Info associated with signal.  */
+    short int pr_cursig;		/* Current signal.  */
+    unsigned long int pr_sigpend;	/* Set of pending signals.  */
+    unsigned long int pr_sighold;	/* Set of held signals.  */
+    __pid_t pr_pid;
+    __pid_t pr_ppid;
+    __pid_t pr_pgrp;
+    __pid_t pr_sid;
+    struct timeval pr_utime;		/* User time.  */
+    struct timeval pr_stime;		/* System time.  */
+    struct timeval pr_cutime;		/* Cumulative user time.  */
+    struct timeval pr_cstime;		/* Cumulative system time.  */
+    elf_gregset_t pr_reg;		/* GP registers.  */
+    int pr_fpvalid;			/* True if math copro being used.  */
+  };
+
+
+#define ELF_PRARGSZ     (80)    /* Number of chars for args.  */
+
+struct elf_prpsinfo
+  {
+    char pr_state;			/* Numeric process state.  */
+    char pr_sname;			/* Char for pr_state.  */
+    char pr_zomb;			/* Zombie.  */
+    char pr_nice;			/* Nice val.  */
+    unsigned long int pr_flag;		/* Flags.  */
+    unsigned short int pr_uid;
+    unsigned short int pr_gid;
+    int pr_pid, pr_ppid, pr_pgrp, pr_sid;
+    char pr_fname[16];			/* Filename of executable.  */
+    char pr_psargs[ELF_PRARGSZ];	/* Initial part of arg list.  */
+  };
+
+/* The rest of this file provides the types for emulation of the
+   Solaris <proc_service.h> interfaces that should be implemented by
+   users of libthread_db.  */
+
+/* Addresses.  */
+typedef void *psaddr_t;
+
+/* Register sets.  Linux has different names.  */
+typedef elf_gregset_t prgregset_t;
+typedef elf_fpregset_t prfpregset_t;
+
+/* We don't have any differences between processes and threads,
+   therefore have only one PID type.  */
+typedef __pid_t lwpid_t;
+
+/* Process status and info.  In the end we do provide typedefs for them.  */
+typedef struct elf_prstatus prstatus_t;
+typedef struct elf_prpsinfo prpsinfo_t;
+
+__END_DECLS
+
+#endif	/* sys/procfs.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..7a853b3
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/sys/ucontext.h
@@ -0,0 +1,85 @@
+/* struct ucontext definition, Andes nds32 version.
+   Copyright (C) 1997-2018 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 __ctx(trap_no);
+        unsigned long __ctx(error_code);
+        unsigned long __ctx(oldmask);
+        unsigned long __ctx(nds32_r0);
+        unsigned long __ctx(nds32_r1);
+        unsigned long __ctx(nds32_r2);
+        unsigned long __ctx(nds32_r3);
+        unsigned long __ctx(nds32_r4);
+        unsigned long __ctx(nds32_r5);
+        unsigned long __ctx(nds32_r6);
+        unsigned long __ctx(nds32_r7);
+        unsigned long __ctx(nds32_r8);
+        unsigned long __ctx(nds32_r9);
+        unsigned long __ctx(nds32_r10);
+        unsigned long __ctx(nds32_r11);
+        unsigned long __ctx(nds32_r12);
+        unsigned long __ctx(nds32_r13);
+        unsigned long __ctx(nds32_r14);
+        unsigned long __ctx(nds32_r15);
+        unsigned long __ctx(nds32_r16);
+        unsigned long __ctx(nds32_r17);
+        unsigned long __ctx(nds32_r18);
+        unsigned long __ctx(nds32_r19);
+        unsigned long __ctx(nds32_r20);
+        unsigned long __ctx(nds32_r21);
+        unsigned long __ctx(nds32_r22);
+        unsigned long __ctx(nds32_r23);
+        unsigned long __ctx(nds32_r24);
+        unsigned long __ctx(nds32_r25);
+        unsigned long __ctx(nds32_fp);
+        unsigned long __ctx(nds32_gp);
+        unsigned long __ctx(nds32_lp);
+        unsigned long __ctx(nds32_sp);
+        unsigned long __ctx(nds32_ipc);
+        unsigned long __ctx(fault_address);
+        unsigned long __ctx(used_math_flag);
+        unsigned long __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..5a4ab70
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/sys/user.h
@@ -0,0 +1,26 @@
+/* Copyright (C) 2017-2018 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
+
+#include <asm/ptrace.h>
+
+struct user_fpregs
+{
+};
+#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..a341805
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/ucontext_i.sym
@@ -0,0 +1,25 @@
+#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)
+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..be5060f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/vfork.S
@@ -0,0 +1,46 @@
+/* vfork for Linux, Andes Linux/nds32 version.
+   Copyright (C) 2005-2018 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)
-- 
2.7.4

^ permalink raw reply	[flat|nested] 31+ messages in thread

* [PATCH 03/11] nds32: Thread-Local Storage Support
  2018-05-06 14:41 [PATCH 00/11] nds32 glibc Port v1 vincentc
                   ` (2 preceding siblings ...)
  2018-05-06 14:42 ` [PATCH 07/11] nds32: Linux Syscall Interface vincentc
@ 2018-05-06 14:42 ` vincentc
  2018-05-06 14:42 ` [PATCH 10/11] Add Andes nds32 dynamic relocation type to elf/elf.h vincentc
                   ` (7 subsequent siblings)
  11 siblings, 0 replies; 31+ messages in thread
From: vincentc @ 2018-05-06 14:42 UTC (permalink / raw)
  To: libc-alpha; +Cc: deanbo422, cnoize, vincentc

This patch implements TLS mechanism for nds32. 4 TLS addressing mode
(LE, IE, LD, GD) is supported when running on Linux via NPTL.
---
 sysdeps/nds32/dl-tls.h             |  28 +++++++
 sysdeps/nds32/dl-tlsdesc.S         | 104 ++++++++++++++++++++++++
 sysdeps/nds32/dl-tlsdesc.h         |  62 ++++++++++++++
 sysdeps/nds32/nptl/tcb-offsets.sym |   7 ++
 sysdeps/nds32/nptl/tls.h           | 160 +++++++++++++++++++++++++++++++++++++
 sysdeps/nds32/tls-macros.h         |  75 +++++++++++++++++
 sysdeps/nds32/tlsdesc.c            |  38 +++++++++
 sysdeps/nds32/tlsdesc.sym          |  16 ++++
 8 files changed, 490 insertions(+)
 create mode 100644 sysdeps/nds32/dl-tls.h
 create mode 100644 sysdeps/nds32/dl-tlsdesc.S
 create mode 100644 sysdeps/nds32/dl-tlsdesc.h
 create mode 100644 sysdeps/nds32/nptl/tcb-offsets.sym
 create mode 100644 sysdeps/nds32/nptl/tls.h
 create mode 100644 sysdeps/nds32/tls-macros.h
 create mode 100644 sysdeps/nds32/tlsdesc.c
 create mode 100644 sysdeps/nds32/tlsdesc.sym

diff --git a/sysdeps/nds32/dl-tls.h b/sysdeps/nds32/dl-tls.h
new file mode 100644
index 0000000..385d031
--- /dev/null
+++ b/sysdeps/nds32/dl-tls.h
@@ -0,0 +1,28 @@
+/* Thread-local storage handling in the ELF dynamic linker.  Andes nds32 version.
+   Copyright (C) 2013 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/>.  */
+
+
+/* Type used for the representation of TLS information in the GOT.  */
+typedef struct
+{
+  unsigned long int ti_module;
+  unsigned long int ti_offset;
+} tls_index;
+
+
+extern void *__tls_get_addr (tls_index *ti);
diff --git a/sysdeps/nds32/dl-tlsdesc.S b/sysdeps/nds32/dl-tlsdesc.S
new file mode 100644
index 0000000..d677740
--- /dev/null
+++ b/sysdeps/nds32/dl-tlsdesc.S
@@ -0,0 +1,104 @@
+/* Thread-local storage handling in the ELF dynamic linker, Andes nds32 version.
+   Copyright (C) 2006-2013 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 <tls.h>
+#include "tlsdesc.h"
+
+	.text
+	.hidden _dl_tlsdesc_return
+	.global	_dl_tlsdesc_return
+	.type	_dl_tlsdesc_return,#function
+	cfi_startproc
+	.align 2
+_dl_tlsdesc_return:
+	lwi	$r0,	[$r0	+ 4]
+	add	$r0,	$r0,	$r25
+	ret
+	cfi_endproc
+	.size   _dl_tlsdesc_return, .-_dl_tlsdesc_return
+
+	.hidden _dl_tlsdesc_undefweak
+	.global	_dl_tlsdesc_undefweak
+	.type	_dl_tlsdesc_undefweak,#function
+	cfi_startproc
+	.align 2
+_dl_tlsdesc_undefweak:
+	ret
+	cfi_endproc
+	.size   _dl_tlsdesc_undefweak, .-_dl_tlsdesc_undefweak
+
+#ifdef SHARED
+	/* Handler for dynamic TLS symbols.
+	   Prototype:
+	   _dl_tlsdesc_dynamic (tlsdesc *) ;
+
+	  ptrdiff_t
+	  _dl_tlsdesc_dynamic(struct tlsdesc *tdp)
+	  {
+            struct tlsdesc_dynamic_arg *td = tdp->argument.pointer;
+            dtv_t *dtv = (dtv_t *)THREAD_DTV();
+            if (__builtin_expect (td->gen_count <= dtv[0].counter
+               && (dtv[td->tlsinfo.ti_module].pointer.val
+                  != TLS_DTV_UNALLOCATED),
+               1))
+               return dtv[td->tlsinfo.ti_module].pointer.val +
+                       td->tlsinfo.ti_offset;
+
+             return __tls_get_addr (&td->tlsinfo);
+           }
+	*/
+	.hidden _dl_tlsdesc_dynamic
+	.global	_dl_tlsdesc_dynamic
+	.type	_dl_tlsdesc_dynamic,#function
+	cfi_startproc
+	.pic
+	.align 2
+
+_dl_tlsdesc_dynamic:
+	lwi	$r0,	[$r0 + 4]                  /* $r0 = td.  */
+	lwi	$r1,	[$r0 + #TLSDESC_GEN_COUNT] /* $r1 = td->gen_count.  */
+	lwi	$r2,	[$r25 +	#DTV_OFFSET]	   /* $r2 = &dtv[0].  */
+	lwi	$r3,	[$r2]                      /* $r3 = module id.  */
+	sub	$r1,	$r1,	$r3
+	bgtz	$r1,	2f
+	lwi	$r3,	[$r0 + #TLSDESC_MODID]
+	slli	$r3,	$r3,	#3  /* $r3 = module offset = ID * 8.  */
+	lw	$r3,	[$r2 + $r3] /* $r3 = &dtc[ID] = &dtv[0]+ module offset.  */
+	movi	$r1,	#TLS_DTV_UNALLOCATED
+	beq	$r3,	$r1,	2f
+	lwi	$r1,	[$r0 + #TLSDESC_MODOFF]
+	add	$r0,	$r3,	$r1
+1:	
+	ret
+2:
+	smw.adm $sp,[$sp],$sp,#0x6
+	.cfi_adjust_cfa_offset 8
+	.cfi_rel_offset gp, 0
+	.cfi_rel_offset lp, 4
+	GET_GTABLE ($gp)
+	la	$r15, HIDDEN_JUMPTARGET (__tls_get_addr@PLT)
+	jral 	$r15
+	lmw.bim $sp,[$sp],$sp,#0x6
+	.cfi_adjust_cfa_offset -8
+	.cfi_restore gp
+	.cfi_restore lp
+	j	1b
+	cfi_endproc
+	.size   _dl_tlsdesc_dynamic, .-_dl_tlsdesc_dynamic
+#endif /* SHARED */
diff --git a/sysdeps/nds32/dl-tlsdesc.h b/sysdeps/nds32/dl-tlsdesc.h
new file mode 100644
index 0000000..16d2270
--- /dev/null
+++ b/sysdeps/nds32/dl-tlsdesc.h
@@ -0,0 +1,62 @@
+/* Thread-local storage descriptor handling in the ELF dynamic linker.
+   Andes nds32 version.
+   Copyright (C) 2005-2013 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; witout 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 _NDS32_DL_TLSDESC_H
+# define _NDS32_DL_TLSDESC_H 1
+
+/* Type used to represent a TLS descriptor in the GOT.  */
+struct tlsdesc
+{
+  ptrdiff_t (*entry)(struct tlsdesc *);
+  union
+    {
+      void *pointer;
+      long value;
+    } argument;
+};
+
+
+typedef struct dl_tls_index
+{
+  unsigned long int ti_module;
+  unsigned long int ti_offset;
+} tls_index;
+
+/* Type used as the argument in a TLS descriptor for a symbol that
+   needs dynamic TLS offsets.  */
+struct tlsdesc_dynamic_arg
+{
+  tls_index tlsinfo;
+  size_t gen_count;
+};
+
+extern ptrdiff_t attribute_hidden
+_dl_tlsdesc_return(struct tlsdesc *);
+
+extern ptrdiff_t attribute_hidden
+_dl_tlsdesc_undefweak(struct tlsdesc *);
+
+# ifdef SHARED
+extern void *_dl_make_tlsdesc_dynamic (struct link_map *map, size_t ti_offset);
+
+extern ptrdiff_t attribute_hidden
+_dl_tlsdesc_dynamic(struct tlsdesc *);
+# endif
+
+#endif /* nds32/dl-tlsdesc.h */
diff --git a/sysdeps/nds32/nptl/tcb-offsets.sym b/sysdeps/nds32/nptl/tcb-offsets.sym
new file mode 100644
index 0000000..333dd53
--- /dev/null
+++ b/sysdeps/nds32/nptl/tcb-offsets.sym
@@ -0,0 +1,7 @@
+#include <sysdep.h>
+#include <tls.h>
+
+#define thread_offsetof(mem)    (long)(offsetof (struct pthread, mem) - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE)
+
+MULTIPLE_THREADS_OFFSET         thread_offsetof (header.multiple_threads)
+TID_OFFSET                      thread_offsetof (tid)
diff --git a/sysdeps/nds32/nptl/tls.h b/sysdeps/nds32/nptl/tls.h
new file mode 100644
index 0000000..59c5557
--- /dev/null
+++ b/sysdeps/nds32/nptl/tls.h
@@ -0,0 +1,160 @@
+/* Definition for thread-local data handling, Andes NPTL/nds32 version.
+   Copyright (C) 2011-2018 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 _NDS32_TLS_H
+#define _NDS32_TLS_H	1
+
+#include <dl-sysdep.h>
+
+#ifndef __ASSEMBLER__
+# include <stdbool.h>
+# include <stddef.h>
+# include <stdint.h>
+# include <dl-dtv.h>
+
+#else
+# include <tcb-offsets.h>
+#endif /* __ASSEMBLER__ */
+
+
+#ifndef __ASSEMBLER__
+
+/* Get system call information.  */
+# include <sysdep.h>
+
+/* The TP points to the start of the thread blocks.  */
+# define TLS_DTV_AT_TP	1
+# define TLS_TCB_AT_TP	0
+
+/* We use the multiple_threads field in the pthread struct.  */
+# define TLS_MULTIPLE_THREADS_IN_TCB	1
+
+/* Get the thread descriptor definition.  */
+# include <nptl/descr.h>
+
+typedef struct
+{
+  dtv_t *dtv;
+  void *private;
+} tcbhead_t;
+
+/* This is the size of the initial TCB.  */
+# define TLS_INIT_TCB_SIZE      0
+
+/* Alignment requirements for the initial TCB.  */
+# define TLS_INIT_TCB_ALIGN     __alignof__ (struct pthread)
+
+/* This is the size of the TCB.  */
+# define TLS_TCB_SIZE           0
+
+/* Alignment requirements for the TCB.  */
+# define TLS_TCB_ALIGN          __alignof__ (struct pthread)
+
+
+
+/* This is the size we need before TCB - actually, it includes the TCB.  */
+# define TLS_PRE_TCB_SIZE \
+  (sizeof (struct pthread)						      \
+   + ((sizeof (tcbhead_t) + TLS_TCB_ALIGN - 1) & ~(TLS_TCB_ALIGN - 1)))
+
+/* Return the thread descriptor (tp) for the current thread.  */
+register void *__thread_pointer asm ("$r25");
+
+
+/* The thread pointer tp points to the end of the TCB.
+ * The pthread_descr structure is immediately in front of the TCB.  */
+# define TLS_TCB_OFFSET	0
+
+/* Install the dtv pointer.  The pointer passed is to the element with
+   index -1 which contain the length.  */
+# define INSTALL_DTV(tcbp, dtvp) \
+  (((tcbhead_t *) (tcbp))[-1].dtv = (dtvp) + 1)
+
+/* Install new dtv for current thread.  */
+# define INSTALL_NEW_DTV(dtv) (THREAD_DTV() = (dtv))
+
+/* Return dtv of given thread descriptor.  */
+# define GET_DTV(tcbp)	(((tcbhead_t *) (tcbp))[-1].dtv)
+
+/* Code to initially initialize the thread pointer (tp).  */
+# define TLS_INIT_TP(tcbp) \
+    (__thread_pointer = (char *)(tcbp) + TLS_TCB_OFFSET, NULL)
+
+/* Value passed to 'clone' for initialization of the thread register.  */
+# define TLS_DEFINE_INIT_TP(tp, pd) \
+  void *tp = (void *) (pd) + TLS_TCB_OFFSET + TLS_PRE_TCB_SIZE
+
+/* Return the address of the dtv for the current thread.  */
+# define THREAD_DTV() \
+    (((tcbhead_t *) (__thread_pointer - TLS_TCB_OFFSET))[-1].dtv)
+
+/* Return the thread descriptor for the current thread.  */
+# define THREAD_SELF \
+    ((struct pthread *) (__thread_pointer \
+			 - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE))
+
+/* Magic for libthread_db to know how to do THREAD_SELF.  */
+# define DB_THREAD_SELF \
+  REGISTER (32, 32, 26 * 4, - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE)
+
+/* Read member of the thread descriptor directly.  */
+# define THREAD_GETMEM(descr, member) (descr->member)
+
+/* Same as THREAD_GETMEM, but the member offset can be non-constant.  */
+# define THREAD_GETMEM_NC(descr, member, idx) \
+    (descr->member[idx])
+
+/* Set member of the thread descriptor directly.  */
+# define THREAD_SETMEM(descr, member, value) \
+    (descr->member = (value))
+
+/* Same as THREAD_SETMEM, but the member offset can be non-constant.  */
+# define THREAD_SETMEM_NC(descr, member, idx, value) \
+    (descr->member[idx] = (value))
+
+
+/* l_tls_offset == 0 is perfectly valid, so we have to use some different
+    value to mean unset l_tls_offset.  */
+# define NO_TLS_OFFSET		-1
+
+/* Get and set the global scope generation counter in struct pthread.  */
+# define THREAD_GSCOPE_FLAG_UNUSED 0
+# define THREAD_GSCOPE_FLAG_USED   1
+# define THREAD_GSCOPE_FLAG_WAIT   2
+# define THREAD_GSCOPE_RESET_FLAG() \
+  do									     \
+    { int __res								     \
+	= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag,	     \
+			       THREAD_GSCOPE_FLAG_UNUSED);		     \
+      if (__res == THREAD_GSCOPE_FLAG_WAIT)				     \
+	lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1, LLL_PRIVATE);   \
+    }									     \
+  while (0)
+# define THREAD_GSCOPE_SET_FLAG() \
+  do									     \
+    {									     \
+      THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED;	     \
+      atomic_write_barrier ();						     \
+    }									     \
+  while (0)
+# define THREAD_GSCOPE_WAIT() \
+  GL(dl_wait_lookup_done) ()
+
+#endif /* __ASSEMBLER__ */
+
+#endif /* tls.h */
diff --git a/sysdeps/nds32/tls-macros.h b/sysdeps/nds32/tls-macros.h
new file mode 100644
index 0000000..b6ff5c1
--- /dev/null
+++ b/sysdeps/nds32/tls-macros.h
@@ -0,0 +1,75 @@
+/* Macros to support TLS testing in times of missing compiler support.
+   Andes nds32 version.
+   Copyright (C) 2017-2018 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/>.  */
+
+#define TLS_LE(x) 						\
+({	int *__l;						\
+	asm("sethi	%0, hi20("#x"@TPOFF)\n\t"		\
+            "ori	%0, %0, lo12("#x"@TPOFF)\n\t"		\
+            "add	%0, %0, $r25\n\t"			\
+	    :"=r"(__l));					\
+	__l;})
+
+#ifdef PIC
+# define TLS_IE(x)						\
+({	int *__l;						\
+	asm(".relax_hint begin\n\t"				\
+            "sethi	%0, hi20("#x"@GOTTPOFF)\n\t"		\
+            ".relax_hint\n\t"					\
+            "ori	%0, %0, lo12("#x"@GOTTPOFF)\n\t"	\
+            ".relax_hint end\n\t"				\
+            "lw	%0, [%0 + $gp]\n\t"				\
+            "add	%0, %0, $r25\n\t"			\
+            :"=r"(__l));					\
+	__l;})
+#else
+# define TLS_IE(x) 						\
+({	int *__l;						\
+	asm(".relax_hint begin\n\t"				\
+            "sethi 	%0, hi20("#x"@GOTTPOFF)\n\t"		\
+            ".relax_hint end\n\t"				\
+            "lwi 	%0, [%0 + lo12("#x"@GOTTPOFF)]\n\t"	\
+            "add	%0, %0, $r25\n\t"			\
+            :"=r"(__l));					\
+	__l;})
+#endif
+
+#define TLS_LD(x) TLS_GD(x)
+
+#define TLS_GD(x)						\
+({	int *__l;	                                        \
+	asm("smw.adm $r1,[$sp],$r5,#0\n\t"			\
+            "smw.adm $r16,[$sp],$r24,#0\n\t"			\
+            ".relax_hint begin\n\t"				\
+            "sethi	$r0, hi20("#x"@TLSDESC)\n\t"		\
+            ".relax_hint\n\t"					\
+            "ori	$r0, $r0, lo12("#x"@TLSDESC)\n\t"	\
+            ".relax_hint\n\t"					\
+            "lw 	$r15, [$r0 + $gp]\n\t"			\
+            ".relax_hint\n\t"					\
+            "add 	$r0, $r0, $gp\n\t"			\
+            ".relax_hint end\n\t"				\
+            "jral 	$r15\n\t"	        		\
+            "lmw.bim $r16,[$sp],$r24,#0\n\t"                	\
+            "lmw.bim $r1,[$sp],$r5,#0\n\t"                  	\
+            "move	%0, $r0\n\t"				\
+            :"=r"(__l)						\
+            :							\
+            :"$r0","$r15");					\
+	__l;})
diff --git a/sysdeps/nds32/tlsdesc.c b/sysdeps/nds32/tlsdesc.c
new file mode 100644
index 0000000..65d0be0
--- /dev/null
+++ b/sysdeps/nds32/tlsdesc.c
@@ -0,0 +1,38 @@
+/* Manage TLS descriptors, Andes nds32 version.
+   Copyright (C) 2005-2013 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 <ldsodefs.h>
+#include <tls.h>
+#include <dl-tlsdesc.h>
+#include <dl-unmap-segments.h>
+#define _dl_tlsdesc_resolve_hold 0
+#include <tlsdeschtab.h>
+
+/* Unmap the dynamic object, but also release its TLS descriptor table
+   if there is one.  */
+
+void
+_dl_unmap (struct link_map *map)
+{
+  _dl_unmap_segments (map);
+
+#ifdef SHARED
+  if (map->l_mach.tlsdesc_table)
+    htab_delete (map->l_mach.tlsdesc_table);
+#endif
+}
diff --git a/sysdeps/nds32/tlsdesc.sym b/sysdeps/nds32/tlsdesc.sym
new file mode 100644
index 0000000..0a34a74
--- /dev/null
+++ b/sysdeps/nds32/tlsdesc.sym
@@ -0,0 +1,16 @@
+#include <stddef.h>
+#include <sysdep.h>
+#include <tls.h>
+#include <link.h>
+#include <dl-tlsdesc.h>
+
+#define dtv_offsetof(dtv)   (offsetof (tcbhead_t, dtv) - TLS_TCB_OFFSET - sizeof (tcbhead_t))
+
+DTV_OFFSET          dtv_offsetof (dtv)
+
+TLSDESC_ARG         offsetof (struct tlsdesc, argument.pointer)
+
+TLSDESC_GEN_COUNT   offsetof (struct tlsdesc_dynamic_arg, gen_count)
+TLSDESC_MODID       offsetof (struct tlsdesc_dynamic_arg, tlsinfo.ti_module)
+TLSDESC_MODOFF      offsetof (struct tlsdesc_dynamic_arg, tlsinfo.ti_offset)
+TLS_DTV_UNALLOCATED     TLS_DTV_UNALLOCATED
-- 
2.7.4

^ permalink raw reply	[flat|nested] 31+ messages in thread

* [PATCH 09/11] nds32: Add ABI list
  2018-05-06 14:41 [PATCH 00/11] nds32 glibc Port v1 vincentc
                   ` (7 preceding siblings ...)
  2018-05-06 14:42 ` [PATCH 05/11] nds32: Generic <math.h> and soft-fp Routines vincentc
@ 2018-05-06 14:42 ` vincentc
  2018-05-06 14:42 ` [PATCH 02/11] nds32: ABI Implementation vincentc
                   ` (2 subsequent siblings)
  11 siblings, 0 replies; 31+ messages in thread
From: vincentc @ 2018-05-06 14:42 UTC (permalink / raw)
  To: libc-alpha; +Cc: deanbo422, cnoize, vincentc

---
 sysdeps/unix/sysv/linux/nds32/c++-types.data       |   67 +
 sysdeps/unix/sysv/linux/nds32/ld.abilist           |   10 +
 .../unix/sysv/linux/nds32/libBrokenLocale.abilist  |    2 +
 sysdeps/unix/sysv/linux/nds32/libanl.abilist       |    5 +
 sysdeps/unix/sysv/linux/nds32/libc.abilist         | 2081 ++++++++++++++++++++
 sysdeps/unix/sysv/linux/nds32/libcidn.abilist      |    0
 sysdeps/unix/sysv/linux/nds32/libcrypt.abilist     |    8 +
 sysdeps/unix/sysv/linux/nds32/libdl.abilist        |   10 +
 sysdeps/unix/sysv/linux/nds32/libm.abilist         |  730 +++++++
 sysdeps/unix/sysv/linux/nds32/libnsl.abilist       |  121 ++
 .../unix/sysv/linux/nds32/libnss_compat.abilist    |    0
 sysdeps/unix/sysv/linux/nds32/libnss_db.abilist    |    0
 sysdeps/unix/sysv/linux/nds32/libnss_dns.abilist   |    0
 sysdeps/unix/sysv/linux/nds32/libnss_files.abilist |    0
 .../unix/sysv/linux/nds32/libnss_hesiod.abilist    |    0
 sysdeps/unix/sysv/linux/nds32/libnss_nis.abilist   |    0
 .../unix/sysv/linux/nds32/libnss_nisplus.abilist   |    0
 sysdeps/unix/sysv/linux/nds32/libpthread.abilist   |  217 ++
 sysdeps/unix/sysv/linux/nds32/libresolv.abilist    |   80 +
 sysdeps/unix/sysv/linux/nds32/librt.abilist        |   36 +
 sysdeps/unix/sysv/linux/nds32/libthread_db.abilist |   41 +
 sysdeps/unix/sysv/linux/nds32/libutil.abilist      |    7 +
 22 files changed, 3415 insertions(+)
 create mode 100644 sysdeps/unix/sysv/linux/nds32/c++-types.data
 create mode 100644 sysdeps/unix/sysv/linux/nds32/ld.abilist
 create mode 100644 sysdeps/unix/sysv/linux/nds32/libBrokenLocale.abilist
 create mode 100644 sysdeps/unix/sysv/linux/nds32/libanl.abilist
 create mode 100644 sysdeps/unix/sysv/linux/nds32/libc.abilist
 create mode 100644 sysdeps/unix/sysv/linux/nds32/libcidn.abilist
 create mode 100644 sysdeps/unix/sysv/linux/nds32/libcrypt.abilist
 create mode 100644 sysdeps/unix/sysv/linux/nds32/libdl.abilist
 create mode 100644 sysdeps/unix/sysv/linux/nds32/libm.abilist
 create mode 100644 sysdeps/unix/sysv/linux/nds32/libnsl.abilist
 create mode 100644 sysdeps/unix/sysv/linux/nds32/libnss_compat.abilist
 create mode 100644 sysdeps/unix/sysv/linux/nds32/libnss_db.abilist
 create mode 100644 sysdeps/unix/sysv/linux/nds32/libnss_dns.abilist
 create mode 100644 sysdeps/unix/sysv/linux/nds32/libnss_files.abilist
 create mode 100644 sysdeps/unix/sysv/linux/nds32/libnss_hesiod.abilist
 create mode 100644 sysdeps/unix/sysv/linux/nds32/libnss_nis.abilist
 create mode 100644 sysdeps/unix/sysv/linux/nds32/libnss_nisplus.abilist
 create mode 100644 sysdeps/unix/sysv/linux/nds32/libpthread.abilist
 create mode 100644 sysdeps/unix/sysv/linux/nds32/libresolv.abilist
 create mode 100644 sysdeps/unix/sysv/linux/nds32/librt.abilist
 create mode 100644 sysdeps/unix/sysv/linux/nds32/libthread_db.abilist
 create mode 100644 sysdeps/unix/sysv/linux/nds32/libutil.abilist

diff --git a/sysdeps/unix/sysv/linux/nds32/c++-types.data b/sysdeps/unix/sysv/linux/nds32/c++-types.data
new file mode 100644
index 0000000..303f457
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/c++-types.data
@@ -0,0 +1,67 @@
+blkcnt64_t:x
+blkcnt_t:l
+blksize_t:i
+caddr_t:Pc
+clockid_t:i
+clock_t:l
+daddr_t:i
+dev_t:y
+fd_mask:l
+fsblkcnt64_t:y
+fsblkcnt_t:m
+fsfilcnt64_t:y
+fsfilcnt_t:m
+fsid_t:8__fsid_t
+gid_t:j
+id_t:j
+ino64_t:y
+ino_t:m
+int16_t:s
+int32_t:i
+int64_t:x
+int8_t:a
+intptr_t:i
+key_t:i
+loff_t:x
+mode_t:j
+nlink_t:j
+off64_t:x
+off_t:l
+pid_t:i
+pthread_attr_t:14pthread_attr_t
+pthread_barrier_t:17pthread_barrier_t
+pthread_barrierattr_t:21pthread_barrierattr_t
+pthread_cond_t:14pthread_cond_t
+pthread_condattr_t:18pthread_condattr_t
+pthread_key_t:j
+pthread_mutex_t:15pthread_mutex_t
+pthread_mutexattr_t:19pthread_mutexattr_t
+pthread_once_t:i
+pthread_rwlock_t:16pthread_rwlock_t
+pthread_rwlockattr_t:20pthread_rwlockattr_t
+pthread_spinlock_t:i
+pthread_t:m
+quad_t:x
+register_t:i
+rlim64_t:y
+rlim_t:m
+sigset_t:10__sigset_t
+size_t:j
+socklen_t:j
+ssize_t:i
+suseconds_t:l
+time_t:l
+u_char:h
+uid_t:j
+uint:j
+u_int:j
+u_int16_t:t
+u_int32_t:j
+u_int64_t:y
+u_int8_t:h
+ulong:m
+u_long:m
+u_quad_t:y
+useconds_t:j
+ushort:t
+u_short:t
diff --git a/sysdeps/unix/sysv/linux/nds32/ld.abilist b/sysdeps/unix/sysv/linux/nds32/ld.abilist
new file mode 100644
index 0000000..d75adca
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/ld.abilist
@@ -0,0 +1,10 @@
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 __libc_stack_end D 0x4
+GLIBC_2.28 __stack_chk_guard D 0x4
+GLIBC_2.28 __tls_get_addr F
+GLIBC_2.28 _dl_mcount F
+GLIBC_2.28 _r_debug D 0x14
+GLIBC_2.28 calloc F
+GLIBC_2.28 free F
+GLIBC_2.28 malloc F
+GLIBC_2.28 realloc F
diff --git a/sysdeps/unix/sysv/linux/nds32/libBrokenLocale.abilist b/sysdeps/unix/sysv/linux/nds32/libBrokenLocale.abilist
new file mode 100644
index 0000000..00c6ddd
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/libBrokenLocale.abilist
@@ -0,0 +1,2 @@
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 __ctype_get_mb_cur_max F
diff --git a/sysdeps/unix/sysv/linux/nds32/libanl.abilist b/sysdeps/unix/sysv/linux/nds32/libanl.abilist
new file mode 100644
index 0000000..2b4bc13
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/libanl.abilist
@@ -0,0 +1,5 @@
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 gai_cancel F
+GLIBC_2.28 gai_error F
+GLIBC_2.28 gai_suspend F
+GLIBC_2.28 getaddrinfo_a F
diff --git a/sysdeps/unix/sysv/linux/nds32/libc.abilist b/sysdeps/unix/sysv/linux/nds32/libc.abilist
new file mode 100644
index 0000000..ede049a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/libc.abilist
@@ -0,0 +1,2081 @@
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 _Exit F
+GLIBC_2.28 _IO_2_1_stderr_ D 0xa0
+GLIBC_2.28 _IO_2_1_stdin_ D 0xa0
+GLIBC_2.28 _IO_2_1_stdout_ D 0xa0
+GLIBC_2.28 _IO_adjust_column F
+GLIBC_2.28 _IO_adjust_wcolumn F
+GLIBC_2.28 _IO_default_doallocate F
+GLIBC_2.28 _IO_default_finish F
+GLIBC_2.28 _IO_default_pbackfail F
+GLIBC_2.28 _IO_default_uflow F
+GLIBC_2.28 _IO_default_xsgetn F
+GLIBC_2.28 _IO_default_xsputn F
+GLIBC_2.28 _IO_do_write F
+GLIBC_2.28 _IO_doallocbuf F
+GLIBC_2.28 _IO_fclose F
+GLIBC_2.28 _IO_fdopen F
+GLIBC_2.28 _IO_feof F
+GLIBC_2.28 _IO_ferror F
+GLIBC_2.28 _IO_fflush F
+GLIBC_2.28 _IO_fgetpos F
+GLIBC_2.28 _IO_fgetpos64 F
+GLIBC_2.28 _IO_fgets F
+GLIBC_2.28 _IO_file_attach F
+GLIBC_2.28 _IO_file_close F
+GLIBC_2.28 _IO_file_close_it F
+GLIBC_2.28 _IO_file_doallocate F
+GLIBC_2.28 _IO_file_finish F
+GLIBC_2.28 _IO_file_fopen F
+GLIBC_2.28 _IO_file_init F
+GLIBC_2.28 _IO_file_jumps D 0x54
+GLIBC_2.28 _IO_file_open F
+GLIBC_2.28 _IO_file_overflow F
+GLIBC_2.28 _IO_file_read F
+GLIBC_2.28 _IO_file_seek F
+GLIBC_2.28 _IO_file_seekoff F
+GLIBC_2.28 _IO_file_setbuf F
+GLIBC_2.28 _IO_file_stat F
+GLIBC_2.28 _IO_file_sync F
+GLIBC_2.28 _IO_file_underflow F
+GLIBC_2.28 _IO_file_write F
+GLIBC_2.28 _IO_file_xsputn F
+GLIBC_2.28 _IO_flockfile F
+GLIBC_2.28 _IO_flush_all F
+GLIBC_2.28 _IO_flush_all_linebuffered F
+GLIBC_2.28 _IO_fopen F
+GLIBC_2.28 _IO_fprintf F
+GLIBC_2.28 _IO_fputs F
+GLIBC_2.28 _IO_fread F
+GLIBC_2.28 _IO_free_backup_area F
+GLIBC_2.28 _IO_free_wbackup_area F
+GLIBC_2.28 _IO_fsetpos F
+GLIBC_2.28 _IO_fsetpos64 F
+GLIBC_2.28 _IO_ftell F
+GLIBC_2.28 _IO_ftrylockfile F
+GLIBC_2.28 _IO_funlockfile F
+GLIBC_2.28 _IO_fwrite F
+GLIBC_2.28 _IO_getc F
+GLIBC_2.28 _IO_getline F
+GLIBC_2.28 _IO_getline_info F
+GLIBC_2.28 _IO_gets F
+GLIBC_2.28 _IO_init F
+GLIBC_2.28 _IO_init_marker F
+GLIBC_2.28 _IO_init_wmarker F
+GLIBC_2.28 _IO_iter_begin F
+GLIBC_2.28 _IO_iter_end F
+GLIBC_2.28 _IO_iter_file F
+GLIBC_2.28 _IO_iter_next F
+GLIBC_2.28 _IO_least_wmarker F
+GLIBC_2.28 _IO_link_in F
+GLIBC_2.28 _IO_list_all D 0x4
+GLIBC_2.28 _IO_list_lock F
+GLIBC_2.28 _IO_list_resetlock F
+GLIBC_2.28 _IO_list_unlock F
+GLIBC_2.28 _IO_marker_delta F
+GLIBC_2.28 _IO_marker_difference F
+GLIBC_2.28 _IO_padn F
+GLIBC_2.28 _IO_peekc_locked F
+GLIBC_2.28 _IO_popen F
+GLIBC_2.28 _IO_printf F
+GLIBC_2.28 _IO_proc_close F
+GLIBC_2.28 _IO_proc_open F
+GLIBC_2.28 _IO_putc F
+GLIBC_2.28 _IO_puts F
+GLIBC_2.28 _IO_remove_marker F
+GLIBC_2.28 _IO_seekmark F
+GLIBC_2.28 _IO_seekoff F
+GLIBC_2.28 _IO_seekpos F
+GLIBC_2.28 _IO_seekwmark F
+GLIBC_2.28 _IO_setb F
+GLIBC_2.28 _IO_setbuffer F
+GLIBC_2.28 _IO_setvbuf F
+GLIBC_2.28 _IO_sgetn F
+GLIBC_2.28 _IO_sprintf F
+GLIBC_2.28 _IO_sputbackc F
+GLIBC_2.28 _IO_sputbackwc F
+GLIBC_2.28 _IO_sscanf F
+GLIBC_2.28 _IO_str_init_readonly F
+GLIBC_2.28 _IO_str_init_static F
+GLIBC_2.28 _IO_str_overflow F
+GLIBC_2.28 _IO_str_pbackfail F
+GLIBC_2.28 _IO_str_seekoff F
+GLIBC_2.28 _IO_str_underflow F
+GLIBC_2.28 _IO_sungetc F
+GLIBC_2.28 _IO_sungetwc F
+GLIBC_2.28 _IO_switch_to_get_mode F
+GLIBC_2.28 _IO_switch_to_main_wget_area F
+GLIBC_2.28 _IO_switch_to_wbackup_area F
+GLIBC_2.28 _IO_switch_to_wget_mode F
+GLIBC_2.28 _IO_un_link F
+GLIBC_2.28 _IO_ungetc F
+GLIBC_2.28 _IO_unsave_markers F
+GLIBC_2.28 _IO_unsave_wmarkers F
+GLIBC_2.28 _IO_vfprintf F
+GLIBC_2.28 _IO_vfscanf F
+GLIBC_2.28 _IO_vsprintf F
+GLIBC_2.28 _IO_wdefault_doallocate F
+GLIBC_2.28 _IO_wdefault_finish F
+GLIBC_2.28 _IO_wdefault_pbackfail F
+GLIBC_2.28 _IO_wdefault_uflow F
+GLIBC_2.28 _IO_wdefault_xsgetn F
+GLIBC_2.28 _IO_wdefault_xsputn F
+GLIBC_2.28 _IO_wdo_write F
+GLIBC_2.28 _IO_wdoallocbuf F
+GLIBC_2.28 _IO_wfile_jumps D 0x54
+GLIBC_2.28 _IO_wfile_overflow F
+GLIBC_2.28 _IO_wfile_seekoff F
+GLIBC_2.28 _IO_wfile_sync F
+GLIBC_2.28 _IO_wfile_underflow F
+GLIBC_2.28 _IO_wfile_xsputn F
+GLIBC_2.28 _IO_wmarker_delta F
+GLIBC_2.28 _IO_wsetb F
+GLIBC_2.28 ___brk_addr D 0x4
+GLIBC_2.28 __adjtimex F
+GLIBC_2.28 __after_morecore_hook D 0x4
+GLIBC_2.28 __argz_count F
+GLIBC_2.28 __argz_next F
+GLIBC_2.28 __argz_stringify F
+GLIBC_2.28 __asprintf F
+GLIBC_2.28 __asprintf_chk F
+GLIBC_2.28 __assert F
+GLIBC_2.28 __assert_fail F
+GLIBC_2.28 __assert_perror_fail F
+GLIBC_2.28 __backtrace F
+GLIBC_2.28 __backtrace_symbols F
+GLIBC_2.28 __backtrace_symbols_fd F
+GLIBC_2.28 __bsd_getpgrp F
+GLIBC_2.28 __bzero F
+GLIBC_2.28 __check_rhosts_file D 0x4
+GLIBC_2.28 __chk_fail F
+GLIBC_2.28 __clone F
+GLIBC_2.28 __close F
+GLIBC_2.28 __cmsg_nxthdr F
+GLIBC_2.28 __confstr_chk F
+GLIBC_2.28 __connect F
+GLIBC_2.28 __ctype_b_loc F
+GLIBC_2.28 __ctype_get_mb_cur_max F
+GLIBC_2.28 __ctype_tolower_loc F
+GLIBC_2.28 __ctype_toupper_loc F
+GLIBC_2.28 __curbrk D 0x4
+GLIBC_2.28 __cxa_at_quick_exit F
+GLIBC_2.28 __cxa_atexit F
+GLIBC_2.28 __cxa_finalize F
+GLIBC_2.28 __cxa_thread_atexit_impl F
+GLIBC_2.28 __cyg_profile_func_enter F
+GLIBC_2.28 __cyg_profile_func_exit F
+GLIBC_2.28 __daylight D 0x4
+GLIBC_2.28 __dcgettext F
+GLIBC_2.28 __default_morecore F
+GLIBC_2.28 __dgettext F
+GLIBC_2.28 __dprintf_chk F
+GLIBC_2.28 __dup2 F
+GLIBC_2.28 __duplocale F
+GLIBC_2.28 __endmntent F
+GLIBC_2.28 __environ D 0x4
+GLIBC_2.28 __errno_location F
+GLIBC_2.28 __explicit_bzero_chk F
+GLIBC_2.28 __fbufsize F
+GLIBC_2.28 __fcntl F
+GLIBC_2.28 __fdelt_chk F
+GLIBC_2.28 __fdelt_warn F
+GLIBC_2.28 __ffs F
+GLIBC_2.28 __fgets_chk F
+GLIBC_2.28 __fgets_unlocked_chk F
+GLIBC_2.28 __fgetws_chk F
+GLIBC_2.28 __fgetws_unlocked_chk F
+GLIBC_2.28 __finite F
+GLIBC_2.28 __finitef F
+GLIBC_2.28 __flbf F
+GLIBC_2.28 __fork F
+GLIBC_2.28 __fpending F
+GLIBC_2.28 __fprintf_chk F
+GLIBC_2.28 __fpu_control D 0x4
+GLIBC_2.28 __fpurge F
+GLIBC_2.28 __fread_chk F
+GLIBC_2.28 __fread_unlocked_chk F
+GLIBC_2.28 __freadable F
+GLIBC_2.28 __freading F
+GLIBC_2.28 __free_hook D 0x4
+GLIBC_2.28 __freelocale F
+GLIBC_2.28 __fsetlocking F
+GLIBC_2.28 __fwprintf_chk F
+GLIBC_2.28 __fwritable F
+GLIBC_2.28 __fwriting F
+GLIBC_2.28 __fxstat F
+GLIBC_2.28 __fxstat64 F
+GLIBC_2.28 __fxstatat F
+GLIBC_2.28 __fxstatat64 F
+GLIBC_2.28 __getauxval F
+GLIBC_2.28 __getcwd_chk F
+GLIBC_2.28 __getdelim F
+GLIBC_2.28 __getdomainname_chk F
+GLIBC_2.28 __getgroups_chk F
+GLIBC_2.28 __gethostname_chk F
+GLIBC_2.28 __getlogin_r_chk F
+GLIBC_2.28 __getmntent_r F
+GLIBC_2.28 __getpagesize F
+GLIBC_2.28 __getpgid F
+GLIBC_2.28 __getpid F
+GLIBC_2.28 __gets_chk F
+GLIBC_2.28 __gettimeofday F
+GLIBC_2.28 __getwd_chk F
+GLIBC_2.28 __gmtime_r F
+GLIBC_2.28 __h_errno_location F
+GLIBC_2.28 __isalnum_l F
+GLIBC_2.28 __isalpha_l F
+GLIBC_2.28 __isascii_l F
+GLIBC_2.28 __isblank_l F
+GLIBC_2.28 __iscntrl_l F
+GLIBC_2.28 __isctype F
+GLIBC_2.28 __isdigit_l F
+GLIBC_2.28 __isgraph_l F
+GLIBC_2.28 __isinf F
+GLIBC_2.28 __isinff F
+GLIBC_2.28 __islower_l F
+GLIBC_2.28 __isnan F
+GLIBC_2.28 __isnanf F
+GLIBC_2.28 __isoc99_fscanf F
+GLIBC_2.28 __isoc99_fwscanf F
+GLIBC_2.28 __isoc99_scanf F
+GLIBC_2.28 __isoc99_sscanf F
+GLIBC_2.28 __isoc99_swscanf F
+GLIBC_2.28 __isoc99_vfscanf F
+GLIBC_2.28 __isoc99_vfwscanf F
+GLIBC_2.28 __isoc99_vscanf F
+GLIBC_2.28 __isoc99_vsscanf F
+GLIBC_2.28 __isoc99_vswscanf F
+GLIBC_2.28 __isoc99_vwscanf F
+GLIBC_2.28 __isoc99_wscanf F
+GLIBC_2.28 __isprint_l F
+GLIBC_2.28 __ispunct_l F
+GLIBC_2.28 __isspace_l F
+GLIBC_2.28 __isupper_l F
+GLIBC_2.28 __iswalnum_l F
+GLIBC_2.28 __iswalpha_l F
+GLIBC_2.28 __iswblank_l F
+GLIBC_2.28 __iswcntrl_l F
+GLIBC_2.28 __iswctype F
+GLIBC_2.28 __iswctype_l F
+GLIBC_2.28 __iswdigit_l F
+GLIBC_2.28 __iswgraph_l F
+GLIBC_2.28 __iswlower_l F
+GLIBC_2.28 __iswprint_l F
+GLIBC_2.28 __iswpunct_l F
+GLIBC_2.28 __iswspace_l F
+GLIBC_2.28 __iswupper_l F
+GLIBC_2.28 __iswxdigit_l F
+GLIBC_2.28 __isxdigit_l F
+GLIBC_2.28 __ivaliduser F
+GLIBC_2.28 __key_decryptsession_pk_LOCAL D 0x4
+GLIBC_2.28 __key_encryptsession_pk_LOCAL D 0x4
+GLIBC_2.28 __key_gendes_LOCAL D 0x4
+GLIBC_2.28 __libc_allocate_rtsig F
+GLIBC_2.28 __libc_calloc F
+GLIBC_2.28 __libc_current_sigrtmax F
+GLIBC_2.28 __libc_current_sigrtmin F
+GLIBC_2.28 __libc_free F
+GLIBC_2.28 __libc_freeres F
+GLIBC_2.28 __libc_init_first F
+GLIBC_2.28 __libc_mallinfo F
+GLIBC_2.28 __libc_malloc F
+GLIBC_2.28 __libc_mallopt F
+GLIBC_2.28 __libc_memalign F
+GLIBC_2.28 __libc_pvalloc F
+GLIBC_2.28 __libc_realloc F
+GLIBC_2.28 __libc_sa_len F
+GLIBC_2.28 __libc_start_main F
+GLIBC_2.28 __libc_valloc F
+GLIBC_2.28 __longjmp_chk F
+GLIBC_2.28 __lseek F
+GLIBC_2.28 __lxstat F
+GLIBC_2.28 __lxstat64 F
+GLIBC_2.28 __malloc_hook D 0x4
+GLIBC_2.28 __mbrlen F
+GLIBC_2.28 __mbrtowc F
+GLIBC_2.28 __mbsnrtowcs_chk F
+GLIBC_2.28 __mbsrtowcs_chk F
+GLIBC_2.28 __mbstowcs_chk F
+GLIBC_2.28 __memalign_hook D 0x4
+GLIBC_2.28 __memcpy_chk F
+GLIBC_2.28 __memmove_chk F
+GLIBC_2.28 __mempcpy F
+GLIBC_2.28 __mempcpy_chk F
+GLIBC_2.28 __memset_chk F
+GLIBC_2.28 __monstartup F
+GLIBC_2.28 __morecore D 0x4
+GLIBC_2.28 __nanosleep F
+GLIBC_2.28 __newlocale F
+GLIBC_2.28 __nl_langinfo_l F
+GLIBC_2.28 __nss_configure_lookup F
+GLIBC_2.28 __nss_database_lookup F
+GLIBC_2.28 __nss_hostname_digits_dots F
+GLIBC_2.28 __nss_next F
+GLIBC_2.28 __obstack_printf_chk F
+GLIBC_2.28 __obstack_vprintf_chk F
+GLIBC_2.28 __open F
+GLIBC_2.28 __open64 F
+GLIBC_2.28 __open64_2 F
+GLIBC_2.28 __open_2 F
+GLIBC_2.28 __openat64_2 F
+GLIBC_2.28 __openat_2 F
+GLIBC_2.28 __overflow F
+GLIBC_2.28 __pipe F
+GLIBC_2.28 __poll F
+GLIBC_2.28 __poll_chk F
+GLIBC_2.28 __posix_getopt F
+GLIBC_2.28 __ppoll_chk F
+GLIBC_2.28 __pread64 F
+GLIBC_2.28 __pread64_chk F
+GLIBC_2.28 __pread_chk F
+GLIBC_2.28 __printf_chk F
+GLIBC_2.28 __printf_fp F
+GLIBC_2.28 __profile_frequency F
+GLIBC_2.28 __progname D 0x4
+GLIBC_2.28 __progname_full D 0x4
+GLIBC_2.28 __ptsname_r_chk F
+GLIBC_2.28 __pwrite64 F
+GLIBC_2.28 __rawmemchr F
+GLIBC_2.28 __rcmd_errstr D 0x4
+GLIBC_2.28 __read F
+GLIBC_2.28 __read_chk F
+GLIBC_2.28 __readlink_chk F
+GLIBC_2.28 __readlinkat_chk F
+GLIBC_2.28 __realloc_hook D 0x4
+GLIBC_2.28 __realpath_chk F
+GLIBC_2.28 __recv_chk F
+GLIBC_2.28 __recvfrom_chk F
+GLIBC_2.28 __register_atfork F
+GLIBC_2.28 __res_init F
+GLIBC_2.28 __res_nclose F
+GLIBC_2.28 __res_ninit F
+GLIBC_2.28 __res_randomid F
+GLIBC_2.28 __res_state F
+GLIBC_2.28 __rpc_thread_createerr F
+GLIBC_2.28 __rpc_thread_svc_fdset F
+GLIBC_2.28 __rpc_thread_svc_max_pollfd F
+GLIBC_2.28 __rpc_thread_svc_pollfd F
+GLIBC_2.28 __sbrk F
+GLIBC_2.28 __sched_cpualloc F
+GLIBC_2.28 __sched_cpucount F
+GLIBC_2.28 __sched_cpufree F
+GLIBC_2.28 __sched_get_priority_max F
+GLIBC_2.28 __sched_get_priority_min F
+GLIBC_2.28 __sched_getparam F
+GLIBC_2.28 __sched_getscheduler F
+GLIBC_2.28 __sched_setscheduler F
+GLIBC_2.28 __sched_yield F
+GLIBC_2.28 __select F
+GLIBC_2.28 __send F
+GLIBC_2.28 __setmntent F
+GLIBC_2.28 __setpgid F
+GLIBC_2.28 __sigaction F
+GLIBC_2.28 __signbit F
+GLIBC_2.28 __signbitf F
+GLIBC_2.28 __sigpause F
+GLIBC_2.28 __sigsetjmp F
+GLIBC_2.28 __sigsuspend F
+GLIBC_2.28 __snprintf_chk F
+GLIBC_2.28 __sprintf_chk F
+GLIBC_2.28 __stack_chk_fail F
+GLIBC_2.28 __statfs F
+GLIBC_2.28 __stpcpy F
+GLIBC_2.28 __stpcpy_chk F
+GLIBC_2.28 __stpncpy F
+GLIBC_2.28 __stpncpy_chk F
+GLIBC_2.28 __strcasecmp F
+GLIBC_2.28 __strcasecmp_l F
+GLIBC_2.28 __strcasestr F
+GLIBC_2.28 __strcat_chk F
+GLIBC_2.28 __strcoll_l F
+GLIBC_2.28 __strcpy_chk F
+GLIBC_2.28 __strdup F
+GLIBC_2.28 __strerror_r F
+GLIBC_2.28 __strfmon_l F
+GLIBC_2.28 __strftime_l F
+GLIBC_2.28 __strncasecmp_l F
+GLIBC_2.28 __strncat_chk F
+GLIBC_2.28 __strncpy_chk F
+GLIBC_2.28 __strndup F
+GLIBC_2.28 __strsep_g F
+GLIBC_2.28 __strtod_internal F
+GLIBC_2.28 __strtod_l F
+GLIBC_2.28 __strtof_internal F
+GLIBC_2.28 __strtof_l F
+GLIBC_2.28 __strtok_r F
+GLIBC_2.28 __strtol_internal F
+GLIBC_2.28 __strtol_l F
+GLIBC_2.28 __strtold_internal F
+GLIBC_2.28 __strtold_l F
+GLIBC_2.28 __strtoll_internal F
+GLIBC_2.28 __strtoll_l F
+GLIBC_2.28 __strtoul_internal F
+GLIBC_2.28 __strtoul_l F
+GLIBC_2.28 __strtoull_internal F
+GLIBC_2.28 __strtoull_l F
+GLIBC_2.28 __strverscmp F
+GLIBC_2.28 __strxfrm_l F
+GLIBC_2.28 __swprintf_chk F
+GLIBC_2.28 __sysconf F
+GLIBC_2.28 __syslog_chk F
+GLIBC_2.28 __sysv_signal F
+GLIBC_2.28 __timezone D 0x4
+GLIBC_2.28 __toascii_l F
+GLIBC_2.28 __tolower_l F
+GLIBC_2.28 __toupper_l F
+GLIBC_2.28 __towctrans F
+GLIBC_2.28 __towctrans_l F
+GLIBC_2.28 __towlower_l F
+GLIBC_2.28 __towupper_l F
+GLIBC_2.28 __ttyname_r_chk F
+GLIBC_2.28 __tzname D 0x8
+GLIBC_2.28 __uflow F
+GLIBC_2.28 __underflow F
+GLIBC_2.28 __uselocale F
+GLIBC_2.28 __vasprintf_chk F
+GLIBC_2.28 __vdprintf_chk F
+GLIBC_2.28 __vfork F
+GLIBC_2.28 __vfprintf_chk F
+GLIBC_2.28 __vfscanf F
+GLIBC_2.28 __vfwprintf_chk F
+GLIBC_2.28 __vprintf_chk F
+GLIBC_2.28 __vsnprintf F
+GLIBC_2.28 __vsnprintf_chk F
+GLIBC_2.28 __vsprintf_chk F
+GLIBC_2.28 __vsscanf F
+GLIBC_2.28 __vswprintf_chk F
+GLIBC_2.28 __vsyslog_chk F
+GLIBC_2.28 __vwprintf_chk F
+GLIBC_2.28 __wait F
+GLIBC_2.28 __waitpid F
+GLIBC_2.28 __wcpcpy_chk F
+GLIBC_2.28 __wcpncpy_chk F
+GLIBC_2.28 __wcrtomb_chk F
+GLIBC_2.28 __wcscasecmp_l F
+GLIBC_2.28 __wcscat_chk F
+GLIBC_2.28 __wcscoll_l F
+GLIBC_2.28 __wcscpy_chk F
+GLIBC_2.28 __wcsftime_l F
+GLIBC_2.28 __wcsncasecmp_l F
+GLIBC_2.28 __wcsncat_chk F
+GLIBC_2.28 __wcsncpy_chk F
+GLIBC_2.28 __wcsnrtombs_chk F
+GLIBC_2.28 __wcsrtombs_chk F
+GLIBC_2.28 __wcstod_internal F
+GLIBC_2.28 __wcstod_l F
+GLIBC_2.28 __wcstof_internal F
+GLIBC_2.28 __wcstof_l F
+GLIBC_2.28 __wcstol_internal F
+GLIBC_2.28 __wcstol_l F
+GLIBC_2.28 __wcstold_internal F
+GLIBC_2.28 __wcstold_l F
+GLIBC_2.28 __wcstoll_internal F
+GLIBC_2.28 __wcstoll_l F
+GLIBC_2.28 __wcstombs_chk F
+GLIBC_2.28 __wcstoul_internal F
+GLIBC_2.28 __wcstoul_l F
+GLIBC_2.28 __wcstoull_internal F
+GLIBC_2.28 __wcstoull_l F
+GLIBC_2.28 __wcsxfrm_l F
+GLIBC_2.28 __wctomb_chk F
+GLIBC_2.28 __wctrans_l F
+GLIBC_2.28 __wctype_l F
+GLIBC_2.28 __wmemcpy_chk F
+GLIBC_2.28 __wmemmove_chk F
+GLIBC_2.28 __wmempcpy_chk F
+GLIBC_2.28 __wmemset_chk F
+GLIBC_2.28 __woverflow F
+GLIBC_2.28 __wprintf_chk F
+GLIBC_2.28 __write F
+GLIBC_2.28 __wuflow F
+GLIBC_2.28 __wunderflow F
+GLIBC_2.28 __xmknod F
+GLIBC_2.28 __xmknodat F
+GLIBC_2.28 __xpg_basename F
+GLIBC_2.28 __xpg_sigpause F
+GLIBC_2.28 __xpg_strerror_r F
+GLIBC_2.28 __xstat F
+GLIBC_2.28 __xstat64 F
+GLIBC_2.28 _authenticate F
+GLIBC_2.28 _dl_mcount_wrapper F
+GLIBC_2.28 _dl_mcount_wrapper_check F
+GLIBC_2.28 _environ D 0x4
+GLIBC_2.28 _exit F
+GLIBC_2.28 _flushlbf F
+GLIBC_2.28 _libc_intl_domainname D 0x5
+GLIBC_2.28 _longjmp F
+GLIBC_2.28 _mcleanup F
+GLIBC_2.28 _mcount F
+GLIBC_2.28 _nl_default_dirname D 0x12
+GLIBC_2.28 _nl_domain_bindings D 0x4
+GLIBC_2.28 _nl_msg_cat_cntr D 0x4
+GLIBC_2.28 _null_auth D 0xc
+GLIBC_2.28 _obstack_allocated_p F
+GLIBC_2.28 _obstack_begin F
+GLIBC_2.28 _obstack_begin_1 F
+GLIBC_2.28 _obstack_free F
+GLIBC_2.28 _obstack_memory_used F
+GLIBC_2.28 _obstack_newchunk F
+GLIBC_2.28 _res D 0x200
+GLIBC_2.28 _res_hconf D 0x30
+GLIBC_2.28 _rpc_dtablesize F
+GLIBC_2.28 _seterr_reply F
+GLIBC_2.28 _setjmp F
+GLIBC_2.28 _sys_errlist D 0x21c
+GLIBC_2.28 _sys_nerr D 0x4
+GLIBC_2.28 _sys_siglist D 0x104
+GLIBC_2.28 _tolower F
+GLIBC_2.28 _toupper F
+GLIBC_2.28 a64l F
+GLIBC_2.28 abort F
+GLIBC_2.28 abs F
+GLIBC_2.28 accept F
+GLIBC_2.28 accept4 F
+GLIBC_2.28 access F
+GLIBC_2.28 acct F
+GLIBC_2.28 addmntent F
+GLIBC_2.28 addseverity F
+GLIBC_2.28 adjtime F
+GLIBC_2.28 adjtimex F
+GLIBC_2.28 alarm F
+GLIBC_2.28 aligned_alloc F
+GLIBC_2.28 alphasort F
+GLIBC_2.28 alphasort64 F
+GLIBC_2.28 argp_err_exit_status D 0x4
+GLIBC_2.28 argp_error F
+GLIBC_2.28 argp_failure F
+GLIBC_2.28 argp_help F
+GLIBC_2.28 argp_parse F
+GLIBC_2.28 argp_program_bug_address D 0x4
+GLIBC_2.28 argp_program_version D 0x4
+GLIBC_2.28 argp_program_version_hook D 0x4
+GLIBC_2.28 argp_state_help F
+GLIBC_2.28 argp_usage F
+GLIBC_2.28 argz_add F
+GLIBC_2.28 argz_add_sep F
+GLIBC_2.28 argz_append F
+GLIBC_2.28 argz_count F
+GLIBC_2.28 argz_create F
+GLIBC_2.28 argz_create_sep F
+GLIBC_2.28 argz_delete F
+GLIBC_2.28 argz_extract F
+GLIBC_2.28 argz_insert F
+GLIBC_2.28 argz_next F
+GLIBC_2.28 argz_replace F
+GLIBC_2.28 argz_stringify F
+GLIBC_2.28 asctime F
+GLIBC_2.28 asctime_r F
+GLIBC_2.28 asprintf F
+GLIBC_2.28 atof F
+GLIBC_2.28 atoi F
+GLIBC_2.28 atol F
+GLIBC_2.28 atoll F
+GLIBC_2.28 authdes_create F
+GLIBC_2.28 authdes_getucred F
+GLIBC_2.28 authdes_pk_create F
+GLIBC_2.28 authnone_create F
+GLIBC_2.28 authunix_create F
+GLIBC_2.28 authunix_create_default F
+GLIBC_2.28 backtrace F
+GLIBC_2.28 backtrace_symbols F
+GLIBC_2.28 backtrace_symbols_fd F
+GLIBC_2.28 basename F
+GLIBC_2.28 bcmp F
+GLIBC_2.28 bcopy F
+GLIBC_2.28 bind F
+GLIBC_2.28 bind_textdomain_codeset F
+GLIBC_2.28 bindresvport F
+GLIBC_2.28 bindtextdomain F
+GLIBC_2.28 brk F
+GLIBC_2.28 bsd_signal F
+GLIBC_2.28 bsearch F
+GLIBC_2.28 btowc F
+GLIBC_2.28 bzero F
+GLIBC_2.28 c16rtomb F
+GLIBC_2.28 c32rtomb F
+GLIBC_2.28 cacheflush F
+GLIBC_2.28 calloc F
+GLIBC_2.28 callrpc F
+GLIBC_2.28 canonicalize_file_name F
+GLIBC_2.28 capget F
+GLIBC_2.28 capset F
+GLIBC_2.28 catclose F
+GLIBC_2.28 catgets F
+GLIBC_2.28 catopen F
+GLIBC_2.28 cbc_crypt F
+GLIBC_2.28 cfgetispeed F
+GLIBC_2.28 cfgetospeed F
+GLIBC_2.28 cfmakeraw F
+GLIBC_2.28 cfsetispeed F
+GLIBC_2.28 cfsetospeed F
+GLIBC_2.28 cfsetspeed F
+GLIBC_2.28 chdir F
+GLIBC_2.28 chflags F
+GLIBC_2.28 chmod F
+GLIBC_2.28 chown F
+GLIBC_2.28 chroot F
+GLIBC_2.28 clearenv F
+GLIBC_2.28 clearerr F
+GLIBC_2.28 clearerr_unlocked F
+GLIBC_2.28 clnt_broadcast F
+GLIBC_2.28 clnt_create F
+GLIBC_2.28 clnt_pcreateerror F
+GLIBC_2.28 clnt_perrno F
+GLIBC_2.28 clnt_perror F
+GLIBC_2.28 clnt_spcreateerror F
+GLIBC_2.28 clnt_sperrno F
+GLIBC_2.28 clnt_sperror F
+GLIBC_2.28 clntraw_create F
+GLIBC_2.28 clnttcp_create F
+GLIBC_2.28 clntudp_bufcreate F
+GLIBC_2.28 clntudp_create F
+GLIBC_2.28 clntunix_create F
+GLIBC_2.28 clock F
+GLIBC_2.28 clock_adjtime F
+GLIBC_2.28 clock_getcpuclockid F
+GLIBC_2.28 clock_getres F
+GLIBC_2.28 clock_gettime F
+GLIBC_2.28 clock_nanosleep F
+GLIBC_2.28 clock_settime F
+GLIBC_2.28 clone F
+GLIBC_2.28 close F
+GLIBC_2.28 closedir F
+GLIBC_2.28 closelog F
+GLIBC_2.28 confstr F
+GLIBC_2.28 connect F
+GLIBC_2.28 copy_file_range F
+GLIBC_2.28 copysign F
+GLIBC_2.28 copysignf F
+GLIBC_2.28 copysignl F
+GLIBC_2.28 creat F
+GLIBC_2.28 creat64 F
+GLIBC_2.28 ctermid F
+GLIBC_2.28 ctime F
+GLIBC_2.28 ctime_r F
+GLIBC_2.28 cuserid F
+GLIBC_2.28 daemon F
+GLIBC_2.28 daylight D 0x4
+GLIBC_2.28 dcgettext F
+GLIBC_2.28 dcngettext F
+GLIBC_2.28 delete_module F
+GLIBC_2.28 des_setparity F
+GLIBC_2.28 dgettext F
+GLIBC_2.28 difftime F
+GLIBC_2.28 dirfd F
+GLIBC_2.28 dirname F
+GLIBC_2.28 div F
+GLIBC_2.28 dl_iterate_phdr F
+GLIBC_2.28 dngettext F
+GLIBC_2.28 dprintf F
+GLIBC_2.28 drand48 F
+GLIBC_2.28 drand48_r F
+GLIBC_2.28 dup F
+GLIBC_2.28 dup2 F
+GLIBC_2.28 dup3 F
+GLIBC_2.28 duplocale F
+GLIBC_2.28 dysize F
+GLIBC_2.28 eaccess F
+GLIBC_2.28 ecb_crypt F
+GLIBC_2.28 ecvt F
+GLIBC_2.28 ecvt_r F
+GLIBC_2.28 endaliasent F
+GLIBC_2.28 endfsent F
+GLIBC_2.28 endgrent F
+GLIBC_2.28 endhostent F
+GLIBC_2.28 endmntent F
+GLIBC_2.28 endnetent F
+GLIBC_2.28 endnetgrent F
+GLIBC_2.28 endprotoent F
+GLIBC_2.28 endpwent F
+GLIBC_2.28 endrpcent F
+GLIBC_2.28 endservent F
+GLIBC_2.28 endsgent F
+GLIBC_2.28 endspent F
+GLIBC_2.28 endttyent F
+GLIBC_2.28 endusershell F
+GLIBC_2.28 endutent F
+GLIBC_2.28 endutxent F
+GLIBC_2.28 environ D 0x4
+GLIBC_2.28 envz_add F
+GLIBC_2.28 envz_entry F
+GLIBC_2.28 envz_get F
+GLIBC_2.28 envz_merge F
+GLIBC_2.28 envz_remove F
+GLIBC_2.28 envz_strip F
+GLIBC_2.28 epoll_create F
+GLIBC_2.28 epoll_create1 F
+GLIBC_2.28 epoll_ctl F
+GLIBC_2.28 epoll_pwait F
+GLIBC_2.28 epoll_wait F
+GLIBC_2.28 erand48 F
+GLIBC_2.28 erand48_r F
+GLIBC_2.28 err F
+GLIBC_2.28 error F
+GLIBC_2.28 error_at_line F
+GLIBC_2.28 error_message_count D 0x4
+GLIBC_2.28 error_one_per_line D 0x4
+GLIBC_2.28 error_print_progname D 0x4
+GLIBC_2.28 errx F
+GLIBC_2.28 ether_aton F
+GLIBC_2.28 ether_aton_r F
+GLIBC_2.28 ether_hostton F
+GLIBC_2.28 ether_line F
+GLIBC_2.28 ether_ntoa F
+GLIBC_2.28 ether_ntoa_r F
+GLIBC_2.28 ether_ntohost F
+GLIBC_2.28 euidaccess F
+GLIBC_2.28 eventfd F
+GLIBC_2.28 eventfd_read F
+GLIBC_2.28 eventfd_write F
+GLIBC_2.28 execl F
+GLIBC_2.28 execle F
+GLIBC_2.28 execlp F
+GLIBC_2.28 execv F
+GLIBC_2.28 execve F
+GLIBC_2.28 execvp F
+GLIBC_2.28 execvpe F
+GLIBC_2.28 exit F
+GLIBC_2.28 explicit_bzero F
+GLIBC_2.28 faccessat F
+GLIBC_2.28 fallocate F
+GLIBC_2.28 fallocate64 F
+GLIBC_2.28 fanotify_init F
+GLIBC_2.28 fanotify_mark F
+GLIBC_2.28 fattach F
+GLIBC_2.28 fchdir F
+GLIBC_2.28 fchflags F
+GLIBC_2.28 fchmod F
+GLIBC_2.28 fchmodat F
+GLIBC_2.28 fchown F
+GLIBC_2.28 fchownat F
+GLIBC_2.28 fclose F
+GLIBC_2.28 fcloseall F
+GLIBC_2.28 fcntl F
+GLIBC_2.28 fcvt F
+GLIBC_2.28 fcvt_r F
+GLIBC_2.28 fdatasync F
+GLIBC_2.28 fdetach F
+GLIBC_2.28 fdopen F
+GLIBC_2.28 fdopendir F
+GLIBC_2.28 feof F
+GLIBC_2.28 feof_unlocked F
+GLIBC_2.28 ferror F
+GLIBC_2.28 ferror_unlocked F
+GLIBC_2.28 fexecve F
+GLIBC_2.28 fflush F
+GLIBC_2.28 fflush_unlocked F
+GLIBC_2.28 ffs F
+GLIBC_2.28 ffsl F
+GLIBC_2.28 ffsll F
+GLIBC_2.28 fgetc F
+GLIBC_2.28 fgetc_unlocked F
+GLIBC_2.28 fgetgrent F
+GLIBC_2.28 fgetgrent_r F
+GLIBC_2.28 fgetpos F
+GLIBC_2.28 fgetpos64 F
+GLIBC_2.28 fgetpwent F
+GLIBC_2.28 fgetpwent_r F
+GLIBC_2.28 fgets F
+GLIBC_2.28 fgets_unlocked F
+GLIBC_2.28 fgetsgent F
+GLIBC_2.28 fgetsgent_r F
+GLIBC_2.28 fgetspent F
+GLIBC_2.28 fgetspent_r F
+GLIBC_2.28 fgetwc F
+GLIBC_2.28 fgetwc_unlocked F
+GLIBC_2.28 fgetws F
+GLIBC_2.28 fgetws_unlocked F
+GLIBC_2.28 fgetxattr F
+GLIBC_2.28 fileno F
+GLIBC_2.28 fileno_unlocked F
+GLIBC_2.28 finite F
+GLIBC_2.28 finitef F
+GLIBC_2.28 finitel F
+GLIBC_2.28 flistxattr F
+GLIBC_2.28 flock F
+GLIBC_2.28 flockfile F
+GLIBC_2.28 fmemopen F
+GLIBC_2.28 fmtmsg F
+GLIBC_2.28 fnmatch F
+GLIBC_2.28 fopen F
+GLIBC_2.28 fopen64 F
+GLIBC_2.28 fopencookie F
+GLIBC_2.28 fork F
+GLIBC_2.28 fpathconf F
+GLIBC_2.28 fprintf F
+GLIBC_2.28 fputc F
+GLIBC_2.28 fputc_unlocked F
+GLIBC_2.28 fputs F
+GLIBC_2.28 fputs_unlocked F
+GLIBC_2.28 fputwc F
+GLIBC_2.28 fputwc_unlocked F
+GLIBC_2.28 fputws F
+GLIBC_2.28 fputws_unlocked F
+GLIBC_2.28 fread F
+GLIBC_2.28 fread_unlocked F
+GLIBC_2.28 free F
+GLIBC_2.28 freeaddrinfo F
+GLIBC_2.28 freeifaddrs F
+GLIBC_2.28 freelocale F
+GLIBC_2.28 fremovexattr F
+GLIBC_2.28 freopen F
+GLIBC_2.28 freopen64 F
+GLIBC_2.28 frexp F
+GLIBC_2.28 frexpf F
+GLIBC_2.28 frexpl F
+GLIBC_2.28 fscanf F
+GLIBC_2.28 fseek F
+GLIBC_2.28 fseeko F
+GLIBC_2.28 fseeko64 F
+GLIBC_2.28 fsetpos F
+GLIBC_2.28 fsetpos64 F
+GLIBC_2.28 fsetxattr F
+GLIBC_2.28 fstatfs F
+GLIBC_2.28 fstatfs64 F
+GLIBC_2.28 fstatvfs F
+GLIBC_2.28 fstatvfs64 F
+GLIBC_2.28 fsync F
+GLIBC_2.28 ftell F
+GLIBC_2.28 ftello F
+GLIBC_2.28 ftello64 F
+GLIBC_2.28 ftime F
+GLIBC_2.28 ftok F
+GLIBC_2.28 ftruncate F
+GLIBC_2.28 ftruncate64 F
+GLIBC_2.28 ftrylockfile F
+GLIBC_2.28 fts64_children F
+GLIBC_2.28 fts64_close F
+GLIBC_2.28 fts64_open F
+GLIBC_2.28 fts64_read F
+GLIBC_2.28 fts64_set F
+GLIBC_2.28 fts_children F
+GLIBC_2.28 fts_close F
+GLIBC_2.28 fts_open F
+GLIBC_2.28 fts_read F
+GLIBC_2.28 fts_set F
+GLIBC_2.28 ftw F
+GLIBC_2.28 ftw64 F
+GLIBC_2.28 funlockfile F
+GLIBC_2.28 futimens F
+GLIBC_2.28 futimes F
+GLIBC_2.28 futimesat F
+GLIBC_2.28 fwide F
+GLIBC_2.28 fwprintf F
+GLIBC_2.28 fwrite F
+GLIBC_2.28 fwrite_unlocked F
+GLIBC_2.28 fwscanf F
+GLIBC_2.28 gai_strerror F
+GLIBC_2.28 gcvt F
+GLIBC_2.28 get_avphys_pages F
+GLIBC_2.28 get_current_dir_name F
+GLIBC_2.28 get_myaddress F
+GLIBC_2.28 get_nprocs F
+GLIBC_2.28 get_nprocs_conf F
+GLIBC_2.28 get_phys_pages F
+GLIBC_2.28 getaddrinfo F
+GLIBC_2.28 getaliasbyname F
+GLIBC_2.28 getaliasbyname_r F
+GLIBC_2.28 getaliasent F
+GLIBC_2.28 getaliasent_r F
+GLIBC_2.28 getauxval F
+GLIBC_2.28 getc F
+GLIBC_2.28 getc_unlocked F
+GLIBC_2.28 getchar F
+GLIBC_2.28 getchar_unlocked F
+GLIBC_2.28 getcontext F
+GLIBC_2.28 getcwd F
+GLIBC_2.28 getdate F
+GLIBC_2.28 getdate_err D 0x4
+GLIBC_2.28 getdate_r F
+GLIBC_2.28 getdelim F
+GLIBC_2.28 getdirentries F
+GLIBC_2.28 getdirentries64 F
+GLIBC_2.28 getdomainname F
+GLIBC_2.28 getdtablesize F
+GLIBC_2.28 getegid F
+GLIBC_2.28 getentropy F
+GLIBC_2.28 getenv F
+GLIBC_2.28 geteuid F
+GLIBC_2.28 getfsent F
+GLIBC_2.28 getfsfile F
+GLIBC_2.28 getfsspec F
+GLIBC_2.28 getgid F
+GLIBC_2.28 getgrent F
+GLIBC_2.28 getgrent_r F
+GLIBC_2.28 getgrgid F
+GLIBC_2.28 getgrgid_r F
+GLIBC_2.28 getgrnam F
+GLIBC_2.28 getgrnam_r F
+GLIBC_2.28 getgrouplist F
+GLIBC_2.28 getgroups F
+GLIBC_2.28 gethostbyaddr F
+GLIBC_2.28 gethostbyaddr_r F
+GLIBC_2.28 gethostbyname F
+GLIBC_2.28 gethostbyname2 F
+GLIBC_2.28 gethostbyname2_r F
+GLIBC_2.28 gethostbyname_r F
+GLIBC_2.28 gethostent F
+GLIBC_2.28 gethostent_r F
+GLIBC_2.28 gethostid F
+GLIBC_2.28 gethostname F
+GLIBC_2.28 getifaddrs F
+GLIBC_2.28 getipv4sourcefilter F
+GLIBC_2.28 getitimer F
+GLIBC_2.28 getline F
+GLIBC_2.28 getloadavg F
+GLIBC_2.28 getlogin F
+GLIBC_2.28 getlogin_r F
+GLIBC_2.28 getmntent F
+GLIBC_2.28 getmntent_r F
+GLIBC_2.28 getmsg F
+GLIBC_2.28 getnameinfo F
+GLIBC_2.28 getnetbyaddr F
+GLIBC_2.28 getnetbyaddr_r F
+GLIBC_2.28 getnetbyname F
+GLIBC_2.28 getnetbyname_r F
+GLIBC_2.28 getnetent F
+GLIBC_2.28 getnetent_r F
+GLIBC_2.28 getnetgrent F
+GLIBC_2.28 getnetgrent_r F
+GLIBC_2.28 getnetname F
+GLIBC_2.28 getopt F
+GLIBC_2.28 getopt_long F
+GLIBC_2.28 getopt_long_only F
+GLIBC_2.28 getpagesize F
+GLIBC_2.28 getpass F
+GLIBC_2.28 getpeername F
+GLIBC_2.28 getpgid F
+GLIBC_2.28 getpgrp F
+GLIBC_2.28 getpid F
+GLIBC_2.28 getpmsg F
+GLIBC_2.28 getppid F
+GLIBC_2.28 getpriority F
+GLIBC_2.28 getprotobyname F
+GLIBC_2.28 getprotobyname_r F
+GLIBC_2.28 getprotobynumber F
+GLIBC_2.28 getprotobynumber_r F
+GLIBC_2.28 getprotoent F
+GLIBC_2.28 getprotoent_r F
+GLIBC_2.28 getpt F
+GLIBC_2.28 getpublickey F
+GLIBC_2.28 getpw F
+GLIBC_2.28 getpwent F
+GLIBC_2.28 getpwent_r F
+GLIBC_2.28 getpwnam F
+GLIBC_2.28 getpwnam_r F
+GLIBC_2.28 getpwuid F
+GLIBC_2.28 getpwuid_r F
+GLIBC_2.28 getrandom F
+GLIBC_2.28 getresgid F
+GLIBC_2.28 getresuid F
+GLIBC_2.28 getrlimit F
+GLIBC_2.28 getrlimit64 F
+GLIBC_2.28 getrpcbyname F
+GLIBC_2.28 getrpcbyname_r F
+GLIBC_2.28 getrpcbynumber F
+GLIBC_2.28 getrpcbynumber_r F
+GLIBC_2.28 getrpcent F
+GLIBC_2.28 getrpcent_r F
+GLIBC_2.28 getrpcport F
+GLIBC_2.28 getrusage F
+GLIBC_2.28 gets F
+GLIBC_2.28 getsecretkey F
+GLIBC_2.28 getservbyname F
+GLIBC_2.28 getservbyname_r F
+GLIBC_2.28 getservbyport F
+GLIBC_2.28 getservbyport_r F
+GLIBC_2.28 getservent F
+GLIBC_2.28 getservent_r F
+GLIBC_2.28 getsgent F
+GLIBC_2.28 getsgent_r F
+GLIBC_2.28 getsgnam F
+GLIBC_2.28 getsgnam_r F
+GLIBC_2.28 getsid F
+GLIBC_2.28 getsockname F
+GLIBC_2.28 getsockopt F
+GLIBC_2.28 getsourcefilter F
+GLIBC_2.28 getspent F
+GLIBC_2.28 getspent_r F
+GLIBC_2.28 getspnam F
+GLIBC_2.28 getspnam_r F
+GLIBC_2.28 getsubopt F
+GLIBC_2.28 gettext F
+GLIBC_2.28 gettimeofday F
+GLIBC_2.28 getttyent F
+GLIBC_2.28 getttynam F
+GLIBC_2.28 getuid F
+GLIBC_2.28 getusershell F
+GLIBC_2.28 getutent F
+GLIBC_2.28 getutent_r F
+GLIBC_2.28 getutid F
+GLIBC_2.28 getutid_r F
+GLIBC_2.28 getutline F
+GLIBC_2.28 getutline_r F
+GLIBC_2.28 getutmp F
+GLIBC_2.28 getutmpx F
+GLIBC_2.28 getutxent F
+GLIBC_2.28 getutxid F
+GLIBC_2.28 getutxline F
+GLIBC_2.28 getw F
+GLIBC_2.28 getwc F
+GLIBC_2.28 getwc_unlocked F
+GLIBC_2.28 getwchar F
+GLIBC_2.28 getwchar_unlocked F
+GLIBC_2.28 getwd F
+GLIBC_2.28 getxattr F
+GLIBC_2.28 glob F
+GLIBC_2.28 glob64 F
+GLIBC_2.28 glob_pattern_p F
+GLIBC_2.28 globfree F
+GLIBC_2.28 globfree64 F
+GLIBC_2.28 gmtime F
+GLIBC_2.28 gmtime_r F
+GLIBC_2.28 gnu_dev_major F
+GLIBC_2.28 gnu_dev_makedev F
+GLIBC_2.28 gnu_dev_minor F
+GLIBC_2.28 gnu_get_libc_release F
+GLIBC_2.28 gnu_get_libc_version F
+GLIBC_2.28 grantpt F
+GLIBC_2.28 group_member F
+GLIBC_2.28 gsignal F
+GLIBC_2.28 gtty F
+GLIBC_2.28 h_errlist D 0x14
+GLIBC_2.28 h_nerr D 0x4
+GLIBC_2.28 hasmntopt F
+GLIBC_2.28 hcreate F
+GLIBC_2.28 hcreate_r F
+GLIBC_2.28 hdestroy F
+GLIBC_2.28 hdestroy_r F
+GLIBC_2.28 herror F
+GLIBC_2.28 host2netname F
+GLIBC_2.28 hsearch F
+GLIBC_2.28 hsearch_r F
+GLIBC_2.28 hstrerror F
+GLIBC_2.28 htonl F
+GLIBC_2.28 htons F
+GLIBC_2.28 iconv F
+GLIBC_2.28 iconv_close F
+GLIBC_2.28 iconv_open F
+GLIBC_2.28 if_freenameindex F
+GLIBC_2.28 if_indextoname F
+GLIBC_2.28 if_nameindex F
+GLIBC_2.28 if_nametoindex F
+GLIBC_2.28 imaxabs F
+GLIBC_2.28 imaxdiv F
+GLIBC_2.28 in6addr_any D 0x10
+GLIBC_2.28 in6addr_loopback D 0x10
+GLIBC_2.28 index F
+GLIBC_2.28 inet6_opt_append F
+GLIBC_2.28 inet6_opt_find F
+GLIBC_2.28 inet6_opt_finish F
+GLIBC_2.28 inet6_opt_get_val F
+GLIBC_2.28 inet6_opt_init F
+GLIBC_2.28 inet6_opt_next F
+GLIBC_2.28 inet6_opt_set_val F
+GLIBC_2.28 inet6_option_alloc F
+GLIBC_2.28 inet6_option_append F
+GLIBC_2.28 inet6_option_find F
+GLIBC_2.28 inet6_option_init F
+GLIBC_2.28 inet6_option_next F
+GLIBC_2.28 inet6_option_space F
+GLIBC_2.28 inet6_rth_add F
+GLIBC_2.28 inet6_rth_getaddr F
+GLIBC_2.28 inet6_rth_init F
+GLIBC_2.28 inet6_rth_reverse F
+GLIBC_2.28 inet6_rth_segments F
+GLIBC_2.28 inet6_rth_space F
+GLIBC_2.28 inet_addr F
+GLIBC_2.28 inet_aton F
+GLIBC_2.28 inet_lnaof F
+GLIBC_2.28 inet_makeaddr F
+GLIBC_2.28 inet_netof F
+GLIBC_2.28 inet_network F
+GLIBC_2.28 inet_nsap_addr F
+GLIBC_2.28 inet_nsap_ntoa F
+GLIBC_2.28 inet_ntoa F
+GLIBC_2.28 inet_ntop F
+GLIBC_2.28 inet_pton F
+GLIBC_2.28 init_module F
+GLIBC_2.28 initgroups F
+GLIBC_2.28 initstate F
+GLIBC_2.28 initstate_r F
+GLIBC_2.28 innetgr F
+GLIBC_2.28 inotify_add_watch F
+GLIBC_2.28 inotify_init F
+GLIBC_2.28 inotify_init1 F
+GLIBC_2.28 inotify_rm_watch F
+GLIBC_2.28 insque F
+GLIBC_2.28 ioctl F
+GLIBC_2.28 iruserok F
+GLIBC_2.28 iruserok_af F
+GLIBC_2.28 isalnum F
+GLIBC_2.28 isalnum_l F
+GLIBC_2.28 isalpha F
+GLIBC_2.28 isalpha_l F
+GLIBC_2.28 isascii F
+GLIBC_2.28 isastream F
+GLIBC_2.28 isatty F
+GLIBC_2.28 isblank F
+GLIBC_2.28 isblank_l F
+GLIBC_2.28 iscntrl F
+GLIBC_2.28 iscntrl_l F
+GLIBC_2.28 isctype F
+GLIBC_2.28 isdigit F
+GLIBC_2.28 isdigit_l F
+GLIBC_2.28 isfdtype F
+GLIBC_2.28 isgraph F
+GLIBC_2.28 isgraph_l F
+GLIBC_2.28 isinf F
+GLIBC_2.28 isinff F
+GLIBC_2.28 isinfl F
+GLIBC_2.28 islower F
+GLIBC_2.28 islower_l F
+GLIBC_2.28 isnan F
+GLIBC_2.28 isnanf F
+GLIBC_2.28 isnanl F
+GLIBC_2.28 isprint F
+GLIBC_2.28 isprint_l F
+GLIBC_2.28 ispunct F
+GLIBC_2.28 ispunct_l F
+GLIBC_2.28 isspace F
+GLIBC_2.28 isspace_l F
+GLIBC_2.28 isupper F
+GLIBC_2.28 isupper_l F
+GLIBC_2.28 iswalnum F
+GLIBC_2.28 iswalnum_l F
+GLIBC_2.28 iswalpha F
+GLIBC_2.28 iswalpha_l F
+GLIBC_2.28 iswblank F
+GLIBC_2.28 iswblank_l F
+GLIBC_2.28 iswcntrl F
+GLIBC_2.28 iswcntrl_l F
+GLIBC_2.28 iswctype F
+GLIBC_2.28 iswctype_l F
+GLIBC_2.28 iswdigit F
+GLIBC_2.28 iswdigit_l F
+GLIBC_2.28 iswgraph F
+GLIBC_2.28 iswgraph_l F
+GLIBC_2.28 iswlower F
+GLIBC_2.28 iswlower_l F
+GLIBC_2.28 iswprint F
+GLIBC_2.28 iswprint_l F
+GLIBC_2.28 iswpunct F
+GLIBC_2.28 iswpunct_l F
+GLIBC_2.28 iswspace F
+GLIBC_2.28 iswspace_l F
+GLIBC_2.28 iswupper F
+GLIBC_2.28 iswupper_l F
+GLIBC_2.28 iswxdigit F
+GLIBC_2.28 iswxdigit_l F
+GLIBC_2.28 isxdigit F
+GLIBC_2.28 isxdigit_l F
+GLIBC_2.28 jrand48 F
+GLIBC_2.28 jrand48_r F
+GLIBC_2.28 key_decryptsession F
+GLIBC_2.28 key_decryptsession_pk F
+GLIBC_2.28 key_encryptsession F
+GLIBC_2.28 key_encryptsession_pk F
+GLIBC_2.28 key_gendes F
+GLIBC_2.28 key_get_conv F
+GLIBC_2.28 key_secretkey_is_set F
+GLIBC_2.28 key_setnet F
+GLIBC_2.28 key_setsecret F
+GLIBC_2.28 kill F
+GLIBC_2.28 killpg F
+GLIBC_2.28 klogctl F
+GLIBC_2.28 l64a F
+GLIBC_2.28 labs F
+GLIBC_2.28 lchmod F
+GLIBC_2.28 lchown F
+GLIBC_2.28 lckpwdf F
+GLIBC_2.28 lcong48 F
+GLIBC_2.28 lcong48_r F
+GLIBC_2.28 ldexp F
+GLIBC_2.28 ldexpf F
+GLIBC_2.28 ldexpl F
+GLIBC_2.28 ldiv F
+GLIBC_2.28 lfind F
+GLIBC_2.28 lgetxattr F
+GLIBC_2.28 link F
+GLIBC_2.28 linkat F
+GLIBC_2.28 listen F
+GLIBC_2.28 listxattr F
+GLIBC_2.28 llabs F
+GLIBC_2.28 lldiv F
+GLIBC_2.28 llistxattr F
+GLIBC_2.28 llseek F
+GLIBC_2.28 localeconv F
+GLIBC_2.28 localtime F
+GLIBC_2.28 localtime_r F
+GLIBC_2.28 lockf F
+GLIBC_2.28 lockf64 F
+GLIBC_2.28 longjmp F
+GLIBC_2.28 lrand48 F
+GLIBC_2.28 lrand48_r F
+GLIBC_2.28 lremovexattr F
+GLIBC_2.28 lsearch F
+GLIBC_2.28 lseek F
+GLIBC_2.28 lseek64 F
+GLIBC_2.28 lsetxattr F
+GLIBC_2.28 lutimes F
+GLIBC_2.28 madvise F
+GLIBC_2.28 makecontext F
+GLIBC_2.28 mallinfo F
+GLIBC_2.28 malloc F
+GLIBC_2.28 malloc_info F
+GLIBC_2.28 malloc_stats F
+GLIBC_2.28 malloc_trim F
+GLIBC_2.28 malloc_usable_size F
+GLIBC_2.28 mallopt F
+GLIBC_2.28 mallwatch D 0x4
+GLIBC_2.28 mblen F
+GLIBC_2.28 mbrlen F
+GLIBC_2.28 mbrtoc16 F
+GLIBC_2.28 mbrtoc32 F
+GLIBC_2.28 mbrtowc F
+GLIBC_2.28 mbsinit F
+GLIBC_2.28 mbsnrtowcs F
+GLIBC_2.28 mbsrtowcs F
+GLIBC_2.28 mbstowcs F
+GLIBC_2.28 mbtowc F
+GLIBC_2.28 mcheck F
+GLIBC_2.28 mcheck_check_all F
+GLIBC_2.28 mcheck_pedantic F
+GLIBC_2.28 memalign F
+GLIBC_2.28 memccpy F
+GLIBC_2.28 memchr F
+GLIBC_2.28 memcmp F
+GLIBC_2.28 memcpy F
+GLIBC_2.28 memfd_create F
+GLIBC_2.28 memfrob F
+GLIBC_2.28 memmem F
+GLIBC_2.28 memmove F
+GLIBC_2.28 mempcpy F
+GLIBC_2.28 memrchr F
+GLIBC_2.28 memset F
+GLIBC_2.28 mincore F
+GLIBC_2.28 mkdir F
+GLIBC_2.28 mkdirat F
+GLIBC_2.28 mkdtemp F
+GLIBC_2.28 mkfifo F
+GLIBC_2.28 mkfifoat F
+GLIBC_2.28 mkostemp F
+GLIBC_2.28 mkostemp64 F
+GLIBC_2.28 mkostemps F
+GLIBC_2.28 mkostemps64 F
+GLIBC_2.28 mkstemp F
+GLIBC_2.28 mkstemp64 F
+GLIBC_2.28 mkstemps F
+GLIBC_2.28 mkstemps64 F
+GLIBC_2.28 mktemp F
+GLIBC_2.28 mktime F
+GLIBC_2.28 mlock F
+GLIBC_2.28 mlock2 F
+GLIBC_2.28 mlockall F
+GLIBC_2.28 mmap F
+GLIBC_2.28 mmap64 F
+GLIBC_2.28 modf F
+GLIBC_2.28 modff F
+GLIBC_2.28 modfl F
+GLIBC_2.28 moncontrol F
+GLIBC_2.28 monstartup F
+GLIBC_2.28 mount F
+GLIBC_2.28 mprobe F
+GLIBC_2.28 mprotect F
+GLIBC_2.28 mrand48 F
+GLIBC_2.28 mrand48_r F
+GLIBC_2.28 mremap F
+GLIBC_2.28 msgctl F
+GLIBC_2.28 msgget F
+GLIBC_2.28 msgrcv F
+GLIBC_2.28 msgsnd F
+GLIBC_2.28 msync F
+GLIBC_2.28 mtrace F
+GLIBC_2.28 munlock F
+GLIBC_2.28 munlockall F
+GLIBC_2.28 munmap F
+GLIBC_2.28 muntrace F
+GLIBC_2.28 name_to_handle_at F
+GLIBC_2.28 nanosleep F
+GLIBC_2.28 netname2host F
+GLIBC_2.28 netname2user F
+GLIBC_2.28 newlocale F
+GLIBC_2.28 nfsservctl F
+GLIBC_2.28 nftw F
+GLIBC_2.28 nftw64 F
+GLIBC_2.28 ngettext F
+GLIBC_2.28 nice F
+GLIBC_2.28 nl_langinfo F
+GLIBC_2.28 nl_langinfo_l F
+GLIBC_2.28 nrand48 F
+GLIBC_2.28 nrand48_r F
+GLIBC_2.28 ntohl F
+GLIBC_2.28 ntohs F
+GLIBC_2.28 ntp_adjtime F
+GLIBC_2.28 ntp_gettime F
+GLIBC_2.28 ntp_gettimex F
+GLIBC_2.28 obstack_alloc_failed_handler D 0x4
+GLIBC_2.28 obstack_exit_failure D 0x4
+GLIBC_2.28 obstack_free F
+GLIBC_2.28 obstack_printf F
+GLIBC_2.28 obstack_vprintf F
+GLIBC_2.28 on_exit F
+GLIBC_2.28 open F
+GLIBC_2.28 open64 F
+GLIBC_2.28 open_by_handle_at F
+GLIBC_2.28 open_memstream F
+GLIBC_2.28 open_wmemstream F
+GLIBC_2.28 openat F
+GLIBC_2.28 openat64 F
+GLIBC_2.28 opendir F
+GLIBC_2.28 openlog F
+GLIBC_2.28 optarg D 0x4
+GLIBC_2.28 opterr D 0x4
+GLIBC_2.28 optind D 0x4
+GLIBC_2.28 optopt D 0x4
+GLIBC_2.28 parse_printf_format F
+GLIBC_2.28 passwd2des F
+GLIBC_2.28 pathconf F
+GLIBC_2.28 pause F
+GLIBC_2.28 pclose F
+GLIBC_2.28 perror F
+GLIBC_2.28 personality F
+GLIBC_2.28 pipe F
+GLIBC_2.28 pipe2 F
+GLIBC_2.28 pivot_root F
+GLIBC_2.28 pkey_alloc F
+GLIBC_2.28 pkey_free F
+GLIBC_2.28 pkey_get F
+GLIBC_2.28 pkey_mprotect F
+GLIBC_2.28 pkey_set F
+GLIBC_2.28 pmap_getmaps F
+GLIBC_2.28 pmap_getport F
+GLIBC_2.28 pmap_rmtcall F
+GLIBC_2.28 pmap_set F
+GLIBC_2.28 pmap_unset F
+GLIBC_2.28 poll F
+GLIBC_2.28 popen F
+GLIBC_2.28 posix_fadvise F
+GLIBC_2.28 posix_fadvise64 F
+GLIBC_2.28 posix_fallocate F
+GLIBC_2.28 posix_fallocate64 F
+GLIBC_2.28 posix_madvise F
+GLIBC_2.28 posix_memalign F
+GLIBC_2.28 posix_openpt F
+GLIBC_2.28 posix_spawn F
+GLIBC_2.28 posix_spawn_file_actions_addclose F
+GLIBC_2.28 posix_spawn_file_actions_adddup2 F
+GLIBC_2.28 posix_spawn_file_actions_addopen F
+GLIBC_2.28 posix_spawn_file_actions_destroy F
+GLIBC_2.28 posix_spawn_file_actions_init F
+GLIBC_2.28 posix_spawnattr_destroy F
+GLIBC_2.28 posix_spawnattr_getflags F
+GLIBC_2.28 posix_spawnattr_getpgroup F
+GLIBC_2.28 posix_spawnattr_getschedparam F
+GLIBC_2.28 posix_spawnattr_getschedpolicy F
+GLIBC_2.28 posix_spawnattr_getsigdefault F
+GLIBC_2.28 posix_spawnattr_getsigmask F
+GLIBC_2.28 posix_spawnattr_init F
+GLIBC_2.28 posix_spawnattr_setflags F
+GLIBC_2.28 posix_spawnattr_setpgroup F
+GLIBC_2.28 posix_spawnattr_setschedparam F
+GLIBC_2.28 posix_spawnattr_setschedpolicy F
+GLIBC_2.28 posix_spawnattr_setsigdefault F
+GLIBC_2.28 posix_spawnattr_setsigmask F
+GLIBC_2.28 posix_spawnp F
+GLIBC_2.28 ppoll F
+GLIBC_2.28 prctl F
+GLIBC_2.28 pread F
+GLIBC_2.28 pread64 F
+GLIBC_2.28 preadv F
+GLIBC_2.28 preadv2 F
+GLIBC_2.28 preadv64 F
+GLIBC_2.28 preadv64v2 F
+GLIBC_2.28 printf F
+GLIBC_2.28 printf_size F
+GLIBC_2.28 printf_size_info F
+GLIBC_2.28 prlimit F
+GLIBC_2.28 prlimit64 F
+GLIBC_2.28 process_vm_readv F
+GLIBC_2.28 process_vm_writev F
+GLIBC_2.28 profil F
+GLIBC_2.28 program_invocation_name D 0x4
+GLIBC_2.28 program_invocation_short_name D 0x4
+GLIBC_2.28 pselect F
+GLIBC_2.28 psiginfo F
+GLIBC_2.28 psignal F
+GLIBC_2.28 pthread_attr_destroy F
+GLIBC_2.28 pthread_attr_getdetachstate F
+GLIBC_2.28 pthread_attr_getinheritsched F
+GLIBC_2.28 pthread_attr_getschedparam F
+GLIBC_2.28 pthread_attr_getschedpolicy F
+GLIBC_2.28 pthread_attr_getscope F
+GLIBC_2.28 pthread_attr_init F
+GLIBC_2.28 pthread_attr_setdetachstate F
+GLIBC_2.28 pthread_attr_setinheritsched F
+GLIBC_2.28 pthread_attr_setschedparam F
+GLIBC_2.28 pthread_attr_setschedpolicy F
+GLIBC_2.28 pthread_attr_setscope F
+GLIBC_2.28 pthread_cond_broadcast F
+GLIBC_2.28 pthread_cond_destroy F
+GLIBC_2.28 pthread_cond_init F
+GLIBC_2.28 pthread_cond_signal F
+GLIBC_2.28 pthread_cond_timedwait F
+GLIBC_2.28 pthread_cond_wait F
+GLIBC_2.28 pthread_condattr_destroy F
+GLIBC_2.28 pthread_condattr_init F
+GLIBC_2.28 pthread_equal F
+GLIBC_2.28 pthread_exit F
+GLIBC_2.28 pthread_getschedparam F
+GLIBC_2.28 pthread_mutex_destroy F
+GLIBC_2.28 pthread_mutex_init F
+GLIBC_2.28 pthread_mutex_lock F
+GLIBC_2.28 pthread_mutex_unlock F
+GLIBC_2.28 pthread_self F
+GLIBC_2.28 pthread_setcancelstate F
+GLIBC_2.28 pthread_setcanceltype F
+GLIBC_2.28 pthread_setschedparam F
+GLIBC_2.28 ptrace F
+GLIBC_2.28 ptsname F
+GLIBC_2.28 ptsname_r F
+GLIBC_2.28 putc F
+GLIBC_2.28 putc_unlocked F
+GLIBC_2.28 putchar F
+GLIBC_2.28 putchar_unlocked F
+GLIBC_2.28 putenv F
+GLIBC_2.28 putgrent F
+GLIBC_2.28 putmsg F
+GLIBC_2.28 putpmsg F
+GLIBC_2.28 putpwent F
+GLIBC_2.28 puts F
+GLIBC_2.28 putsgent F
+GLIBC_2.28 putspent F
+GLIBC_2.28 pututline F
+GLIBC_2.28 pututxline F
+GLIBC_2.28 putw F
+GLIBC_2.28 putwc F
+GLIBC_2.28 putwc_unlocked F
+GLIBC_2.28 putwchar F
+GLIBC_2.28 putwchar_unlocked F
+GLIBC_2.28 pvalloc F
+GLIBC_2.28 pwrite F
+GLIBC_2.28 pwrite64 F
+GLIBC_2.28 pwritev F
+GLIBC_2.28 pwritev2 F
+GLIBC_2.28 pwritev64 F
+GLIBC_2.28 pwritev64v2 F
+GLIBC_2.28 qecvt F
+GLIBC_2.28 qecvt_r F
+GLIBC_2.28 qfcvt F
+GLIBC_2.28 qfcvt_r F
+GLIBC_2.28 qgcvt F
+GLIBC_2.28 qsort F
+GLIBC_2.28 qsort_r F
+GLIBC_2.28 quick_exit F
+GLIBC_2.28 quotactl F
+GLIBC_2.28 raise F
+GLIBC_2.28 rand F
+GLIBC_2.28 rand_r F
+GLIBC_2.28 random F
+GLIBC_2.28 random_r F
+GLIBC_2.28 rawmemchr F
+GLIBC_2.28 rcmd F
+GLIBC_2.28 rcmd_af F
+GLIBC_2.28 re_comp F
+GLIBC_2.28 re_compile_fastmap F
+GLIBC_2.28 re_compile_pattern F
+GLIBC_2.28 re_exec F
+GLIBC_2.28 re_match F
+GLIBC_2.28 re_match_2 F
+GLIBC_2.28 re_search F
+GLIBC_2.28 re_search_2 F
+GLIBC_2.28 re_set_registers F
+GLIBC_2.28 re_set_syntax F
+GLIBC_2.28 re_syntax_options D 0x4
+GLIBC_2.28 read F
+GLIBC_2.28 readahead F
+GLIBC_2.28 readdir F
+GLIBC_2.28 readdir64 F
+GLIBC_2.28 readdir64_r F
+GLIBC_2.28 readdir_r F
+GLIBC_2.28 readlink F
+GLIBC_2.28 readlinkat F
+GLIBC_2.28 readv F
+GLIBC_2.28 realloc F
+GLIBC_2.28 reallocarray F
+GLIBC_2.28 realpath F
+GLIBC_2.28 reboot F
+GLIBC_2.28 recv F
+GLIBC_2.28 recvfrom F
+GLIBC_2.28 recvmmsg F
+GLIBC_2.28 recvmsg F
+GLIBC_2.28 regcomp F
+GLIBC_2.28 regerror F
+GLIBC_2.28 regexec F
+GLIBC_2.28 regfree F
+GLIBC_2.28 register_printf_function F
+GLIBC_2.28 register_printf_modifier F
+GLIBC_2.28 register_printf_specifier F
+GLIBC_2.28 register_printf_type F
+GLIBC_2.28 registerrpc F
+GLIBC_2.28 remap_file_pages F
+GLIBC_2.28 remove F
+GLIBC_2.28 removexattr F
+GLIBC_2.28 remque F
+GLIBC_2.28 rename F
+GLIBC_2.28 renameat F
+GLIBC_2.28 revoke F
+GLIBC_2.28 rewind F
+GLIBC_2.28 rewinddir F
+GLIBC_2.28 rexec F
+GLIBC_2.28 rexec_af F
+GLIBC_2.28 rexecoptions D 0x4
+GLIBC_2.28 rindex F
+GLIBC_2.28 rmdir F
+GLIBC_2.28 rpc_createerr D 0x10
+GLIBC_2.28 rpmatch F
+GLIBC_2.28 rresvport F
+GLIBC_2.28 rresvport_af F
+GLIBC_2.28 rtime F
+GLIBC_2.28 ruserok F
+GLIBC_2.28 ruserok_af F
+GLIBC_2.28 ruserpass F
+GLIBC_2.28 sbrk F
+GLIBC_2.28 scalbn F
+GLIBC_2.28 scalbnf F
+GLIBC_2.28 scalbnl F
+GLIBC_2.28 scandir F
+GLIBC_2.28 scandir64 F
+GLIBC_2.28 scandirat F
+GLIBC_2.28 scandirat64 F
+GLIBC_2.28 scanf F
+GLIBC_2.28 sched_get_priority_max F
+GLIBC_2.28 sched_get_priority_min F
+GLIBC_2.28 sched_getaffinity F
+GLIBC_2.28 sched_getcpu F
+GLIBC_2.28 sched_getparam F
+GLIBC_2.28 sched_getscheduler F
+GLIBC_2.28 sched_rr_get_interval F
+GLIBC_2.28 sched_setaffinity F
+GLIBC_2.28 sched_setparam F
+GLIBC_2.28 sched_setscheduler F
+GLIBC_2.28 sched_yield F
+GLIBC_2.28 secure_getenv F
+GLIBC_2.28 seed48 F
+GLIBC_2.28 seed48_r F
+GLIBC_2.28 seekdir F
+GLIBC_2.28 select F
+GLIBC_2.28 semctl F
+GLIBC_2.28 semget F
+GLIBC_2.28 semop F
+GLIBC_2.28 semtimedop F
+GLIBC_2.28 send F
+GLIBC_2.28 sendfile F
+GLIBC_2.28 sendfile64 F
+GLIBC_2.28 sendmmsg F
+GLIBC_2.28 sendmsg F
+GLIBC_2.28 sendto F
+GLIBC_2.28 setaliasent F
+GLIBC_2.28 setbuf F
+GLIBC_2.28 setbuffer F
+GLIBC_2.28 setcontext F
+GLIBC_2.28 setdomainname F
+GLIBC_2.28 setegid F
+GLIBC_2.28 setenv F
+GLIBC_2.28 seteuid F
+GLIBC_2.28 setfsent F
+GLIBC_2.28 setfsgid F
+GLIBC_2.28 setfsuid F
+GLIBC_2.28 setgid F
+GLIBC_2.28 setgrent F
+GLIBC_2.28 setgroups F
+GLIBC_2.28 sethostent F
+GLIBC_2.28 sethostid F
+GLIBC_2.28 sethostname F
+GLIBC_2.28 setipv4sourcefilter F
+GLIBC_2.28 setitimer F
+GLIBC_2.28 setjmp F
+GLIBC_2.28 setlinebuf F
+GLIBC_2.28 setlocale F
+GLIBC_2.28 setlogin F
+GLIBC_2.28 setlogmask F
+GLIBC_2.28 setmntent F
+GLIBC_2.28 setnetent F
+GLIBC_2.28 setnetgrent F
+GLIBC_2.28 setns F
+GLIBC_2.28 setpgid F
+GLIBC_2.28 setpgrp F
+GLIBC_2.28 setpriority F
+GLIBC_2.28 setprotoent F
+GLIBC_2.28 setpwent F
+GLIBC_2.28 setregid F
+GLIBC_2.28 setresgid F
+GLIBC_2.28 setresuid F
+GLIBC_2.28 setreuid F
+GLIBC_2.28 setrlimit F
+GLIBC_2.28 setrlimit64 F
+GLIBC_2.28 setrpcent F
+GLIBC_2.28 setservent F
+GLIBC_2.28 setsgent F
+GLIBC_2.28 setsid F
+GLIBC_2.28 setsockopt F
+GLIBC_2.28 setsourcefilter F
+GLIBC_2.28 setspent F
+GLIBC_2.28 setstate F
+GLIBC_2.28 setstate_r F
+GLIBC_2.28 settimeofday F
+GLIBC_2.28 setttyent F
+GLIBC_2.28 setuid F
+GLIBC_2.28 setusershell F
+GLIBC_2.28 setutent F
+GLIBC_2.28 setutxent F
+GLIBC_2.28 setvbuf F
+GLIBC_2.28 setxattr F
+GLIBC_2.28 sgetsgent F
+GLIBC_2.28 sgetsgent_r F
+GLIBC_2.28 sgetspent F
+GLIBC_2.28 sgetspent_r F
+GLIBC_2.28 shmat F
+GLIBC_2.28 shmctl F
+GLIBC_2.28 shmdt F
+GLIBC_2.28 shmget F
+GLIBC_2.28 shutdown F
+GLIBC_2.28 sigaction F
+GLIBC_2.28 sigaddset F
+GLIBC_2.28 sigaltstack F
+GLIBC_2.28 sigandset F
+GLIBC_2.28 sigblock F
+GLIBC_2.28 sigdelset F
+GLIBC_2.28 sigemptyset F
+GLIBC_2.28 sigfillset F
+GLIBC_2.28 siggetmask F
+GLIBC_2.28 sighold F
+GLIBC_2.28 sigignore F
+GLIBC_2.28 siginterrupt F
+GLIBC_2.28 sigisemptyset F
+GLIBC_2.28 sigismember F
+GLIBC_2.28 siglongjmp F
+GLIBC_2.28 signal F
+GLIBC_2.28 signalfd F
+GLIBC_2.28 sigorset F
+GLIBC_2.28 sigpause F
+GLIBC_2.28 sigpending F
+GLIBC_2.28 sigprocmask F
+GLIBC_2.28 sigqueue F
+GLIBC_2.28 sigrelse F
+GLIBC_2.28 sigreturn F
+GLIBC_2.28 sigset F
+GLIBC_2.28 sigsetmask F
+GLIBC_2.28 sigstack F
+GLIBC_2.28 sigsuspend F
+GLIBC_2.28 sigtimedwait F
+GLIBC_2.28 sigwait F
+GLIBC_2.28 sigwaitinfo F
+GLIBC_2.28 sleep F
+GLIBC_2.28 snprintf F
+GLIBC_2.28 sockatmark F
+GLIBC_2.28 socket F
+GLIBC_2.28 socketpair F
+GLIBC_2.28 splice F
+GLIBC_2.28 sprintf F
+GLIBC_2.28 sprofil F
+GLIBC_2.28 srand F
+GLIBC_2.28 srand48 F
+GLIBC_2.28 srand48_r F
+GLIBC_2.28 srandom F
+GLIBC_2.28 srandom_r F
+GLIBC_2.28 sscanf F
+GLIBC_2.28 ssignal F
+GLIBC_2.28 sstk F
+GLIBC_2.28 statfs F
+GLIBC_2.28 statfs64 F
+GLIBC_2.28 statvfs F
+GLIBC_2.28 statvfs64 F
+GLIBC_2.28 stderr D 0x4
+GLIBC_2.28 stdin D 0x4
+GLIBC_2.28 stdout D 0x4
+GLIBC_2.28 stime F
+GLIBC_2.28 stpcpy F
+GLIBC_2.28 stpncpy F
+GLIBC_2.28 strcasecmp F
+GLIBC_2.28 strcasecmp_l F
+GLIBC_2.28 strcasestr F
+GLIBC_2.28 strcat F
+GLIBC_2.28 strchr F
+GLIBC_2.28 strchrnul F
+GLIBC_2.28 strcmp F
+GLIBC_2.28 strcoll F
+GLIBC_2.28 strcoll_l F
+GLIBC_2.28 strcpy F
+GLIBC_2.28 strcspn F
+GLIBC_2.28 strdup F
+GLIBC_2.28 strerror F
+GLIBC_2.28 strerror_l F
+GLIBC_2.28 strerror_r F
+GLIBC_2.28 strfmon F
+GLIBC_2.28 strfmon_l F
+GLIBC_2.28 strfromd F
+GLIBC_2.28 strfromf F
+GLIBC_2.28 strfromf32 F
+GLIBC_2.28 strfromf32x F
+GLIBC_2.28 strfromf64 F
+GLIBC_2.28 strfroml F
+GLIBC_2.28 strfry F
+GLIBC_2.28 strftime F
+GLIBC_2.28 strftime_l F
+GLIBC_2.28 strlen F
+GLIBC_2.28 strncasecmp F
+GLIBC_2.28 strncasecmp_l F
+GLIBC_2.28 strncat F
+GLIBC_2.28 strncmp F
+GLIBC_2.28 strncpy F
+GLIBC_2.28 strndup F
+GLIBC_2.28 strnlen F
+GLIBC_2.28 strpbrk F
+GLIBC_2.28 strptime F
+GLIBC_2.28 strptime_l F
+GLIBC_2.28 strrchr F
+GLIBC_2.28 strsep F
+GLIBC_2.28 strsignal F
+GLIBC_2.28 strspn F
+GLIBC_2.28 strstr F
+GLIBC_2.28 strtod F
+GLIBC_2.28 strtod_l F
+GLIBC_2.28 strtof F
+GLIBC_2.28 strtof32 F
+GLIBC_2.28 strtof32_l F
+GLIBC_2.28 strtof32x F
+GLIBC_2.28 strtof32x_l F
+GLIBC_2.28 strtof64 F
+GLIBC_2.28 strtof64_l F
+GLIBC_2.28 strtof_l F
+GLIBC_2.28 strtoimax F
+GLIBC_2.28 strtok F
+GLIBC_2.28 strtok_r F
+GLIBC_2.28 strtol F
+GLIBC_2.28 strtol_l F
+GLIBC_2.28 strtold F
+GLIBC_2.28 strtold_l F
+GLIBC_2.28 strtoll F
+GLIBC_2.28 strtoll_l F
+GLIBC_2.28 strtoq F
+GLIBC_2.28 strtoul F
+GLIBC_2.28 strtoul_l F
+GLIBC_2.28 strtoull F
+GLIBC_2.28 strtoull_l F
+GLIBC_2.28 strtoumax F
+GLIBC_2.28 strtouq F
+GLIBC_2.28 strverscmp F
+GLIBC_2.28 strxfrm F
+GLIBC_2.28 strxfrm_l F
+GLIBC_2.28 stty F
+GLIBC_2.28 svc_exit F
+GLIBC_2.28 svc_fdset D 0x80
+GLIBC_2.28 svc_getreq F
+GLIBC_2.28 svc_getreq_common F
+GLIBC_2.28 svc_getreq_poll F
+GLIBC_2.28 svc_getreqset F
+GLIBC_2.28 svc_max_pollfd D 0x4
+GLIBC_2.28 svc_pollfd D 0x4
+GLIBC_2.28 svc_register F
+GLIBC_2.28 svc_run F
+GLIBC_2.28 svc_sendreply F
+GLIBC_2.28 svc_unregister F
+GLIBC_2.28 svcauthdes_stats D 0xc
+GLIBC_2.28 svcerr_auth F
+GLIBC_2.28 svcerr_decode F
+GLIBC_2.28 svcerr_noproc F
+GLIBC_2.28 svcerr_noprog F
+GLIBC_2.28 svcerr_progvers F
+GLIBC_2.28 svcerr_systemerr F
+GLIBC_2.28 svcerr_weakauth F
+GLIBC_2.28 svcfd_create F
+GLIBC_2.28 svcraw_create F
+GLIBC_2.28 svctcp_create F
+GLIBC_2.28 svcudp_bufcreate F
+GLIBC_2.28 svcudp_create F
+GLIBC_2.28 svcudp_enablecache F
+GLIBC_2.28 svcunix_create F
+GLIBC_2.28 svcunixfd_create F
+GLIBC_2.28 swab F
+GLIBC_2.28 swapcontext F
+GLIBC_2.28 swapoff F
+GLIBC_2.28 swapon F
+GLIBC_2.28 swprintf F
+GLIBC_2.28 swscanf F
+GLIBC_2.28 symlink F
+GLIBC_2.28 symlinkat F
+GLIBC_2.28 sync F
+GLIBC_2.28 sync_file_range F
+GLIBC_2.28 syncfs F
+GLIBC_2.28 sys_errlist D 0x21c
+GLIBC_2.28 sys_nerr D 0x4
+GLIBC_2.28 sys_sigabbrev D 0x104
+GLIBC_2.28 sys_siglist D 0x104
+GLIBC_2.28 syscall F
+GLIBC_2.28 sysconf F
+GLIBC_2.28 sysinfo F
+GLIBC_2.28 syslog F
+GLIBC_2.28 system F
+GLIBC_2.28 sysv_signal F
+GLIBC_2.28 tcdrain F
+GLIBC_2.28 tcflow F
+GLIBC_2.28 tcflush F
+GLIBC_2.28 tcgetattr F
+GLIBC_2.28 tcgetpgrp F
+GLIBC_2.28 tcgetsid F
+GLIBC_2.28 tcsendbreak F
+GLIBC_2.28 tcsetattr F
+GLIBC_2.28 tcsetpgrp F
+GLIBC_2.28 tdelete F
+GLIBC_2.28 tdestroy F
+GLIBC_2.28 tee F
+GLIBC_2.28 telldir F
+GLIBC_2.28 tempnam F
+GLIBC_2.28 textdomain F
+GLIBC_2.28 tfind F
+GLIBC_2.28 time F
+GLIBC_2.28 timegm F
+GLIBC_2.28 timelocal F
+GLIBC_2.28 timerfd_create F
+GLIBC_2.28 timerfd_gettime F
+GLIBC_2.28 timerfd_settime F
+GLIBC_2.28 times F
+GLIBC_2.28 timespec_get F
+GLIBC_2.28 timezone D 0x4
+GLIBC_2.28 tmpfile F
+GLIBC_2.28 tmpfile64 F
+GLIBC_2.28 tmpnam F
+GLIBC_2.28 tmpnam_r F
+GLIBC_2.28 toascii F
+GLIBC_2.28 tolower F
+GLIBC_2.28 tolower_l F
+GLIBC_2.28 toupper F
+GLIBC_2.28 toupper_l F
+GLIBC_2.28 towctrans F
+GLIBC_2.28 towctrans_l F
+GLIBC_2.28 towlower F
+GLIBC_2.28 towlower_l F
+GLIBC_2.28 towupper F
+GLIBC_2.28 towupper_l F
+GLIBC_2.28 tr_break F
+GLIBC_2.28 truncate F
+GLIBC_2.28 truncate64 F
+GLIBC_2.28 tsearch F
+GLIBC_2.28 ttyname F
+GLIBC_2.28 ttyname_r F
+GLIBC_2.28 ttyslot F
+GLIBC_2.28 twalk F
+GLIBC_2.28 tzname D 0x8
+GLIBC_2.28 tzset F
+GLIBC_2.28 ualarm F
+GLIBC_2.28 ulckpwdf F
+GLIBC_2.28 ulimit F
+GLIBC_2.28 umask F
+GLIBC_2.28 umount F
+GLIBC_2.28 umount2 F
+GLIBC_2.28 uname F
+GLIBC_2.28 ungetc F
+GLIBC_2.28 ungetwc F
+GLIBC_2.28 unlink F
+GLIBC_2.28 unlinkat F
+GLIBC_2.28 unlockpt F
+GLIBC_2.28 unsetenv F
+GLIBC_2.28 unshare F
+GLIBC_2.28 updwtmp F
+GLIBC_2.28 updwtmpx F
+GLIBC_2.28 uselocale F
+GLIBC_2.28 user2netname F
+GLIBC_2.28 usleep F
+GLIBC_2.28 ustat F
+GLIBC_2.28 utime F
+GLIBC_2.28 utimensat F
+GLIBC_2.28 utimes F
+GLIBC_2.28 utmpname F
+GLIBC_2.28 utmpxname F
+GLIBC_2.28 valloc F
+GLIBC_2.28 vasprintf F
+GLIBC_2.28 vdprintf F
+GLIBC_2.28 verr F
+GLIBC_2.28 verrx F
+GLIBC_2.28 versionsort F
+GLIBC_2.28 versionsort64 F
+GLIBC_2.28 vfork F
+GLIBC_2.28 vfprintf F
+GLIBC_2.28 vfscanf F
+GLIBC_2.28 vfwprintf F
+GLIBC_2.28 vfwscanf F
+GLIBC_2.28 vhangup F
+GLIBC_2.28 vlimit F
+GLIBC_2.28 vmsplice F
+GLIBC_2.28 vprintf F
+GLIBC_2.28 vscanf F
+GLIBC_2.28 vsnprintf F
+GLIBC_2.28 vsprintf F
+GLIBC_2.28 vsscanf F
+GLIBC_2.28 vswprintf F
+GLIBC_2.28 vswscanf F
+GLIBC_2.28 vsyslog F
+GLIBC_2.28 vtimes F
+GLIBC_2.28 vwarn F
+GLIBC_2.28 vwarnx F
+GLIBC_2.28 vwprintf F
+GLIBC_2.28 vwscanf F
+GLIBC_2.28 wait F
+GLIBC_2.28 wait3 F
+GLIBC_2.28 wait4 F
+GLIBC_2.28 waitid F
+GLIBC_2.28 waitpid F
+GLIBC_2.28 warn F
+GLIBC_2.28 warnx F
+GLIBC_2.28 wcpcpy F
+GLIBC_2.28 wcpncpy F
+GLIBC_2.28 wcrtomb F
+GLIBC_2.28 wcscasecmp F
+GLIBC_2.28 wcscasecmp_l F
+GLIBC_2.28 wcscat F
+GLIBC_2.28 wcschr F
+GLIBC_2.28 wcschrnul F
+GLIBC_2.28 wcscmp F
+GLIBC_2.28 wcscoll F
+GLIBC_2.28 wcscoll_l F
+GLIBC_2.28 wcscpy F
+GLIBC_2.28 wcscspn F
+GLIBC_2.28 wcsdup F
+GLIBC_2.28 wcsftime F
+GLIBC_2.28 wcsftime_l F
+GLIBC_2.28 wcslen F
+GLIBC_2.28 wcsncasecmp F
+GLIBC_2.28 wcsncasecmp_l F
+GLIBC_2.28 wcsncat F
+GLIBC_2.28 wcsncmp F
+GLIBC_2.28 wcsncpy F
+GLIBC_2.28 wcsnlen F
+GLIBC_2.28 wcsnrtombs F
+GLIBC_2.28 wcspbrk F
+GLIBC_2.28 wcsrchr F
+GLIBC_2.28 wcsrtombs F
+GLIBC_2.28 wcsspn F
+GLIBC_2.28 wcsstr F
+GLIBC_2.28 wcstod F
+GLIBC_2.28 wcstod_l F
+GLIBC_2.28 wcstof F
+GLIBC_2.28 wcstof32 F
+GLIBC_2.28 wcstof32_l F
+GLIBC_2.28 wcstof32x F
+GLIBC_2.28 wcstof32x_l F
+GLIBC_2.28 wcstof64 F
+GLIBC_2.28 wcstof64_l F
+GLIBC_2.28 wcstof_l F
+GLIBC_2.28 wcstoimax F
+GLIBC_2.28 wcstok F
+GLIBC_2.28 wcstol F
+GLIBC_2.28 wcstol_l F
+GLIBC_2.28 wcstold F
+GLIBC_2.28 wcstold_l F
+GLIBC_2.28 wcstoll F
+GLIBC_2.28 wcstoll_l F
+GLIBC_2.28 wcstombs F
+GLIBC_2.28 wcstoq F
+GLIBC_2.28 wcstoul F
+GLIBC_2.28 wcstoul_l F
+GLIBC_2.28 wcstoull F
+GLIBC_2.28 wcstoull_l F
+GLIBC_2.28 wcstoumax F
+GLIBC_2.28 wcstouq F
+GLIBC_2.28 wcswcs F
+GLIBC_2.28 wcswidth F
+GLIBC_2.28 wcsxfrm F
+GLIBC_2.28 wcsxfrm_l F
+GLIBC_2.28 wctob F
+GLIBC_2.28 wctomb F
+GLIBC_2.28 wctrans F
+GLIBC_2.28 wctrans_l F
+GLIBC_2.28 wctype F
+GLIBC_2.28 wctype_l F
+GLIBC_2.28 wcwidth F
+GLIBC_2.28 wmemchr F
+GLIBC_2.28 wmemcmp F
+GLIBC_2.28 wmemcpy F
+GLIBC_2.28 wmemmove F
+GLIBC_2.28 wmempcpy F
+GLIBC_2.28 wmemset F
+GLIBC_2.28 wordexp F
+GLIBC_2.28 wordfree F
+GLIBC_2.28 wprintf F
+GLIBC_2.28 write F
+GLIBC_2.28 writev F
+GLIBC_2.28 wscanf F
+GLIBC_2.28 xdecrypt F
+GLIBC_2.28 xdr_accepted_reply F
+GLIBC_2.28 xdr_array F
+GLIBC_2.28 xdr_authdes_cred F
+GLIBC_2.28 xdr_authdes_verf F
+GLIBC_2.28 xdr_authunix_parms F
+GLIBC_2.28 xdr_bool F
+GLIBC_2.28 xdr_bytes F
+GLIBC_2.28 xdr_callhdr F
+GLIBC_2.28 xdr_callmsg F
+GLIBC_2.28 xdr_char F
+GLIBC_2.28 xdr_cryptkeyarg F
+GLIBC_2.28 xdr_cryptkeyarg2 F
+GLIBC_2.28 xdr_cryptkeyres F
+GLIBC_2.28 xdr_des_block F
+GLIBC_2.28 xdr_double F
+GLIBC_2.28 xdr_enum F
+GLIBC_2.28 xdr_float F
+GLIBC_2.28 xdr_free F
+GLIBC_2.28 xdr_getcredres F
+GLIBC_2.28 xdr_hyper F
+GLIBC_2.28 xdr_int F
+GLIBC_2.28 xdr_int16_t F
+GLIBC_2.28 xdr_int32_t F
+GLIBC_2.28 xdr_int64_t F
+GLIBC_2.28 xdr_int8_t F
+GLIBC_2.28 xdr_key_netstarg F
+GLIBC_2.28 xdr_key_netstres F
+GLIBC_2.28 xdr_keybuf F
+GLIBC_2.28 xdr_keystatus F
+GLIBC_2.28 xdr_long F
+GLIBC_2.28 xdr_longlong_t F
+GLIBC_2.28 xdr_netnamestr F
+GLIBC_2.28 xdr_netobj F
+GLIBC_2.28 xdr_opaque F
+GLIBC_2.28 xdr_opaque_auth F
+GLIBC_2.28 xdr_pmap F
+GLIBC_2.28 xdr_pmaplist F
+GLIBC_2.28 xdr_pointer F
+GLIBC_2.28 xdr_quad_t F
+GLIBC_2.28 xdr_reference F
+GLIBC_2.28 xdr_rejected_reply F
+GLIBC_2.28 xdr_replymsg F
+GLIBC_2.28 xdr_rmtcall_args F
+GLIBC_2.28 xdr_rmtcallres F
+GLIBC_2.28 xdr_short F
+GLIBC_2.28 xdr_sizeof F
+GLIBC_2.28 xdr_string F
+GLIBC_2.28 xdr_u_char F
+GLIBC_2.28 xdr_u_hyper F
+GLIBC_2.28 xdr_u_int F
+GLIBC_2.28 xdr_u_long F
+GLIBC_2.28 xdr_u_longlong_t F
+GLIBC_2.28 xdr_u_quad_t F
+GLIBC_2.28 xdr_u_short F
+GLIBC_2.28 xdr_uint16_t F
+GLIBC_2.28 xdr_uint32_t F
+GLIBC_2.28 xdr_uint64_t F
+GLIBC_2.28 xdr_uint8_t F
+GLIBC_2.28 xdr_union F
+GLIBC_2.28 xdr_unixcred F
+GLIBC_2.28 xdr_vector F
+GLIBC_2.28 xdr_void F
+GLIBC_2.28 xdr_wrapstring F
+GLIBC_2.28 xdrmem_create F
+GLIBC_2.28 xdrrec_create F
+GLIBC_2.28 xdrrec_endofrecord F
+GLIBC_2.28 xdrrec_eof F
+GLIBC_2.28 xdrrec_skiprecord F
+GLIBC_2.28 xdrstdio_create F
+GLIBC_2.28 xencrypt F
+GLIBC_2.28 xprt_register F
+GLIBC_2.28 xprt_unregister F
diff --git a/sysdeps/unix/sysv/linux/nds32/libcidn.abilist b/sysdeps/unix/sysv/linux/nds32/libcidn.abilist
new file mode 100644
index 0000000..e69de29
diff --git a/sysdeps/unix/sysv/linux/nds32/libcrypt.abilist b/sysdeps/unix/sysv/linux/nds32/libcrypt.abilist
new file mode 100644
index 0000000..8e676ee
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/libcrypt.abilist
@@ -0,0 +1,8 @@
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 crypt F
+GLIBC_2.28 crypt_r F
+GLIBC_2.28 encrypt F
+GLIBC_2.28 encrypt_r F
+GLIBC_2.28 fcrypt F
+GLIBC_2.28 setkey F
+GLIBC_2.28 setkey_r F
diff --git a/sysdeps/unix/sysv/linux/nds32/libdl.abilist b/sysdeps/unix/sysv/linux/nds32/libdl.abilist
new file mode 100644
index 0000000..8b08f60
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/libdl.abilist
@@ -0,0 +1,10 @@
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 dladdr F
+GLIBC_2.28 dladdr1 F
+GLIBC_2.28 dlclose F
+GLIBC_2.28 dlerror F
+GLIBC_2.28 dlinfo F
+GLIBC_2.28 dlmopen F
+GLIBC_2.28 dlopen F
+GLIBC_2.28 dlsym F
+GLIBC_2.28 dlvsym F
diff --git a/sysdeps/unix/sysv/linux/nds32/libm.abilist b/sysdeps/unix/sysv/linux/nds32/libm.abilist
new file mode 100644
index 0000000..c210e4e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/libm.abilist
@@ -0,0 +1,730 @@
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 __acos_finite F
+GLIBC_2.28 __acosf_finite F
+GLIBC_2.28 __acosh_finite F
+GLIBC_2.28 __acoshf_finite F
+GLIBC_2.28 __asin_finite F
+GLIBC_2.28 __asinf_finite F
+GLIBC_2.28 __atan2_finite F
+GLIBC_2.28 __atan2f_finite F
+GLIBC_2.28 __atanh_finite F
+GLIBC_2.28 __atanhf_finite F
+GLIBC_2.28 __clog10 F
+GLIBC_2.28 __clog10f F
+GLIBC_2.28 __clog10l F
+GLIBC_2.28 __cosh_finite F
+GLIBC_2.28 __coshf_finite F
+GLIBC_2.28 __exp10_finite F
+GLIBC_2.28 __exp10f_finite F
+GLIBC_2.28 __exp2_finite F
+GLIBC_2.28 __exp2f_finite F
+GLIBC_2.28 __exp_finite F
+GLIBC_2.28 __expf_finite F
+GLIBC_2.28 __finite F
+GLIBC_2.28 __finitef F
+GLIBC_2.28 __fmod_finite F
+GLIBC_2.28 __fmodf_finite F
+GLIBC_2.28 __fpclassify F
+GLIBC_2.28 __fpclassifyf F
+GLIBC_2.28 __gamma_r_finite F
+GLIBC_2.28 __gammaf_r_finite F
+GLIBC_2.28 __hypot_finite F
+GLIBC_2.28 __hypotf_finite F
+GLIBC_2.28 __iseqsig F
+GLIBC_2.28 __iseqsigf F
+GLIBC_2.28 __issignaling F
+GLIBC_2.28 __issignalingf F
+GLIBC_2.28 __j0_finite F
+GLIBC_2.28 __j0f_finite F
+GLIBC_2.28 __j1_finite F
+GLIBC_2.28 __j1f_finite F
+GLIBC_2.28 __jn_finite F
+GLIBC_2.28 __jnf_finite F
+GLIBC_2.28 __lgamma_r_finite F
+GLIBC_2.28 __lgammaf_r_finite F
+GLIBC_2.28 __log10_finite F
+GLIBC_2.28 __log10f_finite F
+GLIBC_2.28 __log2_finite F
+GLIBC_2.28 __log2f_finite F
+GLIBC_2.28 __log_finite F
+GLIBC_2.28 __logf_finite F
+GLIBC_2.28 __pow_finite F
+GLIBC_2.28 __powf_finite F
+GLIBC_2.28 __remainder_finite F
+GLIBC_2.28 __remainderf_finite F
+GLIBC_2.28 __scalb_finite F
+GLIBC_2.28 __scalbf_finite F
+GLIBC_2.28 __signbit F
+GLIBC_2.28 __signbitf F
+GLIBC_2.28 __signgam D 0x4
+GLIBC_2.28 __sinh_finite F
+GLIBC_2.28 __sinhf_finite F
+GLIBC_2.28 __sqrt_finite F
+GLIBC_2.28 __sqrtf_finite F
+GLIBC_2.28 __y0_finite F
+GLIBC_2.28 __y0f_finite F
+GLIBC_2.28 __y1_finite F
+GLIBC_2.28 __y1f_finite F
+GLIBC_2.28 __yn_finite F
+GLIBC_2.28 __ynf_finite F
+GLIBC_2.28 acos F
+GLIBC_2.28 acosf F
+GLIBC_2.28 acosf32 F
+GLIBC_2.28 acosf32x F
+GLIBC_2.28 acosf64 F
+GLIBC_2.28 acosh F
+GLIBC_2.28 acoshf F
+GLIBC_2.28 acoshf32 F
+GLIBC_2.28 acoshf32x F
+GLIBC_2.28 acoshf64 F
+GLIBC_2.28 acoshl F
+GLIBC_2.28 acosl F
+GLIBC_2.28 asin F
+GLIBC_2.28 asinf F
+GLIBC_2.28 asinf32 F
+GLIBC_2.28 asinf32x F
+GLIBC_2.28 asinf64 F
+GLIBC_2.28 asinh F
+GLIBC_2.28 asinhf F
+GLIBC_2.28 asinhf32 F
+GLIBC_2.28 asinhf32x F
+GLIBC_2.28 asinhf64 F
+GLIBC_2.28 asinhl F
+GLIBC_2.28 asinl F
+GLIBC_2.28 atan F
+GLIBC_2.28 atan2 F
+GLIBC_2.28 atan2f F
+GLIBC_2.28 atan2f32 F
+GLIBC_2.28 atan2f32x F
+GLIBC_2.28 atan2f64 F
+GLIBC_2.28 atan2l F
+GLIBC_2.28 atanf F
+GLIBC_2.28 atanf32 F
+GLIBC_2.28 atanf32x F
+GLIBC_2.28 atanf64 F
+GLIBC_2.28 atanh F
+GLIBC_2.28 atanhf F
+GLIBC_2.28 atanhf32 F
+GLIBC_2.28 atanhf32x F
+GLIBC_2.28 atanhf64 F
+GLIBC_2.28 atanhl F
+GLIBC_2.28 atanl F
+GLIBC_2.28 cabs F
+GLIBC_2.28 cabsf F
+GLIBC_2.28 cabsf32 F
+GLIBC_2.28 cabsf32x F
+GLIBC_2.28 cabsf64 F
+GLIBC_2.28 cabsl F
+GLIBC_2.28 cacos F
+GLIBC_2.28 cacosf F
+GLIBC_2.28 cacosf32 F
+GLIBC_2.28 cacosf32x F
+GLIBC_2.28 cacosf64 F
+GLIBC_2.28 cacosh F
+GLIBC_2.28 cacoshf F
+GLIBC_2.28 cacoshf32 F
+GLIBC_2.28 cacoshf32x F
+GLIBC_2.28 cacoshf64 F
+GLIBC_2.28 cacoshl F
+GLIBC_2.28 cacosl F
+GLIBC_2.28 canonicalize F
+GLIBC_2.28 canonicalizef F
+GLIBC_2.28 canonicalizef32 F
+GLIBC_2.28 canonicalizef32x F
+GLIBC_2.28 canonicalizef64 F
+GLIBC_2.28 canonicalizel F
+GLIBC_2.28 carg F
+GLIBC_2.28 cargf F
+GLIBC_2.28 cargf32 F
+GLIBC_2.28 cargf32x F
+GLIBC_2.28 cargf64 F
+GLIBC_2.28 cargl F
+GLIBC_2.28 casin F
+GLIBC_2.28 casinf F
+GLIBC_2.28 casinf32 F
+GLIBC_2.28 casinf32x F
+GLIBC_2.28 casinf64 F
+GLIBC_2.28 casinh F
+GLIBC_2.28 casinhf F
+GLIBC_2.28 casinhf32 F
+GLIBC_2.28 casinhf32x F
+GLIBC_2.28 casinhf64 F
+GLIBC_2.28 casinhl F
+GLIBC_2.28 casinl F
+GLIBC_2.28 catan F
+GLIBC_2.28 catanf F
+GLIBC_2.28 catanf32 F
+GLIBC_2.28 catanf32x F
+GLIBC_2.28 catanf64 F
+GLIBC_2.28 catanh F
+GLIBC_2.28 catanhf F
+GLIBC_2.28 catanhf32 F
+GLIBC_2.28 catanhf32x F
+GLIBC_2.28 catanhf64 F
+GLIBC_2.28 catanhl F
+GLIBC_2.28 catanl F
+GLIBC_2.28 cbrt F
+GLIBC_2.28 cbrtf F
+GLIBC_2.28 cbrtf32 F
+GLIBC_2.28 cbrtf32x F
+GLIBC_2.28 cbrtf64 F
+GLIBC_2.28 cbrtl F
+GLIBC_2.28 ccos F
+GLIBC_2.28 ccosf F
+GLIBC_2.28 ccosf32 F
+GLIBC_2.28 ccosf32x F
+GLIBC_2.28 ccosf64 F
+GLIBC_2.28 ccosh F
+GLIBC_2.28 ccoshf F
+GLIBC_2.28 ccoshf32 F
+GLIBC_2.28 ccoshf32x F
+GLIBC_2.28 ccoshf64 F
+GLIBC_2.28 ccoshl F
+GLIBC_2.28 ccosl F
+GLIBC_2.28 ceil F
+GLIBC_2.28 ceilf F
+GLIBC_2.28 ceilf32 F
+GLIBC_2.28 ceilf32x F
+GLIBC_2.28 ceilf64 F
+GLIBC_2.28 ceill F
+GLIBC_2.28 cexp F
+GLIBC_2.28 cexpf F
+GLIBC_2.28 cexpf32 F
+GLIBC_2.28 cexpf32x F
+GLIBC_2.28 cexpf64 F
+GLIBC_2.28 cexpl F
+GLIBC_2.28 cimag F
+GLIBC_2.28 cimagf F
+GLIBC_2.28 cimagf32 F
+GLIBC_2.28 cimagf32x F
+GLIBC_2.28 cimagf64 F
+GLIBC_2.28 cimagl F
+GLIBC_2.28 clog F
+GLIBC_2.28 clog10 F
+GLIBC_2.28 clog10f F
+GLIBC_2.28 clog10f32 F
+GLIBC_2.28 clog10f32x F
+GLIBC_2.28 clog10f64 F
+GLIBC_2.28 clog10l F
+GLIBC_2.28 clogf F
+GLIBC_2.28 clogf32 F
+GLIBC_2.28 clogf32x F
+GLIBC_2.28 clogf64 F
+GLIBC_2.28 clogl F
+GLIBC_2.28 conj F
+GLIBC_2.28 conjf F
+GLIBC_2.28 conjf32 F
+GLIBC_2.28 conjf32x F
+GLIBC_2.28 conjf64 F
+GLIBC_2.28 conjl F
+GLIBC_2.28 copysign F
+GLIBC_2.28 copysignf F
+GLIBC_2.28 copysignf32 F
+GLIBC_2.28 copysignf32x F
+GLIBC_2.28 copysignf64 F
+GLIBC_2.28 copysignl F
+GLIBC_2.28 cos F
+GLIBC_2.28 cosf F
+GLIBC_2.28 cosf32 F
+GLIBC_2.28 cosf32x F
+GLIBC_2.28 cosf64 F
+GLIBC_2.28 cosh F
+GLIBC_2.28 coshf F
+GLIBC_2.28 coshf32 F
+GLIBC_2.28 coshf32x F
+GLIBC_2.28 coshf64 F
+GLIBC_2.28 coshl F
+GLIBC_2.28 cosl F
+GLIBC_2.28 cpow F
+GLIBC_2.28 cpowf F
+GLIBC_2.28 cpowf32 F
+GLIBC_2.28 cpowf32x F
+GLIBC_2.28 cpowf64 F
+GLIBC_2.28 cpowl F
+GLIBC_2.28 cproj F
+GLIBC_2.28 cprojf F
+GLIBC_2.28 cprojf32 F
+GLIBC_2.28 cprojf32x F
+GLIBC_2.28 cprojf64 F
+GLIBC_2.28 cprojl F
+GLIBC_2.28 creal F
+GLIBC_2.28 crealf F
+GLIBC_2.28 crealf32 F
+GLIBC_2.28 crealf32x F
+GLIBC_2.28 crealf64 F
+GLIBC_2.28 creall F
+GLIBC_2.28 csin F
+GLIBC_2.28 csinf F
+GLIBC_2.28 csinf32 F
+GLIBC_2.28 csinf32x F
+GLIBC_2.28 csinf64 F
+GLIBC_2.28 csinh F
+GLIBC_2.28 csinhf F
+GLIBC_2.28 csinhf32 F
+GLIBC_2.28 csinhf32x F
+GLIBC_2.28 csinhf64 F
+GLIBC_2.28 csinhl F
+GLIBC_2.28 csinl F
+GLIBC_2.28 csqrt F
+GLIBC_2.28 csqrtf F
+GLIBC_2.28 csqrtf32 F
+GLIBC_2.28 csqrtf32x F
+GLIBC_2.28 csqrtf64 F
+GLIBC_2.28 csqrtl F
+GLIBC_2.28 ctan F
+GLIBC_2.28 ctanf F
+GLIBC_2.28 ctanf32 F
+GLIBC_2.28 ctanf32x F
+GLIBC_2.28 ctanf64 F
+GLIBC_2.28 ctanh F
+GLIBC_2.28 ctanhf F
+GLIBC_2.28 ctanhf32 F
+GLIBC_2.28 ctanhf32x F
+GLIBC_2.28 ctanhf64 F
+GLIBC_2.28 ctanhl F
+GLIBC_2.28 ctanl F
+GLIBC_2.28 drem F
+GLIBC_2.28 dremf F
+GLIBC_2.28 dreml F
+GLIBC_2.28 erf F
+GLIBC_2.28 erfc F
+GLIBC_2.28 erfcf F
+GLIBC_2.28 erfcf32 F
+GLIBC_2.28 erfcf32x F
+GLIBC_2.28 erfcf64 F
+GLIBC_2.28 erfcl F
+GLIBC_2.28 erff F
+GLIBC_2.28 erff32 F
+GLIBC_2.28 erff32x F
+GLIBC_2.28 erff64 F
+GLIBC_2.28 erfl F
+GLIBC_2.28 exp F
+GLIBC_2.28 exp10 F
+GLIBC_2.28 exp10f F
+GLIBC_2.28 exp10f32 F
+GLIBC_2.28 exp10f32x F
+GLIBC_2.28 exp10f64 F
+GLIBC_2.28 exp10l F
+GLIBC_2.28 exp2 F
+GLIBC_2.28 exp2f F
+GLIBC_2.28 exp2f32 F
+GLIBC_2.28 exp2f32x F
+GLIBC_2.28 exp2f64 F
+GLIBC_2.28 exp2l F
+GLIBC_2.28 expf F
+GLIBC_2.28 expf32 F
+GLIBC_2.28 expf32x F
+GLIBC_2.28 expf64 F
+GLIBC_2.28 expl F
+GLIBC_2.28 expm1 F
+GLIBC_2.28 expm1f F
+GLIBC_2.28 expm1f32 F
+GLIBC_2.28 expm1f32x F
+GLIBC_2.28 expm1f64 F
+GLIBC_2.28 expm1l F
+GLIBC_2.28 fabs F
+GLIBC_2.28 fabsf F
+GLIBC_2.28 fabsf32 F
+GLIBC_2.28 fabsf32x F
+GLIBC_2.28 fabsf64 F
+GLIBC_2.28 fabsl F
+GLIBC_2.28 fdim F
+GLIBC_2.28 fdimf F
+GLIBC_2.28 fdimf32 F
+GLIBC_2.28 fdimf32x F
+GLIBC_2.28 fdimf64 F
+GLIBC_2.28 fdiml F
+GLIBC_2.28 feclearexcept F
+GLIBC_2.28 fedisableexcept F
+GLIBC_2.28 feenableexcept F
+GLIBC_2.28 fegetenv F
+GLIBC_2.28 fegetexcept F
+GLIBC_2.28 fegetexceptflag F
+GLIBC_2.28 fegetmode F
+GLIBC_2.28 fegetround F
+GLIBC_2.28 feholdexcept F
+GLIBC_2.28 feraiseexcept F
+GLIBC_2.28 fesetenv F
+GLIBC_2.28 fesetexcept F
+GLIBC_2.28 fesetexceptflag F
+GLIBC_2.28 fesetmode F
+GLIBC_2.28 fesetround F
+GLIBC_2.28 fetestexcept F
+GLIBC_2.28 fetestexceptflag F
+GLIBC_2.28 feupdateenv F
+GLIBC_2.28 finite F
+GLIBC_2.28 finitef F
+GLIBC_2.28 finitel F
+GLIBC_2.28 floor F
+GLIBC_2.28 floorf F
+GLIBC_2.28 floorf32 F
+GLIBC_2.28 floorf32x F
+GLIBC_2.28 floorf64 F
+GLIBC_2.28 floorl F
+GLIBC_2.28 fma F
+GLIBC_2.28 fmaf F
+GLIBC_2.28 fmaf32 F
+GLIBC_2.28 fmaf32x F
+GLIBC_2.28 fmaf64 F
+GLIBC_2.28 fmal F
+GLIBC_2.28 fmax F
+GLIBC_2.28 fmaxf F
+GLIBC_2.28 fmaxf32 F
+GLIBC_2.28 fmaxf32x F
+GLIBC_2.28 fmaxf64 F
+GLIBC_2.28 fmaxl F
+GLIBC_2.28 fmaxmag F
+GLIBC_2.28 fmaxmagf F
+GLIBC_2.28 fmaxmagf32 F
+GLIBC_2.28 fmaxmagf32x F
+GLIBC_2.28 fmaxmagf64 F
+GLIBC_2.28 fmaxmagl F
+GLIBC_2.28 fmin F
+GLIBC_2.28 fminf F
+GLIBC_2.28 fminf32 F
+GLIBC_2.28 fminf32x F
+GLIBC_2.28 fminf64 F
+GLIBC_2.28 fminl F
+GLIBC_2.28 fminmag F
+GLIBC_2.28 fminmagf F
+GLIBC_2.28 fminmagf32 F
+GLIBC_2.28 fminmagf32x F
+GLIBC_2.28 fminmagf64 F
+GLIBC_2.28 fminmagl F
+GLIBC_2.28 fmod F
+GLIBC_2.28 fmodf F
+GLIBC_2.28 fmodf32 F
+GLIBC_2.28 fmodf32x F
+GLIBC_2.28 fmodf64 F
+GLIBC_2.28 fmodl F
+GLIBC_2.28 frexp F
+GLIBC_2.28 frexpf F
+GLIBC_2.28 frexpf32 F
+GLIBC_2.28 frexpf32x F
+GLIBC_2.28 frexpf64 F
+GLIBC_2.28 frexpl F
+GLIBC_2.28 fromfp F
+GLIBC_2.28 fromfpf F
+GLIBC_2.28 fromfpf32 F
+GLIBC_2.28 fromfpf32x F
+GLIBC_2.28 fromfpf64 F
+GLIBC_2.28 fromfpl F
+GLIBC_2.28 fromfpx F
+GLIBC_2.28 fromfpxf F
+GLIBC_2.28 fromfpxf32 F
+GLIBC_2.28 fromfpxf32x F
+GLIBC_2.28 fromfpxf64 F
+GLIBC_2.28 fromfpxl F
+GLIBC_2.28 gamma F
+GLIBC_2.28 gammaf F
+GLIBC_2.28 gammal F
+GLIBC_2.28 getpayload F
+GLIBC_2.28 getpayloadf F
+GLIBC_2.28 getpayloadf32 F
+GLIBC_2.28 getpayloadf32x F
+GLIBC_2.28 getpayloadf64 F
+GLIBC_2.28 getpayloadl F
+GLIBC_2.28 hypot F
+GLIBC_2.28 hypotf F
+GLIBC_2.28 hypotf32 F
+GLIBC_2.28 hypotf32x F
+GLIBC_2.28 hypotf64 F
+GLIBC_2.28 hypotl F
+GLIBC_2.28 ilogb F
+GLIBC_2.28 ilogbf F
+GLIBC_2.28 ilogbf32 F
+GLIBC_2.28 ilogbf32x F
+GLIBC_2.28 ilogbf64 F
+GLIBC_2.28 ilogbl F
+GLIBC_2.28 j0 F
+GLIBC_2.28 j0f F
+GLIBC_2.28 j0f32 F
+GLIBC_2.28 j0f32x F
+GLIBC_2.28 j0f64 F
+GLIBC_2.28 j0l F
+GLIBC_2.28 j1 F
+GLIBC_2.28 j1f F
+GLIBC_2.28 j1f32 F
+GLIBC_2.28 j1f32x F
+GLIBC_2.28 j1f64 F
+GLIBC_2.28 j1l F
+GLIBC_2.28 jn F
+GLIBC_2.28 jnf F
+GLIBC_2.28 jnf32 F
+GLIBC_2.28 jnf32x F
+GLIBC_2.28 jnf64 F
+GLIBC_2.28 jnl F
+GLIBC_2.28 ldexp F
+GLIBC_2.28 ldexpf F
+GLIBC_2.28 ldexpf32 F
+GLIBC_2.28 ldexpf32x F
+GLIBC_2.28 ldexpf64 F
+GLIBC_2.28 ldexpl F
+GLIBC_2.28 lgamma F
+GLIBC_2.28 lgamma_r F
+GLIBC_2.28 lgammaf F
+GLIBC_2.28 lgammaf32 F
+GLIBC_2.28 lgammaf32_r F
+GLIBC_2.28 lgammaf32x F
+GLIBC_2.28 lgammaf32x_r F
+GLIBC_2.28 lgammaf64 F
+GLIBC_2.28 lgammaf64_r F
+GLIBC_2.28 lgammaf_r F
+GLIBC_2.28 lgammal F
+GLIBC_2.28 lgammal_r F
+GLIBC_2.28 llogb F
+GLIBC_2.28 llogbf F
+GLIBC_2.28 llogbf32 F
+GLIBC_2.28 llogbf32x F
+GLIBC_2.28 llogbf64 F
+GLIBC_2.28 llogbl F
+GLIBC_2.28 llrint F
+GLIBC_2.28 llrintf F
+GLIBC_2.28 llrintf32 F
+GLIBC_2.28 llrintf32x F
+GLIBC_2.28 llrintf64 F
+GLIBC_2.28 llrintl F
+GLIBC_2.28 llround F
+GLIBC_2.28 llroundf F
+GLIBC_2.28 llroundf32 F
+GLIBC_2.28 llroundf32x F
+GLIBC_2.28 llroundf64 F
+GLIBC_2.28 llroundl F
+GLIBC_2.28 log F
+GLIBC_2.28 log10 F
+GLIBC_2.28 log10f F
+GLIBC_2.28 log10f32 F
+GLIBC_2.28 log10f32x F
+GLIBC_2.28 log10f64 F
+GLIBC_2.28 log10l F
+GLIBC_2.28 log1p F
+GLIBC_2.28 log1pf F
+GLIBC_2.28 log1pf32 F
+GLIBC_2.28 log1pf32x F
+GLIBC_2.28 log1pf64 F
+GLIBC_2.28 log1pl F
+GLIBC_2.28 log2 F
+GLIBC_2.28 log2f F
+GLIBC_2.28 log2f32 F
+GLIBC_2.28 log2f32x F
+GLIBC_2.28 log2f64 F
+GLIBC_2.28 log2l F
+GLIBC_2.28 logb F
+GLIBC_2.28 logbf F
+GLIBC_2.28 logbf32 F
+GLIBC_2.28 logbf32x F
+GLIBC_2.28 logbf64 F
+GLIBC_2.28 logbl F
+GLIBC_2.28 logf F
+GLIBC_2.28 logf32 F
+GLIBC_2.28 logf32x F
+GLIBC_2.28 logf64 F
+GLIBC_2.28 logl F
+GLIBC_2.28 lrint F
+GLIBC_2.28 lrintf F
+GLIBC_2.28 lrintf32 F
+GLIBC_2.28 lrintf32x F
+GLIBC_2.28 lrintf64 F
+GLIBC_2.28 lrintl F
+GLIBC_2.28 lround F
+GLIBC_2.28 lroundf F
+GLIBC_2.28 lroundf32 F
+GLIBC_2.28 lroundf32x F
+GLIBC_2.28 lroundf64 F
+GLIBC_2.28 lroundl F
+GLIBC_2.28 modf F
+GLIBC_2.28 modff F
+GLIBC_2.28 modff32 F
+GLIBC_2.28 modff32x F
+GLIBC_2.28 modff64 F
+GLIBC_2.28 modfl F
+GLIBC_2.28 nan F
+GLIBC_2.28 nanf F
+GLIBC_2.28 nanf32 F
+GLIBC_2.28 nanf32x F
+GLIBC_2.28 nanf64 F
+GLIBC_2.28 nanl F
+GLIBC_2.28 nearbyint F
+GLIBC_2.28 nearbyintf F
+GLIBC_2.28 nearbyintf32 F
+GLIBC_2.28 nearbyintf32x F
+GLIBC_2.28 nearbyintf64 F
+GLIBC_2.28 nearbyintl F
+GLIBC_2.28 nextafter F
+GLIBC_2.28 nextafterf F
+GLIBC_2.28 nextafterf32 F
+GLIBC_2.28 nextafterf32x F
+GLIBC_2.28 nextafterf64 F
+GLIBC_2.28 nextafterl F
+GLIBC_2.28 nextdown F
+GLIBC_2.28 nextdownf F
+GLIBC_2.28 nextdownf32 F
+GLIBC_2.28 nextdownf32x F
+GLIBC_2.28 nextdownf64 F
+GLIBC_2.28 nextdownl F
+GLIBC_2.28 nexttoward F
+GLIBC_2.28 nexttowardf F
+GLIBC_2.28 nexttowardl F
+GLIBC_2.28 nextup F
+GLIBC_2.28 nextupf F
+GLIBC_2.28 nextupf32 F
+GLIBC_2.28 nextupf32x F
+GLIBC_2.28 nextupf64 F
+GLIBC_2.28 nextupl F
+GLIBC_2.28 pow F
+GLIBC_2.28 powf F
+GLIBC_2.28 powf32 F
+GLIBC_2.28 powf32x F
+GLIBC_2.28 powf64 F
+GLIBC_2.28 powl F
+GLIBC_2.28 remainder F
+GLIBC_2.28 remainderf F
+GLIBC_2.28 remainderf32 F
+GLIBC_2.28 remainderf32x F
+GLIBC_2.28 remainderf64 F
+GLIBC_2.28 remainderl F
+GLIBC_2.28 remquo F
+GLIBC_2.28 remquof F
+GLIBC_2.28 remquof32 F
+GLIBC_2.28 remquof32x F
+GLIBC_2.28 remquof64 F
+GLIBC_2.28 remquol F
+GLIBC_2.28 rint F
+GLIBC_2.28 rintf F
+GLIBC_2.28 rintf32 F
+GLIBC_2.28 rintf32x F
+GLIBC_2.28 rintf64 F
+GLIBC_2.28 rintl F
+GLIBC_2.28 round F
+GLIBC_2.28 roundeven F
+GLIBC_2.28 roundevenf F
+GLIBC_2.28 roundevenf32 F
+GLIBC_2.28 roundevenf32x F
+GLIBC_2.28 roundevenf64 F
+GLIBC_2.28 roundevenl F
+GLIBC_2.28 roundf F
+GLIBC_2.28 roundf32 F
+GLIBC_2.28 roundf32x F
+GLIBC_2.28 roundf64 F
+GLIBC_2.28 roundl F
+GLIBC_2.28 scalb F
+GLIBC_2.28 scalbf F
+GLIBC_2.28 scalbl F
+GLIBC_2.28 scalbln F
+GLIBC_2.28 scalblnf F
+GLIBC_2.28 scalblnf32 F
+GLIBC_2.28 scalblnf32x F
+GLIBC_2.28 scalblnf64 F
+GLIBC_2.28 scalblnl F
+GLIBC_2.28 scalbn F
+GLIBC_2.28 scalbnf F
+GLIBC_2.28 scalbnf32 F
+GLIBC_2.28 scalbnf32x F
+GLIBC_2.28 scalbnf64 F
+GLIBC_2.28 scalbnl F
+GLIBC_2.28 setpayload F
+GLIBC_2.28 setpayloadf F
+GLIBC_2.28 setpayloadf32 F
+GLIBC_2.28 setpayloadf32x F
+GLIBC_2.28 setpayloadf64 F
+GLIBC_2.28 setpayloadl F
+GLIBC_2.28 setpayloadsig F
+GLIBC_2.28 setpayloadsigf F
+GLIBC_2.28 setpayloadsigf32 F
+GLIBC_2.28 setpayloadsigf32x F
+GLIBC_2.28 setpayloadsigf64 F
+GLIBC_2.28 setpayloadsigl F
+GLIBC_2.28 signgam D 0x4
+GLIBC_2.28 significand F
+GLIBC_2.28 significandf F
+GLIBC_2.28 significandl F
+GLIBC_2.28 sin F
+GLIBC_2.28 sincos F
+GLIBC_2.28 sincosf F
+GLIBC_2.28 sincosf32 F
+GLIBC_2.28 sincosf32x F
+GLIBC_2.28 sincosf64 F
+GLIBC_2.28 sincosl F
+GLIBC_2.28 sinf F
+GLIBC_2.28 sinf32 F
+GLIBC_2.28 sinf32x F
+GLIBC_2.28 sinf64 F
+GLIBC_2.28 sinh F
+GLIBC_2.28 sinhf F
+GLIBC_2.28 sinhf32 F
+GLIBC_2.28 sinhf32x F
+GLIBC_2.28 sinhf64 F
+GLIBC_2.28 sinhl F
+GLIBC_2.28 sinl F
+GLIBC_2.28 sqrt F
+GLIBC_2.28 sqrtf F
+GLIBC_2.28 sqrtf32 F
+GLIBC_2.28 sqrtf32x F
+GLIBC_2.28 sqrtf64 F
+GLIBC_2.28 sqrtl F
+GLIBC_2.28 tan F
+GLIBC_2.28 tanf F
+GLIBC_2.28 tanf32 F
+GLIBC_2.28 tanf32x F
+GLIBC_2.28 tanf64 F
+GLIBC_2.28 tanh F
+GLIBC_2.28 tanhf F
+GLIBC_2.28 tanhf32 F
+GLIBC_2.28 tanhf32x F
+GLIBC_2.28 tanhf64 F
+GLIBC_2.28 tanhl F
+GLIBC_2.28 tanl F
+GLIBC_2.28 tgamma F
+GLIBC_2.28 tgammaf F
+GLIBC_2.28 tgammaf32 F
+GLIBC_2.28 tgammaf32x F
+GLIBC_2.28 tgammaf64 F
+GLIBC_2.28 tgammal F
+GLIBC_2.28 totalorder F
+GLIBC_2.28 totalorderf F
+GLIBC_2.28 totalorderf32 F
+GLIBC_2.28 totalorderf32x F
+GLIBC_2.28 totalorderf64 F
+GLIBC_2.28 totalorderl F
+GLIBC_2.28 totalordermag F
+GLIBC_2.28 totalordermagf F
+GLIBC_2.28 totalordermagf32 F
+GLIBC_2.28 totalordermagf32x F
+GLIBC_2.28 totalordermagf64 F
+GLIBC_2.28 totalordermagl F
+GLIBC_2.28 trunc F
+GLIBC_2.28 truncf F
+GLIBC_2.28 truncf32 F
+GLIBC_2.28 truncf32x F
+GLIBC_2.28 truncf64 F
+GLIBC_2.28 truncl F
+GLIBC_2.28 ufromfp F
+GLIBC_2.28 ufromfpf F
+GLIBC_2.28 ufromfpf32 F
+GLIBC_2.28 ufromfpf32x F
+GLIBC_2.28 ufromfpf64 F
+GLIBC_2.28 ufromfpl F
+GLIBC_2.28 ufromfpx F
+GLIBC_2.28 ufromfpxf F
+GLIBC_2.28 ufromfpxf32 F
+GLIBC_2.28 ufromfpxf32x F
+GLIBC_2.28 ufromfpxf64 F
+GLIBC_2.28 ufromfpxl F
+GLIBC_2.28 y0 F
+GLIBC_2.28 y0f F
+GLIBC_2.28 y0f32 F
+GLIBC_2.28 y0f32x F
+GLIBC_2.28 y0f64 F
+GLIBC_2.28 y0l F
+GLIBC_2.28 y1 F
+GLIBC_2.28 y1f F
+GLIBC_2.28 y1f32 F
+GLIBC_2.28 y1f32x F
+GLIBC_2.28 y1f64 F
+GLIBC_2.28 y1l F
+GLIBC_2.28 yn F
+GLIBC_2.28 ynf F
+GLIBC_2.28 ynf32 F
+GLIBC_2.28 ynf32x F
+GLIBC_2.28 ynf64 F
+GLIBC_2.28 ynl F
diff --git a/sysdeps/unix/sysv/linux/nds32/libnsl.abilist b/sysdeps/unix/sysv/linux/nds32/libnsl.abilist
new file mode 100644
index 0000000..8c86607
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/libnsl.abilist
@@ -0,0 +1,121 @@
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 __free_fdresult F
+GLIBC_2.28 __nis_default_access F
+GLIBC_2.28 __nis_default_group F
+GLIBC_2.28 __nis_default_owner F
+GLIBC_2.28 __nis_default_ttl F
+GLIBC_2.28 __nis_finddirectory F
+GLIBC_2.28 __nisbind_connect F
+GLIBC_2.28 __nisbind_create F
+GLIBC_2.28 __nisbind_destroy F
+GLIBC_2.28 __nisbind_next F
+GLIBC_2.28 __yp_check F
+GLIBC_2.28 nis_add F
+GLIBC_2.28 nis_add_entry F
+GLIBC_2.28 nis_addmember F
+GLIBC_2.28 nis_checkpoint F
+GLIBC_2.28 nis_clone_directory F
+GLIBC_2.28 nis_clone_object F
+GLIBC_2.28 nis_clone_result F
+GLIBC_2.28 nis_creategroup F
+GLIBC_2.28 nis_destroy_object F
+GLIBC_2.28 nis_destroygroup F
+GLIBC_2.28 nis_dir_cmp F
+GLIBC_2.28 nis_domain_of F
+GLIBC_2.28 nis_domain_of_r F
+GLIBC_2.28 nis_first_entry F
+GLIBC_2.28 nis_free_directory F
+GLIBC_2.28 nis_free_object F
+GLIBC_2.28 nis_free_request F
+GLIBC_2.28 nis_freenames F
+GLIBC_2.28 nis_freeresult F
+GLIBC_2.28 nis_freeservlist F
+GLIBC_2.28 nis_freetags F
+GLIBC_2.28 nis_getnames F
+GLIBC_2.28 nis_getservlist F
+GLIBC_2.28 nis_ismember F
+GLIBC_2.28 nis_leaf_of F
+GLIBC_2.28 nis_leaf_of_r F
+GLIBC_2.28 nis_lerror F
+GLIBC_2.28 nis_list F
+GLIBC_2.28 nis_local_directory F
+GLIBC_2.28 nis_local_group F
+GLIBC_2.28 nis_local_host F
+GLIBC_2.28 nis_local_principal F
+GLIBC_2.28 nis_lookup F
+GLIBC_2.28 nis_mkdir F
+GLIBC_2.28 nis_modify F
+GLIBC_2.28 nis_modify_entry F
+GLIBC_2.28 nis_name_of F
+GLIBC_2.28 nis_name_of_r F
+GLIBC_2.28 nis_next_entry F
+GLIBC_2.28 nis_perror F
+GLIBC_2.28 nis_ping F
+GLIBC_2.28 nis_print_directory F
+GLIBC_2.28 nis_print_entry F
+GLIBC_2.28 nis_print_group F
+GLIBC_2.28 nis_print_group_entry F
+GLIBC_2.28 nis_print_link F
+GLIBC_2.28 nis_print_object F
+GLIBC_2.28 nis_print_result F
+GLIBC_2.28 nis_print_rights F
+GLIBC_2.28 nis_print_table F
+GLIBC_2.28 nis_read_obj F
+GLIBC_2.28 nis_remove F
+GLIBC_2.28 nis_remove_entry F
+GLIBC_2.28 nis_removemember F
+GLIBC_2.28 nis_rmdir F
+GLIBC_2.28 nis_servstate F
+GLIBC_2.28 nis_sperrno F
+GLIBC_2.28 nis_sperror F
+GLIBC_2.28 nis_sperror_r F
+GLIBC_2.28 nis_stats F
+GLIBC_2.28 nis_verifygroup F
+GLIBC_2.28 nis_write_obj F
+GLIBC_2.28 readColdStartFile F
+GLIBC_2.28 writeColdStartFile F
+GLIBC_2.28 xdr_cback_data F
+GLIBC_2.28 xdr_domainname F
+GLIBC_2.28 xdr_keydat F
+GLIBC_2.28 xdr_mapname F
+GLIBC_2.28 xdr_obj_p F
+GLIBC_2.28 xdr_peername F
+GLIBC_2.28 xdr_valdat F
+GLIBC_2.28 xdr_yp_buf F
+GLIBC_2.28 xdr_ypall F
+GLIBC_2.28 xdr_ypbind_binding F
+GLIBC_2.28 xdr_ypbind_resp F
+GLIBC_2.28 xdr_ypbind_resptype F
+GLIBC_2.28 xdr_ypbind_setdom F
+GLIBC_2.28 xdr_ypdelete_args F
+GLIBC_2.28 xdr_ypmap_parms F
+GLIBC_2.28 xdr_ypmaplist F
+GLIBC_2.28 xdr_yppush_status F
+GLIBC_2.28 xdr_yppushresp_xfr F
+GLIBC_2.28 xdr_ypreq_key F
+GLIBC_2.28 xdr_ypreq_nokey F
+GLIBC_2.28 xdr_ypreq_xfr F
+GLIBC_2.28 xdr_ypresp_all F
+GLIBC_2.28 xdr_ypresp_key_val F
+GLIBC_2.28 xdr_ypresp_maplist F
+GLIBC_2.28 xdr_ypresp_master F
+GLIBC_2.28 xdr_ypresp_order F
+GLIBC_2.28 xdr_ypresp_val F
+GLIBC_2.28 xdr_ypresp_xfr F
+GLIBC_2.28 xdr_ypstat F
+GLIBC_2.28 xdr_ypupdate_args F
+GLIBC_2.28 xdr_ypxfrstat F
+GLIBC_2.28 yp_all F
+GLIBC_2.28 yp_bind F
+GLIBC_2.28 yp_first F
+GLIBC_2.28 yp_get_default_domain F
+GLIBC_2.28 yp_maplist F
+GLIBC_2.28 yp_master F
+GLIBC_2.28 yp_match F
+GLIBC_2.28 yp_next F
+GLIBC_2.28 yp_order F
+GLIBC_2.28 yp_unbind F
+GLIBC_2.28 yp_update F
+GLIBC_2.28 ypbinderr_string F
+GLIBC_2.28 yperr_string F
+GLIBC_2.28 ypprot_err F
diff --git a/sysdeps/unix/sysv/linux/nds32/libnss_compat.abilist b/sysdeps/unix/sysv/linux/nds32/libnss_compat.abilist
new file mode 100644
index 0000000..e69de29
diff --git a/sysdeps/unix/sysv/linux/nds32/libnss_db.abilist b/sysdeps/unix/sysv/linux/nds32/libnss_db.abilist
new file mode 100644
index 0000000..e69de29
diff --git a/sysdeps/unix/sysv/linux/nds32/libnss_dns.abilist b/sysdeps/unix/sysv/linux/nds32/libnss_dns.abilist
new file mode 100644
index 0000000..e69de29
diff --git a/sysdeps/unix/sysv/linux/nds32/libnss_files.abilist b/sysdeps/unix/sysv/linux/nds32/libnss_files.abilist
new file mode 100644
index 0000000..e69de29
diff --git a/sysdeps/unix/sysv/linux/nds32/libnss_hesiod.abilist b/sysdeps/unix/sysv/linux/nds32/libnss_hesiod.abilist
new file mode 100644
index 0000000..e69de29
diff --git a/sysdeps/unix/sysv/linux/nds32/libnss_nis.abilist b/sysdeps/unix/sysv/linux/nds32/libnss_nis.abilist
new file mode 100644
index 0000000..e69de29
diff --git a/sysdeps/unix/sysv/linux/nds32/libnss_nisplus.abilist b/sysdeps/unix/sysv/linux/nds32/libnss_nisplus.abilist
new file mode 100644
index 0000000..e69de29
diff --git a/sysdeps/unix/sysv/linux/nds32/libpthread.abilist b/sysdeps/unix/sysv/linux/nds32/libpthread.abilist
new file mode 100644
index 0000000..79f1679
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/libpthread.abilist
@@ -0,0 +1,217 @@
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 _IO_flockfile F
+GLIBC_2.28 _IO_ftrylockfile F
+GLIBC_2.28 _IO_funlockfile F
+GLIBC_2.28 __close F
+GLIBC_2.28 __connect F
+GLIBC_2.28 __errno_location F
+GLIBC_2.28 __fcntl F
+GLIBC_2.28 __h_errno_location F
+GLIBC_2.28 __libc_allocate_rtsig F
+GLIBC_2.28 __libc_current_sigrtmax F
+GLIBC_2.28 __libc_current_sigrtmin F
+GLIBC_2.28 __lseek F
+GLIBC_2.28 __nanosleep F
+GLIBC_2.28 __open F
+GLIBC_2.28 __open64 F
+GLIBC_2.28 __pread64 F
+GLIBC_2.28 __pthread_cleanup_routine F
+GLIBC_2.28 __pthread_getspecific F
+GLIBC_2.28 __pthread_key_create F
+GLIBC_2.28 __pthread_mutex_destroy F
+GLIBC_2.28 __pthread_mutex_init F
+GLIBC_2.28 __pthread_mutex_lock F
+GLIBC_2.28 __pthread_mutex_trylock F
+GLIBC_2.28 __pthread_mutex_unlock F
+GLIBC_2.28 __pthread_mutexattr_destroy F
+GLIBC_2.28 __pthread_mutexattr_init F
+GLIBC_2.28 __pthread_mutexattr_settype F
+GLIBC_2.28 __pthread_once F
+GLIBC_2.28 __pthread_register_cancel F
+GLIBC_2.28 __pthread_register_cancel_defer F
+GLIBC_2.28 __pthread_rwlock_destroy F
+GLIBC_2.28 __pthread_rwlock_init F
+GLIBC_2.28 __pthread_rwlock_rdlock F
+GLIBC_2.28 __pthread_rwlock_tryrdlock F
+GLIBC_2.28 __pthread_rwlock_trywrlock F
+GLIBC_2.28 __pthread_rwlock_unlock F
+GLIBC_2.28 __pthread_rwlock_wrlock F
+GLIBC_2.28 __pthread_setspecific F
+GLIBC_2.28 __pthread_unregister_cancel F
+GLIBC_2.28 __pthread_unregister_cancel_restore F
+GLIBC_2.28 __pthread_unwind_next F
+GLIBC_2.28 __pwrite64 F
+GLIBC_2.28 __read F
+GLIBC_2.28 __res_state F
+GLIBC_2.28 __send F
+GLIBC_2.28 __sigaction F
+GLIBC_2.28 __wait F
+GLIBC_2.28 __write F
+GLIBC_2.28 _pthread_cleanup_pop F
+GLIBC_2.28 _pthread_cleanup_pop_restore F
+GLIBC_2.28 _pthread_cleanup_push F
+GLIBC_2.28 _pthread_cleanup_push_defer F
+GLIBC_2.28 accept F
+GLIBC_2.28 close F
+GLIBC_2.28 connect F
+GLIBC_2.28 fcntl F
+GLIBC_2.28 flockfile F
+GLIBC_2.28 fsync F
+GLIBC_2.28 ftrylockfile F
+GLIBC_2.28 funlockfile F
+GLIBC_2.28 lseek F
+GLIBC_2.28 lseek64 F
+GLIBC_2.28 msync F
+GLIBC_2.28 nanosleep F
+GLIBC_2.28 open F
+GLIBC_2.28 open64 F
+GLIBC_2.28 pause F
+GLIBC_2.28 pread F
+GLIBC_2.28 pread64 F
+GLIBC_2.28 pthread_attr_destroy F
+GLIBC_2.28 pthread_attr_getaffinity_np F
+GLIBC_2.28 pthread_attr_getdetachstate F
+GLIBC_2.28 pthread_attr_getguardsize F
+GLIBC_2.28 pthread_attr_getinheritsched F
+GLIBC_2.28 pthread_attr_getschedparam F
+GLIBC_2.28 pthread_attr_getschedpolicy F
+GLIBC_2.28 pthread_attr_getscope F
+GLIBC_2.28 pthread_attr_getstack F
+GLIBC_2.28 pthread_attr_getstackaddr F
+GLIBC_2.28 pthread_attr_getstacksize F
+GLIBC_2.28 pthread_attr_init F
+GLIBC_2.28 pthread_attr_setaffinity_np F
+GLIBC_2.28 pthread_attr_setdetachstate F
+GLIBC_2.28 pthread_attr_setguardsize F
+GLIBC_2.28 pthread_attr_setinheritsched F
+GLIBC_2.28 pthread_attr_setschedparam F
+GLIBC_2.28 pthread_attr_setschedpolicy F
+GLIBC_2.28 pthread_attr_setscope F
+GLIBC_2.28 pthread_attr_setstack F
+GLIBC_2.28 pthread_attr_setstackaddr F
+GLIBC_2.28 pthread_attr_setstacksize F
+GLIBC_2.28 pthread_barrier_destroy F
+GLIBC_2.28 pthread_barrier_init F
+GLIBC_2.28 pthread_barrier_wait F
+GLIBC_2.28 pthread_barrierattr_destroy F
+GLIBC_2.28 pthread_barrierattr_getpshared F
+GLIBC_2.28 pthread_barrierattr_init F
+GLIBC_2.28 pthread_barrierattr_setpshared F
+GLIBC_2.28 pthread_cancel F
+GLIBC_2.28 pthread_cond_broadcast F
+GLIBC_2.28 pthread_cond_destroy F
+GLIBC_2.28 pthread_cond_init F
+GLIBC_2.28 pthread_cond_signal F
+GLIBC_2.28 pthread_cond_timedwait F
+GLIBC_2.28 pthread_cond_wait F
+GLIBC_2.28 pthread_condattr_destroy F
+GLIBC_2.28 pthread_condattr_getclock F
+GLIBC_2.28 pthread_condattr_getpshared F
+GLIBC_2.28 pthread_condattr_init F
+GLIBC_2.28 pthread_condattr_setclock F
+GLIBC_2.28 pthread_condattr_setpshared F
+GLIBC_2.28 pthread_create F
+GLIBC_2.28 pthread_detach F
+GLIBC_2.28 pthread_equal F
+GLIBC_2.28 pthread_exit F
+GLIBC_2.28 pthread_getaffinity_np F
+GLIBC_2.28 pthread_getattr_default_np F
+GLIBC_2.28 pthread_getattr_np F
+GLIBC_2.28 pthread_getconcurrency F
+GLIBC_2.28 pthread_getcpuclockid F
+GLIBC_2.28 pthread_getname_np F
+GLIBC_2.28 pthread_getschedparam F
+GLIBC_2.28 pthread_getspecific F
+GLIBC_2.28 pthread_join F
+GLIBC_2.28 pthread_key_create F
+GLIBC_2.28 pthread_key_delete F
+GLIBC_2.28 pthread_kill F
+GLIBC_2.28 pthread_kill_other_threads_np F
+GLIBC_2.28 pthread_mutex_consistent F
+GLIBC_2.28 pthread_mutex_consistent_np F
+GLIBC_2.28 pthread_mutex_destroy F
+GLIBC_2.28 pthread_mutex_getprioceiling F
+GLIBC_2.28 pthread_mutex_init F
+GLIBC_2.28 pthread_mutex_lock F
+GLIBC_2.28 pthread_mutex_setprioceiling F
+GLIBC_2.28 pthread_mutex_timedlock F
+GLIBC_2.28 pthread_mutex_trylock F
+GLIBC_2.28 pthread_mutex_unlock F
+GLIBC_2.28 pthread_mutexattr_destroy F
+GLIBC_2.28 pthread_mutexattr_getkind_np F
+GLIBC_2.28 pthread_mutexattr_getprioceiling F
+GLIBC_2.28 pthread_mutexattr_getprotocol F
+GLIBC_2.28 pthread_mutexattr_getpshared F
+GLIBC_2.28 pthread_mutexattr_getrobust F
+GLIBC_2.28 pthread_mutexattr_getrobust_np F
+GLIBC_2.28 pthread_mutexattr_gettype F
+GLIBC_2.28 pthread_mutexattr_init F
+GLIBC_2.28 pthread_mutexattr_setkind_np F
+GLIBC_2.28 pthread_mutexattr_setprioceiling F
+GLIBC_2.28 pthread_mutexattr_setprotocol F
+GLIBC_2.28 pthread_mutexattr_setpshared F
+GLIBC_2.28 pthread_mutexattr_setrobust F
+GLIBC_2.28 pthread_mutexattr_setrobust_np F
+GLIBC_2.28 pthread_mutexattr_settype F
+GLIBC_2.28 pthread_once F
+GLIBC_2.28 pthread_rwlock_destroy F
+GLIBC_2.28 pthread_rwlock_init F
+GLIBC_2.28 pthread_rwlock_rdlock F
+GLIBC_2.28 pthread_rwlock_timedrdlock F
+GLIBC_2.28 pthread_rwlock_timedwrlock F
+GLIBC_2.28 pthread_rwlock_tryrdlock F
+GLIBC_2.28 pthread_rwlock_trywrlock F
+GLIBC_2.28 pthread_rwlock_unlock F
+GLIBC_2.28 pthread_rwlock_wrlock F
+GLIBC_2.28 pthread_rwlockattr_destroy F
+GLIBC_2.28 pthread_rwlockattr_getkind_np F
+GLIBC_2.28 pthread_rwlockattr_getpshared F
+GLIBC_2.28 pthread_rwlockattr_init F
+GLIBC_2.28 pthread_rwlockattr_setkind_np F
+GLIBC_2.28 pthread_rwlockattr_setpshared F
+GLIBC_2.28 pthread_setaffinity_np F
+GLIBC_2.28 pthread_setattr_default_np F
+GLIBC_2.28 pthread_setcancelstate F
+GLIBC_2.28 pthread_setcanceltype F
+GLIBC_2.28 pthread_setconcurrency F
+GLIBC_2.28 pthread_setname_np F
+GLIBC_2.28 pthread_setschedparam F
+GLIBC_2.28 pthread_setschedprio F
+GLIBC_2.28 pthread_setspecific F
+GLIBC_2.28 pthread_sigmask F
+GLIBC_2.28 pthread_sigqueue F
+GLIBC_2.28 pthread_spin_destroy F
+GLIBC_2.28 pthread_spin_init F
+GLIBC_2.28 pthread_spin_lock F
+GLIBC_2.28 pthread_spin_trylock F
+GLIBC_2.28 pthread_spin_unlock F
+GLIBC_2.28 pthread_testcancel F
+GLIBC_2.28 pthread_timedjoin_np F
+GLIBC_2.28 pthread_tryjoin_np F
+GLIBC_2.28 pthread_yield F
+GLIBC_2.28 pwrite F
+GLIBC_2.28 pwrite64 F
+GLIBC_2.28 raise F
+GLIBC_2.28 read F
+GLIBC_2.28 recv F
+GLIBC_2.28 recvfrom F
+GLIBC_2.28 recvmsg F
+GLIBC_2.28 sem_close F
+GLIBC_2.28 sem_destroy F
+GLIBC_2.28 sem_getvalue F
+GLIBC_2.28 sem_init F
+GLIBC_2.28 sem_open F
+GLIBC_2.28 sem_post F
+GLIBC_2.28 sem_timedwait F
+GLIBC_2.28 sem_trywait F
+GLIBC_2.28 sem_unlink F
+GLIBC_2.28 sem_wait F
+GLIBC_2.28 send F
+GLIBC_2.28 sendmsg F
+GLIBC_2.28 sendto F
+GLIBC_2.28 sigaction F
+GLIBC_2.28 sigwait F
+GLIBC_2.28 tcdrain F
+GLIBC_2.28 wait F
+GLIBC_2.28 waitpid F
+GLIBC_2.28 write F
diff --git a/sysdeps/unix/sysv/linux/nds32/libresolv.abilist b/sysdeps/unix/sysv/linux/nds32/libresolv.abilist
new file mode 100644
index 0000000..e19dee4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/libresolv.abilist
@@ -0,0 +1,80 @@
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 __b64_ntop F
+GLIBC_2.28 __b64_pton F
+GLIBC_2.28 __dn_comp F
+GLIBC_2.28 __dn_count_labels F
+GLIBC_2.28 __dn_expand F
+GLIBC_2.28 __dn_skipname F
+GLIBC_2.28 __fp_nquery F
+GLIBC_2.28 __fp_query F
+GLIBC_2.28 __fp_resstat F
+GLIBC_2.28 __hostalias F
+GLIBC_2.28 __loc_aton F
+GLIBC_2.28 __loc_ntoa F
+GLIBC_2.28 __p_cdname F
+GLIBC_2.28 __p_cdnname F
+GLIBC_2.28 __p_class F
+GLIBC_2.28 __p_class_syms D 0x54
+GLIBC_2.28 __p_fqname F
+GLIBC_2.28 __p_fqnname F
+GLIBC_2.28 __p_option F
+GLIBC_2.28 __p_query F
+GLIBC_2.28 __p_rcode F
+GLIBC_2.28 __p_time F
+GLIBC_2.28 __p_type F
+GLIBC_2.28 __p_type_syms D 0x228
+GLIBC_2.28 __putlong F
+GLIBC_2.28 __putshort F
+GLIBC_2.28 __res_close F
+GLIBC_2.28 __res_dnok F
+GLIBC_2.28 __res_hnok F
+GLIBC_2.28 __res_hostalias F
+GLIBC_2.28 __res_isourserver F
+GLIBC_2.28 __res_mailok F
+GLIBC_2.28 __res_mkquery F
+GLIBC_2.28 __res_nameinquery F
+GLIBC_2.28 __res_nmkquery F
+GLIBC_2.28 __res_nquery F
+GLIBC_2.28 __res_nquerydomain F
+GLIBC_2.28 __res_nsearch F
+GLIBC_2.28 __res_nsend F
+GLIBC_2.28 __res_ownok F
+GLIBC_2.28 __res_queriesmatch F
+GLIBC_2.28 __res_query F
+GLIBC_2.28 __res_querydomain F
+GLIBC_2.28 __res_search F
+GLIBC_2.28 __res_send F
+GLIBC_2.28 __sym_ntop F
+GLIBC_2.28 __sym_ntos F
+GLIBC_2.28 __sym_ston F
+GLIBC_2.28 _getlong F
+GLIBC_2.28 _getshort F
+GLIBC_2.28 inet_net_ntop F
+GLIBC_2.28 inet_net_pton F
+GLIBC_2.28 inet_neta F
+GLIBC_2.28 ns_datetosecs F
+GLIBC_2.28 ns_format_ttl F
+GLIBC_2.28 ns_get16 F
+GLIBC_2.28 ns_get32 F
+GLIBC_2.28 ns_initparse F
+GLIBC_2.28 ns_makecanon F
+GLIBC_2.28 ns_msg_getflag F
+GLIBC_2.28 ns_name_compress F
+GLIBC_2.28 ns_name_ntol F
+GLIBC_2.28 ns_name_ntop F
+GLIBC_2.28 ns_name_pack F
+GLIBC_2.28 ns_name_pton F
+GLIBC_2.28 ns_name_rollback F
+GLIBC_2.28 ns_name_skip F
+GLIBC_2.28 ns_name_uncompress F
+GLIBC_2.28 ns_name_unpack F
+GLIBC_2.28 ns_parse_ttl F
+GLIBC_2.28 ns_parserr F
+GLIBC_2.28 ns_put16 F
+GLIBC_2.28 ns_put32 F
+GLIBC_2.28 ns_samedomain F
+GLIBC_2.28 ns_samename F
+GLIBC_2.28 ns_skiprr F
+GLIBC_2.28 ns_sprintrr F
+GLIBC_2.28 ns_sprintrrf F
+GLIBC_2.28 ns_subdomain F
diff --git a/sysdeps/unix/sysv/linux/nds32/librt.abilist b/sysdeps/unix/sysv/linux/nds32/librt.abilist
new file mode 100644
index 0000000..34424ba
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/librt.abilist
@@ -0,0 +1,36 @@
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 __mq_open_2 F
+GLIBC_2.28 aio_cancel F
+GLIBC_2.28 aio_cancel64 F
+GLIBC_2.28 aio_error F
+GLIBC_2.28 aio_error64 F
+GLIBC_2.28 aio_fsync F
+GLIBC_2.28 aio_fsync64 F
+GLIBC_2.28 aio_init F
+GLIBC_2.28 aio_read F
+GLIBC_2.28 aio_read64 F
+GLIBC_2.28 aio_return F
+GLIBC_2.28 aio_return64 F
+GLIBC_2.28 aio_suspend F
+GLIBC_2.28 aio_suspend64 F
+GLIBC_2.28 aio_write F
+GLIBC_2.28 aio_write64 F
+GLIBC_2.28 lio_listio F
+GLIBC_2.28 lio_listio64 F
+GLIBC_2.28 mq_close F
+GLIBC_2.28 mq_getattr F
+GLIBC_2.28 mq_notify F
+GLIBC_2.28 mq_open F
+GLIBC_2.28 mq_receive F
+GLIBC_2.28 mq_send F
+GLIBC_2.28 mq_setattr F
+GLIBC_2.28 mq_timedreceive F
+GLIBC_2.28 mq_timedsend F
+GLIBC_2.28 mq_unlink F
+GLIBC_2.28 shm_open F
+GLIBC_2.28 shm_unlink F
+GLIBC_2.28 timer_create F
+GLIBC_2.28 timer_delete F
+GLIBC_2.28 timer_getoverrun F
+GLIBC_2.28 timer_gettime F
+GLIBC_2.28 timer_settime F
diff --git a/sysdeps/unix/sysv/linux/nds32/libthread_db.abilist b/sysdeps/unix/sysv/linux/nds32/libthread_db.abilist
new file mode 100644
index 0000000..72a5ae5
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/libthread_db.abilist
@@ -0,0 +1,41 @@
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 td_init F
+GLIBC_2.28 td_log F
+GLIBC_2.28 td_symbol_list F
+GLIBC_2.28 td_ta_clear_event F
+GLIBC_2.28 td_ta_delete F
+GLIBC_2.28 td_ta_enable_stats F
+GLIBC_2.28 td_ta_event_addr F
+GLIBC_2.28 td_ta_event_getmsg F
+GLIBC_2.28 td_ta_get_nthreads F
+GLIBC_2.28 td_ta_get_ph F
+GLIBC_2.28 td_ta_get_stats F
+GLIBC_2.28 td_ta_map_id2thr F
+GLIBC_2.28 td_ta_map_lwp2thr F
+GLIBC_2.28 td_ta_new F
+GLIBC_2.28 td_ta_reset_stats F
+GLIBC_2.28 td_ta_set_event F
+GLIBC_2.28 td_ta_setconcurrency F
+GLIBC_2.28 td_ta_thr_iter F
+GLIBC_2.28 td_ta_tsd_iter F
+GLIBC_2.28 td_thr_clear_event F
+GLIBC_2.28 td_thr_dbresume F
+GLIBC_2.28 td_thr_dbsuspend F
+GLIBC_2.28 td_thr_event_enable F
+GLIBC_2.28 td_thr_event_getmsg F
+GLIBC_2.28 td_thr_get_info F
+GLIBC_2.28 td_thr_getfpregs F
+GLIBC_2.28 td_thr_getgregs F
+GLIBC_2.28 td_thr_getxregs F
+GLIBC_2.28 td_thr_getxregsize F
+GLIBC_2.28 td_thr_set_event F
+GLIBC_2.28 td_thr_setfpregs F
+GLIBC_2.28 td_thr_setgregs F
+GLIBC_2.28 td_thr_setprio F
+GLIBC_2.28 td_thr_setsigpending F
+GLIBC_2.28 td_thr_setxregs F
+GLIBC_2.28 td_thr_sigsetmask F
+GLIBC_2.28 td_thr_tls_get_addr F
+GLIBC_2.28 td_thr_tlsbase F
+GLIBC_2.28 td_thr_tsd F
+GLIBC_2.28 td_thr_validate F
diff --git a/sysdeps/unix/sysv/linux/nds32/libutil.abilist b/sysdeps/unix/sysv/linux/nds32/libutil.abilist
new file mode 100644
index 0000000..1fe6467
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/nds32/libutil.abilist
@@ -0,0 +1,7 @@
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 forkpty F
+GLIBC_2.28 login F
+GLIBC_2.28 login_tty F
+GLIBC_2.28 logout F
+GLIBC_2.28 logwtmp F
+GLIBC_2.28 openpty F
-- 
2.7.4

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH 00/11] nds32 glibc Port v1
  2018-05-06 14:41 [PATCH 00/11] nds32 glibc Port v1 vincentc
                   ` (10 preceding siblings ...)
  2018-05-06 14:42 ` [PATCH 11/11] Add nds32 entries to config.h.in vincentc
@ 2018-05-08 14:46 ` Joseph Myers
  2018-05-09  5:22   ` Vincent Chen
  11 siblings, 1 reply; 31+ messages in thread
From: Joseph Myers @ 2018-05-08 14:46 UTC (permalink / raw)
  To: vincentc; +Cc: libc-alpha, deanbo422, cnoize

On Sun, 6 May 2018, vincentc wrote:

>    Hi, this serious of patch contains glibc port for Andes nds32 ISA. 

To confirm: all the work on this port is covered by the copyright 
assignment

GLIBC GDB GCC BINUTILS  Andes Technology        Taiwan  2009-12-16
Assigns Past and Future Changes

?

> repository and people can use them to build nds32 glibc toolchain. By the way,
> the patch of build-many-glibcs.py for Andes nds32 port does not be included in

It's still useful to have the changes that just add builds for all 
relevant ABI or other variants, even if they don't work until those 
changes to the other components are upstream, because having the ABI 
variants there may help point to other things in the review.

For example: what is the full list of incompatible ABIs supported by this 
port that would be listed at <https://sourceware.org/glibc/wiki/ABIList>?  
Based on the code in the port, it has at least big-endian and 
little-endian variants, so at least two ABIs.  Those ABIs should have 
different dynamic linker names, as for AArch64 (see my recent comments on 
the C-Sky port) - and likewise any other incompatible ABI variants.

>    ii.The tst-cancel7 and tst-cancel7x fails because the 1 second timeout, at
>       108-th line in tst-cancel7.c, is not enough for child thread to finish all
>       work before system(). In other words, parent thread executes
>       xpthread_cancel () before child thread executes system(). Therefore, child
>       thread cannot write self-pid on pidfile and error message 'could not read
>       pid' is got. The nds32 port can pass this testing after we extend the
>       timeout to 5 seconds.

See bug 14232.

> 2. misc (3 FAIL cases)
>    i. A new flag, RWF_APPEND, for preadv2/pwritev2 is added in Linux 4.16. This
>       change causes expected ENOTSUP does not be caught in misc/tst-preadvwritev2
>       and misc/tst-preadvwritev64v2. The nds32 ports can pass these two cases
>       after adding the new flag RWF_APPEND to sysdeps/unix/sysv/linux/bits/uio-ext.h
>       and misc/ tst-preadvwritev2-common.c.

But that's been fixed since commit 
f2652643d7234c08205b75f527191c2e2b35251f (3 Apr).  Are you sure you are 
testing relative to a recent git version of glibc?

(The ABI baselines need updating for my change to remove absolute symbols 
from ABI baselines, but that change went in two days before your patch 
series posting, whereas the RWF_SUPPORTED change went in a month ago.)

As further examples of updates needed to reflect current glibc, patch 8 
includes sigcontextinfo.h macros that I globally removed as unused in 
commit a44061398c3b531b37e134a6a97accb2251fa28a (22 Mar), while patch 7 
includes a readahead implementation, but Adhemerval consolidated those in 
commit c57bf7c15ba179168d01f7c6acde7ecbf5dd9cd8 so there shouldn't be any 
such architecture-specific implementations needed any more.  Patch 5 
includes a math_private.h file that shouldn't be needed since my 
refactoring in February.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH 01/11] nds32: Build Infastructure
  2018-05-06 14:42 ` [PATCH 01/11] nds32: Build Infastructure vincentc
@ 2018-05-08 14:49   ` Joseph Myers
  2018-05-09  8:32     ` Vincent Chen
  0 siblings, 1 reply; 31+ messages in thread
From: Joseph Myers @ 2018-05-08 14:49 UTC (permalink / raw)
  To: vincentc; +Cc: libc-alpha, deanbo422, cnoize

On Sun, 6 May 2018, vincentc wrote:

> diff --git a/sysdeps/nds32/configure.ac b/sysdeps/nds32/configure.ac
> new file mode 100644
> index 0000000..4ca57b8
> --- /dev/null
> +++ b/sysdeps/nds32/configure.ac
> @@ -0,0 +1,14 @@
> +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
> +# Local configure fragment for sysdeps/nds32.
> +CFLAGS="$CFLAGS -minline-asm-r15"

If that option is needed globally for building glibc, a comment should be 
there to explain it.

> +AC_CACHE_CHECK(whether gcc support option -mno-scalbn-transform,
> +	       libc_cv_scalbn_transform, [dnl
> +save_CFLAGS="$CFLAGS"
> +CFLAGS="$CFLAGS -mno-scalbn-transform"

What does this option do (I don't see it in current GCC)?  Since you've 
said current GCC versions aren't suitable for building glibc, can't you 
just require a compiler supporting the option, unconditionally, so any 
test for it is just to ensure a configure error for a too-old compiler 
rather than allowing compilation to continue without support?

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH 08/11] nds32: Linux ABI
  2018-05-06 14:42 ` [PATCH 08/11] nds32: Linux ABI vincentc
@ 2018-05-08 21:18   ` Adhemerval Zanella
  2018-05-09 13:34     ` Vincent Chen
  0 siblings, 1 reply; 31+ messages in thread
From: Adhemerval Zanella @ 2018-05-08 21:18 UTC (permalink / raw)
  To: libc-alpha



On 06/05/2018 11:41, vincentc wrote:
> 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..e0732b9
> --- /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 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
> +

My understanding was generic uapi for Linux expects IPC_64 being 0x100 for
newer ports, but seems for recent ones that 0x0 is the expect values.  Is
the case or NDS32 is a outlier? 

> diff --git a/sysdeps/unix/sysv/linux/nds32/kernel_sigaction.h b/sysdeps/unix/sysv/linux/nds32/kernel_sigaction.h
> new file mode 100644
> index 0000000..d7fab19
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/nds32/kernel_sigaction.h
> @@ -0,0 +1,30 @@
> +/* Define struct old_kernel_sigaction and kernel_sigaction for Andes nds32.
> +   Copyright (C) 2006-2018 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/>.  */
> +
> +
> +struct old_kernel_sigaction {
> +	__sighandler_t k_sa_handler;
> +	unsigned long sa_mask;
> +	unsigned long sa_flags;
> +};
> +
> +struct kernel_sigaction {
> +	__sighandler_t k_sa_handler;
> +	unsigned long sa_flags;
> +	sigset_t sa_mask;
> +};

The 'old_kernel_sigaction' is not used anywhere in glibc code and after
sigaction consolidation (b4a5d26d8835d972995f0a0a2f805a8845bafa0b) the
generic Linux kernel_sigactions.h should follow generic uapi.  It seems
NDS32 follows this case, so are you sure you need a arch-specific
version?

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH 07/11] nds32: Linux Syscall Interface
  2018-05-06 14:42 ` [PATCH 07/11] nds32: Linux Syscall Interface vincentc
@ 2018-05-08 21:27   ` Adhemerval Zanella
  2018-05-09 13:46     ` Vincent Chen
  0 siblings, 1 reply; 31+ messages in thread
From: Adhemerval Zanella @ 2018-05-08 21:27 UTC (permalink / raw)
  To: libc-alpha



On 06/05/2018 11:41, vincentc wrote:
> This patch contains the Linux system call interface, as well as the
> definitions of a handful of system calls.
> ---
>  sysdeps/unix/sysv/linux/nds32/arch-fork.h      |  27 ++
>  sysdeps/unix/sysv/linux/nds32/clone.S          |  66 +++++
>  sysdeps/unix/sysv/linux/nds32/profil-counter.h |  31 +++
>  sysdeps/unix/sysv/linux/nds32/pt-vfork.S       |   1 +
>  sysdeps/unix/sysv/linux/nds32/readahead.c      |  36 +++
>  sysdeps/unix/sysv/linux/nds32/syscall.c        |  39 +++
>  sysdeps/unix/sysv/linux/nds32/syscalls.list    |   2 +
>  sysdeps/unix/sysv/linux/nds32/sysdep.c         |  30 +++
>  sysdeps/unix/sysv/linux/nds32/sysdep.h         | 337 +++++++++++++++++++++++++
>  9 files changed, 569 insertions(+)
>  create mode 100644 sysdeps/unix/sysv/linux/nds32/arch-fork.h
>  create mode 100644 sysdeps/unix/sysv/linux/nds32/clone.S
>  create mode 100644 sysdeps/unix/sysv/linux/nds32/profil-counter.h
>  create mode 100644 sysdeps/unix/sysv/linux/nds32/pt-vfork.S
>  create mode 100644 sysdeps/unix/sysv/linux/nds32/readahead.c
>  create mode 100644 sysdeps/unix/sysv/linux/nds32/syscall.c
>  create mode 100644 sysdeps/unix/sysv/linux/nds32/syscalls.list
>  create mode 100644 sysdeps/unix/sysv/linux/nds32/sysdep.c
>  create mode 100644 sysdeps/unix/sysv/linux/nds32/sysdep.h
> 
> diff --git a/sysdeps/unix/sysv/linux/nds32/arch-fork.h b/sysdeps/unix/sysv/linux/nds32/arch-fork.h
> new file mode 100644
> index 0000000..e86143a
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/nds32/arch-fork.h
> @@ -0,0 +1,27 @@
> +/* ARCH_FORK definition for Linux fork implementation, Andes Linux/nds32 version.
> +   Copyright (C) 2002-2018 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 <sched.h>
> +#include <sysdep.h>
> +#include <tls.h>
> +
> +#define ARCH_FORK() \
> +  INLINE_SYSCALL (clone, 5,                                                  \
> +                 CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, 0,     \
> +                 NULL, NULL, &THREAD_SELF->tid)
> +

The clone syscall for fork implementation was consolidate (commit
3dc214977beccc95f0df3b90fa4ca2557fe1bdd2).  The new ports need to redefine
it iff the clone kernel ABI does not follow the generic expect one
(check sysdeps/unix/sysv/linux/kernel-features.h:119).


> diff --git a/sysdeps/unix/sysv/linux/nds32/readahead.c b/sysdeps/unix/sysv/linux/nds32/readahead.c
> new file mode 100644
> index 0000000..5559619
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/nds32/readahead.c

Joseph already noted this files should not be required.

> diff --git a/sysdeps/unix/sysv/linux/nds32/syscall.c b/sysdeps/unix/sysv/linux/nds32/syscall.c
> new file mode 100644
> index 0000000..77af6bb
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/nds32/syscall.c
> @@ -0,0 +1,39 @@
> +/* System call interface, Andes nds32 version.
> +   Copyright (C) 2001-2018 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>
> +long int syscall (long int __sysno, ...)
> +{
> +
> +	int result;
> +	unsigned long arg1,arg2,arg3,arg4,arg5,arg6;
> +	va_list arg;
> +	va_start (arg, __sysno);
> +	arg1 = va_arg (arg, unsigned long);
> +	arg2 = va_arg (arg, unsigned long);
> +	arg3 = va_arg (arg, unsigned long);
> +	arg4 = va_arg (arg, unsigned long);
> +	arg5 = va_arg (arg, unsigned long);
> +	arg6 = va_arg (arg, unsigned long);
> +	va_end (arg);
> +	__asm__ volatile ( "" ::: "memory" );
> +	result = INLINE_SYSCALL_NCS(__sysno,6,arg1,arg2,arg3,arg4,arg5,arg6);
> +	return result;
> +}

Maybe we could it as a generic version, the only points I am not sure if why
you need a compiler memory barrier here.

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH 00/11] nds32 glibc Port v1
  2018-05-08 14:46 ` [PATCH 00/11] nds32 glibc Port v1 Joseph Myers
@ 2018-05-09  5:22   ` Vincent Chen
  2018-05-09 12:10     ` Joseph Myers
  0 siblings, 1 reply; 31+ messages in thread
From: Vincent Chen @ 2018-05-09  5:22 UTC (permalink / raw)
  To: Joseph Myers; +Cc: libc-alpha, deanbo422, Che-Wei Chuang (??????)

On Tue, May 08, 2018 at 10:45:57PM +0800, Joseph Myers wrote:
> On Sun, 6 May 2018, vincentc wrote:
> 
> >    Hi, this serious of patch contains glibc port for Andes nds32 ISA. 
> 
> To confirm: all the work on this port is covered by the copyright 
> assignment
> 
> GLIBC GDB GCC BINUTILS  Andes Technology        Taiwan  2009-12-16
> Assigns Past and Future Changes
> 
> ?
>

Yes

 
> > repository and people can use them to build nds32 glibc toolchain. By the way,
> > the patch of build-many-glibcs.py for Andes nds32 port does not be included in
> 
> It's still useful to have the changes that just add builds for all 
> relevant ABI or other variants, even if they don't work until those 
> changes to the other components are upstream, because having the ABI 
> variants there may help point to other things in the review.
> 
> For example: what is the full list of incompatible ABIs supported by this 
> port that would be listed at <https://sourceware.org/glibc/wiki/ABIList>?  
> Based on the code in the port, it has at least big-endian and 
> little-endian variants, so at least two ABIs.  Those ABIs should have 
> different dynamic linker names, as for AArch64 (see my recent comments on 
> the C-Sky port) - and likewise any other incompatible ABI variants.
> 
Ok, we will add nds32 port to build-many-glibcs.py and re-name the dynamic linker
based on support ABI in next version patch. In addition, we plan to remove 
big-endian support in next patch because we don't have stable platform to 
finishing the testing.

By the way, does this port possibly go upstream before the latest nds32 port of
gcc and binutil are upstream?


> >    ii.The tst-cancel7 and tst-cancel7x fails because the 1 second timeout, at
> >       108-th line in tst-cancel7.c, is not enough for child thread to finish all
> >       work before system(). In other words, parent thread executes
> >       xpthread_cancel () before child thread executes system(). Therefore, child
> >       thread cannot write self-pid on pidfile and error message 'could not read
> >       pid' is got. The nds32 port can pass this testing after we extend the
> >       timeout to 5 seconds.
> 
> See bug 14232.
> 

> > 2. misc (3 FAIL cases)
> >    i. A new flag, RWF_APPEND, for preadv2/pwritev2 is added in Linux 4.16. This
> >       change causes expected ENOTSUP does not be caught in misc/tst-preadvwritev2
> >       and misc/tst-preadvwritev64v2. The nds32 ports can pass these two cases
> >       after adding the new flag RWF_APPEND to sysdeps/unix/sysv/linux/bits/uio-ext.h
> >       and misc/ tst-preadvwritev2-common.c.
> 
> But that's been fixed since commit 
> f2652643d7234c08205b75f527191c2e2b35251f (3 Apr).  Are you sure you are 
> testing relative to a recent git version of glibc?
> 
> (The ABI baselines need updating for my change to remove absolute symbols 
> from ABI baselines, but that change went in two days before your patch 
> series posting, whereas the RWF_SUPPORTED change went in a month ago.)
> 
> As further examples of updates needed to reflect current glibc, patch 8 
> includes sigcontextinfo.h macros that I globally removed as unused in 
> commit a44061398c3b531b37e134a6a97accb2251fa28a (22 Mar), while patch 7 
> includes a readahead implementation, but Adhemerval consolidated those in 
> commit c57bf7c15ba179168d01f7c6acde7ecbf5dd9cd8 so there shouldn't be any 
> such architecture-specific implementations needed any more.  Patch 5 
> includes a math_private.h file that shouldn't be needed since my 
> refactoring in February.
> 

The testing is based on glibc 2.27 released commit.
(commit 406e7a023158b08a0908f381459f273a984c6fd328363cb)
I will follow your comment to modify and test the port based on the latest glibc
version again.


Thanks

Vincent Chen 


> -- 
> Joseph S. Myers
> joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH 01/11] nds32: Build Infastructure
  2018-05-08 14:49   ` Joseph Myers
@ 2018-05-09  8:32     ` Vincent Chen
  0 siblings, 0 replies; 31+ messages in thread
From: Vincent Chen @ 2018-05-09  8:32 UTC (permalink / raw)
  To: Joseph Myers; +Cc: libc-alpha, deanbo422, Che-Wei Chuang (??????)

On Tue, May 08, 2018 at 10:49:26PM +0800, Joseph Myers wrote:
> On Sun, 6 May 2018, vincentc wrote:
> 
> > diff --git a/sysdeps/nds32/configure.ac b/sysdeps/nds32/configure.ac
> > new file mode 100644
> > index 0000000..4ca57b8
> > --- /dev/null
> > +++ b/sysdeps/nds32/configure.ac
> > @@ -0,0 +1,14 @@
> > +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
> > +# Local configure fragment for sysdeps/nds32.
> > +CFLAGS="$CFLAGS -minline-asm-r15"
> 
> If that option is needed globally for building glibc, a comment should be 
> there to explain it.
>
Ok, I will add the following comment in next version patch.

# For nds32 ABI, the $r15 register, assembler reserved register, is also used to
# storing the syscall number for issuing syscall. In order to ensure the data
# safety, $r15 is included in clobber list by default. Using the option
# -minline-asm-r15 can avoid the conflict between asm-specifier for syscall number
# and clobber list when using inline assembly to issue syscall.

 
> > +AC_CACHE_CHECK(whether gcc support option -mno-scalbn-transform,
> > +	       libc_cv_scalbn_transform, [dnl
> > +save_CFLAGS="$CFLAGS"
> > +CFLAGS="$CFLAGS -mno-scalbn-transform"
> 
> What does this option do (I don't see it in current GCC)?  Since you've 
> said current GCC versions aren't suitable for building glibc, can't you 
> just require a compiler supporting the option, unconditionally, so any 
> test for it is just to ensure a configure error for a too-old compiler 
> rather than allowing compilation to continue without support?
> 

The -mno-scalbn-transfomr is used to disable nds32 specific feature in gcc 6.3.0.
(We put nds32 gcc-6.3.0 in the git repo https://github.com/andestech/gcc.git)
However, this feature will be deprecated in the latest gcc. We plan to disable 
this feature by default in gcc-6.3.0 too. Therefore, I will remove this option
from the configure in the next version patch.

Thanks

Best regards
Vincent Chen


> -- 
> Joseph S. Myers
> joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH 00/11] nds32 glibc Port v1
  2018-05-09  5:22   ` Vincent Chen
@ 2018-05-09 12:10     ` Joseph Myers
  2018-05-09 13:49       ` Vincent Chen
  0 siblings, 1 reply; 31+ messages in thread
From: Joseph Myers @ 2018-05-09 12:10 UTC (permalink / raw)
  To: Vincent Chen; +Cc: libc-alpha, deanbo422, Che-Wei Chuang (??????)

On Wed, 9 May 2018, Vincent Chen wrote:

> By the way, does this port possibly go upstream before the latest nds32 port of
> gcc and binutil are upstream?

No.  For a glibc port to go upstream, all the build dependencies must be 
upstream (generally meaning GCC, binutils, Linux kernel - and, likewise, 
if one of those ports is removed upstream, that means the glibc port will 
be removed as well, as recently happened to the tile port because that 
Linux kernel port was removed).  They only need to be upstream in the 
respective development mainlines, not on release branches.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH 08/11] nds32: Linux ABI
  2018-05-08 21:18   ` Adhemerval Zanella
@ 2018-05-09 13:34     ` Vincent Chen
  2018-05-09 13:42       ` Adhemerval Zanella
  0 siblings, 1 reply; 31+ messages in thread
From: Vincent Chen @ 2018-05-09 13:34 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha

On Wed, May 09, 2018 at 05:18:41AM +0800, Adhemerval Zanella wrote:
> 
> 
> On 06/05/2018 11:41, vincentc wrote:
> > 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..e0732b9
> > --- /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 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
> > +
> 
> My understanding was generic uapi for Linux expects IPC_64 being 0x100 for
> newer ports, but seems for recent ones that 0x0 is the expect values.  Is
> the case or NDS32 is a outlier? 
>


For new ports of Linux, only new IPC version is supported. Therefore, kernel
does not identify the IPC version by __IPC_64 flag. Unfortunately, kernel also 
skip the code for removing __IPC_64 flag from cmd. Therefore, -EINVAL is returned
if __IPC_64 is set. To solve this problem, we set __IPC_64 as 0x0 instead of
0x100.

 
> > diff --git a/sysdeps/unix/sysv/linux/nds32/kernel_sigaction.h b/sysdeps/unix/sysv/linux/nds32/kernel_sigaction.h
> > new file mode 100644
> > index 0000000..d7fab19
> > --- /dev/null
> > +++ b/sysdeps/unix/sysv/linux/nds32/kernel_sigaction.h
> > @@ -0,0 +1,30 @@
> > +/* Define struct old_kernel_sigaction and kernel_sigaction for Andes nds32.
> > +   Copyright (C) 2006-2018 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/>.  */
> > +
> > +
> > +struct old_kernel_sigaction {
> > +	__sighandler_t k_sa_handler;
> > +	unsigned long sa_mask;
> > +	unsigned long sa_flags;
> > +};
> > +
> > +struct kernel_sigaction {
> > +	__sighandler_t k_sa_handler;
> > +	unsigned long sa_flags;
> > +	sigset_t sa_mask;
> > +};
> 
> The 'old_kernel_sigaction' is not used anywhere in glibc code and after
> sigaction consolidation (b4a5d26d8835d972995f0a0a2f805a8845bafa0b) the
> generic Linux kernel_sigactions.h should follow generic uapi.  It seems
> NDS32 follows this case, so are you sure you need a arch-specific
> version?

OK, we will remove it in the next version.

Thanks for your suggestions.

Best regards
Vincent Chen

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH 08/11] nds32: Linux ABI
  2018-05-09 13:34     ` Vincent Chen
@ 2018-05-09 13:42       ` Adhemerval Zanella
  0 siblings, 0 replies; 31+ messages in thread
From: Adhemerval Zanella @ 2018-05-09 13:42 UTC (permalink / raw)
  To: Vincent Chen; +Cc: libc-alpha



On 09/05/2018 10:34, Vincent Chen wrote:
> On Wed, May 09, 2018 at 05:18:41AM +0800, Adhemerval Zanella wrote:
>>
>>
>> On 06/05/2018 11:41, vincentc wrote:
>>> 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..e0732b9
>>> --- /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 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
>>> +
>>
>> My understanding was generic uapi for Linux expects IPC_64 being 0x100 for
>> newer ports, but seems for recent ones that 0x0 is the expect values.  Is
>> the case or NDS32 is a outlier? 
>>
> 
> 
> For new ports of Linux, only new IPC version is supported. Therefore, kernel
> does not identify the IPC version by __IPC_64 flag. Unfortunately, kernel also 
> skip the code for removing __IPC_64 flag from cmd. Therefore, -EINVAL is returned
> if __IPC_64 is set. To solve this problem, we set __IPC_64 as 0x0 instead of
> 0x100.

Right, so I think a future cleanup could to define the generic ipc_priv.h to
define __IPC_64 set to 0x0 then.  Thanks for the info.

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH 07/11] nds32: Linux Syscall Interface
  2018-05-08 21:27   ` Adhemerval Zanella
@ 2018-05-09 13:46     ` Vincent Chen
  2018-05-09 13:57       ` Adhemerval Zanella
  0 siblings, 1 reply; 31+ messages in thread
From: Vincent Chen @ 2018-05-09 13:46 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha

On Wed, May 09, 2018 at 05:27:16AM +0800, Adhemerval Zanella wrote:
> 
> 
> On 06/05/2018 11:41, vincentc wrote:
> > This patch contains the Linux system call interface, as well as the
> > definitions of a handful of system calls.
> > ---
> >  sysdeps/unix/sysv/linux/nds32/arch-fork.h      |  27 ++
> >  sysdeps/unix/sysv/linux/nds32/clone.S          |  66 +++++
> >  sysdeps/unix/sysv/linux/nds32/profil-counter.h |  31 +++
> >  sysdeps/unix/sysv/linux/nds32/pt-vfork.S       |   1 +
> >  sysdeps/unix/sysv/linux/nds32/readahead.c      |  36 +++
> >  sysdeps/unix/sysv/linux/nds32/syscall.c        |  39 +++
> >  sysdeps/unix/sysv/linux/nds32/syscalls.list    |   2 +
> >  sysdeps/unix/sysv/linux/nds32/sysdep.c         |  30 +++
> >  sysdeps/unix/sysv/linux/nds32/sysdep.h         | 337 +++++++++++++++++++++++++
> >  9 files changed, 569 insertions(+)
> >  create mode 100644 sysdeps/unix/sysv/linux/nds32/arch-fork.h
> >  create mode 100644 sysdeps/unix/sysv/linux/nds32/clone.S
> >  create mode 100644 sysdeps/unix/sysv/linux/nds32/profil-counter.h
> >  create mode 100644 sysdeps/unix/sysv/linux/nds32/pt-vfork.S
> >  create mode 100644 sysdeps/unix/sysv/linux/nds32/readahead.c
> >  create mode 100644 sysdeps/unix/sysv/linux/nds32/syscall.c
> >  create mode 100644 sysdeps/unix/sysv/linux/nds32/syscalls.list
> >  create mode 100644 sysdeps/unix/sysv/linux/nds32/sysdep.c
> >  create mode 100644 sysdeps/unix/sysv/linux/nds32/sysdep.h
> > 
> > diff --git a/sysdeps/unix/sysv/linux/nds32/arch-fork.h b/sysdeps/unix/sysv/linux/nds32/arch-fork.h
> > new file mode 100644
> > index 0000000..e86143a
> > --- /dev/null
> > +++ b/sysdeps/unix/sysv/linux/nds32/arch-fork.h
> > @@ -0,0 +1,27 @@
> > +/* ARCH_FORK definition for Linux fork implementation, Andes Linux/nds32 version.
> > +   Copyright (C) 2002-2018 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 <sched.h>
> > +#include <sysdep.h>
> > +#include <tls.h>
> > +
> > +#define ARCH_FORK() \
> > +  INLINE_SYSCALL (clone, 5,                                                  \
> > +                 CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, 0,     \
> > +                 NULL, NULL, &THREAD_SELF->tid)
> > +
> 
> The clone syscall for fork implementation was consolidate (commit
> 3dc214977beccc95f0df3b90fa4ca2557fe1bdd2).  The new ports need to redefine
> it iff the clone kernel ABI does not follow the generic expect one
> (check sysdeps/unix/sysv/linux/kernel-features.h:119).
> 
>

OK, I will modify it in the next version patch.
 
> > diff --git a/sysdeps/unix/sysv/linux/nds32/readahead.c b/sysdeps/unix/sysv/linux/nds32/readahead.c
> > new file mode 100644
> > index 0000000..5559619
> > --- /dev/null
> > +++ b/sysdeps/unix/sysv/linux/nds32/readahead.c
> 
> Joseph already noted this files should not be required.
> 

OK.

> > diff --git a/sysdeps/unix/sysv/linux/nds32/syscall.c b/sysdeps/unix/sysv/linux/nds32/syscall.c
> > new file mode 100644
> > index 0000000..77af6bb
> > --- /dev/null
> > +++ b/sysdeps/unix/sysv/linux/nds32/syscall.c
> > @@ -0,0 +1,39 @@
> > +/* System call interface, Andes nds32 version.
> > +   Copyright (C) 2001-2018 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>
> > +long int syscall (long int __sysno, ...)
> > +{
> > +
> > +	int result;
> > +	unsigned long arg1,arg2,arg3,arg4,arg5,arg6;
> > +	va_list arg;
> > +	va_start (arg, __sysno);
> > +	arg1 = va_arg (arg, unsigned long);
> > +	arg2 = va_arg (arg, unsigned long);
> > +	arg3 = va_arg (arg, unsigned long);
> > +	arg4 = va_arg (arg, unsigned long);
> > +	arg5 = va_arg (arg, unsigned long);
> > +	arg6 = va_arg (arg, unsigned long);
> > +	va_end (arg);
> > +	__asm__ volatile ( "" ::: "memory" );
> > +	result = INLINE_SYSCALL_NCS(__sysno,6,arg1,arg2,arg3,arg4,arg5,arg6);
> > +	return result;
> > +}
> 
> Maybe we could it as a generic version, the only points I am not sure if why
> you need a compiler memory barrier here.

The compiler memory barrier is used to ensuring that the input argument has been
stored to the targeted register before issuing syscall in compile time.


Thanks for your suggestions

Best regards
Vincent Chen

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH 00/11] nds32 glibc Port v1
  2018-05-09 12:10     ` Joseph Myers
@ 2018-05-09 13:49       ` Vincent Chen
  0 siblings, 0 replies; 31+ messages in thread
From: Vincent Chen @ 2018-05-09 13:49 UTC (permalink / raw)
  To: Joseph Myers; +Cc: libc-alpha, deanbo422, Che-Wei Chuang (??????)

On Wed, May 09, 2018 at 08:10:37PM +0800, Joseph Myers wrote:
> On Wed, 9 May 2018, Vincent Chen wrote:
> 
> > By the way, does this port possibly go upstream before the latest nds32 port of
> > gcc and binutil are upstream?
> 
> No.  For a glibc port to go upstream, all the build dependencies must be 
> upstream (generally meaning GCC, binutils, Linux kernel - and, likewise, 
> if one of those ports is removed upstream, that means the glibc port will 
> be removed as well, as recently happened to the tile port because that 
> Linux kernel port was removed).  They only need to be upstream in the 
> respective development mainlines, not on release branches.
>

OK, I got it.

Thanks for your reply.

Best regards
Vincent
 
> -- 
> Joseph S. Myers
> joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH 07/11] nds32: Linux Syscall Interface
  2018-05-09 13:46     ` Vincent Chen
@ 2018-05-09 13:57       ` Adhemerval Zanella
  2018-05-10  2:58         ` Vincent Chen
  0 siblings, 1 reply; 31+ messages in thread
From: Adhemerval Zanella @ 2018-05-09 13:57 UTC (permalink / raw)
  To: Vincent Chen; +Cc: libc-alpha



On 09/05/2018 10:46, Vincent Chen wrote:
> On Wed, May 09, 2018 at 05:27:16AM +0800, Adhemerval Zanella wrote:
>>
>>
>> On 06/05/2018 11:41, vincentc wrote:
>>> This patch contains the Linux system call interface, as well as the

[...]

>>> +#include <errno.h>
>>> +#include <stdarg.h>
>>> +#include <sysdep.h>
>>> +long int syscall (long int __sysno, ...)
>>> +{
>>> +
>>> +	int result;
>>> +	unsigned long arg1,arg2,arg3,arg4,arg5,arg6;
>>> +	va_list arg;
>>> +	va_start (arg, __sysno);
>>> +	arg1 = va_arg (arg, unsigned long);
>>> +	arg2 = va_arg (arg, unsigned long);
>>> +	arg3 = va_arg (arg, unsigned long);
>>> +	arg4 = va_arg (arg, unsigned long);
>>> +	arg5 = va_arg (arg, unsigned long);
>>> +	arg6 = va_arg (arg, unsigned long);
>>> +	va_end (arg);
>>> +	__asm__ volatile ( "" ::: "memory" );
>>> +	result = INLINE_SYSCALL_NCS(__sysno,6,arg1,arg2,arg3,arg4,arg5,arg6);
>>> +	return result;
>>> +}
>>
>> Maybe we could it as a generic version, the only points I am not sure if why
>> you need a compiler memory barrier here.
> 
> The compiler memory barrier is used to ensuring that the input argument has been
> stored to the targeted register before issuing syscall in compile time.

My understanding is INLINE_SYSCALL_NCS is already issues the syscall with a asm 
volatile, so it should prevent any instruction reordering from compiler to mess
with expected kernel register allocation.  Are you seeing a miscompile without
the barrier?

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH 07/11] nds32: Linux Syscall Interface
  2018-05-09 13:57       ` Adhemerval Zanella
@ 2018-05-10  2:58         ` Vincent Chen
  2018-05-12  7:21           ` Florian Weimer
  0 siblings, 1 reply; 31+ messages in thread
From: Vincent Chen @ 2018-05-10  2:58 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha

On Wed, May 09, 2018 at 10:57:25AM -0300, Adhemerval Zanella wrote:
> 
> 
> On 09/05/2018 10:46, Vincent Chen wrote:
> > On Wed, May 09, 2018 at 05:27:16AM +0800, Adhemerval Zanella wrote:
> >>
> >>
> >> On 06/05/2018 11:41, vincentc wrote:
> >>> This patch contains the Linux system call interface, as well as the
> 
> [...]
> 
> >>> +#include <errno.h>
> >>> +#include <stdarg.h>
> >>> +#include <sysdep.h>
> >>> +long int syscall (long int __sysno, ...)
> >>> +{
> >>> +
> >>> +	int result;
> >>> +	unsigned long arg1,arg2,arg3,arg4,arg5,arg6;
> >>> +	va_list arg;
> >>> +	va_start (arg, __sysno);
> >>> +	arg1 = va_arg (arg, unsigned long);
> >>> +	arg2 = va_arg (arg, unsigned long);
> >>> +	arg3 = va_arg (arg, unsigned long);
> >>> +	arg4 = va_arg (arg, unsigned long);
> >>> +	arg5 = va_arg (arg, unsigned long);
> >>> +	arg6 = va_arg (arg, unsigned long);
> >>> +	va_end (arg);
> >>> +	__asm__ volatile ( "" ::: "memory" );
> >>> +	result = INLINE_SYSCALL_NCS(__sysno,6,arg1,arg2,arg3,arg4,arg5,arg6);
> >>> +	return result;
> >>> +}
> >>
> >> Maybe we could it as a generic version, the only points I am not sure if why
> >> you need a compiler memory barrier here.
> > 
> > The compiler memory barrier is used to ensuring that the input argument has been
> > stored to the targeted register before issuing syscall in compile time.
> 
> My understanding is INLINE_SYSCALL_NCS is already issues the syscall with a asm 
> volatile, so it should prevent any instruction reordering from compiler to mess
> with expected kernel register allocation.  Are you seeing a miscompile without
> the barrier?

I apologize for giving you incorrect information. After I rechecking the git log
of this file, I think this memory barrier is not needed anymore. Originally, we
need to push the 6-th argument to the stack before invoking the system call. In
order to make sure that the value of 6-th argument is correct in stack, we need
a memory barrier which is located between storing 6-th argument to register $r6
and pushing register $r6 to stack. However, the above procedure was not needed
after we modified system call ABI. So, I think the memory barrier is not needed
now. I will remove it in the next version patch.


Thanks for your suggestions.

Best regards
Vincent Chen

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH 02/11] nds32: ABI Implementation
  2018-05-06 14:42 ` [PATCH 02/11] nds32: ABI Implementation vincentc
@ 2018-05-12  7:15   ` Florian Weimer
  2018-05-14 20:56     ` Vincent Chen
  0 siblings, 1 reply; 31+ messages in thread
From: Florian Weimer @ 2018-05-12  7:15 UTC (permalink / raw)
  To: vincentc, libc-alpha; +Cc: deanbo422, cnoize

On 05/06/2018 04:41 PM, vincentc wrote:
> +  $r26 - $r27 are temp registers for OS - no need to save.

Shouldn't you save them in case you decide to use them for a thread 
pointer eventually or something like that?

Thanks,
Florian

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH 07/11] nds32: Linux Syscall Interface
  2018-05-10  2:58         ` Vincent Chen
@ 2018-05-12  7:21           ` Florian Weimer
  2018-05-14 21:11             ` Vincent Chen
  0 siblings, 1 reply; 31+ messages in thread
From: Florian Weimer @ 2018-05-12  7:21 UTC (permalink / raw)
  To: Vincent Chen, Adhemerval Zanella; +Cc: libc-alpha

On 05/10/2018 04:58 AM, Vincent Chen wrote:
>>>>> +#include <errno.h>
>>>>> +#include <stdarg.h>
>>>>> +#include <sysdep.h>
>>>>> +long int syscall (long int __sysno, ...)
>>>>> +{
>>>>> +
>>>>> +	int result;
>>>>> +	unsigned long arg1,arg2,arg3,arg4,arg5,arg6;
>>>>> +	va_list arg;
>>>>> +	va_start (arg, __sysno);
>>>>> +	arg1 = va_arg (arg, unsigned long);
>>>>> +	arg2 = va_arg (arg, unsigned long);
>>>>> +	arg3 = va_arg (arg, unsigned long);
>>>>> +	arg4 = va_arg (arg, unsigned long);
>>>>> +	arg5 = va_arg (arg, unsigned long);
>>>>> +	arg6 = va_arg (arg, unsigned long);
>>>>> +	va_end (arg);
>>>>> +	__asm__ volatile ( "" ::: "memory" );
>>>>> +	result = INLINE_SYSCALL_NCS(__sysno,6,arg1,arg2,arg3,arg4,arg5,arg6);
>>>>> +	return result;
>>>>> +}

> So, I think the memory barrier is not needed
> now. I will remove it in the next version patch.

Please also fix the style issues—syscall should be at the start of the 
line, and there should be spaces after the commas, before (, but not 
after ( and before ).

Thanks,
Florian

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH 02/11] nds32: ABI Implementation
  2018-05-12  7:15   ` Florian Weimer
@ 2018-05-14 20:56     ` Vincent Chen
  2018-05-15 11:32       ` Florian Weimer
  0 siblings, 1 reply; 31+ messages in thread
From: Vincent Chen @ 2018-05-14 20:56 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha, deanbo422, Che-Wei Chuang (?????????)

On Sat, May 12, 2018 at 03:15:39PM +0800, Florian Weimer wrote:
> On 05/06/2018 04:41 PM, vincentc wrote:
> > +  $r26 - $r27 are temp registers for OS - no need to save.
> 
> Shouldn't you save them in case you decide to use them for a thread 
> pointer eventually or something like that?
> 
> Thanks,
> Florian


We do not save $r26, $r27 these two registers because these two register are
reserved for kernel space. In other words, these two registers shall not be used
in user space. Therefore, we needn't save these two registers to jmp_buf.

Thanks for your comment.

Best regards
Vincent Chen

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH 07/11] nds32: Linux Syscall Interface
  2018-05-12  7:21           ` Florian Weimer
@ 2018-05-14 21:11             ` Vincent Chen
  0 siblings, 0 replies; 31+ messages in thread
From: Vincent Chen @ 2018-05-14 21:11 UTC (permalink / raw)
  To: Florian Weimer; +Cc: Adhemerval Zanella, libc-alpha

On Sat, May 12, 2018 at 03:21:22PM +0800, Florian Weimer wrote:
> On 05/10/2018 04:58 AM, Vincent Chen wrote:
> >>>>> +#include <errno.h>
> >>>>> +#include <stdarg.h>
> >>>>> +#include <sysdep.h>
> >>>>> +long int syscall (long int __sysno, ...)
> >>>>> +{
> >>>>> +
> >>>>> +	int result;
> >>>>> +	unsigned long arg1,arg2,arg3,arg4,arg5,arg6;
> >>>>> +	va_list arg;
> >>>>> +	va_start (arg, __sysno);
> >>>>> +	arg1 = va_arg (arg, unsigned long);
> >>>>> +	arg2 = va_arg (arg, unsigned long);
> >>>>> +	arg3 = va_arg (arg, unsigned long);
> >>>>> +	arg4 = va_arg (arg, unsigned long);
> >>>>> +	arg5 = va_arg (arg, unsigned long);
> >>>>> +	arg6 = va_arg (arg, unsigned long);
> >>>>> +	va_end (arg);
> >>>>> +	__asm__ volatile ( "" ::: "memory" );
> >>>>> +	result = INLINE_SYSCALL_NCS(__sysno,6,arg1,arg2,arg3,arg4,arg5,arg6);
> >>>>> +	return result;
> >>>>> +}
> 
> > So, I think the memory barrier is not needed
> > now. I will remove it in the next version patch.
> 
> Please also fix the style issues???syscall should be at the start of the 
> line, and there should be spaces after the commas, before (, but not 
> after ( and before ).
> 
> Thanks,
> Florian

OK, I will modify it in the next version patch.

Thanks for your suggestions.

Best regards
Vincent Chen

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH 02/11] nds32: ABI Implementation
  2018-05-14 20:56     ` Vincent Chen
@ 2018-05-15 11:32       ` Florian Weimer
  2018-05-15 11:50         ` Vincent Chen
  0 siblings, 1 reply; 31+ messages in thread
From: Florian Weimer @ 2018-05-15 11:32 UTC (permalink / raw)
  To: Vincent Chen; +Cc: libc-alpha, deanbo422, Che-Wei Chuang (?????????)

On 05/14/2018 07:14 AM, Vincent Chen wrote:
> On Sat, May 12, 2018 at 03:15:39PM +0800, Florian Weimer wrote:
>> On 05/06/2018 04:41 PM, vincentc wrote:
>>> +  $r26 - $r27 are temp registers for OS - no need to save.
>>
>> Shouldn't you save them in case you decide to use them for a thread
>> pointer eventually or something like that?
>>
>> Thanks,
>> Florian
> 
> 
> We do not save $r26, $r27 these two registers because these two register are
> reserved for kernel space. In other words, these two registers shall not be used
> in user space. Therefore, we needn't save these two registers to jmp_buf.

Okay, in this case, you could update the register list at the top of the 
file.  Perhaps also mention the register used for the thread pointer?

Thanks,
Florian

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH 02/11] nds32: ABI Implementation
  2018-05-15 11:32       ` Florian Weimer
@ 2018-05-15 11:50         ` Vincent Chen
  0 siblings, 0 replies; 31+ messages in thread
From: Vincent Chen @ 2018-05-15 11:50 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha, deanbo422, Che-Wei Chuang (?????????)

On Tue, May 15, 2018 at 07:32:29PM +0800, Florian Weimer wrote:
> On 05/14/2018 07:14 AM, Vincent Chen wrote:
> > On Sat, May 12, 2018 at 03:15:39PM +0800, Florian Weimer wrote:
> >> On 05/06/2018 04:41 PM, vincentc wrote:
> >>> +  $r26 - $r27 are temp registers for OS - no need to save.
> >>
> >> Shouldn't you save them in case you decide to use them for a thread
> >> pointer eventually or something like that?
> >>
> >> Thanks,
> >> Florian
> > 
> > 
> > We do not save $r26, $r27 these two registers because these two register are
> > reserved for kernel space. In other words, these two registers shall not be used
> > in user space. Therefore, we needn't save these two registers to jmp_buf.
> 
> Okay, in this case, you could update the register list at the top of the 
> file.  Perhaps also mention the register used for the thread pointer?
> 
> Thanks,
> Florian
>

In nds32 port, the $r25 register is used for thread pointer. Thanks for your
suggestions. We will update the register list in next version patch.


Best regards
Vincent Chen

^ permalink raw reply	[flat|nested] 31+ messages in thread

end of thread, other threads:[~2018-05-15 11:50 UTC | newest]

Thread overview: 31+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-06 14:41 [PATCH 00/11] nds32 glibc Port v1 vincentc
2018-05-06 14:42 ` [PATCH 04/11] nds32: Startup and Dynamic Loader vincentc
2018-05-06 14:42 ` [PATCH 01/11] nds32: Build Infastructure vincentc
2018-05-08 14:49   ` Joseph Myers
2018-05-09  8:32     ` Vincent Chen
2018-05-06 14:42 ` [PATCH 07/11] nds32: Linux Syscall Interface vincentc
2018-05-08 21:27   ` Adhemerval Zanella
2018-05-09 13:46     ` Vincent Chen
2018-05-09 13:57       ` Adhemerval Zanella
2018-05-10  2:58         ` Vincent Chen
2018-05-12  7:21           ` Florian Weimer
2018-05-14 21:11             ` Vincent Chen
2018-05-06 14:42 ` [PATCH 03/11] nds32: Thread-Local Storage Support vincentc
2018-05-06 14:42 ` [PATCH 10/11] Add Andes nds32 dynamic relocation type to elf/elf.h vincentc
2018-05-06 14:42 ` [PATCH 06/11] nds32: Atomic and Locking Routines vincentc
2018-05-06 14:42 ` [PATCH 08/11] nds32: Linux ABI vincentc
2018-05-08 21:18   ` Adhemerval Zanella
2018-05-09 13:34     ` Vincent Chen
2018-05-09 13:42       ` Adhemerval Zanella
2018-05-06 14:42 ` [PATCH 05/11] nds32: Generic <math.h> and soft-fp Routines vincentc
2018-05-06 14:42 ` [PATCH 09/11] nds32: Add ABI list vincentc
2018-05-06 14:42 ` [PATCH 02/11] nds32: ABI Implementation vincentc
2018-05-12  7:15   ` Florian Weimer
2018-05-14 20:56     ` Vincent Chen
2018-05-15 11:32       ` Florian Weimer
2018-05-15 11:50         ` Vincent Chen
2018-05-06 14:42 ` [PATCH 11/11] Add nds32 entries to config.h.in vincentc
2018-05-08 14:46 ` [PATCH 00/11] nds32 glibc Port v1 Joseph Myers
2018-05-09  5:22   ` Vincent Chen
2018-05-09 12:10     ` Joseph Myers
2018-05-09 13:49       ` Vincent Chen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).