* [RFC PATCH 09/10] C-SKY: Linux Syscall Interface
2018-03-16 9:59 [RFC PATCH 00/10] port C-SKY to glibc Mao Han
` (8 preceding siblings ...)
2018-03-16 9:59 ` [RFC PATCH 06/10] C-SKY: Build Infastructure Mao Han
@ 2018-03-16 9:59 ` Mao Han
2018-03-18 3:19 ` Adhemerval Zanella
2018-03-16 13:52 ` [RFC PATCH 00/10] port C-SKY to glibc Carlos O'Donell
10 siblings, 1 reply; 22+ messages in thread
From: Mao Han @ 2018-03-16 9:59 UTC (permalink / raw)
To: libc-help; +Cc: han_mao, ren_guo, yunhai_shang, qijie_tong, chunqiang_li
Contains the Linux system call interface.
*sysdeps/unix/sysv/linux/csky/abiv2_brk.c: New file
*sysdeps/unix/sysv/linux/csky/abiv2_clone.S: New file
*sysdeps/unix/sysv/linux/csky/abiv2_getcontext.S: New file
*sysdeps/unix/sysv/linux/csky/abiv2_mmap.S: New file
*sysdeps/unix/sysv/linux/csky/abiv2_setcontext.S: New file
*sysdeps/unix/sysv/linux/csky/abiv2_socket.S: New file
*sysdeps/unix/sysv/linux/csky/abiv2_syscall.S: New file
*sysdeps/unix/sysv/linux/csky/abiv2_vfork.S: New file
*sysdeps/unix/sysv/linux/csky/alphasort64.c: New file
*sysdeps/unix/sysv/linux/csky/brk.c: New file
*sysdeps/unix/sysv/linux/csky/clone.S: New file
*sysdeps/unix/sysv/linux/csky/ftruncate64.c: New file
*sysdeps/unix/sysv/linux/csky/fxstat.c: New file
*sysdeps/unix/sysv/linux/csky/fxstatat.c: New file
*sysdeps/unix/sysv/linux/csky/getcontext.S: New file
*sysdeps/unix/sysv/linux/csky/getdents64.c: New file
*sysdeps/unix/sysv/linux/csky/libc-read_tp.S: New file
*sysdeps/unix/sysv/linux/csky/lockf64.c: New file
*sysdeps/unix/sysv/linux/csky/lxstat.c: New file
*sysdeps/unix/sysv/linux/csky/mmap.S: New file
*sysdeps/unix/sysv/linux/csky/pt-vfork.S: New file
*sysdeps/unix/sysv/linux/csky/read_tp.S: New file
*sysdeps/unix/sysv/linux/csky/readahead.c: New file
*sysdeps/unix/sysv/linux/csky/readdir64.c: New file
*sysdeps/unix/sysv/linux/csky/readdir64_r.c: New file
*sysdeps/unix/sysv/linux/csky/scandir64.c: New file
*sysdeps/unix/sysv/linux/csky/socket.S: New file
*sysdeps/unix/sysv/linux/csky/syscall.S: New file
*sysdeps/unix/sysv/linux/csky/syscalls.list: New file
*sysdeps/unix/sysv/linux/csky/versionsort64.c: New file
*sysdeps/unix/sysv/linux/csky/vfork.S: New file
*sysdeps/unix/sysv/linux/csky/xstat.c: New file
*sysdeps/unix/sysv/linux/csky/____longjmp_chk.S: New file
---
sysdeps/unix/sysv/linux/csky/____longjmp_chk.S | 129 ++++++++++++++++++
sysdeps/unix/sysv/linux/csky/abiv2_brk.c | 56 ++++++++
sysdeps/unix/sysv/linux/csky/abiv2_clone.S | 133 ++++++++++++++++++
sysdeps/unix/sysv/linux/csky/abiv2_getcontext.S | 72 ++++++++++
sysdeps/unix/sysv/linux/csky/abiv2_mmap.S | 62 +++++++++
sysdeps/unix/sysv/linux/csky/abiv2_setcontext.S | 95 +++++++++++++
sysdeps/unix/sysv/linux/csky/abiv2_socket.S | 152 +++++++++++++++++++++
sysdeps/unix/sysv/linux/csky/abiv2_syscall.S | 69 ++++++++++
sysdeps/unix/sysv/linux/csky/abiv2_vfork.S | 45 +++++++
sysdeps/unix/sysv/linux/csky/alphasort64.c | 1 +
sysdeps/unix/sysv/linux/csky/brk.c | 61 +++++++++
sysdeps/unix/sysv/linux/csky/clone.S | 125 +++++++++++++++++
sysdeps/unix/sysv/linux/csky/ftruncate64.c | 41 ++++++
sysdeps/unix/sysv/linux/csky/fxstat.c | 1 +
sysdeps/unix/sysv/linux/csky/fxstatat.c | 1 +
sysdeps/unix/sysv/linux/csky/getcontext.S | 108 +++++++++++++++
sysdeps/unix/sysv/linux/csky/getdents64.c | 1 +
sysdeps/unix/sysv/linux/csky/libc-read_tp.S | 1 +
sysdeps/unix/sysv/linux/csky/lockf64.c | 1 +
sysdeps/unix/sysv/linux/csky/lxstat.c | 2 +
sysdeps/unix/sysv/linux/csky/mmap.S | 65 +++++++++
sysdeps/unix/sysv/linux/csky/pt-vfork.S | 50 +++++++
sysdeps/unix/sysv/linux/csky/read_tp.S | 47 +++++++
sysdeps/unix/sysv/linux/csky/readahead.c | 44 ++++++
sysdeps/unix/sysv/linux/csky/readdir64.c | 1 +
sysdeps/unix/sysv/linux/csky/readdir64_r.c | 1 +
sysdeps/unix/sysv/linux/csky/scandir64.c | 1 +
sysdeps/unix/sysv/linux/csky/socket.S | 171 ++++++++++++++++++++++++
sysdeps/unix/sysv/linux/csky/syscall.S | 61 +++++++++
sysdeps/unix/sysv/linux/csky/syscalls.list | 7 +
sysdeps/unix/sysv/linux/csky/versionsort64.c | 1 +
sysdeps/unix/sysv/linux/csky/vfork.S | 49 +++++++
sysdeps/unix/sysv/linux/csky/xstat.c | 1 +
33 files changed, 1655 insertions(+)
create mode 100644 sysdeps/unix/sysv/linux/csky/____longjmp_chk.S
create mode 100644 sysdeps/unix/sysv/linux/csky/abiv2_brk.c
create mode 100644 sysdeps/unix/sysv/linux/csky/abiv2_clone.S
create mode 100644 sysdeps/unix/sysv/linux/csky/abiv2_getcontext.S
create mode 100644 sysdeps/unix/sysv/linux/csky/abiv2_mmap.S
create mode 100644 sysdeps/unix/sysv/linux/csky/abiv2_setcontext.S
create mode 100644 sysdeps/unix/sysv/linux/csky/abiv2_socket.S
create mode 100644 sysdeps/unix/sysv/linux/csky/abiv2_syscall.S
create mode 100644 sysdeps/unix/sysv/linux/csky/abiv2_vfork.S
create mode 100644 sysdeps/unix/sysv/linux/csky/alphasort64.c
create mode 100644 sysdeps/unix/sysv/linux/csky/brk.c
create mode 100644 sysdeps/unix/sysv/linux/csky/clone.S
create mode 100644 sysdeps/unix/sysv/linux/csky/ftruncate64.c
create mode 100644 sysdeps/unix/sysv/linux/csky/fxstat.c
create mode 100644 sysdeps/unix/sysv/linux/csky/fxstatat.c
create mode 100644 sysdeps/unix/sysv/linux/csky/getcontext.S
create mode 100644 sysdeps/unix/sysv/linux/csky/getdents64.c
create mode 100644 sysdeps/unix/sysv/linux/csky/libc-read_tp.S
create mode 100644 sysdeps/unix/sysv/linux/csky/lockf64.c
create mode 100644 sysdeps/unix/sysv/linux/csky/lxstat.c
create mode 100644 sysdeps/unix/sysv/linux/csky/mmap.S
create mode 100644 sysdeps/unix/sysv/linux/csky/pt-vfork.S
create mode 100644 sysdeps/unix/sysv/linux/csky/read_tp.S
create mode 100644 sysdeps/unix/sysv/linux/csky/readahead.c
create mode 100644 sysdeps/unix/sysv/linux/csky/readdir64.c
create mode 100644 sysdeps/unix/sysv/linux/csky/readdir64_r.c
create mode 100644 sysdeps/unix/sysv/linux/csky/scandir64.c
create mode 100644 sysdeps/unix/sysv/linux/csky/socket.S
create mode 100644 sysdeps/unix/sysv/linux/csky/syscall.S
create mode 100644 sysdeps/unix/sysv/linux/csky/syscalls.list
create mode 100644 sysdeps/unix/sysv/linux/csky/versionsort64.c
create mode 100644 sysdeps/unix/sysv/linux/csky/vfork.S
create mode 100644 sysdeps/unix/sysv/linux/csky/xstat.c
diff --git a/sysdeps/unix/sysv/linux/csky/____longjmp_chk.S b/sysdeps/unix/sysv/linux/csky/____longjmp_chk.S
new file mode 100644
index 0000000..1b8e954
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/____longjmp_chk.S
@@ -0,0 +1,129 @@
+/* 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 <sysdep.h>
+
+ .section .rodata.str1.8,"aMS",@progbits,1
+ .align 2
+ .type longjmp_msg,@object
+longjmp_msg:
+ .string "longjmp causes uninitialized stack frame"
+ .size longjmp_msg, .-longjmp_msg
+ .text
+
+#define __longjmp ____longjmp_chk
+
+#ifdef __PIC__
+# ifdef __CSKYABIV2__
+# define CALL_FAIL \
+ subi sp, 8; \
+ stw gb, (sp, 0); \
+ grs gb, .Lgetpc1; \
+.Lgetpc1: \
+ lrw t0, .Lgetpc1@GOTPC; \
+ addu gb, gb, t0; \
+ lrw a0, longjmp_msg@GOTOFF; \
+ addu a0, a0, gb; \
+ lrw t0, (HIDDEN_JUMPTARGET(__fortify_fail))@PLT; \
+ ldr.w t0, (gb, t0 << 0); \
+ jsr t0; \
+ ldw gb, (sp, 0); \
+ addi sp, 8;
+# else /* __CSKYABIV2__ */
+# define CALL_FAIL \
+ subi sp, 8; \
+ stw gb, (sp); \
+ stw r15, (sp, 4); \
+ bsr .Lgetpc2; \
+.Lgetpc2: \
+ lrw gb, .Lgetpc2@GOTPC; \
+ add gb, r15; \
+ lrw a0, longjmp_msg@GOTOFF; \
+ addu a0, gb; \
+ lrw r7, (HIDDEN_JUMPTARGET(__fortify_fail))@PLT; \
+ add r7, gb; \
+ ldw r7, (r7); \
+ jsr r7; \
+ ldw gb, (sp, 0); \
+ ldw r15,(sp, 4); \
+ addi sp, 8;
+# endif /* __CSKYABIV2__ */
+#else /* __PIC__ */
+# define CALL_FAIL \
+ lrw a0, longjmp_msg; \
+ jsri HIDDEN_JUMPTARGET(__fortify_fail);
+#endif/* __PIC__ */
+
+#ifdef __CSKYABIV2__
+# define CHECK_SP(reg) \
+ cmplt sp, reg; \
+ bt .Lok1; \
+ mov r9, a0; \
+ mov t0, r7; \
+ lrw r7, __NR_sigaltstack; \
+ movi a0, 0; \
+ subi sp, 12; /* sizeof (stack_t) */ \
+ mov a1, sp; \
+ trap 0; \
+ mov r7, t0; \
+ cmpnei a0, 0; \
+ bt .Lok; \
+ ldw a1, (sp, 4); \
+ btsti a1, 1; \
+ bt .Lfail; \
+ ldw a1, (sp, 0); \
+ ldw a3, (sp, 8); \
+ add a1, a3; \
+ sub a1, reg; \
+ cmphs a1, a3; \
+ bt .Lok; \
+.Lfail: \
+ addi sp, 12; \
+ CALL_FAIL \
+.Lok: \
+ mov a0, r9; \
+.Lok1:
+#else
+# define CHECK_SP(reg) \
+ cmplt sp, reg; \
+ bt .Lok1; \
+ mov r9, a0; \
+ lrw r1, __NR_sigaltstack; \
+ movi a0, 0; \
+ subi sp, 12; /* sizeof (stack_t) */ \
+ mov a1, sp; \
+ trap 0; \
+ cmpnei a0, 0; \
+ bt .Lok; \
+ ldw a1, (sp, 4); \
+ btsti a1, 1; \
+ bt .Lfail; \
+ ldw a1, (sp, 0); \
+ ldw a3, (sp, 8); \
+ add a1, a3; \
+ sub a1, reg; \
+ cmphs a1, a3; \
+ bt .Lok; \
+.Lfail: \
+ addi sp, 12; \
+ CALL_FAIL \
+.Lok: \
+ mov a0, r9; \
+.Lok1:
+#endif
+
+#include <__longjmp.S>
diff --git a/sysdeps/unix/sysv/linux/csky/abiv2_brk.c b/sysdeps/unix/sysv/linux/csky/abiv2_brk.c
new file mode 100644
index 0000000..a564276
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/abiv2_brk.c
@@ -0,0 +1,56 @@
+/* brk system call for Linux/C-SKY.
+ 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 <unistd.h>
+#include <sys/syscall.h>
+#include <errno.h>
+
+/* This must be initialized data because commons can't have aliases. */
+void * __curbrk = 0;
+
+/* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt
+ to work around different old braindamage in the old Linux/x86 ELF
+ dynamic linker. Sigh. */
+weak_alias (__curbrk, ___brk_addr)
+
+int __brk (void *addr)
+{
+ void *newbrk;
+
+ {
+ register long int res __asm__("a0") = (long int)addr;
+
+ __asm__ volatile ("lrw l3, %1\n\t"
+ "trap 0 \n\t"
+ :"+r" (res)
+ :"i" (__NR_brk)
+ :"l3");
+ newbrk = (void *) res;
+ }
+ __curbrk = newbrk;
+
+ if (newbrk < addr)
+ {
+ __set_errno (ENOMEM);
+ return -1;
+ }
+
+ return 0;
+}
+
+weak_alias (__brk, brk)
diff --git a/sysdeps/unix/sysv/linux/csky/abiv2_clone.S b/sysdeps/unix/sysv/linux/csky/abiv2_clone.S
new file mode 100644
index 0000000..2fd3605
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/abiv2_clone.S
@@ -0,0 +1,133 @@
+/* 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/>. */
+
+/* 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>
+#include <csky_readtp.h>
+
+#define CLONE_VM 8 /* 8 makes btsti easier, 0x00000100 in real */
+#define CLONE_THREAD 16 /* 0x00010000 in real */
+
+/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg,
+ pid_t *ptid, struct user_desc *tls, pid_t *ctid); */
+
+ .text
+ENTRY(__clone)
+ /* Sanity check arguments. */
+ cmpnei a0, 0 /* no NULL function pointers */
+ bf __error_arg
+ cmpnei a1, 0 /* no NULL function pointers */
+ bf __error_arg
+
+ subi a1, 8
+ stw a0, (a1, 0) /* insert the args onto the new stack */
+ stw a3, (a1, 4) /* insert the args onto the new stack */
+
+#ifdef RESET_PID
+ mov t0, a2 /* save a2(flags) */
+#endif
+ mov t1, r7 /* save r7 */
+ mov t2, r4 /* save r4 (has t2 ?)*/
+
+ mov a0, a2 /* arg1 = flags */
+ ldw a2, (sp, 0) /* arg3 = ptid */
+ ldw a3, (sp, 8) /* arg4 = ctid */
+ ldw r4, (sp, 4) /* arg5 = tls */
+ lrw r7, __NR_clone
+ trap 0
+
+ mov r7, t1 /* restore r7 */
+ mov r4, t2 /* restore r4 */
+ btsti a0, 31 /* is a0 less than zero? */
+ bt do_syscall_error
+ cmpnei a0, 0
+ bf 1f
+ rts
+PSEUDO_END (__clone)
+
+1:
+#ifdef RESET_PID
+ ldw a2, (sp, 0)
+ btsti t0, CLONE_THREAD /* judge flags */
+ bt 3f
+ csky_read_tp
+ mov a3, a0
+
+ btsti t0, CLONE_VM /* judge flags */
+ bmaski a0, 0 /* if CLONE_VM not set, pid=tid=-1 */
+ bt 2f
+ mov t1, r7
+ lrw r7, __NR_getpid /* else get pid via getpid syscall */
+ trap 0
+ mov r7, t1
+2:
+ lrw t0, PID_OFFSET
+ add t0, a3
+ stw a0, (t0) /* save pid */
+ lrw t0, TID_OFFSET
+ add t0, a3
+ stw a0, (t0) /* save tid */
+
+3:
+#endif /* RESET_PID */
+ ldw a0, (sp, 4) /* restore args from new sp */
+ ldw a1, (sp, 0) /* restore args from new sp */
+ addi sp, 8
+ jsr a1
+
+ /* exit */
+#ifdef __PIC__
+ grs t1, .Lgetpc1
+.Lgetpc1:
+ lrw t0, .Lgetpc1@GOTPC
+ addu t1, t1, t0
+ lrw t0, _exit@GOT
+ ldr.w t0, (t1, t0 << 0)
+#else
+ lrw t0, _exit /* exit */
+#endif /* __PIC__ */
+ jmp t0
+
+__error_arg:
+ lrw a0, -EINVAL
+
+do_syscall_error:
+#ifdef __PIC__
+ subi sp, 8
+ stw gb, (sp, 0)
+ stw r15, (sp, 4)
+ grs gb, .Lgetpc2
+.Lgetpc2:
+ lrw t0, .Lgetpc2@GOTPC
+ addu gb, gb, t0
+ lrw t0, __syscall_error@PLT
+ ldr.w t0, (gb, t0 << 0)
+ jsr t0
+ ldw gb, (sp, 0)
+ ldw r15, (sp, 4)
+ addi sp, 8
+#else
+ jmpi __syscall_error
+#endif /* __PIC__ */
+ rts
+
+libc_hidden_def (__clone)
+weak_alias (__clone, clone)
diff --git a/sysdeps/unix/sysv/linux/csky/abiv2_getcontext.S b/sysdeps/unix/sysv/linux/csky/abiv2_getcontext.S
new file mode 100644
index 0000000..c85cbac
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/abiv2_getcontext.S
@@ -0,0 +1,72 @@
+/* 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 <sysdep.h>
+
+#include "ucontext_i.h"
+
+/* int getcontext (ucontext_t *ucp) */
+
+ENTRY(__getcontext)
+ /* No need to save r2-r7 or a0-a3 */
+ mov t0, a0
+
+ addi a0, MCONTEXT_CSKY_R4
+
+ stm r4-r13, (a0) /* save r4-r13 */
+ stw sp, (t0, MCONTEXT_CSKY_SP) /* save sp */
+ stw r15, (t0, MCONTEXT_CSKY_LR) /* save lr */
+ stw r15, (t0, MCONTEXT_CSKY_PC) /* Return to PC */
+ addi a0, t0, MCONTEXT_CSKY_R16
+ stm r16-r31, (a0) /* save r16-r31 */
+ movi a0, 0
+ stw a0, (t0, MCONTEXT_CSKY_A0) /* Return zero */
+
+ subi sp, 8
+ stw t0, (sp, 0) /* save t0 after "save sp" */
+
+ /* __sigprocmask(SIG_BLOCK, NULL, &(ucontext->uc_sigmask)) */
+ movi a0, SIG_BLOCK
+ movi a1, 0
+ addi a2, t0, UCONTEXT_SIGMASK
+
+ /* do sigprocmask syscall */
+#ifdef __PIC__
+ subi sp, 8
+ stw gb, (sp, 0)
+ grs gb, .Lgetpc
+.Lgetpc:
+ lrw a3, .Lgetpc@GOTPC
+ addu gb, gb, a3
+ lrw a3, __sigprocmask@PLT
+ ldr.w a3, (gb, a3 << 0)
+ jsr a3
+ ldw gb, (sp, 0)
+ addi sp, 8
+#else
+ jsri __sigprocmask
+#endif
+
+ ldw t0, (sp, 0)
+ addi sp, 8
+ /* restore r15 for sigprocmask changes*/
+ ldw r15, (t0, MCONTEXT_CSKY_LR)
+ movi a0, 0 /* return 0 */
+ jmp r15
+END(__getcontext)
+
+weak_alias(__getcontext, getcontext)
diff --git a/sysdeps/unix/sysv/linux/csky/abiv2_mmap.S b/sysdeps/unix/sysv/linux/csky/abiv2_mmap.S
new file mode 100644
index 0000000..e759ba2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/abiv2_mmap.S
@@ -0,0 +1,62 @@
+/* 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 <sysdep.h>
+
+/* void *mmap(void *addr, size_t len, int prot, int flags,
+ int fildes, off_t off); */
+
+ENTRY (__mmap)
+ subi sp, 24
+ stm a0-a3, (sp) /* store arg1-arg4 */
+ ldw t0, (sp, 24)
+ stw t0, (sp, 16) /* store arg5 */
+ ldw t0, (sp, 28)
+ stw t0, (sp, 20) /* store arg6 */
+
+ mov t0, r7 /* save r7 */
+ lrw r7, __NR_mmap
+ mov a0, sp
+ trap 0
+ addi sp, sp, 24
+ mov r7, t0
+ lrw t0, 0xfffff000
+ cmphs a0, t0
+ bf 1f
+#ifdef __PIC__
+ subi sp, 8
+ stw gb, (sp, 0)
+ stw r15, (sp, 4)
+ grs gb, .Lgetpc
+.Lgetpc:
+ lrw t0, .Lgetpc@GOTPC
+ addu gb, gb, t0
+ lrw t0, __syscall_error@PLT
+ ldr.w t0, (gb, t0 << 0)
+ jsr t0
+ ldw gb, (sp, 0)
+ ldw r15, (sp, 4)
+ addi sp, 8
+#else
+ jmpi __syscall_error
+#endif /* __PIC__ */
+1:
+ rts
+PSEUDO_END (__mmap)
+
+weak_alias (__mmap, mmap)
+libc_hidden_builtin_def (__mmap)
diff --git a/sysdeps/unix/sysv/linux/csky/abiv2_setcontext.S b/sysdeps/unix/sysv/linux/csky/abiv2_setcontext.S
new file mode 100644
index 0000000..d6c0d64
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/abiv2_setcontext.S
@@ -0,0 +1,95 @@
+/* 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 <sysdep.h>
+
+#include "ucontext_i.h"
+
+/* int setcontext (const ucontext_t *ucp) */
+
+ENTRY(__setcontext)
+ mov t0, a0
+ subi sp, 8
+ stw a0, (sp, 0)
+
+ /* set sigmask */
+ movi a0, SIG_SETMASK
+ addi a1, t0, UCONTEXT_SIGMASK
+ movi a2, 0
+
+ /* do sigprocmask syscall */
+#ifdef __PIC__
+ subi sp, 8
+ stw gb, (sp, 0)
+ grs gb, .Lgetpc1
+.Lgetpc1:
+ lrw a3, .Lgetpc1@GOTPC
+ addu gb, gb, a3
+ lrw a3, __sigprocmask@PLT
+ ldr.w a3, (gb, a3 << 0)
+ jsr a3
+ ldw gb, (sp, 0)
+ addi sp, 8
+#else
+ jsri __sigprocmask
+#endif /* __PIC__ */
+
+ ldw t0, (sp, 0)
+ addi sp, 8
+ /* set r0-r11. Load a0-a3, for makecontext requires */
+ addi t1, t0, MCONTEXT_CSKY_A0
+ ldm r0-r11, (t1)
+ ldw sp, (t0, MCONTEXT_CSKY_SP) /* load sp */
+ ldw r15, (t0, MCONTEXT_CSKY_LR) /* load lr */
+ ldw t0, (t0, MCONTEXT_CSKY_PC) /* load start addr */
+ jmp t0
+END(setcontext)
+weak_alias(__setcontext, setcontext)
+
+ENTRY(__startcontext)
+ mov a0, r9
+ cmpnei r9, 0 /* r9 was set in makecontext */
+ bf 1f /* null, then exit */
+
+ /* call setcontext */
+#ifdef __PIC__
+ grs t1, .Lgetpc2
+.Lgetpc2:
+ lrw t0, .Lgetpc2@GOTPC
+ addu t1, t1, t0
+ lrw t0, __setcontext@GOT
+ ldr.w t0, (t1, t0 << 0)
+#else
+ lrw t0, __setcontext
+#endif
+ jsr t0
+
+1:
+ /* call _exit */
+#ifdef __PIC__
+ grs t1, .Lgetpc3
+.Lgetpc3:
+ lrw t0, .Lgetpc3@GOTPC
+ addu t1, t1, t0
+ lrw t0, _exit@GOT
+ ldr.w t0, (t1, t0 << 0)
+#else
+ lrw t0, _exit
+#endif
+ jsr t0
+
+END(__startcontext)
diff --git a/sysdeps/unix/sysv/linux/csky/abiv2_socket.S b/sysdeps/unix/sysv/linux/csky/abiv2_socket.S
new file mode 100644
index 0000000..f2b8ca8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/abiv2_socket.S
@@ -0,0 +1,152 @@
+/* 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 <sysdep-cancel.h>
+#include <socketcall.h>
+
+#define P(a, b) P2(a, b)
+#define P2(a, b) a##b
+
+/* The socket-oriented system calls are handled unusally in Linux.
+ They are all gated through the single `socketcall' system call number.
+ `socketcall' takes two arguments: the first is the subcode, specifying
+ which socket function is being called; and the second is a pointer to
+ the arguments to the specific function.
+
+ The .S files for the other calls just #define socket and #include this. */
+
+#ifndef NARGS
+#ifdef socket
+#error NARGS not defined
+#endif
+#define NARGS 3
+#endif
+
+#ifndef __socket
+# ifndef NO_WEAK_ALIAS
+# define __socket P(__,socket)
+# else
+# define __socket socket
+# endif
+#endif
+
+ENTRY (__socket)
+ subi sp, 32
+ .cfi_def_cfa_offset 32
+#if NARGS >= 1
+ stw a0, (sp, 0)
+#endif
+
+#if NARGS >= 2
+ stw a1, (sp, 4)
+#endif
+
+#if NARGS >= 3
+ stw a2, (sp, 8)
+#endif
+
+#if NARGS >= 4
+ stw a3, (sp, 12)
+#endif
+
+#if NARGS >= 5
+ ldw t0, (sp, 32)
+ stw t0, (sp, 16)
+#endif
+
+#if NARGS >= 6
+ ldw t0, (sp, 36)
+ stw t0, (sp, 20)
+#endif
+
+#if defined NEED_CANCELLATION && defined CENABLE
+ stw r15, (sp, 24)
+ .cfi_offset 15, -8
+ stw gb, (sp, 28)
+ .cfi_offset 28, -4
+ SINGLE_THREAD_P
+ bt .Lsocket_cancel
+#endif
+
+ mov t0, r7
+ lrw r7, __NR_socketcall
+ movi a0, P(SOCKOP_, socket)
+ mov a1, sp
+ trap 0
+ cfi_remember_state
+ .cfi_def_cfa_offset 40
+ addi sp, 32
+ .cfi_def_cfa_offset 0
+ mov r7, t0
+ PSEUDO_RET
+
+#if defined NEED_CANCELLATION && defined CENABLE
+.Lsocket_cancel:
+ /* GET GB */
+ cfi_restore_state
+ grs gb, .Lgetpc
+.Lgetpc:
+ lrw t0, .Lgetpc@GOTPC
+ addu gb, t0
+
+ CENABLE
+ mov t1, a0 /* save CENABLE return value */
+ mov t0, r7
+ lrw r7, __NR_socketcall
+ movi a0, P(SOCKOP_, socket)
+ mov a1, sp
+ trap 0
+ stw a0, (sp, 0)
+ mov r7, t0
+ mov a0, t1
+ CDISABLE
+ ldw a0, (sp, 0)
+ ldw r15, (sp, 24)
+ .cfi_restore 15
+ ldw gb, (sp, 28)
+ .cfi_restore 28
+ addi sp, 32
+ .cfi_def_cfa_offset 0
+ btsti a0, 31
+ bf 3f
+#ifdef __PIC__
+ subi sp, 8
+ stw gb, (sp, 0)
+ stw r15, (sp, 4)
+ /* must cal gb here, gb used by SYSCALL_ERROR ,why? FIXME */
+ grs gb, .Lgetpc2
+.Lgetpc2:
+ lrw t0, .Lgetpc2@GOTPC
+ addu gb, gb, t0
+
+ bsr SYSCALL_ERROR
+ ldw r15, (sp, 4)
+ ldw gb, (sp, 0)
+ addi sp, 8
+#else
+ jmpi SYSCALL_ERROR
+#endif
+3:
+ rts
+#endif
+
+PSEUDO_END(__socket)
+
+libc_hidden_def (__socket)
+#ifndef NO_WEAK_ALIAS
+weak_alias (__socket, socket)
+#endif
diff --git a/sysdeps/unix/sysv/linux/csky/abiv2_syscall.S b/sysdeps/unix/sysv/linux/csky/abiv2_syscall.S
new file mode 100644
index 0000000..90218bf
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/abiv2_syscall.S
@@ -0,0 +1,69 @@
+/* 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 <sysdep.h>
+
+/* long syscall(long sysnum, long a, long b, long c, long d, long e, long f) */
+
+ENTRY (syscall)
+ subi sp, 8
+ stw r4, (sp, 0)
+ stw r5, (sp, 4)
+
+ mov t0, r7
+ mov r7, a0 /* r7 = sysnum */
+
+ mov a0, a1 /* arg1 = a */
+ mov a1, a2 /* arg2 = b */
+ mov a2, a3 /* arg3 = c */
+ ldw a3, (sp, 8) /* arg4 = d */
+ ldw r4, (sp, 12) /* arg5 = e */
+ ldw r5, (sp, 16) /* arg6 = f */
+ trap 0
+
+ mov r7, t0
+
+ ldw r4, (sp, 0)
+ ldw r5, (sp, 4)
+ addi sp, 8
+
+ lrw t0, 0xfffff000
+ cmphs a0, t0
+ bt do_syscall_error
+ rts
+PSEUDO_END (syscall)
+
+do_syscall_error:
+#ifdef __PIC__
+ subi sp, 8
+ stw gb, (sp, 0)
+ stw lr, (sp, 4)
+ grs gb, .Lgetpc
+.Lgetpc:
+ lrw t0, .Lgetpc@GOTPC
+ addu gb, gb, t0
+ lrw t0, __syscall_error@PLT
+ ldr.w t0, (gb, t0 << 0)
+ jsr t0
+ ldw gb, (sp, 0)
+ ldw lr, (sp, 4)
+ addi sp, 8
+#else
+ jmpi __syscall_error
+#endif /* __PIC__ */
+ rts
+
diff --git a/sysdeps/unix/sysv/linux/csky/abiv2_vfork.S b/sysdeps/unix/sysv/linux/csky/abiv2_vfork.S
new file mode 100644
index 0000000..88cdc8a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/abiv2_vfork.S
@@ -0,0 +1,45 @@
+/* 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 <sysdep.h>
+#define _ERRNO_H 1
+#include <bits/errno.h>
+
+/* Clone the calling process, but without copying the whole address space.
+ The calling process is suspended until the new process exits or is
+ replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
+ and the process ID of the new process to the old process. */
+
+ENTRY (__vfork)
+#ifdef SAVE_PID
+ SAVE_PID
+#endif
+ mov t0, r7
+ lrw r7, __NR_vfork
+ trap 0
+ mov r7, t0
+#ifdef RESTORE_PID
+ RESTORE_PID
+#endif
+ PSEUDO_RET
+ rts
+
+PSEUDO_END (__vfork)
+libc_hidden_def (__vfork)
+
+weak_alias (__vfork, vfork)
+strong_alias (__vfork, __libc_vfork)
diff --git a/sysdeps/unix/sysv/linux/csky/alphasort64.c b/sysdeps/unix/sysv/linux/csky/alphasort64.c
new file mode 100644
index 0000000..0b5ae47
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/alphasort64.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/alphasort64.c>
diff --git a/sysdeps/unix/sysv/linux/csky/brk.c b/sysdeps/unix/sysv/linux/csky/brk.c
new file mode 100644
index 0000000..00d42c2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/brk.c
@@ -0,0 +1,61 @@
+/* brk system call for Linux/C-SKY.
+ 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/>. */
+
+#ifdef __CSKYABIV2__
+# include "abiv2_brk.c"
+#else
+
+#include <unistd.h>
+#include <sys/syscall.h>
+#include <errno.h>
+
+/* This must be initialized data because commons can't have aliases. */
+void * __curbrk = 0;
+
+/* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt
+ to work around different old braindamage in the old Linux/x86 ELF
+ dynamic linker. Sigh. */
+weak_alias (__curbrk, ___brk_addr)
+
+int __brk (void *addr)
+{
+ void *newbrk;
+
+ {
+ register long int res __asm__("r2") = (long int)addr;
+
+ __asm__ volatile ("lrw r1, %1\n\t"
+ "trap 0\n\t"
+ :"+r" (res)
+ :"i" (__NR_brk) :"r1");
+ newbrk = (void *) res;
+ }
+ __curbrk = newbrk;
+
+ if (newbrk < addr)
+ {
+ __set_errno (ENOMEM);
+ return -1;
+ }
+
+ return 0;
+}
+
+weak_alias (__brk, brk)
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/csky/clone.S b/sysdeps/unix/sysv/linux/csky/clone.S
new file mode 100644
index 0000000..67ac7d1
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/clone.S
@@ -0,0 +1,125 @@
+/* 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/>. */
+
+/* clone() is even more special than fork() as it mucks with stacks
+ and invokes a function in the right context after its all over. */
+
+#ifdef __CSKYABIV2__
+# include "abiv2_clone.S"
+#else
+
+# include <sysdep.h>
+# define _ERRNO_H 1
+# include <bits/errno.h>
+# include <csky_readtp.h>
+
+# define CLONE_VM 8 /* 11 makes btsti easier, 0x00000100 in real */
+# define CLONE_THREAD 16 /* 0x00010000 in real */
+
+/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg,
+ pid_t *ptid, struct user_desc *tls, pid_t *ctid); */
+
+ .text
+ENTRY(__clone)
+ /* Sanity check arguments. */
+ cmpnei r2, 0
+ bf __error_arg /* no NULL function pointers */
+ cmpnei r3, 0
+ bf __error_arg /* no NULL function pointers */
+
+ subi r3, 8
+ stw r2, (r3, 0) /* insert the args onto the new stack */
+ stw r5, (r3, 4) /* insert the args onto the new stack */
+
+ ldw r5, (sp, 0) /* arg4 = ctid */
+# ifdef RESET_PID
+ subi r3, 8
+ stw r4, (r3, 0x0) /* save r4(flags) */
+# endif
+
+ mov r2, r4 /* arg1 = flags */
+ mov r4, r6 /* arg3 = ptid */
+ mov r6, r7 /* arg5 = tls */
+ lrw r1, __NR_clone /* do syscall */
+ trap 0
+
+ btsti r2, 31 /* is r2 less than zero? */
+ bt do_syscall_error
+ cmpnei r2, 0
+ bf 1f
+ rts
+PSEUDO_END (__clone)
+
+1:
+# ifdef RESET_PID
+ ld.w r4, (sp, 0x0)
+ btsti r4, CLONE_THREAD /* judge flags */
+ bt 3f
+ csky_read_tp
+ mov r6, r2
+
+ btsti r4, CLONE_VM /* judge flags */
+ bmaski r2, 0 /* if CLONE_VM not set, pid=tid=-1 */
+ bt 2f
+ lrw r1, __NR_getpid /* else get pid via getpid syscall */
+ trap 0
+2:
+ lrw r7, PID_OFFSET
+ add r7, r6
+ stw r2, (r7) /* save pid */
+ lrw r7, TID_OFFSET
+ add r7, r6
+ stw r2, (r7) /* save tid */
+3:
+ addi sp, 8
+# endif /* RESET_PID */
+ ldw r2, (sp, 4) /* restore args from new sp */
+ ldw r3, (sp, 0) /* restore args from new sp */
+ addi sp, 8
+
+ jsr r3
+ lrw r1, __NR_exit
+ trap 0
+
+__error_arg:
+ lrw r2, -EINVAL
+
+do_syscall_error:
+# ifdef __PIC__
+ subi sp, 8
+ stw gb, (sp, 0)
+ stw r15, (sp, 4)
+ bsr .Lgetpc
+.Lgetpc:
+ lrw gb, .Lgetpc@GOTPC
+ addu gb, r15
+ lrw r7, __syscall_error@PLT
+ addu r7, gb
+ ldw r7, (r7)
+ jsr r7
+ ldw gb, (sp, 0)
+ ldw r15, (sp, 4)
+ addi sp, 8
+# else
+ jmpi __syscall_error
+# endif /* __PIC__ */
+ rts
+
+libc_hidden_def (__clone)
+weak_alias (__clone, clone)
+
+#endif /* __CSKYABIV2__*/
diff --git a/sysdeps/unix/sysv/linux/csky/ftruncate64.c b/sysdeps/unix/sysv/linux/csky/ftruncate64.c
new file mode 100644
index 0000000..47c38e6
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/ftruncate64.c
@@ -0,0 +1,41 @@
+/* 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/types.h>
+#include <errno.h>
+#include <endian.h>
+#include <unistd.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+
+/* Truncate the file FD refers to to LENGTH bytes. */
+int
+__ftruncate64 (int fd, off64_t length)
+{
+ unsigned int low = length & 0xffffffff;
+ unsigned int high = length >> 32;
+#ifdef __CSKYABIV2__
+ int result = INLINE_SYSCALL (ftruncate64, 3, fd,
+ __LONG_LONG_PAIR (high, low));
+#else
+ int result = INLINE_SYSCALL (ftruncate64, 4, fd, 0,
+ __LONG_LONG_PAIR (high, low));
+#endif
+ return result;
+}
+weak_alias (__ftruncate64, ftruncate64)
diff --git a/sysdeps/unix/sysv/linux/csky/fxstat.c b/sysdeps/unix/sysv/linux/csky/fxstat.c
new file mode 100644
index 0000000..4f219f0
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/fxstat.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fxstat.c>
diff --git a/sysdeps/unix/sysv/linux/csky/fxstatat.c b/sysdeps/unix/sysv/linux/csky/fxstatat.c
new file mode 100644
index 0000000..0f8b313
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/fxstatat.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fxstatat.c>
diff --git a/sysdeps/unix/sysv/linux/csky/getcontext.S b/sysdeps/unix/sysv/linux/csky/getcontext.S
new file mode 100644
index 0000000..447c15b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/getcontext.S
@@ -0,0 +1,108 @@
+/* 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/>. */
+
+#ifdef __CSKYABIV2__
+#include "abiv2_getcontext.S"
+#else
+
+#include <sysdep.h>
+
+#include "ucontext_i.h"
+
+/* int getcontext (ucontext_t *ucp) */
+
+ENTRY(__getcontext)
+ /* No need to save r2-r7 or a0-a3 */
+ mov r7, r2
+
+ /* return zero */
+ lrw r2, MCONTEXT_CSKY_A0
+ add r2, r7
+ movi r1, 0
+ stw r1, (r2)
+
+ lrw r2, MCONTEXT_CSKY_R8
+ add r2, r7
+ stw r8, (r2, 0) /* save r8 */
+ stw r9, (r2, 4) /* save r9 */
+ stw r10, (r2, 8) /* save r10 */
+ stw r11, (r2, 12) /* save r11 */
+ stw r12, (r2, 16) /* save r12 */
+ stw r13, (r2, 20) /* save r13 */
+ stw r14, (r2, 24) /* save r14 */
+ stw r15, (r2, 28) /* save lr */
+
+
+ lrw r2, MCONTEXT_CSKY_SP
+ add r2, r7
+ stw sp, (r2) /* save sp */
+
+ lrw r2, MCONTEXT_CSKY_LR
+ add r2, r7
+ stw r15, (r2) /* Return to LR */
+
+ lrw r2, MCONTEXT_CSKY_PC
+ add r2, r7
+ stw r15, (r2) /* Return to LR */
+
+ lrw r2, MCONTEXT_CSKY_A0
+ add r2, r7
+ movi r3, 0
+ stw r3, (r2) /* Return zero */
+
+ /* __sigprocmask(SIG_BLOCK, NULL, &(ucontext->uc_sigmask)) */
+ lrw r2, SIG_BLOCK
+ movi r3, 0
+ lrw r4, UCONTEXT_SIGMASK
+ add r4, r7
+
+ subi sp, 8
+ stw r7, (sp, 0)
+
+ /* do sigprocmask syscall */
+#ifdef __PIC__
+ subi sp, 8
+ stw gb, (sp, 0)
+ stw lr, (sp, 4)
+ bsr .Lgetpc
+.Lgetpc:
+ lrw gb, .Lgetpc@GOTPC
+ addu gb, r15
+ lrw r7, __sigprocmask@PLT
+ addu r7, gb
+ ldw r7, (r7)
+ jsr r7
+ ldw gb, (sp, 0)
+ ldw lr, (sp, 4)
+ addi sp, 8
+#else
+ jsri __sigprocmask
+#endif
+
+ ldw r7, (sp, 0)
+ addi sp, 8
+ lrw r2, MCONTEXT_CSKY_LR
+ add r2, r7
+ /* restore r15 for sigprocmask changes */
+ ldw r15, (r2)
+ movi r2, 0 /* return 0 */
+ jmp r15
+END(__getcontext)
+
+weak_alias(__getcontext, getcontext)
+
+#endif /* __CSKYABIV2__*/
diff --git a/sysdeps/unix/sysv/linux/csky/getdents64.c b/sysdeps/unix/sysv/linux/csky/getdents64.c
new file mode 100644
index 0000000..0c75fb5
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/getdents64.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getdents64.c>
diff --git a/sysdeps/unix/sysv/linux/csky/libc-read_tp.S b/sysdeps/unix/sysv/linux/csky/libc-read_tp.S
new file mode 100644
index 0000000..ca9d2b8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/libc-read_tp.S
@@ -0,0 +1 @@
+#include <read_tp.S>
diff --git a/sysdeps/unix/sysv/linux/csky/lockf64.c b/sysdeps/unix/sysv/linux/csky/lockf64.c
new file mode 100644
index 0000000..a88f5a7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/lockf64.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/lockf64.c>
diff --git a/sysdeps/unix/sysv/linux/csky/lxstat.c b/sysdeps/unix/sysv/linux/csky/lxstat.c
new file mode 100644
index 0000000..2371cd9
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/lxstat.c
@@ -0,0 +1,2 @@
+#include <sysdeps/unix/sysv/linux/i386/lxstat.c>
+
diff --git a/sysdeps/unix/sysv/linux/csky/mmap.S b/sysdeps/unix/sysv/linux/csky/mmap.S
new file mode 100644
index 0000000..0d27ba5
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/mmap.S
@@ -0,0 +1,65 @@
+/* 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/>. */
+
+#ifdef __CSKYABIV2__
+# include "abiv2_mmap.S"
+#else
+
+#include <sysdep.h>
+
+/*void *mmap(void *addr, size_t len, int prot, int flags,
+ int fildes, off_t off); */
+ENTRY (__mmap)
+ subi sp, 24
+ stw r2, (sp, 0)
+ stw r3, (sp, 4)
+ stw r4, (sp, 8)
+ stw r5, (sp, 12)
+ stw r6, (sp, 16)
+ stw r7, (sp, 20)
+ mov r2, sp
+ lrw r1, __NR_mmap
+ trap 0
+ addi sp, 24
+ lrw r3, 0xfffff000
+ cmphs r2, r3
+ bf 1f
+#ifdef __PIC__
+ subi sp, 8
+ stw gb, (sp, 0)
+ stw r15, (sp, 4)
+ bsr .Lgetpc
+.Lgetpc:
+ lrw gb, .Lgetpc@GOTPC
+ addu gb, r15
+ lrw r7, __syscall_error@PLT
+ addu r7, gb
+ ldw r7, (r7)
+ jsr r7
+ ldw gb, (sp, 0)
+ ldw r15, (sp, 4)
+ addi sp, 8
+#else
+ jmpi __syscall_error
+#endif /* __PIC__ */
+1:
+ rts
+PSEUDO_END (__mmap)
+
+weak_alias (__mmap, mmap)
+libc_hidden_builtin_def (__mmap)
+#endif /* __CSKYABVI2__*/
diff --git a/sysdeps/unix/sysv/linux/csky/pt-vfork.S b/sysdeps/unix/sysv/linux/csky/pt-vfork.S
new file mode 100644
index 0000000..9bbd34c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/pt-vfork.S
@@ -0,0 +1,50 @@
+/* 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 <sysdep.h>
+#define _ERRNO_H 1
+#include <bits/errno.h>
+
+/* Clone the calling process, but without copying the whole address space.
+ The calling process is suspended until the new process exits or is
+ replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
+ and the process ID of the new process to the old process. */
+
+ENTRY (vfork_compat)
+#ifdef SAVE_PID
+ SAVE_PID
+#endif
+
+#ifdef __CSKYABIV2__
+ mov t0, r7
+ lrw r7, __NR_vfork
+ trap 0
+ mov r7, t0
+#else
+ lrw r1, __NR_vfork
+ trap 0
+#endif
+
+#ifdef RESTORE_PID
+ RESTORE_PID
+#endif
+ PSEUDO_RET
+ rts
+
+PSEUDO_END (vfork_compat)
+
+strong_alias (vfork_compat, vfork_compat2)
diff --git a/sysdeps/unix/sysv/linux/csky/read_tp.S b/sysdeps/unix/sysv/linux/csky/read_tp.S
new file mode 100644
index 0000000..99c6d1a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/read_tp.S
@@ -0,0 +1,47 @@
+/* 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 <features.h>
+#include <sysdep.h>
+
+/* This function is exported from libc for use by user code. libpthread, librt,
+ and the dynamic linker get their own private copies, for
+ performance (and in the case of ld.so, out of necessity); those are
+ all hidden. */
+
+/*
+ * __read_tp
+ * clobbe r0, others had to be saved
+ *
+ */
+#if IS_IN (libc)
+ .global __read_tp
+#else
+ .hidden __read_tp
+#endif
+#ifdef __CSKYABIV2__
+ENTRY (__read_tp)
+ mov r0, r31
+ rts
+END (__read_tp)
+#else
+ENTRY (__read_tp)
+ trap 3
+ rts
+END (__read_tp)
+#endif
+
diff --git a/sysdeps/unix/sysv/linux/csky/readahead.c b/sysdeps/unix/sysv/linux/csky/readahead.c
new file mode 100644
index 0000000..47c44c3
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/readahead.c
@@ -0,0 +1,44 @@
+/* Provide kernel hint to read ahead.
+ 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 <errno.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <endian.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+
+ssize_t
+__readahead (int fd, off64_t offset, size_t count)
+{
+#ifdef __CSKYABVI2__
+ return INLINE_SYSCALL (readahead, 4, fd,
+ __LONG_LONG_PAIR ((off_t) (offset >> 32),
+ (off_t) (offset & 0xffffffff)),
+ count);
+#else
+ return INLINE_SYSCALL (readahead, 5, fd, 0,
+ __LONG_LONG_PAIR ((off_t) (offset >> 32),
+ (off_t) (offset & 0xffffffff)),
+ count);
+
+#endif
+}
+
+weak_alias (__readahead, readahead)
diff --git a/sysdeps/unix/sysv/linux/csky/readdir64.c b/sysdeps/unix/sysv/linux/csky/readdir64.c
new file mode 100644
index 0000000..2ea26dd
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/readdir64.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/readdir64.c>
diff --git a/sysdeps/unix/sysv/linux/csky/readdir64_r.c b/sysdeps/unix/sysv/linux/csky/readdir64_r.c
new file mode 100644
index 0000000..9f54f89
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/readdir64_r.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/readdir64_r.c>
diff --git a/sysdeps/unix/sysv/linux/csky/scandir64.c b/sysdeps/unix/sysv/linux/csky/scandir64.c
new file mode 100644
index 0000000..506fd88
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/scandir64.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/scandir64.c>
diff --git a/sysdeps/unix/sysv/linux/csky/socket.S b/sysdeps/unix/sysv/linux/csky/socket.S
new file mode 100644
index 0000000..3ceb232
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/socket.S
@@ -0,0 +1,171 @@
+/* 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/>. */
+
+#ifdef __CSKYABIV2__
+#include "abiv2_socket.S"
+#else
+
+#include <sysdep-cancel.h>
+#include <socketcall.h>
+
+#define P(a, b) P2(a, b)
+#define P2(a, b) a##b
+
+/* The socket-oriented system calls are handled unusally in Linux.
+ They are all gated through the single `socketcall' system call number.
+ `socketcall' takes two arguments: the first is the subcode, specifying
+ which socket function is being called; and the second is a pointer to
+ the arguments to the specific function.
+
+ The .S files for the other calls just #define socket and #include this. */
+
+#ifndef NARGS
+#ifdef socket
+#error NARGS not defined
+#endif
+#define NARGS 3
+#endif
+
+#ifndef __socket
+# ifndef NO_WEAK_ALIAS
+# define __socket P(__,socket)
+# else
+# define __socket socket
+# endif
+#endif
+
+ENTRY (__socket)
+ subi sp, 32
+ subi sp, 8
+ .cfi_def_cfa_offset 40
+#if NARGS >= 1
+ stw r2, (sp, 0)
+ .cfi_offset 2, -40
+#endif
+
+#if NARGS >= 2
+ stw r3, (sp, 4)
+ .cfi_offset 3, -36
+#endif
+
+#if NARGS >= 3
+ stw r4, (sp, 8)
+ .cfi_offset 4, -32
+#endif
+
+#if NARGS >= 4
+ stw r5, (sp, 12)
+ .cfi_offset 5, -28
+#endif
+
+#if NARGS >= 5
+ stw r6, (sp, 16)
+ .cfi_offset 6, -24
+#endif
+
+#if NARGS >= 6
+ stw r7, (sp, 20)
+ .cfi_offset 7, -20
+#endif
+
+#if defined NEED_CANCELLATION && defined CENABLE
+ stw r15, (sp, 24)
+ .cfi_offset 15, -16
+ st.w r14, (sp, 28)
+ .cfi_offset 14, -12
+ st.w r9, (sp, 32)
+ .cfi_offset 9, -8
+ SINGLE_THREAD_P
+ bt .Lsocket_cancel
+#endif
+
+ lrw r1, __NR_socketcall
+ movi r2, P(SOCKOP_, socket)
+ mov r3, sp
+ trap 0
+ cfi_remember_state
+ .cfi_def_cfa_offset 40
+ addi sp, 32
+ addi sp, 8
+ .cfi_def_cfa_offset 0
+ mov r1, r15
+ PSEUDO_RET
+
+#if defined NEED_CANCELLATION && defined CENABLE
+.Lsocket_cancel:
+ cfi_restore_state
+ /* GET GB */
+ bsr 1f
+1:
+ lrw r14, 1b@GOTPC
+ add r14, lr
+
+ CENABLE
+ mov r4, r2 /* save CENABLE return value */
+ lrw r1, __NR_socketcall
+ movi r2, P(SOCKOP_, socket)
+ mov r3, sp
+ trap 0
+ mov r9, r2 /* (sp,0) save r9 */
+ mov r2, r4
+ CDISABLE
+ mov r2, r9
+ ldw r15, (sp, 24)
+ .cfi_restore 15
+ ldw r14, (sp, 28)
+ .cfi_restore 14
+ ldw r9, (sp, 32)
+ .cfi_restore 9
+ addi sp, 32
+ addi sp, 8
+ .cfi_def_cfa_offset 0
+ btsti r2, 31
+ bf 3f
+#ifdef __PIC__
+ subi sp, 8
+ .cfi_def_cfa_offset 8
+ stw gb, (sp, 0)
+ .cfi_offset 14, -8
+ stw r15, (sp, 4)
+ .cfi_offset 15, -4
+ bsr .Lgetpc
+.Lgetpc:
+ lrw gb, .Lgetpc@GOTPC
+ addu gb, r15
+ lrw r7, SYSCALL_ERROR@GOTOFF
+ addu r7, gb
+ jsr r7
+ ldw gb, (sp, 0)
+ ldw r15, (sp, 4)
+ addi sp, 8
+ .cfi_def_cfa_offset 0
+#else
+ jmpi SYSCALL_ERROR
+#endif
+
+3:
+ rts
+#endif
+
+PSEUDO_END (__socket)
+
+libc_hidden_def (__socket)
+#ifndef NO_WEAK_ALIAS
+weak_alias (__socket, socket)
+#endif
+
+#endif /* __CSKYABIV2__*/
diff --git a/sysdeps/unix/sysv/linux/csky/syscall.S b/sysdeps/unix/sysv/linux/csky/syscall.S
new file mode 100644
index 0000000..9b700a3
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/syscall.S
@@ -0,0 +1,61 @@
+/* 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/>. */
+
+#ifdef __CSKYABIV2__
+# include "abiv2_syscall.S"
+#else
+
+# include <sysdep.h>
+
+ENTRY (syscall)
+ mov r1, r2 /* syscall num */
+
+ mov r2, r3 /* arg1 */
+ mov r3, r4 /* arg2 */
+ mov r4, r5 /* arg3 */
+ mov r5, r6 /* arg4*/
+ mov r6, r7 /* arg5*/
+ ld r7, (sp, 0) /* arg6 */
+ trap 0
+ lrw r3, 0xfffff000
+ cmphs r2, r3
+ bt do_syscall_error
+ rts
+PSEUDO_END (syscall)
+
+do_syscall_error:
+# ifdef __PIC__
+ subi sp, 8
+ stw gb, (sp, 0)
+ stw r15, (sp, 4)
+ bsr .Lgetpc
+.Lgetpc:
+ lrw gb, .Lgetpc@GOTPC
+ addu gb, r15
+ lrw r7, __syscall_error@PLT
+ addu r7, gb
+ ldw r7, (r7)
+ jsr r7
+ ldw gb, (sp, 0)
+ ldw r15, (sp, 4)
+ addi sp, 8
+# else
+ jmpi __syscall_error
+# endif /* __PIC__ */
+ rts
+
+#endif /* __CSKYABVI2__ */
diff --git a/sysdeps/unix/sysv/linux/csky/syscalls.list b/sysdeps/unix/sysv/linux/csky/syscalls.list
new file mode 100644
index 0000000..53cff69
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/syscalls.list
@@ -0,0 +1,7 @@
+# File name Caller Syscall name Args Strong name Weak names
+
+chown - chown32 i:sii __chown chown
+cacheflush - cacheflush i:pii _flush_cache cacheflush
+
+prlimit64 EXTRA prlimit64 i:iipp prlimit64
+fanotify_mark EXTRA fanotify_mark i:iiiiis fanotify_mark
diff --git a/sysdeps/unix/sysv/linux/csky/versionsort64.c b/sysdeps/unix/sysv/linux/csky/versionsort64.c
new file mode 100644
index 0000000..144b691
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/versionsort64.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/versionsort64.c>
diff --git a/sysdeps/unix/sysv/linux/csky/vfork.S b/sysdeps/unix/sysv/linux/csky/vfork.S
new file mode 100644
index 0000000..913ca00
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/vfork.S
@@ -0,0 +1,49 @@
+/* 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/>. */
+
+#ifdef __CSKYABIV2__
+# include "abiv2_vfork.S"
+#else
+
+# include <sysdep.h>
+# define _ERRNO_H 1
+# include <bits/errno.h>
+
+/* Clone the calling process, but without copying the whole address space.
+ The calling process is suspended until the new process exits or is
+ replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
+ and the process ID of the new process to the old process. */
+
+ENTRY (__vfork)
+# ifdef SAVE_PID
+ SAVE_PID
+# endif
+ lrw r1, __NR_vfork
+ trap 0
+# ifdef RESTORE_PID
+ RESTORE_PID
+# endif
+ PSEUDO_RET
+ rts
+
+PSEUDO_END (__vfork)
+libc_hidden_def (__vfork)
+
+weak_alias (__vfork, vfork)
+strong_alias (__vfork, __libc_vfork)
+
+#endif /* __CSKYABIV2__*/
diff --git a/sysdeps/unix/sysv/linux/csky/xstat.c b/sysdeps/unix/sysv/linux/csky/xstat.c
new file mode 100644
index 0000000..e9869f5
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/xstat.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/xstat.c>
--
2.7.4
^ permalink raw reply [flat|nested] 22+ messages in thread
* [RFC PATCH 05/10] C-SKY: Linux Startup and Dynamic Loading Code
2018-03-16 9:59 [RFC PATCH 00/10] port C-SKY to glibc Mao Han
@ 2018-03-16 9:59 ` Mao Han
2018-03-16 14:37 ` Carlos O'Donell
2018-03-16 9:59 ` [RFC PATCH 02/10] C-SKY: TLS support Mao Han
` (9 subsequent siblings)
10 siblings, 1 reply; 22+ messages in thread
From: Mao Han @ 2018-03-16 9:59 UTC (permalink / raw)
To: libc-help; +Cc: han_mao, ren_guo, yunhai_shang, qijie_tong, chunqiang_li
This contains the Linux-specific code for loading programs on C-SKY.
*elf/elf.h: Add C-SKY relocale
*sysdeps/csky/dl-machine.h: New file
*sysdeps/csky/dl-procinfo.c: New file
*sysdeps/csky/dl-procinfo.h: New file
*sysdeps/csky/dl-sysdep.h: New file
*sysdeps/csky/dl-tlsdesc.h: New file
*sysdeps/csky/ldsodefs.h: New file
*sysdeps/csky/linkmap.h: New file
*sysdeps/csky/sotruss-lib.c: New file
*sysdeps/unix/sysv/linux/csky/ldconfig.h: New file
Signed-off-by: Mao Han <han_mao@c-sky.com>
---
elf/elf.h | 61 +++++
sysdeps/csky/dl-machine.h | 471 ++++++++++++++++++++++++++++++++
sysdeps/csky/dl-procinfo.c | 62 +++++
sysdeps/csky/dl-procinfo.h | 59 ++++
sysdeps/csky/dl-sysdep.h | 23 ++
sysdeps/csky/dl-tlsdesc.h | 61 +++++
sysdeps/csky/ldsodefs.h | 42 +++
sysdeps/csky/linkmap.h | 5 +
sysdeps/csky/sotruss-lib.c | 49 ++++
sysdeps/unix/sysv/linux/csky/ldconfig.h | 24 ++
10 files changed, 857 insertions(+)
create mode 100644 sysdeps/csky/dl-machine.h
create mode 100644 sysdeps/csky/dl-procinfo.c
create mode 100644 sysdeps/csky/dl-procinfo.h
create mode 100644 sysdeps/csky/dl-sysdep.h
create mode 100644 sysdeps/csky/dl-tlsdesc.h
create mode 100644 sysdeps/csky/ldsodefs.h
create mode 100644 sysdeps/csky/linkmap.h
create mode 100644 sysdeps/csky/sotruss-lib.c
create mode 100644 sysdeps/unix/sysv/linux/csky/ldconfig.h
diff --git a/elf/elf.h b/elf/elf.h
index 4f43577..6ac0a36 100644
--- a/elf/elf.h
+++ b/elf/elf.h
@@ -3013,6 +3013,67 @@ enum
/* Keep this the last entry. */
#define R_ARM_NUM 256
+/* csky */
+#define R_CKCORE_NONE 0 /* */
+#define R_CKCORE_ADDR32 1 /* */
+#define R_CKCORE_PCRELIMM8BY4 2 /* */
+#define R_CKCORE_PCRELIMM11BY2 3 /* */
+#define R_CKCORE_PCRELIMM4BY2 4 /* */
+#define R_CKCORE_PCREL32 5 /* */
+#define R_CKCORE_PCRELJSR_IMM11BY2 6 /* */
+#define R_CKCORE_GNU_VTINHERIT 7 /* */
+#define R_CKCORE_GNU_VTENTRY 8 /* */
+#define R_CKCORE_RELATIVE 9 /* */
+#define R_CKCORE_COPY 10 /* */
+#define R_CKCORE_GLOB_DAT 11 /* */
+#define R_CKCORE_JUMP_SLOT 12 /* */
+#define R_CKCORE_GOTOFF 13 /* */
+#define R_CKCORE_GOTPC 14 /* */
+#define R_CKCORE_GOT32 15 /* */
+#define R_CKCORE_PLT32 16 /* */
+#define R_CKCORE_ADDRGOT 17 /* */
+#define R_CKCORE_ADDRPLT 18 /* */
+#define R_CKCORE_PCREL_IMM26BY2 19 /* */
+#define R_CKCORE_PCREL_IMM16BY2 20 /* */
+#define R_CKCORE_PCREL_IMM16BY4 21 /* */
+#define R_CKCORE_PCREL_IMM10BY2 22 /* */
+#define R_CKCORE_PCREL_IMM10BY4 23 /* */
+#define R_CKCORE_ADDR_HI16 24 /* */
+#define R_CKCORE_ADDR_LO16 25 /* */
+#define R_CKCORE_GOTPC_HI16 26 /* */
+#define R_CKCORE_GOTPC_LO16 27 /* */
+#define R_CKCORE_GOTOFF_HI16 28 /* */
+#define R_CKCORE_GOTOFF_LO16 29 /* */
+#define R_CKCORE_GOT12 30 /* */
+#define R_CKCORE_GOT_HI16 31 /* */
+#define R_CKCORE_GOT_LO16 32 /* */
+#define R_CKCORE_PLT12 33 /* */
+#define R_CKCORE_PLT_HI16 34 /* */
+#define R_CKCORE_PLT_LO16 35 /* */
+#define R_CKCORE_ADDRGOT_HI16 36 /* */
+#define R_CKCORE_ADDRGOT_LO16 37 /* */
+#define R_CKCORE_ADDRPLT_HI16 38 /* */
+#define R_CKCORE_ADDRPLT_LO16 39 /* */
+#define R_CKCORE_PCREL_JSR_IMM26BY2 40 /* */
+#define R_CKCORE_TOFFSET_LO16 41 /* */
+#define R_CKCORE_DOFFSET_LO16 42 /* */
+#define R_CKCORE_PCREL_IMM18BY2 43 /* */
+#define R_CKCORE_DOFFSET_IMM18 44 /* */
+#define R_CKCORE_DOFFSET_IMM18BY2 45 /* */
+#define R_CKCORE_DOFFSET_IMM18BY4 46 /* */
+#define R_CKCORE_GOTOFF_IMM18 47 /* */
+#define R_CKCORE_GOT_IMM18BY4 48 /* */
+#define R_CKCORE_PLT_IMM18BY4 49 /* */
+#define R_CKCORE_PCREL_IMM7BY4 50 /* */
+#define R_CKCORE_TLS_LE32 51
+#define R_CKCORE_TLS_IE32 52
+#define R_CKCORE_TLS_GD32 53
+#define R_CKCORE_TLS_LDM32 54
+#define R_CKCORE_TLS_LDO32 55
+#define R_CKCORE_TLS_DTPMOD32 56
+#define R_CKCORE_TLS_DTPOFF32 57
+#define R_CKCORE_TLS_TPOFF32 58
+
/* IA-64 specific declarations. */
/* Processor specific flags for the Ehdr e_flags field. */
diff --git a/sysdeps/csky/dl-machine.h b/sysdeps/csky/dl-machine.h
new file mode 100644
index 0000000..f38d2c6
--- /dev/null
+++ b/sysdeps/csky/dl-machine.h
@@ -0,0 +1,471 @@
+/* Machine-dependent ELF dynamic relocation inline functions. C-SKY 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/>. */
+
+#ifndef dl_machine_h
+#define dl_machine_h
+
+#define ELF_MACHINE_NAME "csky"
+
+#include <sys/param.h>
+#include <sysdep.h>
+#include <dl-tls.h>
+
+/* Return nonzero iff ELF header is compatible with the running host. */
+static inline int
+elf_machine_matches_host (const Elf32_Ehdr *ehdr)
+{
+ return 1;
+}
+
+/* Return the link-time address of _DYNAMIC.
+ This must be inlined in a function which uses global data. */
+static inline Elf32_Addr
+elf_machine_dynamic (void)
+{
+ register Elf32_Addr *got __asm__ ("gb"); /* need modify */
+ return *got;
+}
+
+/* Return the run-time load address ,of the shared object. */
+static inline Elf32_Addr
+elf_machine_load_address (void)
+{
+#ifdef __CSKYABIV2__
+ extern Elf32_Addr __dl_start (void *) asm ("_dl_start");
+ Elf32_Addr got_addr = (Elf32_Addr) &__dl_start;
+ Elf32_Addr pcrel_addr;
+ asm ("grs %0,_dl_start\n" : "=r" (pcrel_addr));
+#else
+ extern Elf32_Addr __start_flag (void *) asm ("start_flag");
+ Elf32_Addr got_addr = (Elf32_Addr) &__start_flag;
+ Elf32_Addr pcrel_addr;
+ asm ("subi sp,8\n" \
+ "stw lr,(sp,0)\n" \
+ "bsr start_flag\n" \
+ "start_flag:" \
+ "mov %0, lr\n" \
+ "ldw lr,(sp,0)\n" \
+ "addi sp,8\n" \
+ : "=r" (pcrel_addr));
+#endif
+ return pcrel_addr - got_addr;
+}
+
+
+/* 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__ ((always_inline))
+elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
+{
+ Elf32_Addr *got;
+ extern void _dl_runtime_resolve (Elf32_Word);
+ extern void _dl_runtime_profile (Elf32_Word);
+
+ if (l->l_info[DT_JMPREL] && lazy)
+ {
+ /* 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 .rela.plt section, push
+ _GLOBAL_OFFSET_TABLE_[1], and then jump to
+ _GLOBAL_OFFSET_TABLE_[2]. */
+ got = (Elf32_Addr *) D_PTR (l, l_info[DT_PLTGOT]);
+
+ if (got[1])
+ l->l_mach.plt = got[1] + l->l_addr;
+ got[1] = (Elf32_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. */
+ got[2] = (Elf32_Addr) &_dl_runtime_resolve;
+ }
+ return lazy;
+}
+
+/* Mask identifying addresses reserved for the user program,
+ where the dynamic linker should not map anything. */
+#define ELF_MACHINE_USER_ADDRESS_MASK 0x80000000UL
+
+/* 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. */
+#ifdef __CSKYABIV2__
+#define RTLD_START asm ("\
+.text\n\
+.globl _start\n\
+.type _start, @function\n\
+.globl _dl_start_user\n\
+.type _dl_start_user, @function\n\
+_start:\n\
+ grs gb, .Lgetpc1\n\
+.Lgetpc1:\n\
+ lrw t0, .Lgetpc1@GOTPC\n\
+ addu gb, t0\n\
+ mov a0, sp\n\
+ lrw t1, _dl_start@GOTOFF\n\
+ addu t1, gb\n\
+ jsr t1\n\
+_dl_start_user:\n\
+ /* get _dl_skip_args */ \n\
+ lrw r11, _dl_skip_args@GOTOFF\n\
+ addu r11, gb\n\
+ ldw r11, (r11, 0)\n\
+ /* store program entry address in r11 */ \n\
+ mov r10, a0\n\
+ /* Get argc */\n\
+ ldw a1, (sp, 0)\n\
+ /* Get **argv */\n\
+ mov a2, sp\n\
+ addi a2, 4\n\
+ cmpnei r11, 0\n\
+ bt .L_fixup_stack\n\
+.L_done_fixup:\n\
+ mov a3, a1\n\
+ lsli a3, 2\n\
+ add a3, a2\n\
+ addi a3, 4\n\
+ lrw a0, _rtld_local@GOTOFF\n\
+ addu a0, gb\n\
+ ldw a0, (a0, 0)\n\
+ lrw t1, _dl_init@PLT\n\
+ addu t1, gb\n\
+ ldw t1, (t1)\n\
+ jsr t1\n\
+ lrw a0, _dl_fini@GOTOFF\n\
+ addu a0, gb\n\
+ jmp r10\n\
+.L_fixup_stack:\n\
+ subu a1, r11\n\
+ lsli r11, 2\n\
+ addu sp, r11\n\
+ stw a1, (sp, 0)\n\
+ mov a2, sp\n\
+ addi a2, 4\n\
+ lrw a3, _dl_argv@GOTOFF\n\
+ addu a3, gb\n\
+ stw a2, (a3, 0)\n\
+ br .L_done_fixup\n\
+");
+#else
+#define RTLD_START asm ("\
+.text\n\
+.globl _start\n\
+.type _start, @function\n\
+.globl _dl_start_user\n\
+.type _dl_start_user, @function\n\
+_start:\n\
+ bsr .Lgetpc1\n\
+.Lgetpc1:\n\
+ lrw gb, .Lgetpc1@GOTPC\n\
+ addu gb, lr\n\
+ mov a0, sp\n\
+ lrw r7, _dl_start@GOTOFF\n\
+ addu r7, gb\n\
+ jsr r7\n\
+_dl_start_user:\n\
+ /* get _dl_skip_args */ \n\
+ lrw r8, _dl_skip_args@GOTOFF\n\
+ addu r8, gb\n\
+ ldw r8, (r8, 0)\n\
+ /* store program entry address in r11 */ \n\
+ mov r11, a0\n\
+ /* Get argc */\n\
+ ldw a1, (sp, 0)\n\
+ /* Get **argv */\n\
+ mov a2, sp\n\
+ addi a2, 4\n\
+ cmpnei r8, 0\n\
+ bt .L_fixup_stack\n\
+.L_done_fixup:\n\
+ mov a3, a1\n\
+ lsli a3, 2\n\
+ addu a3, a2\n\
+ addi a3, 4\n\
+ lrw a0, _rtld_local@GOTOFF\n\
+ addu a0, gb\n\
+ ldw a0, (a0, 0)\n\
+ lrw r7, _dl_init@PLT\n\
+ addu r7, gb\n\
+ ldw r7, (r7)\n\
+ jsr r7\n\
+ lrw a0, _dl_fini@GOTOFF\n\
+ addu a0, gb\n\
+ jmp r11\n\
+.L_fixup_stack:\n\
+ subu a1, r8\n\
+ stw a1, (sp, 0)\n\
+ mov a3, a2\n\
+ lsli r8, 2\n\
+ addu r8, a2\n\
+1: ldw r10, (r8, 0)\n\
+ stw r10, (a3, 0)\n\
+ addi r8, 4\n\
+ addi a3, 4\n\
+ cmpnei r10, 0\n\
+ bt 1b\n\
+1: ldw r10, (r8, 0)\n\
+ stw r10, (a3, 0)\n\
+ addi r8, 4\n\
+ addi a3, 4\n\
+ cmpnei r10, 0\n\
+ bt 1b\n\
+ subi r8, 4\n\
+1: ldw a0, (r8, 0)\n\
+ cmpnei a0, 0\n\
+ ldw r10,(r8, 4)\n\
+ stw a0, (a3, 0)\n\
+ stw r10, (a3, 4)\n\
+ addi a3, 8\n\
+ addi r8, 8\n\
+ ldw a0, (r8, 0)\n\
+ ldw r10,(r8, 4)\n\
+ stw a0, (a3, 0)\n\
+ stw r10, (a3, 4)\n\
+ addi a3, 8\n\
+ addi r8, 8\n\
+ ldw a0, (r8, 0)\n\
+ ldw r10,(r8, 4)\n\
+ stw a0, (a3, 0)\n\
+ stw r10, (a3, 4)\n\
+ addi a3, 8\n\
+ addi r8, 8\n\
+ bt 1b\n\
+ lrw a3, _dl_argv@GOTOFF\n\
+ addu a3, gb\n\
+ stw a2, (a3, 0)\n\
+ br .L_done_fixup\n\
+");
+#endif
+
+/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry or
+ TLS variable, so undefined references should not be allowed to
+ define the value.
+ ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
+ of the main executable's symbols, as for a COPY reloc. */
+#ifndef RTLD_BOOTSTRAP
+# define elf_machine_type_class(type) \
+ ((((type) == R_CKCORE_JUMP_SLOT || (type) == R_CKCORE_TLS_DTPMOD32 \
+ || (type) == R_CKCORE_TLS_DTPOFF32 || (type) == R_CKCORE_TLS_TPOFF32) \
+ * ELF_RTYPE_CLASS_PLT) \
+ | (((type) == R_CKCORE_COPY) * ELF_RTYPE_CLASS_COPY))
+#else
+#define elf_machine_type_class(type) \
+ ((((type) == R_CKCORE_JUMP_SLOT \
+ | (((type) == R_CKCORE_COPY) * ELF_RTYPE_CLASS_COPY))
+#endif
+
+/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
+#define ELF_MACHINE_JMP_SLOT R_CKCORE_JUMP_SLOT
+
+/* The csky never uses Elf32_Rel relocations. */
+#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;
+}
+
+static inline Elf32_Addr
+elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+ const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
+ const Elf32_Rela *reloc,
+ Elf32_Addr *reloc_addr, Elf32_Addr value)
+{
+ return *reloc_addr = value;
+}
+
+/* Return the final value of a plt relocation. On the csky the JMP_SLOT
+ relocation ignores the addend. */
+static inline Elf32_Addr
+elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
+ Elf32_Addr value)
+{
+ return value;
+}
+
+/* Names of the architecture-specific auditing callback functions. */
+#define ARCH_LA_PLTENTER csky_gnu_pltenter
+#define ARCH_LA_PLTEXIT csky_gnu_pltexit
+
+#endif /* !dl_machine_h */
+#ifdef RESOLVE_MAP
+
+/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
+ MAP is the object containing the reloc. */
+
+auto inline void __attribute__ ((unused, always_inline))
+elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
+ const Elf32_Sym *sym, const struct r_found_version *version,
+ void *const reloc_addr_arg, int skip_ifunc)
+{
+ Elf32_Addr *const reloc_addr = reloc_addr_arg;
+ const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
+ unsigned short __attribute__((unused)) *opcode16_addr;
+ Elf32_Addr __attribute__((unused)) insn_opcode = 0x0;
+
+ if (__builtin_expect (r_type == R_CKCORE_RELATIVE, 0))
+ *reloc_addr = map->l_addr + reloc->r_addend;
+ else
+ {
+ const Elf32_Sym *const refsym = sym;
+ struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
+ Elf32_Addr value = sym == NULL ? 0 : sym_map->l_addr + sym->st_value;
+ opcode16_addr = (unsigned short *)reloc_addr;
+
+ switch (r_type)
+ {
+ case R_CKCORE_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 void *) 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_CKCORE_GLOB_DAT:
+ case R_CKCORE_JUMP_SLOT:
+ *reloc_addr = value;
+ break;
+ case R_CKCORE_ADDR32:
+ *reloc_addr = value + reloc->r_addend;
+ break;
+ case R_CKCORE_PCRELIMM4BY2:
+ *(short *) reloc_addr
+ = value + reloc->r_addend - (Elf32_Addr) reloc_addr;
+ break;
+ case R_CKCORE_PCREL32:
+ *reloc_addr = value + reloc->r_addend - (Elf32_Addr) reloc_addr;
+ break;
+#if defined(__CK810__) || defined(__CK807__)
+ case R_CKCORE_ADDR_HI16:
+ insn_opcode = (*opcode16_addr << 16) | (*(opcode16_addr + 1));
+ insn_opcode = (insn_opcode & 0xffff0000)
+ | (((value + reloc->r_addend) >> 16) & 0xffff);
+ *(opcode16_addr++) = (unsigned short)(insn_opcode >> 16);
+ *opcode16_addr = (unsigned short)(insn_opcode & 0xffff);
+ break;
+ case R_CKCORE_ADDR_LO16:
+ insn_opcode = (*opcode16_addr << 16) | (*(opcode16_addr + 1));
+ insn_opcode = (insn_opcode & 0xffff0000)
+ | ((value + reloc->r_addend) & 0xffff);
+ *(opcode16_addr++) = (unsigned short)(insn_opcode >> 16);
+ *opcode16_addr = (unsigned short)(insn_opcode & 0xffff);
+ break;
+ case R_CKCORE_PCREL_IMM26BY2:
+ {
+ unsigned int offset = ((value + reloc->r_addend -
+ (unsigned int)reloc_addr) >> 1);
+ insn_opcode = (*opcode16_addr << 16) | (*(opcode16_addr + 1));
+ if (offset > 0x3ffffff){
+ const char *strtab;
+ strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
+
+ _dl_error_printf ("\
+%s:The reloc R_CKCORE_PCREL_IMM26BY2 cannot reach the symbol '%s'.\n",
+ rtld_progname ?: "<program name unknown>",
+ strtab + refsym->st_name);
+ break;
+ }
+ insn_opcode = (insn_opcode & ~0x3ffffff) | offset;
+ *(opcode16_addr++) = (unsigned short)(insn_opcode >> 16);
+ *opcode16_addr = (unsigned short)(insn_opcode & 0xffff);
+ break;
+ }
+ case R_CKCORE_PCREL_JSR_IMM26BY2:
+ break;
+#endif
+#ifndef RTLD_BOOTSTRAP
+ case R_CKCORE_TLS_DTPMOD32:
+ /* Get the information from the link map returned by the
+ resolv function. */
+ if (sym_map != NULL)
+ *reloc_addr = sym_map->l_tls_modid;
+ break;
+ case R_CKCORE_TLS_DTPOFF32:
+ if (sym != NULL)
+ *reloc_addr =(sym == NULL ? 0 : sym->st_value) + reloc->r_addend;
+ break;
+ case R_CKCORE_TLS_TPOFF32:
+ if (sym != NULL)
+ {
+ CHECK_STATIC_TLS (map, sym_map);
+ *reloc_addr = (sym->st_value + sym_map->l_tls_offset
+ + reloc->r_addend);
+ }
+ break;
+#endif /* !RTLD_BOOTSTRAP */
+ case R_CKCORE_NONE: /* Alright, Wilbur. */
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+auto inline void __attribute__ ((unused, always_inline))
+elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+ void *const reloc_addr_arg)
+{
+ Elf32_Addr *const reloc_addr = reloc_addr_arg;
+ *reloc_addr = l_addr + reloc->r_addend;
+}
+
+auto inline void __attribute__ ((unused, always_inline))
+elf_machine_lazy_rel (struct link_map *map,
+ Elf32_Addr l_addr, const Elf32_Rela *reloc,
+ int skip_ifunc)
+{
+ Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
+ const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
+ if (ELF32_R_TYPE (reloc->r_info) == R_CKCORE_JUMP_SLOT)
+ {
+ /* Check for unexpected PLT reloc type. */
+ if (__builtin_expect (r_type == R_CKCORE_JUMP_SLOT, 1))
+ {
+ if (__builtin_expect (map->l_mach.plt, 0) == 0)
+ *reloc_addr = l_addr+ reloc->r_addend;
+ else
+ *reloc_addr = map->l_mach.plt;
+ }
+ }
+}
+
+#endif /* RESOLVE_MAP */
diff --git a/sysdeps/csky/dl-procinfo.c b/sysdeps/csky/dl-procinfo.c
new file mode 100644
index 0000000..b0d0054
--- /dev/null
+++ b/sysdeps/csky/dl-procinfo.c
@@ -0,0 +1,62 @@
+/* Data for C-SKY version of processor capability information.
+ 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/>. */
+
+/* This information must be kept in sync with the _DL_PLATFORM_COUNT
+ definitions in procinfo.h.
+
+ If anything should be added here check whether the size of each string
+ is still ok with the given array size.
+
+ All the #ifdefs in the definitions are quite irritating but
+ necessary if we want to avoid duplicating the information. There
+ are three different modes:
+
+ - PROCINFO_DECL is defined. This means we are only interested in
+ declarations.
+
+ - PROCINFO_DECL is not defined:
+
+ + if SHARED is defined the file is included in an array
+ initializer. The .element = { ... } syntax is needed.
+
+ + if SHARED is not defined a normal array initialization is
+ needed.
+ */
+
+#ifndef PROCINFO_CLASS
+#define PROCINFO_CLASS
+#endif
+
+#if !defined PROCINFO_DECL && defined SHARED
+ ._dl_csky_platforms
+#else
+PROCINFO_CLASS const char _dl_csky_platforms[4][6]
+#endif
+#ifndef PROCINFO_DECL
+= {
+ "ck610", "ck807", "ck810", "ck860"
+ }
+#endif
+#if !defined SHARED || defined PROCINFO_DECL
+;
+#else
+,
+#endif
+
+#undef PROCINFO_DECL
+#undef PROCINFO_CLASS
diff --git a/sysdeps/csky/dl-procinfo.h b/sysdeps/csky/dl-procinfo.h
new file mode 100644
index 0000000..4e7abe7
--- /dev/null
+++ b/sysdeps/csky/dl-procinfo.h
@@ -0,0 +1,59 @@
+/* C-SKY version of processor capability information handling macros.
+ 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/>. */
+
+
+#ifndef _DL_PROCINFO_H
+#define _DL_PROCINFO_H 1
+
+#include <ldsodefs.h>
+
+/* Mask to filter out platforms. */
+#define _DL_HWCAP_PLATFORM (-1ULL)
+
+#define _DL_PLATFORMS_COUNT 4
+
+static inline int
+__attribute__ ((unused, always_inline))
+_dl_string_platform (const char *str)
+{
+ int i;
+
+ if (str != NULL)
+ for (i = 0; i < _DL_PLATFORMS_COUNT; ++i)
+ {
+ if (strcmp (str, GLRO(dl_csky_platforms)[i]) == 0)
+ return i;
+ }
+ return -1;
+};
+
+/* We cannot provide a general printing function. */
+#define _dl_procinfo(word, val) -1
+
+/* There are no hardware capabilities defined. */
+#define _dl_hwcap_string(idx) ""
+
+/* By default there is no important hardware capability. */
+#define HWCAP_IMPORTANT (0)
+
+/* We don't have any hardware capabilities. */
+#define _DL_HWCAP_COUNT 0
+
+#define _dl_string_hwcap(str) (-1)
+
+#endif /* dl-procinfo.h */
diff --git a/sysdeps/csky/dl-sysdep.h b/sysdeps/csky/dl-sysdep.h
new file mode 100644
index 0000000..7b3ab87
--- /dev/null
+++ b/sysdeps/csky/dl-sysdep.h
@@ -0,0 +1,23 @@
+/* System-specific settings for dynamic linker code. Alpha 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_next <dl-sysdep.h>
+
+/* _dl_argv cannot be attribute_relro, because _dl_start_user
+ might write into it after _dl_start returns. */
+#define DL_ARGV_NOT_RELRO 1
diff --git a/sysdeps/csky/dl-tlsdesc.h b/sysdeps/csky/dl-tlsdesc.h
new file mode 100644
index 0000000..16b2bb0
--- /dev/null
+++ b/sysdeps/csky/dl-tlsdesc.h
@@ -0,0 +1,61 @@
+/* Thread-local storage descriptor handling in the ELF dynamic linker.
+ CSKY 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/>. */
+
+#ifndef _CSKY_DL_TLSDESC_H
+#define _CSKY_DL_TLSDESC_H 1
+
+/* Type used to represent a TLS descriptor in the GOT. */
+struct tlsdesc
+{
+ union
+ {
+ void *pointer;
+ long value;
+ } argument;
+ ptrdiff_t (*entry)(struct tlsdesc *);
+};
+
+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 *),
+ _dl_tlsdesc_undefweak(struct tlsdesc *),
+ _dl_tlsdesc_resolve_hold(struct tlsdesc *),
+ _dl_tlsdesc_lazy_resolver(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
diff --git a/sysdeps/csky/ldsodefs.h b/sysdeps/csky/ldsodefs.h
new file mode 100644
index 0000000..b002808
--- /dev/null
+++ b/sysdeps/csky/ldsodefs.h
@@ -0,0 +1,42 @@
+/* Run-time dynamic linker data structures for loaded ELF shared objects.
+ 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/>. */
+
+#ifndef _CSKY_LDSODEFS_H
+#define _CSKY_LDSODEFS_H 1
+
+#include <elf.h>
+
+struct La_csky_regs;
+struct La_csky_retval;
+
+#define ARCH_PLTENTER_MEMBERS \
+ Elf32_Addr (*csky_gnu_pltenter) (Elf32_Sym *, unsigned int, \
+ uintptr_t *, uintptr_t *, \
+ struct La_csky_regs *, \
+ unsigned int *, const char *name, \
+ long int *framesizep);
+
+#define ARCH_PLTEXIT_MEMBERS \
+ unsigned int (*csky_gnu_pltexit) (Elf32_Sym *, unsigned int, \
+ uintptr_t *, uintptr_t *, \
+ const struct La_csky_regs *, \
+ struct La_csky_retval *, \
+ const char *);
+
+#include_next <ldsodefs.h>
+#endif
diff --git a/sysdeps/csky/linkmap.h b/sysdeps/csky/linkmap.h
new file mode 100644
index 0000000..7c2b4a6
--- /dev/null
+++ b/sysdeps/csky/linkmap.h
@@ -0,0 +1,5 @@
+struct link_map_machine
+ {
+ Elf32_Addr plt; /* Address of .plt */
+ void *tlsdesc_table; /* Address of TLS descriptor hash table. */
+ };
diff --git a/sysdeps/csky/sotruss-lib.c b/sysdeps/csky/sotruss-lib.c
new file mode 100644
index 0000000..dac947e
--- /dev/null
+++ b/sysdeps/csky/sotruss-lib.c
@@ -0,0 +1,49 @@
+/* Override generic sotruss-lib.c to define actual functions for CSKY.
+ 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 HAVE_ARCH_PLTENTER
+#define HAVE_ARCH_PLTEXIT
+
+#include <elf/sotruss-lib.c>
+
+ElfW(Addr)
+la_csky_gnu_pltenter (ElfW(Sym) *sym __attribute__ ((unused)),
+ unsigned int ndx __attribute__ ((unused)),
+ uintptr_t *refcook, uintptr_t *defcook,
+ La_csky_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_csky_gnu_pltexit (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook,
+ uintptr_t *defcook, const struct La_csky_regs *inregs,
+ struct La_csky_retval *outregs, const char *symname)
+{
+ print_exit (refcook, defcook, symname, outregs->lrv_v0);
+
+ return 0;
+}
diff --git a/sysdeps/unix/sysv/linux/csky/ldconfig.h b/sysdeps/unix/sysv/linux/csky/ldconfig.h
new file mode 100644
index 0000000..912a868
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/ldconfig.h
@@ -0,0 +1,24 @@
+/* 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 <sysdeps/generic/ldconfig.h>
+
+#define SYSDEP_KNOWN_INTERPRETER_NAMES \
+ { "/lib/ld-linux.so.2", FLAG_ELF_LIBC6 },
+#define SYSDEP_KNOWN_LIBRARY_NAMES \
+ { "libc.so.6", FLAG_ELF_LIBC6 }, \
+ { "libm.so.6", FLAG_ELF_LIBC6 },
--
2.7.4
^ permalink raw reply [flat|nested] 22+ messages in thread
* [RFC PATCH 06/10] C-SKY: Build Infastructure
2018-03-16 9:59 [RFC PATCH 00/10] port C-SKY to glibc Mao Han
` (7 preceding siblings ...)
2018-03-16 9:59 ` [RFC PATCH 10/10] C-SKY: Linux ABI Mao Han
@ 2018-03-16 9:59 ` Mao Han
2018-03-16 9:59 ` [RFC PATCH 09/10] C-SKY: Linux Syscall Interface Mao Han
2018-03-16 13:52 ` [RFC PATCH 00/10] port C-SKY to glibc Carlos O'Donell
10 siblings, 0 replies; 22+ messages in thread
From: Mao Han @ 2018-03-16 9:59 UTC (permalink / raw)
To: libc-help; +Cc: han_mao, ren_guo, yunhai_shang, qijie_tong, chunqiang_li
This patch contains all the implile, makefile and configure needed in
C-SKY porting.
*scripts/config.sub: Add C-SKY arch
*sysdeps/csky/Implies: New file
*sysdeps/csky/Makefile: New file
*sysdeps/csky/configure: New file
*sysdeps/csky/configure.ac: New file
*sysdeps/csky/tst-audit.h: New file
*sysdeps/csky/nptl/Makefile: New file
*sysdeps/csky/preconfigure: New file
*sysdeps/unix/sysv/linux/csky/configure: New file
*sysdeps/unix/sysv/linux/csky/configure.ac: New file
*sysdeps/unix/sysv/linux/csky/Implies: New file
*sysdeps/unix/sysv/linux/csky/Makefile: New file
Signed-off-by: Mao Han <han_mao@c-sky.com>
---
scripts/config.sub | 4 ++--
sysdeps/csky/Implies | 4 ++++
sysdeps/csky/Makefile | 32 +++++++++++++++++++++++++++++++
sysdeps/csky/configure | 4 ++++
sysdeps/csky/configure.ac | 4 ++++
sysdeps/csky/nptl/Makefile | 20 +++++++++++++++++++
sysdeps/csky/preconfigure | 5 +++++
sysdeps/csky/tst-audit.h | 24 +++++++++++++++++++++++
sysdeps/unix/sysv/linux/csky/Implies | 1 +
sysdeps/unix/sysv/linux/csky/Makefile | 28 +++++++++++++++++++++++++++
sysdeps/unix/sysv/linux/csky/configure | 5 +++++
sysdeps/unix/sysv/linux/csky/configure.ac | 6 ++++++
12 files changed, 135 insertions(+), 2 deletions(-)
create mode 100644 sysdeps/csky/Implies
create mode 100644 sysdeps/csky/Makefile
create mode 100644 sysdeps/csky/configure
create mode 100644 sysdeps/csky/configure.ac
create mode 100644 sysdeps/csky/nptl/Makefile
create mode 100644 sysdeps/csky/preconfigure
create mode 100644 sysdeps/csky/tst-audit.h
create mode 100644 sysdeps/unix/sysv/linux/csky/Implies
create mode 100644 sysdeps/unix/sysv/linux/csky/Makefile
create mode 100644 sysdeps/unix/sysv/linux/csky/configure
create mode 100644 sysdeps/unix/sysv/linux/csky/configure.ac
diff --git a/scripts/config.sub b/scripts/config.sub
index f2632cd..9550e57 100755
--- a/scripts/config.sub
+++ b/scripts/config.sub
@@ -254,7 +254,7 @@ case $basic_machine in
| ba \
| be32 | be64 \
| bfin \
- | c4x | c8051 | clipper \
+ | c4x | c8051 | clipper | csky \
| d10v | d30v | dlx | dsp16xx \
| e2k | epiphany \
| fido | fr30 | frv | ft32 \
@@ -378,7 +378,7 @@ case $basic_machine in
| be32-* | be64-* \
| bfin-* | bs2000-* \
| c[123]* | c30-* | [cjt]90-* | c4x-* \
- | c8051-* | clipper-* | craynv-* | cydra-* \
+ | c8051-* | clipper-* | craynv-* | csky-* | cydra-* \
| d10v-* | d30v-* | dlx-* \
| e2k-* | elxsi-* \
| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
diff --git a/sysdeps/csky/Implies b/sysdeps/csky/Implies
new file mode 100644
index 0000000..781a016
--- /dev/null
+++ b/sysdeps/csky/Implies
@@ -0,0 +1,4 @@
+wordsize-32
+# CSKY uses IEEE 754 floating point.
+ieee754/flt-32
+ieee754/dbl-64
diff --git a/sysdeps/csky/Makefile b/sysdeps/csky/Makefile
new file mode 100644
index 0000000..ca451e4
--- /dev/null
+++ b/sysdeps/csky/Makefile
@@ -0,0 +1,32 @@
+ifeq ($(subdir),csu)
+gen-as-const-headers += tcb-offsets.sym
+endif
+
+ifeq ($(subdir),misc)
+sysdep_headers += sysdep.h
+endif
+
+ifeq ($(subdir),signal)
+sysdep_headers += sysdep.h
+endif
+
+ifeq ($(subdir),debug)
+CFLAGS-backtrace.c += -funwind-tables
+endif
+
+ifeq ($(subdir),csu)
+CPPFLAGS-crti.S += $(pic-ccflag)
+CPPFLAGS-crtn.S += $(pic-ccflag)
+endif
+
+ifeq ($(subdir),nptl)
+CPPFLAGS-pt-crti.S += $(pic-ccflag)
+CPPFLAGS-crtn.S += $(pic-ccflag)
+endif
+
+ASFLAGS-.os += $(pic-ccflag)
+
+ifeq ($(subdir),gmon)
+sysdep_routines += csky-mcount
+endif
+
diff --git a/sysdeps/csky/configure b/sysdeps/csky/configure
new file mode 100644
index 0000000..53f5f1b
--- /dev/null
+++ b/sysdeps/csky/configure
@@ -0,0 +1,4 @@
+# This file is generated from configure.ac by Autoconf. DO NOT EDIT!
+ # Local configure fragment for sysdeps/riscv/elf.
+
+$as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h
diff --git a/sysdeps/csky/configure.ac b/sysdeps/csky/configure.ac
new file mode 100644
index 0000000..34f62d4
--- /dev/null
+++ b/sysdeps/csky/configure.ac
@@ -0,0 +1,4 @@
+GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
+# Local configure fragment for sysdeps/riscv/elf.
+
+AC_DEFINE(PI_STATIC_AND_HIDDEN)
diff --git a/sysdeps/csky/nptl/Makefile b/sysdeps/csky/nptl/Makefile
new file mode 100644
index 0000000..a80a979
--- /dev/null
+++ b/sysdeps/csky/nptl/Makefile
@@ -0,0 +1,20 @@
+# 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/>.
+
+ifeq ($(subdir),csu)
+gen-as-const-headers += tcb-offsets.sym
+endif
diff --git a/sysdeps/csky/preconfigure b/sysdeps/csky/preconfigure
new file mode 100644
index 0000000..2e507e6
--- /dev/null
+++ b/sysdeps/csky/preconfigure
@@ -0,0 +1,5 @@
+case "$machine" in
+csky*) base_machine=csky
+ machine=csky
+esac
+
diff --git a/sysdeps/csky/tst-audit.h b/sysdeps/csky/tst-audit.h
new file mode 100644
index 0000000..a88d099
--- /dev/null
+++ b/sysdeps/csky/tst-audit.h
@@ -0,0 +1,24 @@
+/* Definitions for testing PLT entry/exit auditing. C-SKY 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 pltenter la_csky_gnu_pltenter
+#define pltexit la_csky_gnu_pltexit
+#define La_regs La_csky_regs
+#define La_retval La_csky_retval
+#define int_retval lrv_reg[0]
+
diff --git a/sysdeps/unix/sysv/linux/csky/Implies b/sysdeps/unix/sysv/linux/csky/Implies
new file mode 100644
index 0000000..2259772
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/Implies
@@ -0,0 +1 @@
+csky/nptl
diff --git a/sysdeps/unix/sysv/linux/csky/Makefile b/sysdeps/unix/sysv/linux/csky/Makefile
new file mode 100644
index 0000000..230fe8e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/Makefile
@@ -0,0 +1,28 @@
+ifeq ($(subdir),csu)
+sysdep_routines += read_tp libc-read_tp
+static-only-routines += read_tp
+shared-only-routines += libc-read_tp
+endif
+
+ifeq ($(subdir),elf)
+sysdep-rtld-routines += read_tp
+endif
+
+ifeq ($(subdir),misc)
+sysdep_routines += cacheflush
+sysdep_headers += sys/cachectl.h
+endif
+
+ifeq ($(subdir),stdlib)
+gen-as-const-headers += ucontext_i.sym
+endif
+
+ifeq ($(subdir), csky)
+sysdep_headers += csky_readtp.h
+endif
+
+ifeq ($(subdir), malloc)
+libmemusage-routines += read_tp
+endif
+
+
diff --git a/sysdeps/unix/sysv/linux/csky/configure b/sysdeps/unix/sysv/linux/csky/configure
new file mode 100644
index 0000000..a3a7b81
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/configure
@@ -0,0 +1,5 @@
+# This file is generated from configure.ac by Autoconf. DO NOT EDIT!
+
+arch_minimum_kernel=2.6.25
+libc_cv_gcc_unwind_find_fde=no
+ldd_rewrite_script=sysdeps/unix/sysv/linux/ldd-rewrite.sed
diff --git a/sysdeps/unix/sysv/linux/csky/configure.ac b/sysdeps/unix/sysv/linux/csky/configure.ac
new file mode 100644
index 0000000..41746f8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/configure.ac
@@ -0,0 +1,6 @@
+GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
+# Local configure fragment for sysdeps/unix/sysv/linux/csky
+
+arch_minimum_kernel=2.6.25
+libc_cv_gcc_unwind_find_fde=no
+ldd_rewrite_script=sysdeps/unix/sysv/linux/ldd-rewrite.sed
--
2.7.4
^ permalink raw reply [flat|nested] 22+ messages in thread
* [RFC PATCH 04/10] C-SKY: Hard Float Support
2018-03-16 9:59 [RFC PATCH 00/10] port C-SKY to glibc Mao Han
` (4 preceding siblings ...)
2018-03-16 9:59 ` [RFC PATCH 01/10] C-SKY: ABI related code Mao Han
@ 2018-03-16 9:59 ` Mao Han
2018-03-16 14:15 ` Carlos O'Donell
2018-03-16 9:59 ` [RFC PATCH 07/10] C-SKY: Atomic and Locking Routines Mao Han
` (4 subsequent siblings)
10 siblings, 1 reply; 22+ messages in thread
From: Mao Han @ 2018-03-16 9:59 UTC (permalink / raw)
To: libc-help; +Cc: han_mao, ren_guo, yunhai_shang, qijie_tong, chunqiang_li
This patch contains hardware floating-point support for C-SKY.
*sysdeps/csky/fpu/fclrexcpt.c: New file
*sysdeps/csky/fpu/fedisblxcpt.c: New file
*sysdeps/csky/fpu/feenablxcpt.c: New file
*sysdeps/csky/fpu/fegetenv.c: New file
*sysdeps/csky/fpu/fegetexcept.c: New file
*sysdeps/csky/fpu/fegetmode.c: New file
*sysdeps/csky/fpu/fegetround.c: New file
*sysdeps/csky/fpu/feholdexcpt.c: New file
*sysdeps/csky/fpu/fenv_libc.h: New file
*sysdeps/csky/fpu/fesetenv.c: New file
*sysdeps/csky/fpu/fesetexcept.c: New file
*sysdeps/csky/fpu/fesetmode.c: New file
*sysdeps/csky/fpu/fesetround.c: New file
*sysdeps/csky/fpu/feupdateenv.c: New file
*sysdeps/csky/fpu/fgetexcptflg.c: New file
*sysdeps/csky/fpu/fraiseexcpt.c: New file
*sysdeps/csky/fpu/fsetexcptflg.c: New file
*sysdeps/csky/fpu/ftestexcept.c: New file
*sysdeps/csky/fpu_control.h: New file
Signed-off-by: Mao Han <han_mao@c-sky.com>
---
sysdeps/csky/fpu/fclrexcpt.c | 47 +++++++++++++
sysdeps/csky/fpu/fedisblxcpt.c | 46 ++++++++++++
sysdeps/csky/fpu/feenablxcpt.c | 45 ++++++++++++
sysdeps/csky/fpu/fegetenv.c | 43 ++++++++++++
sysdeps/csky/fpu/fegetexcept.c | 37 ++++++++++
sysdeps/csky/fpu/fegetmode.c | 29 ++++++++
sysdeps/csky/fpu/fegetround.c | 39 +++++++++++
sysdeps/csky/fpu/feholdexcpt.c | 39 +++++++++++
sysdeps/csky/fpu/fenv_libc.h | 29 ++++++++
sysdeps/csky/fpu/fesetenv.c | 65 +++++++++++++++++
sysdeps/csky/fpu/fesetexcept.c | 37 ++++++++++
sysdeps/csky/fpu/fesetmode.c | 37 ++++++++++
sysdeps/csky/fpu/fesetround.c | 42 +++++++++++
sysdeps/csky/fpu/feupdateenv.c | 52 ++++++++++++++
sysdeps/csky/fpu/fgetexcptflg.c | 37 ++++++++++
sysdeps/csky/fpu/fraiseexcpt.c | 131 +++++++++++++++++++++++++++++++++++
sysdeps/csky/fpu/fsetexcptflg.c | 48 +++++++++++++
sysdeps/csky/fpu/ftestexcept.c | 35 ++++++++++
sysdeps/csky/fpu_control.h | 150 ++++++++++++++++++++++++++++++++++++++++
19 files changed, 988 insertions(+)
create mode 100644 sysdeps/csky/fpu/fclrexcpt.c
create mode 100644 sysdeps/csky/fpu/fedisblxcpt.c
create mode 100644 sysdeps/csky/fpu/feenablxcpt.c
create mode 100644 sysdeps/csky/fpu/fegetenv.c
create mode 100644 sysdeps/csky/fpu/fegetexcept.c
create mode 100644 sysdeps/csky/fpu/fegetmode.c
create mode 100644 sysdeps/csky/fpu/fegetround.c
create mode 100644 sysdeps/csky/fpu/feholdexcpt.c
create mode 100644 sysdeps/csky/fpu/fenv_libc.h
create mode 100644 sysdeps/csky/fpu/fesetenv.c
create mode 100644 sysdeps/csky/fpu/fesetexcept.c
create mode 100644 sysdeps/csky/fpu/fesetmode.c
create mode 100644 sysdeps/csky/fpu/fesetround.c
create mode 100644 sysdeps/csky/fpu/feupdateenv.c
create mode 100644 sysdeps/csky/fpu/fgetexcptflg.c
create mode 100644 sysdeps/csky/fpu/fraiseexcpt.c
create mode 100644 sysdeps/csky/fpu/fsetexcptflg.c
create mode 100644 sysdeps/csky/fpu/ftestexcept.c
create mode 100644 sysdeps/csky/fpu_control.h
diff --git a/sysdeps/csky/fpu/fclrexcpt.c b/sysdeps/csky/fpu/fclrexcpt.c
new file mode 100644
index 0000000..d3bbaf0
--- /dev/null
+++ b/sysdeps/csky/fpu/fclrexcpt.c
@@ -0,0 +1,47 @@
+/* Clear given exceptions in current floating-point environment.
+ 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 <fenv.h>
+#include <fenv_libc.h>
+#include <fpu_control.h>
+
+int
+feclearexcept (int excepts)
+{
+#ifdef __csky_hard_float__
+ int fpsr;
+
+ /* Mask out unsupported bits/exceptions. */
+ excepts &= FE_ALL_EXCEPT;
+
+ /* Read the complete control word. */
+ _FPU_GETFPSR (fpsr);
+
+ /* Clear the relevant bits. */
+ fpsr &= ~(excepts | (excepts << CAUSE_SHIFT));
+
+ /* Put the new data in effect. */
+ _FPU_SETFPSR (fpsr);
+
+ return 0;
+#else
+ /* Unsupported, so fail unless nothing needs to be done. */
+ return (excepts != 0);
+#endif /* __csky_hard_float__ */
+}
+libm_hidden_def (feclearexcept)
diff --git a/sysdeps/csky/fpu/fedisblxcpt.c b/sysdeps/csky/fpu/fedisblxcpt.c
new file mode 100644
index 0000000..6a70c0e
--- /dev/null
+++ b/sysdeps/csky/fpu/fedisblxcpt.c
@@ -0,0 +1,46 @@
+/* Disable floating-point exceptions.
+ 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 <fenv.h>
+#include <fenv_libc.h>
+#include <fpu_control.h>
+
+int
+fedisableexcept (int excepts)
+{
+#ifdef __csky_hard_float__
+ unsigned int new_exc, old_exc;
+
+ /* Get the current control word. */
+ _FPU_GETCW (new_exc);
+
+ old_exc = (new_exc & ENABLE_MASK) >> ENABLE_SHIFT;
+
+ /* Get the except disable mask. */
+ excepts &= FE_ALL_EXCEPT;
+ new_exc &= ~(excepts << ENABLE_SHIFT);
+
+ /* Put the new data in effect. */
+ _FPU_SETCW (new_exc);
+
+ return old_exc;
+#else
+ /* Unsupported, so return -1 for failure. */
+ return -1;
+#endif /* __csky_hard_float__ */
+}
diff --git a/sysdeps/csky/fpu/feenablxcpt.c b/sysdeps/csky/fpu/feenablxcpt.c
new file mode 100644
index 0000000..21c1e77
--- /dev/null
+++ b/sysdeps/csky/fpu/feenablxcpt.c
@@ -0,0 +1,45 @@
+/* Enable floating-point exceptions.
+ 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 <fenv.h>
+#include <fenv_libc.h>
+#include <fpu_control.h>
+
+int
+feenableexcept (int excepts)
+{
+#ifdef __csky_hard_float__
+ unsigned int new_exc, old_exc;
+
+ /* Get the current control word. */
+ _FPU_GETCW (new_exc);
+
+ old_exc = (new_exc & ENABLE_MASK) >> ENABLE_SHIFT;
+
+ excepts &= FE_ALL_EXCEPT;
+
+ new_exc |= excepts << ENABLE_SHIFT;
+
+ _FPU_SETCW (new_exc);
+
+ return old_exc;
+#else
+ /* Unsupported, so return -1 for failure. */
+ return -1;
+#endif /* __csky_hard_float__ */
+}
diff --git a/sysdeps/csky/fpu/fegetenv.c b/sysdeps/csky/fpu/fegetenv.c
new file mode 100644
index 0000000..5828c99
--- /dev/null
+++ b/sysdeps/csky/fpu/fegetenv.c
@@ -0,0 +1,43 @@
+/* Store current floating-point environment.
+ 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 <fenv.h>
+#include <fpu_control.h>
+
+int
+__fegetenv (fenv_t *envp)
+{
+#ifdef __csky_hard_float__
+ unsigned int fpcr;
+ unsigned int fpsr;
+
+ _FPU_GETCW (fpcr);
+ _FPU_GETFPSR (fpsr);
+ envp->__fpcr = fpcr;
+ envp->__fpsr = fpsr;
+
+ return 0;
+#else
+ /* Unsupported, so return 1 for failure. */
+ return 1;
+#endif /* __csky_hard_float__ */
+}
+libm_hidden_def (__fegetenv)
+weak_alias (__fegetenv, fegetenv)
+libm_hidden_weak (fegetenv)
+
diff --git a/sysdeps/csky/fpu/fegetexcept.c b/sysdeps/csky/fpu/fegetexcept.c
new file mode 100644
index 0000000..784f4f7
--- /dev/null
+++ b/sysdeps/csky/fpu/fegetexcept.c
@@ -0,0 +1,37 @@
+/* Get enabled floating-point exceptions.
+ 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 <fenv.h>
+#include <fenv_libc.h>
+#include <fpu_control.h>
+
+int
+fegetexcept (void)
+{
+#ifdef __csky_hard_float__
+ unsigned int exc;
+
+ /* Get the current control word. */
+ _FPU_GETCW (exc);
+
+ return (exc & ENABLE_MASK) >> ENABLE_SHIFT;
+#else
+ /* Unsupported. Return all exceptions disabled. */
+ return 0;
+#endif /* __csky_hard_float__ */
+}
diff --git a/sysdeps/csky/fpu/fegetmode.c b/sysdeps/csky/fpu/fegetmode.c
new file mode 100644
index 0000000..f3115b1
--- /dev/null
+++ b/sysdeps/csky/fpu/fegetmode.c
@@ -0,0 +1,29 @@
+/* Store current floating-point control modes.
+ 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 <fenv.h>
+#include <fpu_control.h>
+
+int
+fegetmode (femode_t *modep)
+{
+#ifdef __csky_hard_float__
+ _FPU_GETCW (*modep);
+#endif /* __csky_hard_float__ */
+ return 0;
+}
diff --git a/sysdeps/csky/fpu/fegetround.c b/sysdeps/csky/fpu/fegetround.c
new file mode 100644
index 0000000..6e0fcec
--- /dev/null
+++ b/sysdeps/csky/fpu/fegetround.c
@@ -0,0 +1,39 @@
+/* Return current rounding direction.
+ 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 <fenv.h>
+#include <fpu_control.h>
+
+int
+__fegetround (void)
+{
+#ifdef __csky_hard_float__
+ unsigned int cw;
+
+ /* Get control word. */
+ _FPU_GETCW (cw);
+
+ return cw & FE_ROUND_MASK;
+#else
+ /* The current soft-float implementation only handles TONEAREST. */
+ return FE_TONEAREST;
+#endif /* __csky_hard_float__ */
+}
+libm_hidden_def (__fegetround)
+weak_alias (__fegetround, fegetround)
+libm_hidden_weak (fegetround)
diff --git a/sysdeps/csky/fpu/feholdexcpt.c b/sysdeps/csky/fpu/feholdexcpt.c
new file mode 100644
index 0000000..6c466d0
--- /dev/null
+++ b/sysdeps/csky/fpu/feholdexcpt.c
@@ -0,0 +1,39 @@
+/* Store current floating-point environment and clear exceptions.
+ 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 <fenv.h>
+#include <fpu_control.h>
+#include <fenv_libc.h>
+#include <fenv_private.h>
+
+#include <stdio.h>
+
+int
+__feholdexcept (fenv_t *envp)
+{
+#ifdef __csky_hard_float__
+ libc_feholdexcept_vfp (envp);
+ return 0;
+#else
+ /* Unsupported, so fail. */
+ return 1;
+#endif /* __csky_hard_float__ */
+}
+libm_hidden_def (__feholdexcept)
+weak_alias (__feholdexcept, feholdexcept)
+libm_hidden_weak (feholdexcept)
diff --git a/sysdeps/csky/fpu/fenv_libc.h b/sysdeps/csky/fpu/fenv_libc.h
new file mode 100644
index 0000000..2dacb2c
--- /dev/null
+++ b/sysdeps/csky/fpu/fenv_libc.h
@@ -0,0 +1,29 @@
+/* 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/>. */
+
+#ifndef _FENV_LIBC_H
+#define _FENV_LIBC_H 1
+
+/* Mask for enabling exceptions and for the CAUSE bits. */
+#define ENABLE_MASK 0x0003FU
+#define CAUSE_MASK 0x3F000U
+
+/* Shift for FE_* flags to get up to the ENABLE bits and the CAUSE bits. */
+#define ENABLE_SHIFT 0
+#define CAUSE_SHIFT 8
+
+#endif /* _FENV_LIBC_H */
diff --git a/sysdeps/csky/fpu/fesetenv.c b/sysdeps/csky/fpu/fesetenv.c
new file mode 100644
index 0000000..9a651a6
--- /dev/null
+++ b/sysdeps/csky/fpu/fesetenv.c
@@ -0,0 +1,65 @@
+/* Install given floating-point environment.
+ 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 <fenv.h>
+#include <fpu_control.h>
+
+int
+__fesetenv (const fenv_t *envp)
+{
+#ifdef __csky_hard_float__
+ unsigned int fpcr;
+ unsigned int fpsr;
+
+ _FPU_GETCW (fpcr);
+ _FPU_GETFPSR (fpsr);
+
+ fpcr &= _FPU_RESERVED;
+ fpsr &= _FPU_FPSR_RESERVED;
+
+ if (envp == FE_DFL_ENV)
+ {
+ fpcr |= _FPU_DEFAULT;
+ fpsr |= _FPU_FPSR_DEFAULT;
+ }
+ else if (envp == FE_NOMASK_ENV)
+ {
+ fpcr |= _FPU_FPCR_IEEE;
+ fpsr |= _FPU_FPSR_IEEE;
+ }
+ else
+ {
+ fpcr |= envp->__fpcr & ~_FPU_RESERVED;
+ fpsr |= envp->__fpsr & ~_FPU_FPSR_RESERVED;
+ }
+
+ _FPU_SETFPSR (fpsr);
+
+ _FPU_SETCW (fpcr);
+
+ /* Success. */
+ return 0;
+#else
+ /* Unsupported, so fail. */
+ return 1;
+#endif /* __csky_hard_float__ */
+}
+libm_hidden_def (__fesetenv)
+weak_alias (__fesetenv, fesetenv)
+libm_hidden_weak (fesetenv)
+
diff --git a/sysdeps/csky/fpu/fesetexcept.c b/sysdeps/csky/fpu/fesetexcept.c
new file mode 100644
index 0000000..e0a90f6
--- /dev/null
+++ b/sysdeps/csky/fpu/fesetexcept.c
@@ -0,0 +1,37 @@
+/* Set given exception flags.
+ 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 <fenv.h>
+#include <fpu_control.h>
+#include <fenv_libc.h>
+
+int
+fesetexcept (int excepts)
+{
+#ifdef __csky_hard_float__
+ fpu_control_t fpsr, new_fpsr;
+ _FPU_GETFPSR (fpsr);
+ new_fpsr = fpsr | ((excepts & FE_ALL_EXCEPT) << CAUSE_SHIFT);
+ if (new_fpsr != fpsr)
+ _FPU_SETFPSR (new_fpsr);
+#else
+ return (excepts != 0);
+#endif /* __csky_hard_float__ */
+
+ return 0;
+}
diff --git a/sysdeps/csky/fpu/fesetmode.c b/sysdeps/csky/fpu/fesetmode.c
new file mode 100644
index 0000000..9e259d0
--- /dev/null
+++ b/sysdeps/csky/fpu/fesetmode.c
@@ -0,0 +1,37 @@
+/* Install given floating-point control modes.
+ 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 <fenv.h>
+#include <fpu_control.h>
+
+int
+fesetmode (const femode_t *modep)
+{
+#ifdef __csky_hard_float__
+ if (modep == FE_DFL_MODE)
+ mode = _FPU_DEFAULT;
+ else
+ mode = *modep;
+ _FPU_SETCW (mode);
+
+ return 0;
+#else
+ /* Nothing to do. */
+ return 0;
+#endif /* __csky_hard_float__ */
+}
diff --git a/sysdeps/csky/fpu/fesetround.c b/sysdeps/csky/fpu/fesetround.c
new file mode 100644
index 0000000..8e3128c
--- /dev/null
+++ b/sysdeps/csky/fpu/fesetround.c
@@ -0,0 +1,42 @@
+/* Set current rounding direction.
+ 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 <fenv.h>
+#include <fpu_control.h>
+#include <fenv_private.h>
+
+#include <stdio.h>
+int
+__fesetround (int round)
+{
+#ifdef __csky_hard_float__
+ libc_fesetround_vfp (round);
+ return 0;
+#else
+ if (round == FE_TONEAREST)
+ /* This is the only supported rounding mode for soft-fp. */
+ return 0;
+
+ /* Unsupported, so fail. */
+ return 1;
+#endif /* __csky_hard_float__ */
+}
+libm_hidden_def (__fesetround)
+weak_alias (__fesetround, fesetround)
+libm_hidden_weak (fesetround)
+
diff --git a/sysdeps/csky/fpu/feupdateenv.c b/sysdeps/csky/fpu/feupdateenv.c
new file mode 100644
index 0000000..992717e
--- /dev/null
+++ b/sysdeps/csky/fpu/feupdateenv.c
@@ -0,0 +1,52 @@
+/* Install given floating-point environment and raise exceptions.
+ 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 <fenv.h>
+#include <fpu_control.h>
+#include <fenv_libc.h>
+#include <fenv_private.h>
+#include <stdio.h>
+
+int
+__feupdateenv (const fenv_t *envp)
+{
+#ifdef __csky_hard_float__
+ int temp;
+
+ /* Save current exceptions. */
+ _FPU_GETFPSR(temp);
+ temp = (temp >> CAUSE_SHIFT) & FE_ALL_EXCEPT;
+ /* Install new environment. */
+ libc_fesetenv_vfp (envp);
+
+ /* Raise the safed exception. Incidently for us the implementation
+ defined format of the values in objects of type fexcept_t is the
+ same as the ones specified using the FE_* constants. */
+ feraiseexcept (temp);
+
+ /* Success. */
+ return 0;
+#else
+ /* Unsupported, so fail. */
+ return 1;
+#endif /* __csky_hard_float__ */
+}
+libm_hidden_def (__feupdateenv)
+weak_alias (__feupdateenv, feupdateenv)
+libm_hidden_weak (feupdateenv)
+
diff --git a/sysdeps/csky/fpu/fgetexcptflg.c b/sysdeps/csky/fpu/fgetexcptflg.c
new file mode 100644
index 0000000..73d0ce8
--- /dev/null
+++ b/sysdeps/csky/fpu/fgetexcptflg.c
@@ -0,0 +1,37 @@
+/* Store current representation for exceptions.
+ 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 <fenv.h>
+#include <fpu_control.h>
+#include <fenv_libc.h>
+#include <fenv_private.h>
+#include <stdio.h>
+
+int
+fegetexceptflag (fexcept_t *flagp, int excepts)
+{
+#ifdef __csky_hard_float__
+ *flagp = libc_fetestexcept_vfp (excepts);
+
+ /* Success. */
+ return 0;
+#else
+ /* Unsupported, so fail. */
+ return 1;
+#endif /* __csky_hard_float__ */
+}
diff --git a/sysdeps/csky/fpu/fraiseexcpt.c b/sysdeps/csky/fpu/fraiseexcpt.c
new file mode 100644
index 0000000..221533e
--- /dev/null
+++ b/sysdeps/csky/fpu/fraiseexcpt.c
@@ -0,0 +1,131 @@
+/* Raise given exceptions.
+ 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 <fenv.h>
+#include <fenv_libc.h>
+#include <fpu_control.h>
+#include <float.h>
+#include <math.h>
+
+int
+__feraiseexcept (int excepts)
+{
+#ifdef __csky_hard_float__
+ /* Raise exceptions represented by EXCEPTS. But we must raise only one
+ signal at a time. It is important that if the overflow/underflow
+ exception and the divide by zero exception are given at the same
+ time, the overflow/underflow exception follows the divide by zero
+ exception. */
+
+# ifdef __csky_fpuv2__
+ /* First: invalid exception. */
+ if (FE_INVALID & excepts)
+ {
+ /* One example of a invalid operation is 0 * Infinity. */
+ float x = HUGE_VALF, y = 0.0f;
+ __asm__ __volatile__ ("fmuls %0, %0, %1" : "+v" (x) : "v" (y));
+ }
+
+ /* Next: division by zero. */
+ if (FE_DIVBYZERO & excepts)
+ {
+ float x = 1.0f, y = 0.0f;
+ __asm__ __volatile__ ("fdivs %0, %0, %1" : "+v" (x) : "v" (y));
+ }
+
+ /* Next: overflow. */
+ if (FE_OVERFLOW & excepts)
+ {
+ float x = FLT_MAX;
+ __asm__ __volatile__ ("fmuls %0, %0, %0" : "+v" (x));
+ }
+ /* Next: underflow. */
+ if (FE_UNDERFLOW & excepts)
+ {
+ float x = -FLT_MIN;
+
+ __asm__ __volatile__ ("fmuls %0, %0, %0" : "+v" (x));
+ }
+
+ /* Last: inexact. */
+ if (FE_INEXACT & excepts)
+ {
+ float x = 1.0f, y = 3.0f;
+ __asm__ __volatile__ ("fdivs %0, %0, %1" : "+v" (x) : "v" (y));
+ }
+
+ if (FE_DENORMAL & excepts)
+ {
+ double x = 4.9406564584124654e-324;
+ __asm__ __volatile__ ("fstod %0, %0" : "+v" (x));
+ }
+# else /* __csky_fpuv2__ */
+ int tmp = 0;
+ /* First: invalid exception. */
+ if (FE_INVALID & excepts)
+ {
+ /* One example of a invalid operation is 0 * Infinity. */
+ float x = HUGE_VALF, y = 0.0f;
+ __asm__ __volatile__ ("fmuls %0, %0, %2, %1"
+ : "+f" (x), "+r"(tmp) : "f" (y));
+ }
+
+ /* Next: division by zero. */
+ if (FE_DIVBYZERO & excepts)
+ {
+ float x = 1.0f, y = 0.0f;
+ __asm__ __volatile__ ("fdivs %0, %0, %2, %1"
+ : "+f" (x), "+r"(tmp) : "f" (y));
+ }
+
+ /* Next: overflow. */
+ if (FE_OVERFLOW & excepts)
+ {
+ float x = FLT_MAX, y = FLT_MAX;
+ __asm__ __volatile__ ("fmuls %0, %0, %2, %1"
+ : "+f" (x), "+r"(tmp) : "f" (y));
+ }
+
+ /* Next: underflow. */
+ if (FE_UNDERFLOW & excepts)
+ {
+ float x = -FLT_MIN, y = -FLT_MIN;
+
+ __asm__ __volatile__ ("fmuls %0, %0, %2, %1"
+ : "+f" (x), "+r"(tmp) : "f" (y));
+ }
+
+ /* Last: inexact. */
+ if (FE_INEXACT & excepts)
+ {
+ float x = 1.0f, y = 3.0f;
+ __asm__ __volatile__ ("fdivs %0, %0, %2, %1"
+ : "+f" (x), "+r"(tmp) : "f" (y));
+ }
+# endif /* __csky_fpuv2__ */
+
+ /* Success. */
+ return 0;
+#else /* __csky_hard_float__ */
+ /* Unsupported, so fail unless nothing needs to be done. */
+ return (excepts != 0);
+#endif
+}
+libm_hidden_def (__feraiseexcept)
+weak_alias (__feraiseexcept, feraiseexcept)
+libm_hidden_weak (feraiseexcept)
diff --git a/sysdeps/csky/fpu/fsetexcptflg.c b/sysdeps/csky/fpu/fsetexcptflg.c
new file mode 100644
index 0000000..79ddc50
--- /dev/null
+++ b/sysdeps/csky/fpu/fsetexcptflg.c
@@ -0,0 +1,48 @@
+/* Set floating-point environment exception handling.
+ 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 <fenv.h>
+#include <fpu_control.h>
+#include <fenv_libc.h>
+
+int
+fesetexceptflag (const fexcept_t *flagp, int excepts)
+{
+#ifdef __csky_hard_float__
+ fpu_control_t temp;
+
+ /* Get the current exceptions. */
+ _FPU_GETFPSR (temp);
+
+ /* Make sure the flags we want restored are legal. */
+ excepts &= FE_ALL_EXCEPT;
+
+ /* Now clear the bits called for, and copy them in from flagp. Note that
+ we ignore all non-flag bits from *flagp, so they don't matter. */
+ temp = ((temp >> CAUSE_SHIFT) & ~excepts) | (*flagp & excepts);
+ temp = temp << CAUSE_SHIFT;
+
+ _FPU_SETFPSR (temp);
+
+ /* Success. */
+ return 0;
+#else
+ /* Unsupported, so fail unless nothing needs to be done. */
+ return (excepts != 0);
+#endif
+}
diff --git a/sysdeps/csky/fpu/ftestexcept.c b/sysdeps/csky/fpu/ftestexcept.c
new file mode 100644
index 0000000..23f7f0b
--- /dev/null
+++ b/sysdeps/csky/fpu/ftestexcept.c
@@ -0,0 +1,35 @@
+/* Test exception in current environment.
+ 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 <fenv.h>
+#include <fpu_control.h>
+#include <fenv_libc.h>
+#include <fenv_private.h>
+#include <stdio.h>
+
+int
+fetestexcept (int excepts)
+{
+#ifdef __csky_hard_float__
+ return libc_fetestexcept_vfp (excepts);
+#else
+ /* Unsupported, return 0. */
+ return 0;
+#endif
+}
+libm_hidden_def (fetestexcept)
diff --git a/sysdeps/csky/fpu_control.h b/sysdeps/csky/fpu_control.h
new file mode 100644
index 0000000..c2757f5
--- /dev/null
+++ b/sysdeps/csky/fpu_control.h
@@ -0,0 +1,150 @@
+/* FPU control word bits. C-SKY 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/>. */
+
+#ifndef _FPU_CONTROL_H
+#define _FPU_CONTROL_H
+
+/*
+ * CSKY FPU floating point control register bits.
+ *
+ * 31-28 -> reserved (read as 0, write with 0)
+ * 27 -> 0: flush denormalized results to zero
+ * 1: flush denormalized results to signed minimal normal number.
+ * 26 -> reserved (read as 0, write with 0)
+ * 25-24 -> rounding control
+ * 23-6 -> reserved (read as 0, write with 0)
+ * 5 -> enable exception for input denormalized exception
+ * 4 -> enable exception for inexact exception
+ * 3 -> enable exception for underflow exception
+ * 2 -> enable exception for overflow exception
+ * 1 -> enable exception for division by zero exception
+ * 0 -> enable exception for invalid operation exception
+ *
+ * Rounding Control:
+ * 00 - rounding to nearest (RN)
+ * 01 - rounding toward zero (RZ)
+ * 10 - rounding (up) toward plus infinity (RP)
+ * 11 - rounding (down)toward minus infinity (RM)
+ *
+ * CSKY FPU floating point exception status register bits.
+ *
+ * 15 -> accumulate bit for any exception
+ * 14 -> reserved (read as 0, write with 0)
+ * 13 -> cause bit for input denormalized exception
+ * 12 -> cause bit for inexact exception
+ * 11 -> cause bit for underflow exception
+ * 10 -> cause bit for overflow exception
+ * 9 -> cause bit for division by zero exception
+ * 8 -> cause bit for invalid operation exception
+ * 7 -> flag bit for any exception
+ * 6 -> reserved (read as 0, write with 0)
+ * 5 -> flag exception for input denormalized exception
+ * 4 -> flag exception for inexact exception
+ * 3 -> flag exception for underflow exception
+ * 2 -> flag exception for overflow exception
+ * 1 -> flag exception for division by zero exception
+ * 0 -> flag exception for invalid operation exception
+ */
+
+#include <features.h>
+
+#ifdef __csky_soft_float__
+
+# define _FPU_RESERVED 0xffffffff
+# define _FPU_DEFAULT 0x00000000
+typedef unsigned int fpu_control_t;
+# define _FPU_GETCW(cw) (cw) = 0
+# define _FPU_SETCW(cw) (void) (cw)
+# define _FPU_GETFPSR(cw) (cw) = 0
+# define _FPU_SETFPSR(cw) (void) (cw)
+extern fpu_control_t __fpu_control;
+
+#else /* !__csky_soft_float__ */
+
+/* masking of interrupts */
+# define _FPU_MASK_IDE (1 << 5) /* input denormalized exception */
+# define _FPU_MASK_IXE (1 << 4) /* inexact exception */
+# define _FPU_MASK_UFE (1 << 3) /* underflow exception */
+# define _FPU_MASK_OFE (1 << 2) /* overflow exception */
+# define _FPU_MASK_DZE (1 << 1) /* division by zero exception */
+# define _FPU_MASK_IOE (1 << 0) /* invalid operation exception */
+
+# define _FPU_MASK_FEA (1 << 15) /* case for any exception */
+# define _FPU_MASK_FEC (1 << 7) /* flag for any exception */
+
+/* flush denormalized numbers to zero */
+# define _FPU_FLUSH_TZ 0x8000000
+
+/* rounding control */
+# define _FPU_RC_NEAREST (0x0 << 24) /* RECOMMENDED */
+# define _FPU_RC_ZERO (0x1 << 24)
+# define _FPU_RC_UP (0x2 << 24)
+# define _FPU_RC_DOWN (0x3 << 24)
+
+# define _FPU_RESERVED 0xf4ffffc0 /* Reserved bits in cw */
+# define _FPU_FPSR_RESERVED 0x3fff0000
+
+/* The fdlibm code requires strict IEEE double precision arithmetic,
+ and no interrupts for exceptions, rounding to nearest. */
+
+# define _FPU_DEFAULT 0x00000000
+# define _FPU_FPSR_DEFAULT 0x00000000
+
+/* IEEE: same as above, but exceptions */
+# define _FPU_FPCR_IEEE 0x0000001F
+# define _FPU_FPSR_IEEE 0x00000000
+
+/* Type of the control word. */
+typedef unsigned int fpu_control_t;
+
+/* Macros for accessing the hardware control word. */
+# if (__CSKY__ == 2)
+# define _FPU_GETCW(cw) __asm__ volatile ("mfcr %0, cr<1, 2>" : "=r" (cw))
+# define _FPU_SETCW(cw) __asm__ volatile ("mtcr %0, cr<1, 2>" : : "r" (cw))
+# define _FPU_GETFPSR(cw) __asm__ volatile ("mfcr %0, cr<2, 2>" : "=r" (cw))
+# define _FPU_SETFPSR(cw) __asm__ volatile ("mtcr %0, cr<2, 2>" : : "r" (cw))
+# else /* __CSKY__ != 2 */
+# define _FPU_GETCW(cw) __asm__ volatile ("1: cprcr %0, cpcr2 \n" \
+ " btsti %0, 31 \n" \
+ " bt 1b \n" \
+ " cprcr %0, cpcr1\n" : "=b" (cw))
+
+# define _FPU_SETCW(cw) __asm__ volatile ("1: cprcr r7, cpcr2 \n" \
+ " btsti r7, 31 \n" \
+ " bt 1b \n" \
+ " cpwcr %0, cpcr1 \n" \
+ : : "b" (cw) : "r7")
+
+# define _FPU_GETFPSR(cw) __asm__ volatile ("1: cprcr %0, cpcr2 \n" \
+ " btsti %0, 31 \n" \
+ " bt 1b \n" \
+ " cprcr %0, cpcr4\n" : "=b" (cw))
+
+# define _FPU_SETFPSR(cw) __asm__ volatile ("1: cprcr r7, cpcr2 \n" \
+ " btsti r7, 31 \n" \
+ " bt 1b \n" \
+ " cpwcr %0, cpcr4 \n" \
+ : : "b" (cw) : "r7")
+# endif /* __CSKY__ != 2 */
+
+/* Default control word set at startup. */
+extern fpu_control_t __fpu_control;
+
+#endif /* !__csky_soft_float__ */
+
+#endif /* fpu_control.h */
--
2.7.4
^ permalink raw reply [flat|nested] 22+ messages in thread
* [RFC PATCH 00/10] port C-SKY to glibc
@ 2018-03-16 9:59 Mao Han
2018-03-16 9:59 ` [RFC PATCH 05/10] C-SKY: Linux Startup and Dynamic Loading Code Mao Han
` (10 more replies)
0 siblings, 11 replies; 22+ messages in thread
From: Mao Han @ 2018-03-16 9:59 UTC (permalink / raw)
To: libc-help; +Cc: han_mao, ren_guo, yunhai_shang, qijie_tong, chunqiang_li
I am working on editing C-SKY Glibc porting, and want to upstream these
patches to the official master branch. I send the email for the initial
review, and want get some suggestion on what I should do next.
I was Employed by Hangzhou C-SKY Microsystems Co., Ltd.; and responsible
for the C-SKY porting of Glibc. Meanwhile, we are doing the upstreams of
C-SKY GCC, binutils, GDB and Linux. Mentor graphic is helping us with the
upstream submission of GCC, binutils, GDB. More information about us is on
http://en.c-sky.com/.
This patchset adds architecture support to Glibc for CK610, CK807, CK810
processor cores. It base on the release version of 2.27.
CK610 is the second-generation CPU of CSKY, fullycompatible with M*Core.
CK807/CK810 bases on C-SKY V2 instruction set architecture and 16/32-bit
variable length instruction. Including basic core(CK807/CK810),
floating-point enhancement(CK807F/CK810F), multimedia enhancement (CK810D)
and multiple-processing extension (CK807MP/CK810MP).
The porting of C-SKY Glibc is tested in our CI enviroment. Toolchain, kernel,
test packages are built form source code via builtroot. LTP, Lmbench, dhrystone
etc are tested in the enviroment.
Here is our CI envoirnment:
https://gitlab.com/c-sky/buildroot/pipelines
Our sources are available on github.com/c-sky. Including gcc, glibc, uclibc-ng
Linux kernel e.g.
Mao Han (10):
C-SKY: ABI related code
C-SKY: TLS support
C-SKY: Generic math Routines
C-SKY: Hard Float Support
C-SKY: Linux Startup and Dynamic Loading Code
C-SKY: Build Infastructure
C-SKY: Atomic and Locking Routines
C-SKY: ABI Lists
C-SKY: Linux Syscall Interface
C-SKY: Linux ABI
elf/elf.h | 61 +
scripts/config.sub | 4 +-
sysdeps/csky/Implies | 4 +
sysdeps/csky/Makefile | 32 +
sysdeps/csky/__longjmp.S | 67 +
sysdeps/csky/abort-instr.h | 2 +
sysdeps/csky/atomic-machine.h | 115 ++
sysdeps/csky/backtrace.c | 128 ++
sysdeps/csky/bits/endian.h | 10 +
sysdeps/csky/bits/fenv.h | 97 +
sysdeps/csky/bits/link.h | 54 +
sysdeps/csky/bits/setjmp.h | 32 +
sysdeps/csky/bsd-_setjmp.S | 1 +
sysdeps/csky/bsd-setjmp.S | 1 +
sysdeps/csky/configure | 4 +
sysdeps/csky/configure.ac | 4 +
sysdeps/csky/crti.S | 113 ++
sysdeps/csky/crtn.S | 51 +
sysdeps/csky/csky-mcount.S | 87 +
sysdeps/csky/dl-machine.h | 471 +++++
sysdeps/csky/dl-procinfo.c | 62 +
sysdeps/csky/dl-procinfo.h | 59 +
sysdeps/csky/dl-sysdep.h | 23 +
sysdeps/csky/dl-tls.h | 26 +
sysdeps/csky/dl-tlsdesc.h | 61 +
sysdeps/csky/dl-trampoline.S | 110 ++
sysdeps/csky/fenv_private.h | 288 +++
sysdeps/csky/fpu/fclrexcpt.c | 47 +
sysdeps/csky/fpu/fedisblxcpt.c | 46 +
sysdeps/csky/fpu/feenablxcpt.c | 45 +
sysdeps/csky/fpu/fegetenv.c | 43 +
sysdeps/csky/fpu/fegetexcept.c | 37 +
sysdeps/csky/fpu/fegetmode.c | 29 +
sysdeps/csky/fpu/fegetround.c | 39 +
sysdeps/csky/fpu/feholdexcpt.c | 39 +
sysdeps/csky/fpu/fenv_libc.h | 29 +
sysdeps/csky/fpu/fesetenv.c | 65 +
sysdeps/csky/fpu/fesetexcept.c | 37 +
sysdeps/csky/fpu/fesetmode.c | 37 +
sysdeps/csky/fpu/fesetround.c | 42 +
sysdeps/csky/fpu/feupdateenv.c | 52 +
sysdeps/csky/fpu/fgetexcptflg.c | 37 +
sysdeps/csky/fpu/fraiseexcpt.c | 131 ++
sysdeps/csky/fpu/fsetexcptflg.c | 48 +
sysdeps/csky/fpu/ftestexcept.c | 35 +
sysdeps/csky/fpu_control.h | 150 ++
sysdeps/csky/gccframe.h | 21 +
sysdeps/csky/jmpbuf-unwind.h | 47 +
sysdeps/csky/ldsodefs.h | 42 +
sysdeps/csky/libc-tls.c | 32 +
sysdeps/csky/libm-test-ulps | 1682 ++++++++++++++++
sysdeps/csky/libm-test-ulps-name | 1 +
sysdeps/csky/linkmap.h | 5 +
sysdeps/csky/machine-gmon.h | 32 +
sysdeps/csky/macro.S | 31 +
sysdeps/csky/math-tests.h | 35 +
sysdeps/csky/math_private.h | 7 +
sysdeps/csky/memcpy.S | 400 ++++
sysdeps/csky/memusage.h | 20 +
sysdeps/csky/nptl/Makefile | 20 +
sysdeps/csky/nptl/bits/pthreadtypes-arch.h | 71 +
sysdeps/csky/nptl/bits/semaphore.h | 34 +
sysdeps/csky/nptl/pthread-offsets.h | 5 +
sysdeps/csky/nptl/pthreaddef.h | 40 +
sysdeps/csky/nptl/tcb-offsets.sym | 10 +
sysdeps/csky/nptl/tls.h | 169 ++
sysdeps/csky/preconfigure | 5 +
sysdeps/csky/setjmp.S | 95 +
sysdeps/csky/sfp-machine.h | 51 +
sysdeps/csky/sotruss-lib.c | 49 +
sysdeps/csky/stackinfo.h | 32 +
sysdeps/csky/start.S | 133 ++
sysdeps/csky/strcmp.S | 337 ++++
sysdeps/csky/strcpy.S | 273 +++
sysdeps/csky/sys/ucontext.h | 116 ++
sysdeps/csky/sysdep.h | 46 +
sysdeps/csky/tls-macros.h | 106 +
sysdeps/csky/tst-audit.h | 24 +
sysdeps/unix/csky/abiv2_sysdep.S | 73 +
sysdeps/unix/csky/sysdep.S | 84 +
sysdeps/unix/csky/sysdep.h | 26 +
sysdeps/unix/sysv/linux/csky/Implies | 1 +
sysdeps/unix/sysv/linux/csky/Makefile | 28 +
sysdeps/unix/sysv/linux/csky/____longjmp_chk.S | 129 ++
sysdeps/unix/sysv/linux/csky/abiv2_brk.c | 56 +
sysdeps/unix/sysv/linux/csky/abiv2_clone.S | 133 ++
sysdeps/unix/sysv/linux/csky/abiv2_getcontext.S | 72 +
sysdeps/unix/sysv/linux/csky/abiv2_mmap.S | 62 +
sysdeps/unix/sysv/linux/csky/abiv2_setcontext.S | 95 +
sysdeps/unix/sysv/linux/csky/abiv2_socket.S | 152 ++
sysdeps/unix/sysv/linux/csky/abiv2_syscall.S | 69 +
sysdeps/unix/sysv/linux/csky/abiv2_vfork.S | 45 +
sysdeps/unix/sysv/linux/csky/alphasort64.c | 1 +
sysdeps/unix/sysv/linux/csky/bits/fcntl.h | 54 +
sysdeps/unix/sysv/linux/csky/bits/mman.h | 42 +
sysdeps/unix/sysv/linux/csky/bits/shm.h | 103 +
sysdeps/unix/sysv/linux/csky/brk.c | 61 +
sysdeps/unix/sysv/linux/csky/c++-types.data | 67 +
sysdeps/unix/sysv/linux/csky/clone.S | 125 ++
sysdeps/unix/sysv/linux/csky/configure | 5 +
sysdeps/unix/sysv/linux/csky/configure.ac | 6 +
sysdeps/unix/sysv/linux/csky/csky_readtp.h | 24 +
sysdeps/unix/sysv/linux/csky/ftruncate64.c | 41 +
sysdeps/unix/sysv/linux/csky/fxstat.c | 1 +
sysdeps/unix/sysv/linux/csky/fxstatat.c | 1 +
sysdeps/unix/sysv/linux/csky/getcontext.S | 108 +
sysdeps/unix/sysv/linux/csky/getdents64.c | 1 +
sysdeps/unix/sysv/linux/csky/jmp_buf-macros.h | 6 +
sysdeps/unix/sysv/linux/csky/kernel-features.h | 29 +
sysdeps/unix/sysv/linux/csky/ld.abilist | 10 +
sysdeps/unix/sysv/linux/csky/ldconfig.h | 24 +
.../unix/sysv/linux/csky/libBrokenLocale.abilist | 2 +
sysdeps/unix/sysv/linux/csky/libanl.abilist | 5 +
sysdeps/unix/sysv/linux/csky/libc-read_tp.S | 1 +
sysdeps/unix/sysv/linux/csky/libc.abilist | 2083 ++++++++++++++++++++
sysdeps/unix/sysv/linux/csky/libcrypt.abilist | 8 +
sysdeps/unix/sysv/linux/csky/libdl.abilist | 10 +
sysdeps/unix/sysv/linux/csky/libm.abilist | 737 +++++++
sysdeps/unix/sysv/linux/csky/libnsl.abilist | 121 ++
sysdeps/unix/sysv/linux/csky/libpthread.abilist | 217 ++
sysdeps/unix/sysv/linux/csky/libresolv.abilist | 80 +
sysdeps/unix/sysv/linux/csky/librt.abilist | 36 +
sysdeps/unix/sysv/linux/csky/libthread_db.abilist | 41 +
sysdeps/unix/sysv/linux/csky/libutil.abilist | 7 +
sysdeps/unix/sysv/linux/csky/lockf64.c | 1 +
sysdeps/unix/sysv/linux/csky/lxstat.c | 2 +
sysdeps/unix/sysv/linux/csky/makecontext.c | 81 +
sysdeps/unix/sysv/linux/csky/mmap.S | 65 +
sysdeps/unix/sysv/linux/csky/profil-counter.h | 34 +
sysdeps/unix/sysv/linux/csky/pt-vfork.S | 50 +
sysdeps/unix/sysv/linux/csky/read_tp.S | 47 +
sysdeps/unix/sysv/linux/csky/readahead.c | 44 +
sysdeps/unix/sysv/linux/csky/readdir64.c | 1 +
sysdeps/unix/sysv/linux/csky/readdir64_r.c | 1 +
sysdeps/unix/sysv/linux/csky/register-dump.h | 218 ++
sysdeps/unix/sysv/linux/csky/scandir64.c | 1 +
sysdeps/unix/sysv/linux/csky/setcontext.S | 128 ++
sysdeps/unix/sysv/linux/csky/shlib-versions | 3 +
sysdeps/unix/sysv/linux/csky/sigcontextinfo.h | 37 +
sysdeps/unix/sysv/linux/csky/socket.S | 171 ++
sysdeps/unix/sysv/linux/csky/swapcontext.S | 112 ++
sysdeps/unix/sysv/linux/csky/sys/cachectl.h | 35 +
sysdeps/unix/sysv/linux/csky/sys/procfs.h | 123 ++
sysdeps/unix/sysv/linux/csky/sys/ucontext.h | 111 ++
sysdeps/unix/sysv/linux/csky/sys/user.h | 65 +
sysdeps/unix/sysv/linux/csky/syscall.S | 61 +
sysdeps/unix/sysv/linux/csky/syscalls.list | 7 +
sysdeps/unix/sysv/linux/csky/sysdep-cancel.h | 407 ++++
sysdeps/unix/sysv/linux/csky/sysdep.S | 119 ++
sysdeps/unix/sysv/linux/csky/sysdep.h | 730 +++++++
sysdeps/unix/sysv/linux/csky/ucontext_i.sym | 31 +
sysdeps/unix/sysv/linux/csky/versionsort64.c | 1 +
sysdeps/unix/sysv/linux/csky/vfork.S | 49 +
sysdeps/unix/sysv/linux/csky/xstat.c | 1 +
154 files changed, 14742 insertions(+), 2 deletions(-)
create mode 100644 sysdeps/csky/Implies
create mode 100644 sysdeps/csky/Makefile
create mode 100644 sysdeps/csky/__longjmp.S
create mode 100644 sysdeps/csky/abort-instr.h
create mode 100644 sysdeps/csky/atomic-machine.h
create mode 100644 sysdeps/csky/backtrace.c
create mode 100644 sysdeps/csky/bits/endian.h
create mode 100644 sysdeps/csky/bits/fenv.h
create mode 100644 sysdeps/csky/bits/link.h
create mode 100644 sysdeps/csky/bits/setjmp.h
create mode 100644 sysdeps/csky/bsd-_setjmp.S
create mode 100644 sysdeps/csky/bsd-setjmp.S
create mode 100644 sysdeps/csky/configure
create mode 100644 sysdeps/csky/configure.ac
create mode 100644 sysdeps/csky/crti.S
create mode 100644 sysdeps/csky/crtn.S
create mode 100644 sysdeps/csky/csky-mcount.S
create mode 100644 sysdeps/csky/dl-machine.h
create mode 100644 sysdeps/csky/dl-procinfo.c
create mode 100644 sysdeps/csky/dl-procinfo.h
create mode 100644 sysdeps/csky/dl-sysdep.h
create mode 100644 sysdeps/csky/dl-tls.h
create mode 100644 sysdeps/csky/dl-tlsdesc.h
create mode 100644 sysdeps/csky/dl-trampoline.S
create mode 100644 sysdeps/csky/fenv_private.h
create mode 100644 sysdeps/csky/fpu/fclrexcpt.c
create mode 100644 sysdeps/csky/fpu/fedisblxcpt.c
create mode 100644 sysdeps/csky/fpu/feenablxcpt.c
create mode 100644 sysdeps/csky/fpu/fegetenv.c
create mode 100644 sysdeps/csky/fpu/fegetexcept.c
create mode 100644 sysdeps/csky/fpu/fegetmode.c
create mode 100644 sysdeps/csky/fpu/fegetround.c
create mode 100644 sysdeps/csky/fpu/feholdexcpt.c
create mode 100644 sysdeps/csky/fpu/fenv_libc.h
create mode 100644 sysdeps/csky/fpu/fesetenv.c
create mode 100644 sysdeps/csky/fpu/fesetexcept.c
create mode 100644 sysdeps/csky/fpu/fesetmode.c
create mode 100644 sysdeps/csky/fpu/fesetround.c
create mode 100644 sysdeps/csky/fpu/feupdateenv.c
create mode 100644 sysdeps/csky/fpu/fgetexcptflg.c
create mode 100644 sysdeps/csky/fpu/fraiseexcpt.c
create mode 100644 sysdeps/csky/fpu/fsetexcptflg.c
create mode 100644 sysdeps/csky/fpu/ftestexcept.c
create mode 100644 sysdeps/csky/fpu_control.h
create mode 100644 sysdeps/csky/gccframe.h
create mode 100644 sysdeps/csky/jmpbuf-unwind.h
create mode 100644 sysdeps/csky/ldsodefs.h
create mode 100644 sysdeps/csky/libc-tls.c
create mode 100644 sysdeps/csky/libm-test-ulps
create mode 100644 sysdeps/csky/libm-test-ulps-name
create mode 100644 sysdeps/csky/linkmap.h
create mode 100644 sysdeps/csky/machine-gmon.h
create mode 100644 sysdeps/csky/macro.S
create mode 100644 sysdeps/csky/math-tests.h
create mode 100644 sysdeps/csky/math_private.h
create mode 100644 sysdeps/csky/memcpy.S
create mode 100644 sysdeps/csky/memusage.h
create mode 100644 sysdeps/csky/nptl/Makefile
create mode 100644 sysdeps/csky/nptl/bits/pthreadtypes-arch.h
create mode 100644 sysdeps/csky/nptl/bits/semaphore.h
create mode 100644 sysdeps/csky/nptl/pthread-offsets.h
create mode 100644 sysdeps/csky/nptl/pthreaddef.h
create mode 100644 sysdeps/csky/nptl/tcb-offsets.sym
create mode 100644 sysdeps/csky/nptl/tls.h
create mode 100644 sysdeps/csky/preconfigure
create mode 100644 sysdeps/csky/setjmp.S
create mode 100644 sysdeps/csky/sfp-machine.h
create mode 100644 sysdeps/csky/sotruss-lib.c
create mode 100644 sysdeps/csky/stackinfo.h
create mode 100644 sysdeps/csky/start.S
create mode 100644 sysdeps/csky/strcmp.S
create mode 100644 sysdeps/csky/strcpy.S
create mode 100644 sysdeps/csky/sys/ucontext.h
create mode 100644 sysdeps/csky/sysdep.h
create mode 100644 sysdeps/csky/tls-macros.h
create mode 100644 sysdeps/csky/tst-audit.h
create mode 100644 sysdeps/unix/csky/abiv2_sysdep.S
create mode 100644 sysdeps/unix/csky/sysdep.S
create mode 100644 sysdeps/unix/csky/sysdep.h
create mode 100644 sysdeps/unix/sysv/linux/csky/Implies
create mode 100644 sysdeps/unix/sysv/linux/csky/Makefile
create mode 100644 sysdeps/unix/sysv/linux/csky/____longjmp_chk.S
create mode 100644 sysdeps/unix/sysv/linux/csky/abiv2_brk.c
create mode 100644 sysdeps/unix/sysv/linux/csky/abiv2_clone.S
create mode 100644 sysdeps/unix/sysv/linux/csky/abiv2_getcontext.S
create mode 100644 sysdeps/unix/sysv/linux/csky/abiv2_mmap.S
create mode 100644 sysdeps/unix/sysv/linux/csky/abiv2_setcontext.S
create mode 100644 sysdeps/unix/sysv/linux/csky/abiv2_socket.S
create mode 100644 sysdeps/unix/sysv/linux/csky/abiv2_syscall.S
create mode 100644 sysdeps/unix/sysv/linux/csky/abiv2_vfork.S
create mode 100644 sysdeps/unix/sysv/linux/csky/alphasort64.c
create mode 100644 sysdeps/unix/sysv/linux/csky/bits/fcntl.h
create mode 100644 sysdeps/unix/sysv/linux/csky/bits/mman.h
create mode 100644 sysdeps/unix/sysv/linux/csky/bits/shm.h
create mode 100644 sysdeps/unix/sysv/linux/csky/brk.c
create mode 100644 sysdeps/unix/sysv/linux/csky/c++-types.data
create mode 100644 sysdeps/unix/sysv/linux/csky/clone.S
create mode 100644 sysdeps/unix/sysv/linux/csky/configure
create mode 100644 sysdeps/unix/sysv/linux/csky/configure.ac
create mode 100644 sysdeps/unix/sysv/linux/csky/csky_readtp.h
create mode 100644 sysdeps/unix/sysv/linux/csky/ftruncate64.c
create mode 100644 sysdeps/unix/sysv/linux/csky/fxstat.c
create mode 100644 sysdeps/unix/sysv/linux/csky/fxstatat.c
create mode 100644 sysdeps/unix/sysv/linux/csky/getcontext.S
create mode 100644 sysdeps/unix/sysv/linux/csky/getdents64.c
create mode 100644 sysdeps/unix/sysv/linux/csky/jmp_buf-macros.h
create mode 100644 sysdeps/unix/sysv/linux/csky/kernel-features.h
create mode 100644 sysdeps/unix/sysv/linux/csky/ld.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/ldconfig.h
create mode 100644 sysdeps/unix/sysv/linux/csky/libBrokenLocale.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libanl.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libc-read_tp.S
create mode 100644 sysdeps/unix/sysv/linux/csky/libc.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libcrypt.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libdl.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libm.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libnsl.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libpthread.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libresolv.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/librt.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libthread_db.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libutil.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/lockf64.c
create mode 100644 sysdeps/unix/sysv/linux/csky/lxstat.c
create mode 100644 sysdeps/unix/sysv/linux/csky/makecontext.c
create mode 100644 sysdeps/unix/sysv/linux/csky/mmap.S
create mode 100644 sysdeps/unix/sysv/linux/csky/profil-counter.h
create mode 100644 sysdeps/unix/sysv/linux/csky/pt-vfork.S
create mode 100644 sysdeps/unix/sysv/linux/csky/read_tp.S
create mode 100644 sysdeps/unix/sysv/linux/csky/readahead.c
create mode 100644 sysdeps/unix/sysv/linux/csky/readdir64.c
create mode 100644 sysdeps/unix/sysv/linux/csky/readdir64_r.c
create mode 100644 sysdeps/unix/sysv/linux/csky/register-dump.h
create mode 100644 sysdeps/unix/sysv/linux/csky/scandir64.c
create mode 100644 sysdeps/unix/sysv/linux/csky/setcontext.S
create mode 100644 sysdeps/unix/sysv/linux/csky/shlib-versions
create mode 100644 sysdeps/unix/sysv/linux/csky/sigcontextinfo.h
create mode 100644 sysdeps/unix/sysv/linux/csky/socket.S
create mode 100644 sysdeps/unix/sysv/linux/csky/swapcontext.S
create mode 100644 sysdeps/unix/sysv/linux/csky/sys/cachectl.h
create mode 100644 sysdeps/unix/sysv/linux/csky/sys/procfs.h
create mode 100644 sysdeps/unix/sysv/linux/csky/sys/ucontext.h
create mode 100644 sysdeps/unix/sysv/linux/csky/sys/user.h
create mode 100644 sysdeps/unix/sysv/linux/csky/syscall.S
create mode 100644 sysdeps/unix/sysv/linux/csky/syscalls.list
create mode 100644 sysdeps/unix/sysv/linux/csky/sysdep-cancel.h
create mode 100644 sysdeps/unix/sysv/linux/csky/sysdep.S
create mode 100644 sysdeps/unix/sysv/linux/csky/sysdep.h
create mode 100644 sysdeps/unix/sysv/linux/csky/ucontext_i.sym
create mode 100644 sysdeps/unix/sysv/linux/csky/versionsort64.c
create mode 100644 sysdeps/unix/sysv/linux/csky/vfork.S
create mode 100644 sysdeps/unix/sysv/linux/csky/xstat.c
--
2.7.4
^ permalink raw reply [flat|nested] 22+ messages in thread
* [RFC PATCH 08/10] C-SKY: ABI Lists
2018-03-16 9:59 [RFC PATCH 00/10] port C-SKY to glibc Mao Han
` (2 preceding siblings ...)
2018-03-16 9:59 ` [RFC PATCH 03/10] C-SKY: Generic math Routines Mao Han
@ 2018-03-16 9:59 ` Mao Han
2018-03-16 9:59 ` [RFC PATCH 01/10] C-SKY: ABI related code Mao Han
` (6 subsequent siblings)
10 siblings, 0 replies; 22+ messages in thread
From: Mao Han @ 2018-03-16 9:59 UTC (permalink / raw)
To: libc-help; +Cc: han_mao, ren_guo, yunhai_shang, qijie_tong, chunqiang_li
This patch contains the list of ABI introduced under different library
version on C-SKY.
*sysdeps/unix/sysv/linux/csky/libc.abilist: New file
*sysdeps/unix/sysv/linux/csky/libutil.abilist: New file
*sysdeps/unix/sysv/linux/csky/ld.abilist: New file
*sysdeps/unix/sysv/linux/csky/libanl.abilist: New file
*sysdeps/unix/sysv/linux/csky/libdl.abilist: New file
*sysdeps/unix/sysv/linux/csky/libm.abilist: New file
*sysdeps/unix/sysv/linux/csky/libnsl.abilist: New file
*sysdeps/unix/sysv/linux/csky/librt.abilist: New file
*sysdeps/unix/sysv/linux/csky/libBrokenLocale.abilist: New file
*sysdeps/unix/sysv/linux/csky/libcrypt.abilist: New file
*sysdeps/unix/sysv/linux/csky/libpthread.abilist: New file
*sysdeps/unix/sysv/linux/csky/libresolv.abilist: New file
*sysdeps/unix/sysv/linux/csky/libthread_db.abilist: New file
Signed-off-by: Mao Han <han_mao@c-sky.com>
---
sysdeps/unix/sysv/linux/csky/ld.abilist | 10 +
.../unix/sysv/linux/csky/libBrokenLocale.abilist | 2 +
sysdeps/unix/sysv/linux/csky/libanl.abilist | 5 +
sysdeps/unix/sysv/linux/csky/libc.abilist | 2083 ++++++++++++++++++++
sysdeps/unix/sysv/linux/csky/libcrypt.abilist | 8 +
sysdeps/unix/sysv/linux/csky/libdl.abilist | 10 +
sysdeps/unix/sysv/linux/csky/libm.abilist | 737 +++++++
sysdeps/unix/sysv/linux/csky/libnsl.abilist | 121 ++
sysdeps/unix/sysv/linux/csky/libpthread.abilist | 217 ++
sysdeps/unix/sysv/linux/csky/libresolv.abilist | 80 +
sysdeps/unix/sysv/linux/csky/librt.abilist | 36 +
sysdeps/unix/sysv/linux/csky/libthread_db.abilist | 41 +
sysdeps/unix/sysv/linux/csky/libutil.abilist | 7 +
13 files changed, 3357 insertions(+)
create mode 100644 sysdeps/unix/sysv/linux/csky/ld.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libBrokenLocale.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libanl.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libc.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libcrypt.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libdl.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libm.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libnsl.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libpthread.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libresolv.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/librt.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libthread_db.abilist
create mode 100644 sysdeps/unix/sysv/linux/csky/libutil.abilist
diff --git a/sysdeps/unix/sysv/linux/csky/ld.abilist b/sysdeps/unix/sysv/linux/csky/ld.abilist
new file mode 100644
index 0000000..eb8a78c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/ld.abilist
@@ -0,0 +1,10 @@
+GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __libc_stack_end D 0x4
+GLIBC_2.27 __stack_chk_guard D 0x4
+GLIBC_2.27 __tls_get_addr F
+GLIBC_2.27 _dl_mcount F
+GLIBC_2.27 _r_debug D 0x14
+GLIBC_2.27 calloc F
+GLIBC_2.27 free F
+GLIBC_2.27 malloc F
+GLIBC_2.27 realloc F
diff --git a/sysdeps/unix/sysv/linux/csky/libBrokenLocale.abilist b/sysdeps/unix/sysv/linux/csky/libBrokenLocale.abilist
new file mode 100644
index 0000000..78f0bef
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/libBrokenLocale.abilist
@@ -0,0 +1,2 @@
+GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __ctype_get_mb_cur_max F
diff --git a/sysdeps/unix/sysv/linux/csky/libanl.abilist b/sysdeps/unix/sysv/linux/csky/libanl.abilist
new file mode 100644
index 0000000..dea8bd0
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/libanl.abilist
@@ -0,0 +1,5 @@
+GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 gai_cancel F
+GLIBC_2.27 gai_error F
+GLIBC_2.27 gai_suspend F
+GLIBC_2.27 getaddrinfo_a F
diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist
new file mode 100644
index 0000000..0c7ec49
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/libc.abilist
@@ -0,0 +1,2083 @@
+GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 _Exit F
+GLIBC_2.27 _IO_2_1_stderr_ D 0x98
+GLIBC_2.27 _IO_2_1_stdin_ D 0x98
+GLIBC_2.27 _IO_2_1_stdout_ D 0x98
+GLIBC_2.27 _IO_adjust_column F
+GLIBC_2.27 _IO_adjust_wcolumn F
+GLIBC_2.27 _IO_default_doallocate F
+GLIBC_2.27 _IO_default_finish F
+GLIBC_2.27 _IO_default_pbackfail F
+GLIBC_2.27 _IO_default_uflow F
+GLIBC_2.27 _IO_default_xsgetn F
+GLIBC_2.27 _IO_default_xsputn F
+GLIBC_2.27 _IO_do_write F
+GLIBC_2.27 _IO_doallocbuf F
+GLIBC_2.27 _IO_fclose F
+GLIBC_2.27 _IO_fdopen F
+GLIBC_2.27 _IO_feof F
+GLIBC_2.27 _IO_ferror F
+GLIBC_2.27 _IO_fflush F
+GLIBC_2.27 _IO_fgetpos F
+GLIBC_2.27 _IO_fgetpos64 F
+GLIBC_2.27 _IO_fgets F
+GLIBC_2.27 _IO_file_attach F
+GLIBC_2.27 _IO_file_close F
+GLIBC_2.27 _IO_file_close_it F
+GLIBC_2.27 _IO_file_doallocate F
+GLIBC_2.27 _IO_file_finish F
+GLIBC_2.27 _IO_file_fopen F
+GLIBC_2.27 _IO_file_init F
+GLIBC_2.27 _IO_file_jumps D 0x54
+GLIBC_2.27 _IO_file_open F
+GLIBC_2.27 _IO_file_overflow F
+GLIBC_2.27 _IO_file_read F
+GLIBC_2.27 _IO_file_seek F
+GLIBC_2.27 _IO_file_seekoff F
+GLIBC_2.27 _IO_file_setbuf F
+GLIBC_2.27 _IO_file_stat F
+GLIBC_2.27 _IO_file_sync F
+GLIBC_2.27 _IO_file_underflow F
+GLIBC_2.27 _IO_file_write F
+GLIBC_2.27 _IO_file_xsputn F
+GLIBC_2.27 _IO_flockfile F
+GLIBC_2.27 _IO_flush_all F
+GLIBC_2.27 _IO_flush_all_linebuffered F
+GLIBC_2.27 _IO_fopen F
+GLIBC_2.27 _IO_fprintf F
+GLIBC_2.27 _IO_fputs F
+GLIBC_2.27 _IO_fread F
+GLIBC_2.27 _IO_free_backup_area F
+GLIBC_2.27 _IO_free_wbackup_area F
+GLIBC_2.27 _IO_fsetpos F
+GLIBC_2.27 _IO_fsetpos64 F
+GLIBC_2.27 _IO_ftell F
+GLIBC_2.27 _IO_ftrylockfile F
+GLIBC_2.27 _IO_funlockfile F
+GLIBC_2.27 _IO_fwrite F
+GLIBC_2.27 _IO_getc F
+GLIBC_2.27 _IO_getline F
+GLIBC_2.27 _IO_getline_info F
+GLIBC_2.27 _IO_gets F
+GLIBC_2.27 _IO_init F
+GLIBC_2.27 _IO_init_marker F
+GLIBC_2.27 _IO_init_wmarker F
+GLIBC_2.27 _IO_iter_begin F
+GLIBC_2.27 _IO_iter_end F
+GLIBC_2.27 _IO_iter_file F
+GLIBC_2.27 _IO_iter_next F
+GLIBC_2.27 _IO_least_wmarker F
+GLIBC_2.27 _IO_link_in F
+GLIBC_2.27 _IO_list_all D 0x4
+GLIBC_2.27 _IO_list_lock F
+GLIBC_2.27 _IO_list_resetlock F
+GLIBC_2.27 _IO_list_unlock F
+GLIBC_2.27 _IO_marker_delta F
+GLIBC_2.27 _IO_marker_difference F
+GLIBC_2.27 _IO_padn F
+GLIBC_2.27 _IO_peekc_locked F
+GLIBC_2.27 _IO_popen F
+GLIBC_2.27 _IO_printf F
+GLIBC_2.27 _IO_proc_close F
+GLIBC_2.27 _IO_proc_open F
+GLIBC_2.27 _IO_putc F
+GLIBC_2.27 _IO_puts F
+GLIBC_2.27 _IO_remove_marker F
+GLIBC_2.27 _IO_seekmark F
+GLIBC_2.27 _IO_seekoff F
+GLIBC_2.27 _IO_seekpos F
+GLIBC_2.27 _IO_seekwmark F
+GLIBC_2.27 _IO_setb F
+GLIBC_2.27 _IO_setbuffer F
+GLIBC_2.27 _IO_setvbuf F
+GLIBC_2.27 _IO_sgetn F
+GLIBC_2.27 _IO_sprintf F
+GLIBC_2.27 _IO_sputbackc F
+GLIBC_2.27 _IO_sputbackwc F
+GLIBC_2.27 _IO_sscanf F
+GLIBC_2.27 _IO_str_init_readonly F
+GLIBC_2.27 _IO_str_init_static F
+GLIBC_2.27 _IO_str_overflow F
+GLIBC_2.27 _IO_str_pbackfail F
+GLIBC_2.27 _IO_str_seekoff F
+GLIBC_2.27 _IO_str_underflow F
+GLIBC_2.27 _IO_sungetc F
+GLIBC_2.27 _IO_sungetwc F
+GLIBC_2.27 _IO_switch_to_get_mode F
+GLIBC_2.27 _IO_switch_to_main_wget_area F
+GLIBC_2.27 _IO_switch_to_wbackup_area F
+GLIBC_2.27 _IO_switch_to_wget_mode F
+GLIBC_2.27 _IO_un_link F
+GLIBC_2.27 _IO_ungetc F
+GLIBC_2.27 _IO_unsave_markers F
+GLIBC_2.27 _IO_unsave_wmarkers F
+GLIBC_2.27 _IO_vfprintf F
+GLIBC_2.27 _IO_vfscanf F
+GLIBC_2.27 _IO_vsprintf F
+GLIBC_2.27 _IO_wdefault_doallocate F
+GLIBC_2.27 _IO_wdefault_finish F
+GLIBC_2.27 _IO_wdefault_pbackfail F
+GLIBC_2.27 _IO_wdefault_uflow F
+GLIBC_2.27 _IO_wdefault_xsgetn F
+GLIBC_2.27 _IO_wdefault_xsputn F
+GLIBC_2.27 _IO_wdo_write F
+GLIBC_2.27 _IO_wdoallocbuf F
+GLIBC_2.27 _IO_wfile_jumps D 0x54
+GLIBC_2.27 _IO_wfile_overflow F
+GLIBC_2.27 _IO_wfile_seekoff F
+GLIBC_2.27 _IO_wfile_sync F
+GLIBC_2.27 _IO_wfile_underflow F
+GLIBC_2.27 _IO_wfile_xsputn F
+GLIBC_2.27 _IO_wmarker_delta F
+GLIBC_2.27 _IO_wsetb F
+GLIBC_2.27 ___brk_addr D 0x4
+GLIBC_2.27 __adjtimex F
+GLIBC_2.27 __after_morecore_hook D 0x4
+GLIBC_2.27 __argz_count F
+GLIBC_2.27 __argz_next F
+GLIBC_2.27 __argz_stringify F
+GLIBC_2.27 __asprintf F
+GLIBC_2.27 __asprintf_chk F
+GLIBC_2.27 __assert F
+GLIBC_2.27 __assert_fail F
+GLIBC_2.27 __assert_perror_fail F
+GLIBC_2.27 __backtrace F
+GLIBC_2.27 __backtrace_symbols F
+GLIBC_2.27 __backtrace_symbols_fd F
+GLIBC_2.27 __bsd_getpgrp F
+GLIBC_2.27 __bzero F
+GLIBC_2.27 __check_rhosts_file D 0x4
+GLIBC_2.27 __chk_fail F
+GLIBC_2.27 __clone F
+GLIBC_2.27 __close F
+GLIBC_2.27 __cmsg_nxthdr F
+GLIBC_2.27 __confstr_chk F
+GLIBC_2.27 __connect F
+GLIBC_2.27 __ctype_b_loc F
+GLIBC_2.27 __ctype_get_mb_cur_max F
+GLIBC_2.27 __ctype_tolower_loc F
+GLIBC_2.27 __ctype_toupper_loc F
+GLIBC_2.27 __curbrk D 0x4
+GLIBC_2.27 __cxa_at_quick_exit F
+GLIBC_2.27 __cxa_atexit F
+GLIBC_2.27 __cxa_finalize F
+GLIBC_2.27 __cxa_thread_atexit_impl F
+GLIBC_2.27 __cyg_profile_func_enter F
+GLIBC_2.27 __cyg_profile_func_exit F
+GLIBC_2.27 __daylight D 0x4
+GLIBC_2.27 __dcgettext F
+GLIBC_2.27 __default_morecore F
+GLIBC_2.27 __dgettext F
+GLIBC_2.27 __dprintf_chk F
+GLIBC_2.27 __dup2 F
+GLIBC_2.27 __duplocale F
+GLIBC_2.27 __endmntent F
+GLIBC_2.27 __environ D 0x4
+GLIBC_2.27 __errno_location F
+GLIBC_2.27 __explicit_bzero_chk F
+GLIBC_2.27 __fbufsize F
+GLIBC_2.27 __fcntl F
+GLIBC_2.27 __fdelt_chk F
+GLIBC_2.27 __fdelt_warn F
+GLIBC_2.27 __ffs F
+GLIBC_2.27 __fgets_chk F
+GLIBC_2.27 __fgets_unlocked_chk F
+GLIBC_2.27 __fgetws_chk F
+GLIBC_2.27 __fgetws_unlocked_chk F
+GLIBC_2.27 __finite F
+GLIBC_2.27 __finitef F
+GLIBC_2.27 __flbf F
+GLIBC_2.27 __fork F
+GLIBC_2.27 __fpending F
+GLIBC_2.27 __fprintf_chk F
+GLIBC_2.27 __fpu_control D 0x4
+GLIBC_2.27 __fpurge F
+GLIBC_2.27 __fread_chk F
+GLIBC_2.27 __fread_unlocked_chk F
+GLIBC_2.27 __freadable F
+GLIBC_2.27 __freading F
+GLIBC_2.27 __free_hook D 0x4
+GLIBC_2.27 __freelocale F
+GLIBC_2.27 __fsetlocking F
+GLIBC_2.27 __fwprintf_chk F
+GLIBC_2.27 __fwritable F
+GLIBC_2.27 __fwriting F
+GLIBC_2.27 __fxstat F
+GLIBC_2.27 __fxstat64 F
+GLIBC_2.27 __fxstatat F
+GLIBC_2.27 __fxstatat64 F
+GLIBC_2.27 __getauxval F
+GLIBC_2.27 __getcwd_chk F
+GLIBC_2.27 __getdelim F
+GLIBC_2.27 __getdomainname_chk F
+GLIBC_2.27 __getgroups_chk F
+GLIBC_2.27 __gethostname_chk F
+GLIBC_2.27 __getlogin_r_chk F
+GLIBC_2.27 __getmntent_r F
+GLIBC_2.27 __getpagesize F
+GLIBC_2.27 __getpgid F
+GLIBC_2.27 __getpid F
+GLIBC_2.27 __gets_chk F
+GLIBC_2.27 __gettimeofday F
+GLIBC_2.27 __getwd_chk F
+GLIBC_2.27 __gmtime_r F
+GLIBC_2.27 __h_errno_location F
+GLIBC_2.27 __isalnum_l F
+GLIBC_2.27 __isalpha_l F
+GLIBC_2.27 __isascii_l F
+GLIBC_2.27 __isblank_l F
+GLIBC_2.27 __iscntrl_l F
+GLIBC_2.27 __isctype F
+GLIBC_2.27 __isdigit_l F
+GLIBC_2.27 __isgraph_l F
+GLIBC_2.27 __isinf F
+GLIBC_2.27 __isinff F
+GLIBC_2.27 __islower_l F
+GLIBC_2.27 __isnan F
+GLIBC_2.27 __isnanf F
+GLIBC_2.27 __isoc99_fscanf F
+GLIBC_2.27 __isoc99_fwscanf F
+GLIBC_2.27 __isoc99_scanf F
+GLIBC_2.27 __isoc99_sscanf F
+GLIBC_2.27 __isoc99_swscanf F
+GLIBC_2.27 __isoc99_vfscanf F
+GLIBC_2.27 __isoc99_vfwscanf F
+GLIBC_2.27 __isoc99_vscanf F
+GLIBC_2.27 __isoc99_vsscanf F
+GLIBC_2.27 __isoc99_vswscanf F
+GLIBC_2.27 __isoc99_vwscanf F
+GLIBC_2.27 __isoc99_wscanf F
+GLIBC_2.27 __isprint_l F
+GLIBC_2.27 __ispunct_l F
+GLIBC_2.27 __isspace_l F
+GLIBC_2.27 __isupper_l F
+GLIBC_2.27 __iswalnum_l F
+GLIBC_2.27 __iswalpha_l F
+GLIBC_2.27 __iswblank_l F
+GLIBC_2.27 __iswcntrl_l F
+GLIBC_2.27 __iswctype F
+GLIBC_2.27 __iswctype_l F
+GLIBC_2.27 __iswdigit_l F
+GLIBC_2.27 __iswgraph_l F
+GLIBC_2.27 __iswlower_l F
+GLIBC_2.27 __iswprint_l F
+GLIBC_2.27 __iswpunct_l F
+GLIBC_2.27 __iswspace_l F
+GLIBC_2.27 __iswupper_l F
+GLIBC_2.27 __iswxdigit_l F
+GLIBC_2.27 __isxdigit_l F
+GLIBC_2.27 __ivaliduser F
+GLIBC_2.27 __key_decryptsession_pk_LOCAL D 0x4
+GLIBC_2.27 __key_encryptsession_pk_LOCAL D 0x4
+GLIBC_2.27 __key_gendes_LOCAL D 0x4
+GLIBC_2.27 __libc_allocate_rtsig F
+GLIBC_2.27 __libc_calloc F
+GLIBC_2.27 __libc_current_sigrtmax F
+GLIBC_2.27 __libc_current_sigrtmin F
+GLIBC_2.27 __libc_free F
+GLIBC_2.27 __libc_freeres F
+GLIBC_2.27 __libc_init_first F
+GLIBC_2.27 __libc_mallinfo F
+GLIBC_2.27 __libc_malloc F
+GLIBC_2.27 __libc_mallopt F
+GLIBC_2.27 __libc_memalign F
+GLIBC_2.27 __libc_pvalloc F
+GLIBC_2.27 __libc_realloc F
+GLIBC_2.27 __libc_sa_len F
+GLIBC_2.27 __libc_start_main F
+GLIBC_2.27 __libc_valloc F
+GLIBC_2.27 __longjmp_chk F
+GLIBC_2.27 __lseek F
+GLIBC_2.27 __lxstat F
+GLIBC_2.27 __lxstat64 F
+GLIBC_2.27 __malloc_hook D 0x4
+GLIBC_2.27 __mbrlen F
+GLIBC_2.27 __mbrtowc F
+GLIBC_2.27 __mbsnrtowcs_chk F
+GLIBC_2.27 __mbsrtowcs_chk F
+GLIBC_2.27 __mbstowcs_chk F
+GLIBC_2.27 __memalign_hook D 0x4
+GLIBC_2.27 __memcpy_chk F
+GLIBC_2.27 __memmove_chk F
+GLIBC_2.27 __mempcpy F
+GLIBC_2.27 __mempcpy_chk F
+GLIBC_2.27 __memset_chk F
+GLIBC_2.27 __monstartup F
+GLIBC_2.27 __morecore D 0x4
+GLIBC_2.27 __nanosleep F
+GLIBC_2.27 __newlocale F
+GLIBC_2.27 __nl_langinfo_l F
+GLIBC_2.27 __nss_configure_lookup F
+GLIBC_2.27 __nss_database_lookup F
+GLIBC_2.27 __nss_hostname_digits_dots F
+GLIBC_2.27 __nss_next F
+GLIBC_2.27 __obstack_printf_chk F
+GLIBC_2.27 __obstack_vprintf_chk F
+GLIBC_2.27 __open F
+GLIBC_2.27 __open64 F
+GLIBC_2.27 __open64_2 F
+GLIBC_2.27 __open_2 F
+GLIBC_2.27 __openat64_2 F
+GLIBC_2.27 __openat_2 F
+GLIBC_2.27 __overflow F
+GLIBC_2.27 __pipe F
+GLIBC_2.27 __poll F
+GLIBC_2.27 __poll_chk F
+GLIBC_2.27 __posix_getopt F
+GLIBC_2.27 __ppoll_chk F
+GLIBC_2.27 __pread64 F
+GLIBC_2.27 __pread64_chk F
+GLIBC_2.27 __pread_chk F
+GLIBC_2.27 __printf_chk F
+GLIBC_2.27 __printf_fp F
+GLIBC_2.27 __profile_frequency F
+GLIBC_2.27 __progname D 0x4
+GLIBC_2.27 __progname_full D 0x4
+GLIBC_2.27 __ptsname_r_chk F
+GLIBC_2.27 __pwrite64 F
+GLIBC_2.27 __rawmemchr F
+GLIBC_2.27 __rcmd_errstr D 0x4
+GLIBC_2.27 __read F
+GLIBC_2.27 __read_chk F
+GLIBC_2.27 __readlink_chk F
+GLIBC_2.27 __readlinkat_chk F
+GLIBC_2.27 __realloc_hook D 0x4
+GLIBC_2.27 __realpath_chk F
+GLIBC_2.27 __recv_chk F
+GLIBC_2.27 __recvfrom_chk F
+GLIBC_2.27 __register_atfork F
+GLIBC_2.27 __res_init F
+GLIBC_2.27 __res_nclose F
+GLIBC_2.27 __res_ninit F
+GLIBC_2.27 __res_randomid F
+GLIBC_2.27 __res_state F
+GLIBC_2.27 __rpc_thread_createerr F
+GLIBC_2.27 __rpc_thread_svc_fdset F
+GLIBC_2.27 __rpc_thread_svc_max_pollfd F
+GLIBC_2.27 __rpc_thread_svc_pollfd F
+GLIBC_2.27 __sbrk F
+GLIBC_2.27 __sched_cpualloc F
+GLIBC_2.27 __sched_cpucount F
+GLIBC_2.27 __sched_cpufree F
+GLIBC_2.27 __sched_get_priority_max F
+GLIBC_2.27 __sched_get_priority_min F
+GLIBC_2.27 __sched_getparam F
+GLIBC_2.27 __sched_getscheduler F
+GLIBC_2.27 __sched_setscheduler F
+GLIBC_2.27 __sched_yield F
+GLIBC_2.27 __select F
+GLIBC_2.27 __send F
+GLIBC_2.27 __setmntent F
+GLIBC_2.27 __setpgid F
+GLIBC_2.27 __sigaction F
+GLIBC_2.27 __signbit F
+GLIBC_2.27 __signbitf F
+GLIBC_2.27 __sigpause F
+GLIBC_2.27 __sigsetjmp F
+GLIBC_2.27 __sigsuspend F
+GLIBC_2.27 __snprintf_chk F
+GLIBC_2.27 __sprintf_chk F
+GLIBC_2.27 __stack_chk_fail F
+GLIBC_2.27 __statfs F
+GLIBC_2.27 __stpcpy F
+GLIBC_2.27 __stpcpy_chk F
+GLIBC_2.27 __stpncpy F
+GLIBC_2.27 __stpncpy_chk F
+GLIBC_2.27 __strcasecmp F
+GLIBC_2.27 __strcasecmp_l F
+GLIBC_2.27 __strcasestr F
+GLIBC_2.27 __strcat_chk F
+GLIBC_2.27 __strcoll_l F
+GLIBC_2.27 __strcpy_chk F
+GLIBC_2.27 __strdup F
+GLIBC_2.27 __strerror_r F
+GLIBC_2.27 __strfmon_l F
+GLIBC_2.27 __strftime_l F
+GLIBC_2.27 __strncasecmp_l F
+GLIBC_2.27 __strncat_chk F
+GLIBC_2.27 __strncpy_chk F
+GLIBC_2.27 __strndup F
+GLIBC_2.27 __strsep_g F
+GLIBC_2.27 __strtod_internal F
+GLIBC_2.27 __strtod_l F
+GLIBC_2.27 __strtof_internal F
+GLIBC_2.27 __strtof_l F
+GLIBC_2.27 __strtok_r F
+GLIBC_2.27 __strtol_internal F
+GLIBC_2.27 __strtol_l F
+GLIBC_2.27 __strtold_internal F
+GLIBC_2.27 __strtold_l F
+GLIBC_2.27 __strtoll_internal F
+GLIBC_2.27 __strtoll_l F
+GLIBC_2.27 __strtoul_internal F
+GLIBC_2.27 __strtoul_l F
+GLIBC_2.27 __strtoull_internal F
+GLIBC_2.27 __strtoull_l F
+GLIBC_2.27 __strverscmp F
+GLIBC_2.27 __strxfrm_l F
+GLIBC_2.27 __swprintf_chk F
+GLIBC_2.27 __sysconf F
+GLIBC_2.27 __sysctl F
+GLIBC_2.27 __syslog_chk F
+GLIBC_2.27 __sysv_signal F
+GLIBC_2.27 __timezone D 0x4
+GLIBC_2.27 __toascii_l F
+GLIBC_2.27 __tolower_l F
+GLIBC_2.27 __toupper_l F
+GLIBC_2.27 __towctrans F
+GLIBC_2.27 __towctrans_l F
+GLIBC_2.27 __towlower_l F
+GLIBC_2.27 __towupper_l F
+GLIBC_2.27 __ttyname_r_chk F
+GLIBC_2.27 __tzname D 0x8
+GLIBC_2.27 __uflow F
+GLIBC_2.27 __underflow F
+GLIBC_2.27 __uselocale F
+GLIBC_2.27 __vasprintf_chk F
+GLIBC_2.27 __vdprintf_chk F
+GLIBC_2.27 __vfork F
+GLIBC_2.27 __vfprintf_chk F
+GLIBC_2.27 __vfscanf F
+GLIBC_2.27 __vfwprintf_chk F
+GLIBC_2.27 __vprintf_chk F
+GLIBC_2.27 __vsnprintf F
+GLIBC_2.27 __vsnprintf_chk F
+GLIBC_2.27 __vsprintf_chk F
+GLIBC_2.27 __vsscanf F
+GLIBC_2.27 __vswprintf_chk F
+GLIBC_2.27 __vsyslog_chk F
+GLIBC_2.27 __vwprintf_chk F
+GLIBC_2.27 __wait F
+GLIBC_2.27 __waitpid F
+GLIBC_2.27 __wcpcpy_chk F
+GLIBC_2.27 __wcpncpy_chk F
+GLIBC_2.27 __wcrtomb_chk F
+GLIBC_2.27 __wcscasecmp_l F
+GLIBC_2.27 __wcscat_chk F
+GLIBC_2.27 __wcscoll_l F
+GLIBC_2.27 __wcscpy_chk F
+GLIBC_2.27 __wcsftime_l F
+GLIBC_2.27 __wcsncasecmp_l F
+GLIBC_2.27 __wcsncat_chk F
+GLIBC_2.27 __wcsncpy_chk F
+GLIBC_2.27 __wcsnrtombs_chk F
+GLIBC_2.27 __wcsrtombs_chk F
+GLIBC_2.27 __wcstod_internal F
+GLIBC_2.27 __wcstod_l F
+GLIBC_2.27 __wcstof_internal F
+GLIBC_2.27 __wcstof_l F
+GLIBC_2.27 __wcstol_internal F
+GLIBC_2.27 __wcstol_l F
+GLIBC_2.27 __wcstold_internal F
+GLIBC_2.27 __wcstold_l F
+GLIBC_2.27 __wcstoll_internal F
+GLIBC_2.27 __wcstoll_l F
+GLIBC_2.27 __wcstombs_chk F
+GLIBC_2.27 __wcstoul_internal F
+GLIBC_2.27 __wcstoul_l F
+GLIBC_2.27 __wcstoull_internal F
+GLIBC_2.27 __wcstoull_l F
+GLIBC_2.27 __wcsxfrm_l F
+GLIBC_2.27 __wctomb_chk F
+GLIBC_2.27 __wctrans_l F
+GLIBC_2.27 __wctype_l F
+GLIBC_2.27 __wmemcpy_chk F
+GLIBC_2.27 __wmemmove_chk F
+GLIBC_2.27 __wmempcpy_chk F
+GLIBC_2.27 __wmemset_chk F
+GLIBC_2.27 __woverflow F
+GLIBC_2.27 __wprintf_chk F
+GLIBC_2.27 __write F
+GLIBC_2.27 __wuflow F
+GLIBC_2.27 __wunderflow F
+GLIBC_2.27 __xmknod F
+GLIBC_2.27 __xmknodat F
+GLIBC_2.27 __xpg_basename F
+GLIBC_2.27 __xpg_sigpause F
+GLIBC_2.27 __xpg_strerror_r F
+GLIBC_2.27 __xstat F
+GLIBC_2.27 __xstat64 F
+GLIBC_2.27 _authenticate F
+GLIBC_2.27 _dl_mcount_wrapper F
+GLIBC_2.27 _dl_mcount_wrapper_check F
+GLIBC_2.27 _environ D 0x4
+GLIBC_2.27 _exit F
+GLIBC_2.27 _flushlbf F
+GLIBC_2.27 _libc_intl_domainname D 0x5
+GLIBC_2.27 _longjmp F
+GLIBC_2.27 _mcleanup F
+GLIBC_2.27 _mcount F
+GLIBC_2.27 _nl_default_dirname D 0x12
+GLIBC_2.27 _nl_domain_bindings D 0x4
+GLIBC_2.27 _nl_msg_cat_cntr D 0x4
+GLIBC_2.27 _null_auth D 0xc
+GLIBC_2.27 _obstack_allocated_p F
+GLIBC_2.27 _obstack_begin F
+GLIBC_2.27 _obstack_begin_1 F
+GLIBC_2.27 _obstack_free F
+GLIBC_2.27 _obstack_memory_used F
+GLIBC_2.27 _obstack_newchunk F
+GLIBC_2.27 _res D 0x200
+GLIBC_2.27 _res_hconf D 0x30
+GLIBC_2.27 _rpc_dtablesize F
+GLIBC_2.27 _seterr_reply F
+GLIBC_2.27 _setjmp F
+GLIBC_2.27 _sys_errlist D 0x21c
+GLIBC_2.27 _sys_nerr D 0x4
+GLIBC_2.27 _sys_siglist D 0x104
+GLIBC_2.27 _tolower F
+GLIBC_2.27 _toupper F
+GLIBC_2.27 a64l F
+GLIBC_2.27 abort F
+GLIBC_2.27 abs F
+GLIBC_2.27 accept F
+GLIBC_2.27 accept4 F
+GLIBC_2.27 access F
+GLIBC_2.27 acct F
+GLIBC_2.27 addmntent F
+GLIBC_2.27 addseverity F
+GLIBC_2.27 adjtime F
+GLIBC_2.27 adjtimex F
+GLIBC_2.27 alarm F
+GLIBC_2.27 aligned_alloc F
+GLIBC_2.27 alphasort F
+GLIBC_2.27 alphasort64 F
+GLIBC_2.27 argp_err_exit_status D 0x4
+GLIBC_2.27 argp_error F
+GLIBC_2.27 argp_failure F
+GLIBC_2.27 argp_help F
+GLIBC_2.27 argp_parse F
+GLIBC_2.27 argp_program_bug_address D 0x4
+GLIBC_2.27 argp_program_version D 0x4
+GLIBC_2.27 argp_program_version_hook D 0x4
+GLIBC_2.27 argp_state_help F
+GLIBC_2.27 argp_usage F
+GLIBC_2.27 argz_add F
+GLIBC_2.27 argz_add_sep F
+GLIBC_2.27 argz_append F
+GLIBC_2.27 argz_count F
+GLIBC_2.27 argz_create F
+GLIBC_2.27 argz_create_sep F
+GLIBC_2.27 argz_delete F
+GLIBC_2.27 argz_extract F
+GLIBC_2.27 argz_insert F
+GLIBC_2.27 argz_next F
+GLIBC_2.27 argz_replace F
+GLIBC_2.27 argz_stringify F
+GLIBC_2.27 asctime F
+GLIBC_2.27 asctime_r F
+GLIBC_2.27 asprintf F
+GLIBC_2.27 atof F
+GLIBC_2.27 atoi F
+GLIBC_2.27 atol F
+GLIBC_2.27 atoll F
+GLIBC_2.27 authdes_create F
+GLIBC_2.27 authdes_getucred F
+GLIBC_2.27 authdes_pk_create F
+GLIBC_2.27 authnone_create F
+GLIBC_2.27 authunix_create F
+GLIBC_2.27 authunix_create_default F
+GLIBC_2.27 backtrace F
+GLIBC_2.27 backtrace_symbols F
+GLIBC_2.27 backtrace_symbols_fd F
+GLIBC_2.27 basename F
+GLIBC_2.27 bcmp F
+GLIBC_2.27 bcopy F
+GLIBC_2.27 bind F
+GLIBC_2.27 bind_textdomain_codeset F
+GLIBC_2.27 bindresvport F
+GLIBC_2.27 bindtextdomain F
+GLIBC_2.27 brk F
+GLIBC_2.27 bsd_signal F
+GLIBC_2.27 bsearch F
+GLIBC_2.27 btowc F
+GLIBC_2.27 bzero F
+GLIBC_2.27 c16rtomb F
+GLIBC_2.27 c32rtomb F
+GLIBC_2.27 calloc F
+GLIBC_2.27 callrpc F
+GLIBC_2.27 canonicalize_file_name F
+GLIBC_2.27 capget F
+GLIBC_2.27 capset F
+GLIBC_2.27 catclose F
+GLIBC_2.27 catgets F
+GLIBC_2.27 catopen F
+GLIBC_2.27 cbc_crypt F
+GLIBC_2.27 cfgetispeed F
+GLIBC_2.27 cfgetospeed F
+GLIBC_2.27 cfmakeraw F
+GLIBC_2.27 cfsetispeed F
+GLIBC_2.27 cfsetospeed F
+GLIBC_2.27 cfsetspeed F
+GLIBC_2.27 chdir F
+GLIBC_2.27 chflags F
+GLIBC_2.27 chmod F
+GLIBC_2.27 chown F
+GLIBC_2.27 chroot F
+GLIBC_2.27 clearenv F
+GLIBC_2.27 clearerr F
+GLIBC_2.27 clearerr_unlocked F
+GLIBC_2.27 clnt_broadcast F
+GLIBC_2.27 clnt_create F
+GLIBC_2.27 clnt_pcreateerror F
+GLIBC_2.27 clnt_perrno F
+GLIBC_2.27 clnt_perror F
+GLIBC_2.27 clnt_spcreateerror F
+GLIBC_2.27 clnt_sperrno F
+GLIBC_2.27 clnt_sperror F
+GLIBC_2.27 clntraw_create F
+GLIBC_2.27 clnttcp_create F
+GLIBC_2.27 clntudp_bufcreate F
+GLIBC_2.27 clntudp_create F
+GLIBC_2.27 clntunix_create F
+GLIBC_2.27 clock F
+GLIBC_2.27 clock_adjtime F
+GLIBC_2.27 clock_getcpuclockid F
+GLIBC_2.27 clock_getres F
+GLIBC_2.27 clock_gettime F
+GLIBC_2.27 clock_nanosleep F
+GLIBC_2.27 clock_settime F
+GLIBC_2.27 clone F
+GLIBC_2.27 close F
+GLIBC_2.27 closedir F
+GLIBC_2.27 closelog F
+GLIBC_2.27 confstr F
+GLIBC_2.27 connect F
+GLIBC_2.27 copy_file_range F
+GLIBC_2.27 copysign F
+GLIBC_2.27 copysignf F
+GLIBC_2.27 copysignl F
+GLIBC_2.27 creat F
+GLIBC_2.27 creat64 F
+GLIBC_2.27 ctermid F
+GLIBC_2.27 ctime F
+GLIBC_2.27 ctime_r F
+GLIBC_2.27 cuserid F
+GLIBC_2.27 daemon F
+GLIBC_2.27 daylight D 0x4
+GLIBC_2.27 dcgettext F
+GLIBC_2.27 dcngettext F
+GLIBC_2.27 delete_module F
+GLIBC_2.27 des_setparity F
+GLIBC_2.27 dgettext F
+GLIBC_2.27 difftime F
+GLIBC_2.27 dirfd F
+GLIBC_2.27 dirname F
+GLIBC_2.27 div F
+GLIBC_2.27 dl_iterate_phdr F
+GLIBC_2.27 dngettext F
+GLIBC_2.27 dprintf F
+GLIBC_2.27 drand48 F
+GLIBC_2.27 drand48_r F
+GLIBC_2.27 dup F
+GLIBC_2.27 dup2 F
+GLIBC_2.27 dup3 F
+GLIBC_2.27 duplocale F
+GLIBC_2.27 dysize F
+GLIBC_2.27 eaccess F
+GLIBC_2.27 ecb_crypt F
+GLIBC_2.27 ecvt F
+GLIBC_2.27 ecvt_r F
+GLIBC_2.27 endaliasent F
+GLIBC_2.27 endfsent F
+GLIBC_2.27 endgrent F
+GLIBC_2.27 endhostent F
+GLIBC_2.27 endmntent F
+GLIBC_2.27 endnetent F
+GLIBC_2.27 endnetgrent F
+GLIBC_2.27 endprotoent F
+GLIBC_2.27 endpwent F
+GLIBC_2.27 endrpcent F
+GLIBC_2.27 endservent F
+GLIBC_2.27 endsgent F
+GLIBC_2.27 endspent F
+GLIBC_2.27 endttyent F
+GLIBC_2.27 endusershell F
+GLIBC_2.27 endutent F
+GLIBC_2.27 endutxent F
+GLIBC_2.27 environ D 0x4
+GLIBC_2.27 envz_add F
+GLIBC_2.27 envz_entry F
+GLIBC_2.27 envz_get F
+GLIBC_2.27 envz_merge F
+GLIBC_2.27 envz_remove F
+GLIBC_2.27 envz_strip F
+GLIBC_2.27 epoll_create F
+GLIBC_2.27 epoll_create1 F
+GLIBC_2.27 epoll_ctl F
+GLIBC_2.27 epoll_pwait F
+GLIBC_2.27 epoll_wait F
+GLIBC_2.27 erand48 F
+GLIBC_2.27 erand48_r F
+GLIBC_2.27 err F
+GLIBC_2.27 error F
+GLIBC_2.27 error_at_line F
+GLIBC_2.27 error_message_count D 0x4
+GLIBC_2.27 error_one_per_line D 0x4
+GLIBC_2.27 error_print_progname D 0x4
+GLIBC_2.27 errx F
+GLIBC_2.27 ether_aton F
+GLIBC_2.27 ether_aton_r F
+GLIBC_2.27 ether_hostton F
+GLIBC_2.27 ether_line F
+GLIBC_2.27 ether_ntoa F
+GLIBC_2.27 ether_ntoa_r F
+GLIBC_2.27 ether_ntohost F
+GLIBC_2.27 euidaccess F
+GLIBC_2.27 eventfd F
+GLIBC_2.27 eventfd_read F
+GLIBC_2.27 eventfd_write F
+GLIBC_2.27 execl F
+GLIBC_2.27 execle F
+GLIBC_2.27 execlp F
+GLIBC_2.27 execv F
+GLIBC_2.27 execve F
+GLIBC_2.27 execvp F
+GLIBC_2.27 execvpe F
+GLIBC_2.27 exit F
+GLIBC_2.27 explicit_bzero F
+GLIBC_2.27 faccessat F
+GLIBC_2.27 fallocate F
+GLIBC_2.27 fanotify_init F
+GLIBC_2.27 fanotify_mark F
+GLIBC_2.27 fattach F
+GLIBC_2.27 fchdir F
+GLIBC_2.27 fchflags F
+GLIBC_2.27 fchmod F
+GLIBC_2.27 fchmodat F
+GLIBC_2.27 fchown F
+GLIBC_2.27 fchownat F
+GLIBC_2.27 fclose F
+GLIBC_2.27 fcloseall F
+GLIBC_2.27 fcntl F
+GLIBC_2.27 fcvt F
+GLIBC_2.27 fcvt_r F
+GLIBC_2.27 fdatasync F
+GLIBC_2.27 fdetach F
+GLIBC_2.27 fdopen F
+GLIBC_2.27 fdopendir F
+GLIBC_2.27 feof F
+GLIBC_2.27 feof_unlocked F
+GLIBC_2.27 ferror F
+GLIBC_2.27 ferror_unlocked F
+GLIBC_2.27 fexecve F
+GLIBC_2.27 fflush F
+GLIBC_2.27 fflush_unlocked F
+GLIBC_2.27 ffs F
+GLIBC_2.27 ffsl F
+GLIBC_2.27 ffsll F
+GLIBC_2.27 fgetc F
+GLIBC_2.27 fgetc_unlocked F
+GLIBC_2.27 fgetgrent F
+GLIBC_2.27 fgetgrent_r F
+GLIBC_2.27 fgetpos F
+GLIBC_2.27 fgetpos64 F
+GLIBC_2.27 fgetpwent F
+GLIBC_2.27 fgetpwent_r F
+GLIBC_2.27 fgets F
+GLIBC_2.27 fgets_unlocked F
+GLIBC_2.27 fgetsgent F
+GLIBC_2.27 fgetsgent_r F
+GLIBC_2.27 fgetspent F
+GLIBC_2.27 fgetspent_r F
+GLIBC_2.27 fgetwc F
+GLIBC_2.27 fgetwc_unlocked F
+GLIBC_2.27 fgetws F
+GLIBC_2.27 fgetws_unlocked F
+GLIBC_2.27 fgetxattr F
+GLIBC_2.27 fileno F
+GLIBC_2.27 fileno_unlocked F
+GLIBC_2.27 finite F
+GLIBC_2.27 finitef F
+GLIBC_2.27 finitel F
+GLIBC_2.27 flistxattr F
+GLIBC_2.27 flock F
+GLIBC_2.27 flockfile F
+GLIBC_2.27 fmemopen F
+GLIBC_2.27 fmtmsg F
+GLIBC_2.27 fnmatch F
+GLIBC_2.27 fopen F
+GLIBC_2.27 fopen64 F
+GLIBC_2.27 fopencookie F
+GLIBC_2.27 fork F
+GLIBC_2.27 fpathconf F
+GLIBC_2.27 fprintf F
+GLIBC_2.27 fputc F
+GLIBC_2.27 fputc_unlocked F
+GLIBC_2.27 fputs F
+GLIBC_2.27 fputs_unlocked F
+GLIBC_2.27 fputwc F
+GLIBC_2.27 fputwc_unlocked F
+GLIBC_2.27 fputws F
+GLIBC_2.27 fputws_unlocked F
+GLIBC_2.27 fread F
+GLIBC_2.27 fread_unlocked F
+GLIBC_2.27 free F
+GLIBC_2.27 freeaddrinfo F
+GLIBC_2.27 freeifaddrs F
+GLIBC_2.27 freelocale F
+GLIBC_2.27 fremovexattr F
+GLIBC_2.27 freopen F
+GLIBC_2.27 freopen64 F
+GLIBC_2.27 frexp F
+GLIBC_2.27 frexpf F
+GLIBC_2.27 frexpl F
+GLIBC_2.27 fscanf F
+GLIBC_2.27 fseek F
+GLIBC_2.27 fseeko F
+GLIBC_2.27 fseeko64 F
+GLIBC_2.27 fsetpos F
+GLIBC_2.27 fsetpos64 F
+GLIBC_2.27 fsetxattr F
+GLIBC_2.27 fstatfs F
+GLIBC_2.27 fstatfs64 F
+GLIBC_2.27 fstatvfs F
+GLIBC_2.27 fstatvfs64 F
+GLIBC_2.27 fsync F
+GLIBC_2.27 ftell F
+GLIBC_2.27 ftello F
+GLIBC_2.27 ftello64 F
+GLIBC_2.27 ftime F
+GLIBC_2.27 ftok F
+GLIBC_2.27 ftruncate F
+GLIBC_2.27 ftruncate64 F
+GLIBC_2.27 ftrylockfile F
+GLIBC_2.27 fts64_children F
+GLIBC_2.27 fts64_close F
+GLIBC_2.27 fts64_open F
+GLIBC_2.27 fts64_read F
+GLIBC_2.27 fts64_set F
+GLIBC_2.27 fts_children F
+GLIBC_2.27 fts_close F
+GLIBC_2.27 fts_open F
+GLIBC_2.27 fts_read F
+GLIBC_2.27 fts_set F
+GLIBC_2.27 ftw F
+GLIBC_2.27 ftw64 F
+GLIBC_2.27 funlockfile F
+GLIBC_2.27 futimens F
+GLIBC_2.27 futimes F
+GLIBC_2.27 futimesat F
+GLIBC_2.27 fwide F
+GLIBC_2.27 fwprintf F
+GLIBC_2.27 fwrite F
+GLIBC_2.27 fwrite_unlocked F
+GLIBC_2.27 fwscanf F
+GLIBC_2.27 gai_strerror F
+GLIBC_2.27 gcvt F
+GLIBC_2.27 get_avphys_pages F
+GLIBC_2.27 get_current_dir_name F
+GLIBC_2.27 get_myaddress F
+GLIBC_2.27 get_nprocs F
+GLIBC_2.27 get_nprocs_conf F
+GLIBC_2.27 get_phys_pages F
+GLIBC_2.27 getaddrinfo F
+GLIBC_2.27 getaliasbyname F
+GLIBC_2.27 getaliasbyname_r F
+GLIBC_2.27 getaliasent F
+GLIBC_2.27 getaliasent_r F
+GLIBC_2.27 getauxval F
+GLIBC_2.27 getc F
+GLIBC_2.27 getc_unlocked F
+GLIBC_2.27 getchar F
+GLIBC_2.27 getchar_unlocked F
+GLIBC_2.27 getcontext F
+GLIBC_2.27 getcwd F
+GLIBC_2.27 getdate F
+GLIBC_2.27 getdate_err D 0x4
+GLIBC_2.27 getdate_r F
+GLIBC_2.27 getdelim F
+GLIBC_2.27 getdirentries F
+GLIBC_2.27 getdirentries64 F
+GLIBC_2.27 getdomainname F
+GLIBC_2.27 getdtablesize F
+GLIBC_2.27 getegid F
+GLIBC_2.27 getentropy F
+GLIBC_2.27 getenv F
+GLIBC_2.27 geteuid F
+GLIBC_2.27 getfsent F
+GLIBC_2.27 getfsfile F
+GLIBC_2.27 getfsspec F
+GLIBC_2.27 getgid F
+GLIBC_2.27 getgrent F
+GLIBC_2.27 getgrent_r F
+GLIBC_2.27 getgrgid F
+GLIBC_2.27 getgrgid_r F
+GLIBC_2.27 getgrnam F
+GLIBC_2.27 getgrnam_r F
+GLIBC_2.27 getgrouplist F
+GLIBC_2.27 getgroups F
+GLIBC_2.27 gethostbyaddr F
+GLIBC_2.27 gethostbyaddr_r F
+GLIBC_2.27 gethostbyname F
+GLIBC_2.27 gethostbyname2 F
+GLIBC_2.27 gethostbyname2_r F
+GLIBC_2.27 gethostbyname_r F
+GLIBC_2.27 gethostent F
+GLIBC_2.27 gethostent_r F
+GLIBC_2.27 gethostid F
+GLIBC_2.27 gethostname F
+GLIBC_2.27 getifaddrs F
+GLIBC_2.27 getipv4sourcefilter F
+GLIBC_2.27 getitimer F
+GLIBC_2.27 getline F
+GLIBC_2.27 getloadavg F
+GLIBC_2.27 getlogin F
+GLIBC_2.27 getlogin_r F
+GLIBC_2.27 getmntent F
+GLIBC_2.27 getmntent_r F
+GLIBC_2.27 getmsg F
+GLIBC_2.27 getnameinfo F
+GLIBC_2.27 getnetbyaddr F
+GLIBC_2.27 getnetbyaddr_r F
+GLIBC_2.27 getnetbyname F
+GLIBC_2.27 getnetbyname_r F
+GLIBC_2.27 getnetent F
+GLIBC_2.27 getnetent_r F
+GLIBC_2.27 getnetgrent F
+GLIBC_2.27 getnetgrent_r F
+GLIBC_2.27 getnetname F
+GLIBC_2.27 getopt F
+GLIBC_2.27 getopt_long F
+GLIBC_2.27 getopt_long_only F
+GLIBC_2.27 getpagesize F
+GLIBC_2.27 getpass F
+GLIBC_2.27 getpeername F
+GLIBC_2.27 getpgid F
+GLIBC_2.27 getpgrp F
+GLIBC_2.27 getpid F
+GLIBC_2.27 getpmsg F
+GLIBC_2.27 getppid F
+GLIBC_2.27 getpriority F
+GLIBC_2.27 getprotobyname F
+GLIBC_2.27 getprotobyname_r F
+GLIBC_2.27 getprotobynumber F
+GLIBC_2.27 getprotobynumber_r F
+GLIBC_2.27 getprotoent F
+GLIBC_2.27 getprotoent_r F
+GLIBC_2.27 getpt F
+GLIBC_2.27 getpublickey F
+GLIBC_2.27 getpw F
+GLIBC_2.27 getpwent F
+GLIBC_2.27 getpwent_r F
+GLIBC_2.27 getpwnam F
+GLIBC_2.27 getpwnam_r F
+GLIBC_2.27 getpwuid F
+GLIBC_2.27 getpwuid_r F
+GLIBC_2.27 getrandom F
+GLIBC_2.27 getresgid F
+GLIBC_2.27 getresuid F
+GLIBC_2.27 getrlimit F
+GLIBC_2.27 getrlimit64 F
+GLIBC_2.27 getrpcbyname F
+GLIBC_2.27 getrpcbyname_r F
+GLIBC_2.27 getrpcbynumber F
+GLIBC_2.27 getrpcbynumber_r F
+GLIBC_2.27 getrpcent F
+GLIBC_2.27 getrpcent_r F
+GLIBC_2.27 getrpcport F
+GLIBC_2.27 getrusage F
+GLIBC_2.27 gets F
+GLIBC_2.27 getsecretkey F
+GLIBC_2.27 getservbyname F
+GLIBC_2.27 getservbyname_r F
+GLIBC_2.27 getservbyport F
+GLIBC_2.27 getservbyport_r F
+GLIBC_2.27 getservent F
+GLIBC_2.27 getservent_r F
+GLIBC_2.27 getsgent F
+GLIBC_2.27 getsgent_r F
+GLIBC_2.27 getsgnam F
+GLIBC_2.27 getsgnam_r F
+GLIBC_2.27 getsid F
+GLIBC_2.27 getsockname F
+GLIBC_2.27 getsockopt F
+GLIBC_2.27 getsourcefilter F
+GLIBC_2.27 getspent F
+GLIBC_2.27 getspent_r F
+GLIBC_2.27 getspnam F
+GLIBC_2.27 getspnam_r F
+GLIBC_2.27 getsubopt F
+GLIBC_2.27 gettext F
+GLIBC_2.27 gettimeofday F
+GLIBC_2.27 getttyent F
+GLIBC_2.27 getttynam F
+GLIBC_2.27 getuid F
+GLIBC_2.27 getusershell F
+GLIBC_2.27 getutent F
+GLIBC_2.27 getutent_r F
+GLIBC_2.27 getutid F
+GLIBC_2.27 getutid_r F
+GLIBC_2.27 getutline F
+GLIBC_2.27 getutline_r F
+GLIBC_2.27 getutmp F
+GLIBC_2.27 getutmpx F
+GLIBC_2.27 getutxent F
+GLIBC_2.27 getutxid F
+GLIBC_2.27 getutxline F
+GLIBC_2.27 getw F
+GLIBC_2.27 getwc F
+GLIBC_2.27 getwc_unlocked F
+GLIBC_2.27 getwchar F
+GLIBC_2.27 getwchar_unlocked F
+GLIBC_2.27 getwd F
+GLIBC_2.27 getxattr F
+GLIBC_2.27 glob F
+GLIBC_2.27 glob64 F
+GLIBC_2.27 glob_pattern_p F
+GLIBC_2.27 globfree F
+GLIBC_2.27 globfree64 F
+GLIBC_2.27 gmtime F
+GLIBC_2.27 gmtime_r F
+GLIBC_2.27 gnu_dev_major F
+GLIBC_2.27 gnu_dev_makedev F
+GLIBC_2.27 gnu_dev_minor F
+GLIBC_2.27 gnu_get_libc_release F
+GLIBC_2.27 gnu_get_libc_version F
+GLIBC_2.27 grantpt F
+GLIBC_2.27 group_member F
+GLIBC_2.27 gsignal F
+GLIBC_2.27 gtty F
+GLIBC_2.27 h_errlist D 0x14
+GLIBC_2.27 h_nerr D 0x4
+GLIBC_2.27 hasmntopt F
+GLIBC_2.27 hcreate F
+GLIBC_2.27 hcreate_r F
+GLIBC_2.27 hdestroy F
+GLIBC_2.27 hdestroy_r F
+GLIBC_2.27 herror F
+GLIBC_2.27 host2netname F
+GLIBC_2.27 hsearch F
+GLIBC_2.27 hsearch_r F
+GLIBC_2.27 hstrerror F
+GLIBC_2.27 htonl F
+GLIBC_2.27 htons F
+GLIBC_2.27 iconv F
+GLIBC_2.27 iconv_close F
+GLIBC_2.27 iconv_open F
+GLIBC_2.27 if_freenameindex F
+GLIBC_2.27 if_indextoname F
+GLIBC_2.27 if_nameindex F
+GLIBC_2.27 if_nametoindex F
+GLIBC_2.27 imaxabs F
+GLIBC_2.27 imaxdiv F
+GLIBC_2.27 in6addr_any D 0x10
+GLIBC_2.27 in6addr_loopback D 0x10
+GLIBC_2.27 index F
+GLIBC_2.27 inet6_opt_append F
+GLIBC_2.27 inet6_opt_find F
+GLIBC_2.27 inet6_opt_finish F
+GLIBC_2.27 inet6_opt_get_val F
+GLIBC_2.27 inet6_opt_init F
+GLIBC_2.27 inet6_opt_next F
+GLIBC_2.27 inet6_opt_set_val F
+GLIBC_2.27 inet6_option_alloc F
+GLIBC_2.27 inet6_option_append F
+GLIBC_2.27 inet6_option_find F
+GLIBC_2.27 inet6_option_init F
+GLIBC_2.27 inet6_option_next F
+GLIBC_2.27 inet6_option_space F
+GLIBC_2.27 inet6_rth_add F
+GLIBC_2.27 inet6_rth_getaddr F
+GLIBC_2.27 inet6_rth_init F
+GLIBC_2.27 inet6_rth_reverse F
+GLIBC_2.27 inet6_rth_segments F
+GLIBC_2.27 inet6_rth_space F
+GLIBC_2.27 inet_addr F
+GLIBC_2.27 inet_aton F
+GLIBC_2.27 inet_lnaof F
+GLIBC_2.27 inet_makeaddr F
+GLIBC_2.27 inet_netof F
+GLIBC_2.27 inet_network F
+GLIBC_2.27 inet_nsap_addr F
+GLIBC_2.27 inet_nsap_ntoa F
+GLIBC_2.27 inet_ntoa F
+GLIBC_2.27 inet_ntop F
+GLIBC_2.27 inet_pton F
+GLIBC_2.27 init_module F
+GLIBC_2.27 initgroups F
+GLIBC_2.27 initstate F
+GLIBC_2.27 initstate_r F
+GLIBC_2.27 innetgr F
+GLIBC_2.27 inotify_add_watch F
+GLIBC_2.27 inotify_init F
+GLIBC_2.27 inotify_init1 F
+GLIBC_2.27 inotify_rm_watch F
+GLIBC_2.27 insque F
+GLIBC_2.27 ioctl F
+GLIBC_2.27 iruserok F
+GLIBC_2.27 iruserok_af F
+GLIBC_2.27 isalnum F
+GLIBC_2.27 isalnum_l F
+GLIBC_2.27 isalpha F
+GLIBC_2.27 isalpha_l F
+GLIBC_2.27 isascii F
+GLIBC_2.27 isastream F
+GLIBC_2.27 isatty F
+GLIBC_2.27 isblank F
+GLIBC_2.27 isblank_l F
+GLIBC_2.27 iscntrl F
+GLIBC_2.27 iscntrl_l F
+GLIBC_2.27 isctype F
+GLIBC_2.27 isdigit F
+GLIBC_2.27 isdigit_l F
+GLIBC_2.27 isfdtype F
+GLIBC_2.27 isgraph F
+GLIBC_2.27 isgraph_l F
+GLIBC_2.27 isinf F
+GLIBC_2.27 isinff F
+GLIBC_2.27 isinfl F
+GLIBC_2.27 islower F
+GLIBC_2.27 islower_l F
+GLIBC_2.27 isnan F
+GLIBC_2.27 isnanf F
+GLIBC_2.27 isnanl F
+GLIBC_2.27 isprint F
+GLIBC_2.27 isprint_l F
+GLIBC_2.27 ispunct F
+GLIBC_2.27 ispunct_l F
+GLIBC_2.27 isspace F
+GLIBC_2.27 isspace_l F
+GLIBC_2.27 isupper F
+GLIBC_2.27 isupper_l F
+GLIBC_2.27 iswalnum F
+GLIBC_2.27 iswalnum_l F
+GLIBC_2.27 iswalpha F
+GLIBC_2.27 iswalpha_l F
+GLIBC_2.27 iswblank F
+GLIBC_2.27 iswblank_l F
+GLIBC_2.27 iswcntrl F
+GLIBC_2.27 iswcntrl_l F
+GLIBC_2.27 iswctype F
+GLIBC_2.27 iswctype_l F
+GLIBC_2.27 iswdigit F
+GLIBC_2.27 iswdigit_l F
+GLIBC_2.27 iswgraph F
+GLIBC_2.27 iswgraph_l F
+GLIBC_2.27 iswlower F
+GLIBC_2.27 iswlower_l F
+GLIBC_2.27 iswprint F
+GLIBC_2.27 iswprint_l F
+GLIBC_2.27 iswpunct F
+GLIBC_2.27 iswpunct_l F
+GLIBC_2.27 iswspace F
+GLIBC_2.27 iswspace_l F
+GLIBC_2.27 iswupper F
+GLIBC_2.27 iswupper_l F
+GLIBC_2.27 iswxdigit F
+GLIBC_2.27 iswxdigit_l F
+GLIBC_2.27 isxdigit F
+GLIBC_2.27 isxdigit_l F
+GLIBC_2.27 jrand48 F
+GLIBC_2.27 jrand48_r F
+GLIBC_2.27 key_decryptsession F
+GLIBC_2.27 key_decryptsession_pk F
+GLIBC_2.27 key_encryptsession F
+GLIBC_2.27 key_encryptsession_pk F
+GLIBC_2.27 key_gendes F
+GLIBC_2.27 key_get_conv F
+GLIBC_2.27 key_secretkey_is_set F
+GLIBC_2.27 key_setnet F
+GLIBC_2.27 key_setsecret F
+GLIBC_2.27 kill F
+GLIBC_2.27 killpg F
+GLIBC_2.27 klogctl F
+GLIBC_2.27 l64a F
+GLIBC_2.27 labs F
+GLIBC_2.27 lchmod F
+GLIBC_2.27 lchown F
+GLIBC_2.27 lckpwdf F
+GLIBC_2.27 lcong48 F
+GLIBC_2.27 lcong48_r F
+GLIBC_2.27 ldexp F
+GLIBC_2.27 ldexpf F
+GLIBC_2.27 ldexpl F
+GLIBC_2.27 ldiv F
+GLIBC_2.27 lfind F
+GLIBC_2.27 lgetxattr F
+GLIBC_2.27 link F
+GLIBC_2.27 linkat F
+GLIBC_2.27 listen F
+GLIBC_2.27 listxattr F
+GLIBC_2.27 llabs F
+GLIBC_2.27 lldiv F
+GLIBC_2.27 llistxattr F
+GLIBC_2.27 llseek F
+GLIBC_2.27 localeconv F
+GLIBC_2.27 localtime F
+GLIBC_2.27 localtime_r F
+GLIBC_2.27 lockf F
+GLIBC_2.27 lockf64 F
+GLIBC_2.27 longjmp F
+GLIBC_2.27 lrand48 F
+GLIBC_2.27 lrand48_r F
+GLIBC_2.27 lremovexattr F
+GLIBC_2.27 lsearch F
+GLIBC_2.27 lseek F
+GLIBC_2.27 lseek64 F
+GLIBC_2.27 lsetxattr F
+GLIBC_2.27 lutimes F
+GLIBC_2.27 madvise F
+GLIBC_2.27 makecontext F
+GLIBC_2.27 mallinfo F
+GLIBC_2.27 malloc F
+GLIBC_2.27 malloc_info F
+GLIBC_2.27 malloc_stats F
+GLIBC_2.27 malloc_trim F
+GLIBC_2.27 malloc_usable_size F
+GLIBC_2.27 mallopt F
+GLIBC_2.27 mallwatch D 0x4
+GLIBC_2.27 mblen F
+GLIBC_2.27 mbrlen F
+GLIBC_2.27 mbrtoc16 F
+GLIBC_2.27 mbrtoc32 F
+GLIBC_2.27 mbrtowc F
+GLIBC_2.27 mbsinit F
+GLIBC_2.27 mbsnrtowcs F
+GLIBC_2.27 mbsrtowcs F
+GLIBC_2.27 mbstowcs F
+GLIBC_2.27 mbtowc F
+GLIBC_2.27 mcheck F
+GLIBC_2.27 mcheck_check_all F
+GLIBC_2.27 mcheck_pedantic F
+GLIBC_2.27 mcount F
+GLIBC_2.27 memalign F
+GLIBC_2.27 memccpy F
+GLIBC_2.27 memchr F
+GLIBC_2.27 memcmp F
+GLIBC_2.27 memcpy F
+GLIBC_2.27 memfd_create F
+GLIBC_2.27 memfrob F
+GLIBC_2.27 memmem F
+GLIBC_2.27 memmove F
+GLIBC_2.27 mempcpy F
+GLIBC_2.27 memrchr F
+GLIBC_2.27 memset F
+GLIBC_2.27 mincore F
+GLIBC_2.27 mkdir F
+GLIBC_2.27 mkdirat F
+GLIBC_2.27 mkdtemp F
+GLIBC_2.27 mkfifo F
+GLIBC_2.27 mkfifoat F
+GLIBC_2.27 mkostemp F
+GLIBC_2.27 mkostemp64 F
+GLIBC_2.27 mkostemps F
+GLIBC_2.27 mkostemps64 F
+GLIBC_2.27 mkstemp F
+GLIBC_2.27 mkstemp64 F
+GLIBC_2.27 mkstemps F
+GLIBC_2.27 mkstemps64 F
+GLIBC_2.27 mktemp F
+GLIBC_2.27 mktime F
+GLIBC_2.27 mlock F
+GLIBC_2.27 mlock2 F
+GLIBC_2.27 mlockall F
+GLIBC_2.27 mmap F
+GLIBC_2.27 mmap64 F
+GLIBC_2.27 modf F
+GLIBC_2.27 modff F
+GLIBC_2.27 modfl F
+GLIBC_2.27 moncontrol F
+GLIBC_2.27 monstartup F
+GLIBC_2.27 mount F
+GLIBC_2.27 mprobe F
+GLIBC_2.27 mprotect F
+GLIBC_2.27 mrand48 F
+GLIBC_2.27 mrand48_r F
+GLIBC_2.27 mremap F
+GLIBC_2.27 msgctl F
+GLIBC_2.27 msgget F
+GLIBC_2.27 msgrcv F
+GLIBC_2.27 msgsnd F
+GLIBC_2.27 msync F
+GLIBC_2.27 mtrace F
+GLIBC_2.27 munlock F
+GLIBC_2.27 munlockall F
+GLIBC_2.27 munmap F
+GLIBC_2.27 muntrace F
+GLIBC_2.27 name_to_handle_at F
+GLIBC_2.27 nanosleep F
+GLIBC_2.27 netname2host F
+GLIBC_2.27 netname2user F
+GLIBC_2.27 newlocale F
+GLIBC_2.27 nfsservctl F
+GLIBC_2.27 nftw F
+GLIBC_2.27 nftw64 F
+GLIBC_2.27 ngettext F
+GLIBC_2.27 nice F
+GLIBC_2.27 nl_langinfo F
+GLIBC_2.27 nl_langinfo_l F
+GLIBC_2.27 nrand48 F
+GLIBC_2.27 nrand48_r F
+GLIBC_2.27 ntohl F
+GLIBC_2.27 ntohs F
+GLIBC_2.27 ntp_adjtime F
+GLIBC_2.27 ntp_gettime F
+GLIBC_2.27 ntp_gettimex F
+GLIBC_2.27 obstack_alloc_failed_handler D 0x4
+GLIBC_2.27 obstack_exit_failure D 0x4
+GLIBC_2.27 obstack_free F
+GLIBC_2.27 obstack_printf F
+GLIBC_2.27 obstack_vprintf F
+GLIBC_2.27 on_exit F
+GLIBC_2.27 open F
+GLIBC_2.27 open64 F
+GLIBC_2.27 open_by_handle_at F
+GLIBC_2.27 open_memstream F
+GLIBC_2.27 open_wmemstream F
+GLIBC_2.27 openat F
+GLIBC_2.27 openat64 F
+GLIBC_2.27 opendir F
+GLIBC_2.27 openlog F
+GLIBC_2.27 optarg D 0x4
+GLIBC_2.27 opterr D 0x4
+GLIBC_2.27 optind D 0x4
+GLIBC_2.27 optopt D 0x4
+GLIBC_2.27 parse_printf_format F
+GLIBC_2.27 passwd2des F
+GLIBC_2.27 pathconf F
+GLIBC_2.27 pause F
+GLIBC_2.27 pclose F
+GLIBC_2.27 perror F
+GLIBC_2.27 personality F
+GLIBC_2.27 pipe F
+GLIBC_2.27 pipe2 F
+GLIBC_2.27 pivot_root F
+GLIBC_2.27 pkey_alloc F
+GLIBC_2.27 pkey_free F
+GLIBC_2.27 pkey_get F
+GLIBC_2.27 pkey_mprotect F
+GLIBC_2.27 pkey_set F
+GLIBC_2.27 pmap_getmaps F
+GLIBC_2.27 pmap_getport F
+GLIBC_2.27 pmap_rmtcall F
+GLIBC_2.27 pmap_set F
+GLIBC_2.27 pmap_unset F
+GLIBC_2.27 poll F
+GLIBC_2.27 popen F
+GLIBC_2.27 posix_fadvise F
+GLIBC_2.27 posix_fadvise64 F
+GLIBC_2.27 posix_fallocate F
+GLIBC_2.27 posix_fallocate64 F
+GLIBC_2.27 posix_madvise F
+GLIBC_2.27 posix_memalign F
+GLIBC_2.27 posix_openpt F
+GLIBC_2.27 posix_spawn F
+GLIBC_2.27 posix_spawn_file_actions_addclose F
+GLIBC_2.27 posix_spawn_file_actions_adddup2 F
+GLIBC_2.27 posix_spawn_file_actions_addopen F
+GLIBC_2.27 posix_spawn_file_actions_destroy F
+GLIBC_2.27 posix_spawn_file_actions_init F
+GLIBC_2.27 posix_spawnattr_destroy F
+GLIBC_2.27 posix_spawnattr_getflags F
+GLIBC_2.27 posix_spawnattr_getpgroup F
+GLIBC_2.27 posix_spawnattr_getschedparam F
+GLIBC_2.27 posix_spawnattr_getschedpolicy F
+GLIBC_2.27 posix_spawnattr_getsigdefault F
+GLIBC_2.27 posix_spawnattr_getsigmask F
+GLIBC_2.27 posix_spawnattr_init F
+GLIBC_2.27 posix_spawnattr_setflags F
+GLIBC_2.27 posix_spawnattr_setpgroup F
+GLIBC_2.27 posix_spawnattr_setschedparam F
+GLIBC_2.27 posix_spawnattr_setschedpolicy F
+GLIBC_2.27 posix_spawnattr_setsigdefault F
+GLIBC_2.27 posix_spawnattr_setsigmask F
+GLIBC_2.27 posix_spawnp F
+GLIBC_2.27 ppoll F
+GLIBC_2.27 prctl F
+GLIBC_2.27 pread F
+GLIBC_2.27 pread64 F
+GLIBC_2.27 preadv F
+GLIBC_2.27 preadv2 F
+GLIBC_2.27 preadv64 F
+GLIBC_2.27 preadv64v2 F
+GLIBC_2.27 printf F
+GLIBC_2.27 printf_size F
+GLIBC_2.27 printf_size_info F
+GLIBC_2.27 prlimit F
+GLIBC_2.27 prlimit64 F
+GLIBC_2.27 process_vm_readv F
+GLIBC_2.27 process_vm_writev F
+GLIBC_2.27 profil F
+GLIBC_2.27 profil_counter F
+GLIBC_2.27 program_invocation_name D 0x4
+GLIBC_2.27 program_invocation_short_name D 0x4
+GLIBC_2.27 pselect F
+GLIBC_2.27 psiginfo F
+GLIBC_2.27 psignal F
+GLIBC_2.27 pthread_attr_destroy F
+GLIBC_2.27 pthread_attr_getdetachstate F
+GLIBC_2.27 pthread_attr_getinheritsched F
+GLIBC_2.27 pthread_attr_getschedparam F
+GLIBC_2.27 pthread_attr_getschedpolicy F
+GLIBC_2.27 pthread_attr_getscope F
+GLIBC_2.27 pthread_attr_init F
+GLIBC_2.27 pthread_attr_setdetachstate F
+GLIBC_2.27 pthread_attr_setinheritsched F
+GLIBC_2.27 pthread_attr_setschedparam F
+GLIBC_2.27 pthread_attr_setschedpolicy F
+GLIBC_2.27 pthread_attr_setscope F
+GLIBC_2.27 pthread_cond_broadcast F
+GLIBC_2.27 pthread_cond_destroy F
+GLIBC_2.27 pthread_cond_init F
+GLIBC_2.27 pthread_cond_signal F
+GLIBC_2.27 pthread_cond_timedwait F
+GLIBC_2.27 pthread_cond_wait F
+GLIBC_2.27 pthread_condattr_destroy F
+GLIBC_2.27 pthread_condattr_init F
+GLIBC_2.27 pthread_equal F
+GLIBC_2.27 pthread_exit F
+GLIBC_2.27 pthread_getschedparam F
+GLIBC_2.27 pthread_mutex_destroy F
+GLIBC_2.27 pthread_mutex_init F
+GLIBC_2.27 pthread_mutex_lock F
+GLIBC_2.27 pthread_mutex_unlock F
+GLIBC_2.27 pthread_self F
+GLIBC_2.27 pthread_setcancelstate F
+GLIBC_2.27 pthread_setcanceltype F
+GLIBC_2.27 pthread_setschedparam F
+GLIBC_2.27 ptrace F
+GLIBC_2.27 ptsname F
+GLIBC_2.27 ptsname_r F
+GLIBC_2.27 putc F
+GLIBC_2.27 putc_unlocked F
+GLIBC_2.27 putchar F
+GLIBC_2.27 putchar_unlocked F
+GLIBC_2.27 putenv F
+GLIBC_2.27 putgrent F
+GLIBC_2.27 putmsg F
+GLIBC_2.27 putpmsg F
+GLIBC_2.27 putpwent F
+GLIBC_2.27 puts F
+GLIBC_2.27 putsgent F
+GLIBC_2.27 putspent F
+GLIBC_2.27 pututline F
+GLIBC_2.27 pututxline F
+GLIBC_2.27 putw F
+GLIBC_2.27 putwc F
+GLIBC_2.27 putwc_unlocked F
+GLIBC_2.27 putwchar F
+GLIBC_2.27 putwchar_unlocked F
+GLIBC_2.27 pvalloc F
+GLIBC_2.27 pwrite F
+GLIBC_2.27 pwrite64 F
+GLIBC_2.27 pwritev F
+GLIBC_2.27 pwritev2 F
+GLIBC_2.27 pwritev64 F
+GLIBC_2.27 pwritev64v2 F
+GLIBC_2.27 qecvt F
+GLIBC_2.27 qecvt_r F
+GLIBC_2.27 qfcvt F
+GLIBC_2.27 qfcvt_r F
+GLIBC_2.27 qgcvt F
+GLIBC_2.27 qsort F
+GLIBC_2.27 qsort_r F
+GLIBC_2.27 quick_exit F
+GLIBC_2.27 quotactl F
+GLIBC_2.27 raise F
+GLIBC_2.27 rand F
+GLIBC_2.27 rand_r F
+GLIBC_2.27 random F
+GLIBC_2.27 random_r F
+GLIBC_2.27 rawmemchr F
+GLIBC_2.27 rcmd F
+GLIBC_2.27 rcmd_af F
+GLIBC_2.27 re_comp F
+GLIBC_2.27 re_compile_fastmap F
+GLIBC_2.27 re_compile_pattern F
+GLIBC_2.27 re_exec F
+GLIBC_2.27 re_match F
+GLIBC_2.27 re_match_2 F
+GLIBC_2.27 re_search F
+GLIBC_2.27 re_search_2 F
+GLIBC_2.27 re_set_registers F
+GLIBC_2.27 re_set_syntax F
+GLIBC_2.27 re_syntax_options D 0x4
+GLIBC_2.27 read F
+GLIBC_2.27 readahead F
+GLIBC_2.27 readdir F
+GLIBC_2.27 readdir64 F
+GLIBC_2.27 readdir64_r F
+GLIBC_2.27 readdir_r F
+GLIBC_2.27 readlink F
+GLIBC_2.27 readlinkat F
+GLIBC_2.27 readv F
+GLIBC_2.27 realloc F
+GLIBC_2.27 reallocarray F
+GLIBC_2.27 realpath F
+GLIBC_2.27 reboot F
+GLIBC_2.27 recv F
+GLIBC_2.27 recvfrom F
+GLIBC_2.27 recvmmsg F
+GLIBC_2.27 recvmsg F
+GLIBC_2.27 regcomp F
+GLIBC_2.27 regerror F
+GLIBC_2.27 regexec F
+GLIBC_2.27 regfree F
+GLIBC_2.27 register_printf_function F
+GLIBC_2.27 register_printf_modifier F
+GLIBC_2.27 register_printf_specifier F
+GLIBC_2.27 register_printf_type F
+GLIBC_2.27 registerrpc F
+GLIBC_2.27 remap_file_pages F
+GLIBC_2.27 remove F
+GLIBC_2.27 removexattr F
+GLIBC_2.27 remque F
+GLIBC_2.27 rename F
+GLIBC_2.27 renameat F
+GLIBC_2.27 revoke F
+GLIBC_2.27 rewind F
+GLIBC_2.27 rewinddir F
+GLIBC_2.27 rexec F
+GLIBC_2.27 rexec_af F
+GLIBC_2.27 rexecoptions D 0x4
+GLIBC_2.27 rindex F
+GLIBC_2.27 rmdir F
+GLIBC_2.27 rpc_createerr D 0x10
+GLIBC_2.27 rpmatch F
+GLIBC_2.27 rresvport F
+GLIBC_2.27 rresvport_af F
+GLIBC_2.27 rtime F
+GLIBC_2.27 ruserok F
+GLIBC_2.27 ruserok_af F
+GLIBC_2.27 ruserpass F
+GLIBC_2.27 sbrk F
+GLIBC_2.27 scalbn F
+GLIBC_2.27 scalbnf F
+GLIBC_2.27 scalbnl F
+GLIBC_2.27 scandir F
+GLIBC_2.27 scandir64 F
+GLIBC_2.27 scandirat F
+GLIBC_2.27 scandirat64 F
+GLIBC_2.27 scanf F
+GLIBC_2.27 sched_get_priority_max F
+GLIBC_2.27 sched_get_priority_min F
+GLIBC_2.27 sched_getaffinity F
+GLIBC_2.27 sched_getcpu F
+GLIBC_2.27 sched_getparam F
+GLIBC_2.27 sched_getscheduler F
+GLIBC_2.27 sched_rr_get_interval F
+GLIBC_2.27 sched_setaffinity F
+GLIBC_2.27 sched_setparam F
+GLIBC_2.27 sched_setscheduler F
+GLIBC_2.27 sched_yield F
+GLIBC_2.27 secure_getenv F
+GLIBC_2.27 seed48 F
+GLIBC_2.27 seed48_r F
+GLIBC_2.27 seekdir F
+GLIBC_2.27 select F
+GLIBC_2.27 semctl F
+GLIBC_2.27 semget F
+GLIBC_2.27 semop F
+GLIBC_2.27 semtimedop F
+GLIBC_2.27 send F
+GLIBC_2.27 sendfile F
+GLIBC_2.27 sendfile64 F
+GLIBC_2.27 sendmmsg F
+GLIBC_2.27 sendmsg F
+GLIBC_2.27 sendto F
+GLIBC_2.27 setaliasent F
+GLIBC_2.27 setbuf F
+GLIBC_2.27 setbuffer F
+GLIBC_2.27 setcontext F
+GLIBC_2.27 setdomainname F
+GLIBC_2.27 setegid F
+GLIBC_2.27 setenv F
+GLIBC_2.27 seteuid F
+GLIBC_2.27 setfsent F
+GLIBC_2.27 setfsgid F
+GLIBC_2.27 setfsuid F
+GLIBC_2.27 setgid F
+GLIBC_2.27 setgrent F
+GLIBC_2.27 setgroups F
+GLIBC_2.27 sethostent F
+GLIBC_2.27 sethostid F
+GLIBC_2.27 sethostname F
+GLIBC_2.27 setipv4sourcefilter F
+GLIBC_2.27 setitimer F
+GLIBC_2.27 setjmp F
+GLIBC_2.27 setlinebuf F
+GLIBC_2.27 setlocale F
+GLIBC_2.27 setlogin F
+GLIBC_2.27 setlogmask F
+GLIBC_2.27 setmntent F
+GLIBC_2.27 setnetent F
+GLIBC_2.27 setnetgrent F
+GLIBC_2.27 setns F
+GLIBC_2.27 setpgid F
+GLIBC_2.27 setpgrp F
+GLIBC_2.27 setpriority F
+GLIBC_2.27 setprotoent F
+GLIBC_2.27 setpwent F
+GLIBC_2.27 setregid F
+GLIBC_2.27 setresgid F
+GLIBC_2.27 setresuid F
+GLIBC_2.27 setreuid F
+GLIBC_2.27 setrlimit F
+GLIBC_2.27 setrlimit64 F
+GLIBC_2.27 setrpcent F
+GLIBC_2.27 setservent F
+GLIBC_2.27 setsgent F
+GLIBC_2.27 setsid F
+GLIBC_2.27 setsockopt F
+GLIBC_2.27 setsourcefilter F
+GLIBC_2.27 setspent F
+GLIBC_2.27 setstate F
+GLIBC_2.27 setstate_r F
+GLIBC_2.27 settimeofday F
+GLIBC_2.27 setttyent F
+GLIBC_2.27 setuid F
+GLIBC_2.27 setusershell F
+GLIBC_2.27 setutent F
+GLIBC_2.27 setutxent F
+GLIBC_2.27 setvbuf F
+GLIBC_2.27 setxattr F
+GLIBC_2.27 sgetsgent F
+GLIBC_2.27 sgetsgent_r F
+GLIBC_2.27 sgetspent F
+GLIBC_2.27 sgetspent_r F
+GLIBC_2.27 shmat F
+GLIBC_2.27 shmctl F
+GLIBC_2.27 shmdt F
+GLIBC_2.27 shmget F
+GLIBC_2.27 shutdown F
+GLIBC_2.27 sigaction F
+GLIBC_2.27 sigaddset F
+GLIBC_2.27 sigaltstack F
+GLIBC_2.27 sigandset F
+GLIBC_2.27 sigblock F
+GLIBC_2.27 sigdelset F
+GLIBC_2.27 sigemptyset F
+GLIBC_2.27 sigfillset F
+GLIBC_2.27 siggetmask F
+GLIBC_2.27 sighold F
+GLIBC_2.27 sigignore F
+GLIBC_2.27 siginterrupt F
+GLIBC_2.27 sigisemptyset F
+GLIBC_2.27 sigismember F
+GLIBC_2.27 siglongjmp F
+GLIBC_2.27 signal F
+GLIBC_2.27 signalfd F
+GLIBC_2.27 sigorset F
+GLIBC_2.27 sigpause F
+GLIBC_2.27 sigpending F
+GLIBC_2.27 sigprocmask F
+GLIBC_2.27 sigqueue F
+GLIBC_2.27 sigrelse F
+GLIBC_2.27 sigreturn F
+GLIBC_2.27 sigset F
+GLIBC_2.27 sigsetmask F
+GLIBC_2.27 sigstack F
+GLIBC_2.27 sigsuspend F
+GLIBC_2.27 sigtimedwait F
+GLIBC_2.27 sigwait F
+GLIBC_2.27 sigwaitinfo F
+GLIBC_2.27 sleep F
+GLIBC_2.27 snprintf F
+GLIBC_2.27 sockatmark F
+GLIBC_2.27 socket F
+GLIBC_2.27 socketpair F
+GLIBC_2.27 splice F
+GLIBC_2.27 sprintf F
+GLIBC_2.27 sprofil F
+GLIBC_2.27 srand F
+GLIBC_2.27 srand48 F
+GLIBC_2.27 srand48_r F
+GLIBC_2.27 srandom F
+GLIBC_2.27 srandom_r F
+GLIBC_2.27 sscanf F
+GLIBC_2.27 ssignal F
+GLIBC_2.27 sstk F
+GLIBC_2.27 statfs F
+GLIBC_2.27 statfs64 F
+GLIBC_2.27 statvfs F
+GLIBC_2.27 statvfs64 F
+GLIBC_2.27 stderr D 0x4
+GLIBC_2.27 stdin D 0x4
+GLIBC_2.27 stdout D 0x4
+GLIBC_2.27 stime F
+GLIBC_2.27 stpcpy F
+GLIBC_2.27 stpncpy F
+GLIBC_2.27 strcasecmp F
+GLIBC_2.27 strcasecmp_l F
+GLIBC_2.27 strcasestr F
+GLIBC_2.27 strcat F
+GLIBC_2.27 strchr F
+GLIBC_2.27 strchrnul F
+GLIBC_2.27 strcmp F
+GLIBC_2.27 strcoll F
+GLIBC_2.27 strcoll_l F
+GLIBC_2.27 strcpy F
+GLIBC_2.27 strcspn F
+GLIBC_2.27 strdup F
+GLIBC_2.27 strerror F
+GLIBC_2.27 strerror_l F
+GLIBC_2.27 strerror_r F
+GLIBC_2.27 strfmon F
+GLIBC_2.27 strfmon_l F
+GLIBC_2.27 strfromd F
+GLIBC_2.27 strfromf F
+GLIBC_2.27 strfromf32 F
+GLIBC_2.27 strfromf32x F
+GLIBC_2.27 strfromf64 F
+GLIBC_2.27 strfroml F
+GLIBC_2.27 strfry F
+GLIBC_2.27 strftime F
+GLIBC_2.27 strftime_l F
+GLIBC_2.27 strlen F
+GLIBC_2.27 strncasecmp F
+GLIBC_2.27 strncasecmp_l F
+GLIBC_2.27 strncat F
+GLIBC_2.27 strncmp F
+GLIBC_2.27 strncpy F
+GLIBC_2.27 strndup F
+GLIBC_2.27 strnlen F
+GLIBC_2.27 strpbrk F
+GLIBC_2.27 strptime F
+GLIBC_2.27 strptime_l F
+GLIBC_2.27 strrchr F
+GLIBC_2.27 strsep F
+GLIBC_2.27 strsignal F
+GLIBC_2.27 strspn F
+GLIBC_2.27 strstr F
+GLIBC_2.27 strtod F
+GLIBC_2.27 strtod_l F
+GLIBC_2.27 strtof F
+GLIBC_2.27 strtof32 F
+GLIBC_2.27 strtof32_l F
+GLIBC_2.27 strtof32x F
+GLIBC_2.27 strtof32x_l F
+GLIBC_2.27 strtof64 F
+GLIBC_2.27 strtof64_l F
+GLIBC_2.27 strtof_l F
+GLIBC_2.27 strtoimax F
+GLIBC_2.27 strtok F
+GLIBC_2.27 strtok_r F
+GLIBC_2.27 strtol F
+GLIBC_2.27 strtol_l F
+GLIBC_2.27 strtold F
+GLIBC_2.27 strtold_l F
+GLIBC_2.27 strtoll F
+GLIBC_2.27 strtoll_l F
+GLIBC_2.27 strtoq F
+GLIBC_2.27 strtoul F
+GLIBC_2.27 strtoul_l F
+GLIBC_2.27 strtoull F
+GLIBC_2.27 strtoull_l F
+GLIBC_2.27 strtoumax F
+GLIBC_2.27 strtouq F
+GLIBC_2.27 strverscmp F
+GLIBC_2.27 strxfrm F
+GLIBC_2.27 strxfrm_l F
+GLIBC_2.27 stty F
+GLIBC_2.27 svc_exit F
+GLIBC_2.27 svc_fdset D 0x80
+GLIBC_2.27 svc_getreq F
+GLIBC_2.27 svc_getreq_common F
+GLIBC_2.27 svc_getreq_poll F
+GLIBC_2.27 svc_getreqset F
+GLIBC_2.27 svc_max_pollfd D 0x4
+GLIBC_2.27 svc_pollfd D 0x4
+GLIBC_2.27 svc_register F
+GLIBC_2.27 svc_run F
+GLIBC_2.27 svc_sendreply F
+GLIBC_2.27 svc_unregister F
+GLIBC_2.27 svcauthdes_stats D 0xc
+GLIBC_2.27 svcerr_auth F
+GLIBC_2.27 svcerr_decode F
+GLIBC_2.27 svcerr_noproc F
+GLIBC_2.27 svcerr_noprog F
+GLIBC_2.27 svcerr_progvers F
+GLIBC_2.27 svcerr_systemerr F
+GLIBC_2.27 svcerr_weakauth F
+GLIBC_2.27 svcfd_create F
+GLIBC_2.27 svcraw_create F
+GLIBC_2.27 svctcp_create F
+GLIBC_2.27 svcudp_bufcreate F
+GLIBC_2.27 svcudp_create F
+GLIBC_2.27 svcudp_enablecache F
+GLIBC_2.27 svcunix_create F
+GLIBC_2.27 svcunixfd_create F
+GLIBC_2.27 swab F
+GLIBC_2.27 swapcontext F
+GLIBC_2.27 swapoff F
+GLIBC_2.27 swapon F
+GLIBC_2.27 swprintf F
+GLIBC_2.27 swscanf F
+GLIBC_2.27 symlink F
+GLIBC_2.27 symlinkat F
+GLIBC_2.27 sync F
+GLIBC_2.27 sync_file_range F
+GLIBC_2.27 syncfs F
+GLIBC_2.27 sys_errlist D 0x21c
+GLIBC_2.27 sys_nerr D 0x4
+GLIBC_2.27 sys_sigabbrev D 0x104
+GLIBC_2.27 sys_siglist D 0x104
+GLIBC_2.27 syscall F
+GLIBC_2.27 sysconf F
+GLIBC_2.27 sysctl F
+GLIBC_2.27 sysinfo F
+GLIBC_2.27 syslog F
+GLIBC_2.27 system F
+GLIBC_2.27 sysv_signal F
+GLIBC_2.27 tcdrain F
+GLIBC_2.27 tcflow F
+GLIBC_2.27 tcflush F
+GLIBC_2.27 tcgetattr F
+GLIBC_2.27 tcgetpgrp F
+GLIBC_2.27 tcgetsid F
+GLIBC_2.27 tcsendbreak F
+GLIBC_2.27 tcsetattr F
+GLIBC_2.27 tcsetpgrp F
+GLIBC_2.27 tdelete F
+GLIBC_2.27 tdestroy F
+GLIBC_2.27 tee F
+GLIBC_2.27 telldir F
+GLIBC_2.27 tempnam F
+GLIBC_2.27 textdomain F
+GLIBC_2.27 tfind F
+GLIBC_2.27 time F
+GLIBC_2.27 timegm F
+GLIBC_2.27 timelocal F
+GLIBC_2.27 timerfd_create F
+GLIBC_2.27 timerfd_gettime F
+GLIBC_2.27 timerfd_settime F
+GLIBC_2.27 times F
+GLIBC_2.27 timespec_get F
+GLIBC_2.27 timezone D 0x4
+GLIBC_2.27 tmpfile F
+GLIBC_2.27 tmpfile64 F
+GLIBC_2.27 tmpnam F
+GLIBC_2.27 tmpnam_r F
+GLIBC_2.27 toascii F
+GLIBC_2.27 tolower F
+GLIBC_2.27 tolower_l F
+GLIBC_2.27 toupper F
+GLIBC_2.27 toupper_l F
+GLIBC_2.27 towctrans F
+GLIBC_2.27 towctrans_l F
+GLIBC_2.27 towlower F
+GLIBC_2.27 towlower_l F
+GLIBC_2.27 towupper F
+GLIBC_2.27 towupper_l F
+GLIBC_2.27 tr_break F
+GLIBC_2.27 truncate F
+GLIBC_2.27 truncate64 F
+GLIBC_2.27 tsearch F
+GLIBC_2.27 ttyname F
+GLIBC_2.27 ttyname_r F
+GLIBC_2.27 ttyslot F
+GLIBC_2.27 twalk F
+GLIBC_2.27 tzname D 0x8
+GLIBC_2.27 tzset F
+GLIBC_2.27 ualarm F
+GLIBC_2.27 ulckpwdf F
+GLIBC_2.27 ulimit F
+GLIBC_2.27 umask F
+GLIBC_2.27 umount F
+GLIBC_2.27 umount2 F
+GLIBC_2.27 uname F
+GLIBC_2.27 ungetc F
+GLIBC_2.27 ungetwc F
+GLIBC_2.27 unlink F
+GLIBC_2.27 unlinkat F
+GLIBC_2.27 unlockpt F
+GLIBC_2.27 unsetenv F
+GLIBC_2.27 unshare F
+GLIBC_2.27 updwtmp F
+GLIBC_2.27 updwtmpx F
+GLIBC_2.27 uselocale F
+GLIBC_2.27 user2netname F
+GLIBC_2.27 usleep F
+GLIBC_2.27 ustat F
+GLIBC_2.27 utime F
+GLIBC_2.27 utimensat F
+GLIBC_2.27 utimes F
+GLIBC_2.27 utmpname F
+GLIBC_2.27 utmpxname F
+GLIBC_2.27 valloc F
+GLIBC_2.27 vasprintf F
+GLIBC_2.27 vdprintf F
+GLIBC_2.27 verr F
+GLIBC_2.27 verrx F
+GLIBC_2.27 versionsort F
+GLIBC_2.27 versionsort64 F
+GLIBC_2.27 vfork F
+GLIBC_2.27 vfprintf F
+GLIBC_2.27 vfscanf F
+GLIBC_2.27 vfwprintf F
+GLIBC_2.27 vfwscanf F
+GLIBC_2.27 vhangup F
+GLIBC_2.27 vlimit F
+GLIBC_2.27 vmsplice F
+GLIBC_2.27 vprintf F
+GLIBC_2.27 vscanf F
+GLIBC_2.27 vsnprintf F
+GLIBC_2.27 vsprintf F
+GLIBC_2.27 vsscanf F
+GLIBC_2.27 vswprintf F
+GLIBC_2.27 vswscanf F
+GLIBC_2.27 vsyslog F
+GLIBC_2.27 vtimes F
+GLIBC_2.27 vwarn F
+GLIBC_2.27 vwarnx F
+GLIBC_2.27 vwprintf F
+GLIBC_2.27 vwscanf F
+GLIBC_2.27 wait F
+GLIBC_2.27 wait3 F
+GLIBC_2.27 wait4 F
+GLIBC_2.27 waitid F
+GLIBC_2.27 waitpid F
+GLIBC_2.27 warn F
+GLIBC_2.27 warnx F
+GLIBC_2.27 wcpcpy F
+GLIBC_2.27 wcpncpy F
+GLIBC_2.27 wcrtomb F
+GLIBC_2.27 wcscasecmp F
+GLIBC_2.27 wcscasecmp_l F
+GLIBC_2.27 wcscat F
+GLIBC_2.27 wcschr F
+GLIBC_2.27 wcschrnul F
+GLIBC_2.27 wcscmp F
+GLIBC_2.27 wcscoll F
+GLIBC_2.27 wcscoll_l F
+GLIBC_2.27 wcscpy F
+GLIBC_2.27 wcscspn F
+GLIBC_2.27 wcsdup F
+GLIBC_2.27 wcsftime F
+GLIBC_2.27 wcsftime_l F
+GLIBC_2.27 wcslen F
+GLIBC_2.27 wcsncasecmp F
+GLIBC_2.27 wcsncasecmp_l F
+GLIBC_2.27 wcsncat F
+GLIBC_2.27 wcsncmp F
+GLIBC_2.27 wcsncpy F
+GLIBC_2.27 wcsnlen F
+GLIBC_2.27 wcsnrtombs F
+GLIBC_2.27 wcspbrk F
+GLIBC_2.27 wcsrchr F
+GLIBC_2.27 wcsrtombs F
+GLIBC_2.27 wcsspn F
+GLIBC_2.27 wcsstr F
+GLIBC_2.27 wcstod F
+GLIBC_2.27 wcstod_l F
+GLIBC_2.27 wcstof F
+GLIBC_2.27 wcstof32 F
+GLIBC_2.27 wcstof32_l F
+GLIBC_2.27 wcstof32x F
+GLIBC_2.27 wcstof32x_l F
+GLIBC_2.27 wcstof64 F
+GLIBC_2.27 wcstof64_l F
+GLIBC_2.27 wcstof_l F
+GLIBC_2.27 wcstoimax F
+GLIBC_2.27 wcstok F
+GLIBC_2.27 wcstol F
+GLIBC_2.27 wcstol_l F
+GLIBC_2.27 wcstold F
+GLIBC_2.27 wcstold_l F
+GLIBC_2.27 wcstoll F
+GLIBC_2.27 wcstoll_l F
+GLIBC_2.27 wcstombs F
+GLIBC_2.27 wcstoq F
+GLIBC_2.27 wcstoul F
+GLIBC_2.27 wcstoul_l F
+GLIBC_2.27 wcstoull F
+GLIBC_2.27 wcstoull_l F
+GLIBC_2.27 wcstoumax F
+GLIBC_2.27 wcstouq F
+GLIBC_2.27 wcswcs F
+GLIBC_2.27 wcswidth F
+GLIBC_2.27 wcsxfrm F
+GLIBC_2.27 wcsxfrm_l F
+GLIBC_2.27 wctob F
+GLIBC_2.27 wctomb F
+GLIBC_2.27 wctrans F
+GLIBC_2.27 wctrans_l F
+GLIBC_2.27 wctype F
+GLIBC_2.27 wctype_l F
+GLIBC_2.27 wcwidth F
+GLIBC_2.27 wmemchr F
+GLIBC_2.27 wmemcmp F
+GLIBC_2.27 wmemcpy F
+GLIBC_2.27 wmemmove F
+GLIBC_2.27 wmempcpy F
+GLIBC_2.27 wmemset F
+GLIBC_2.27 wordexp F
+GLIBC_2.27 wordfree F
+GLIBC_2.27 wprintf F
+GLIBC_2.27 write F
+GLIBC_2.27 writev F
+GLIBC_2.27 wscanf F
+GLIBC_2.27 xdecrypt F
+GLIBC_2.27 xdr_accepted_reply F
+GLIBC_2.27 xdr_array F
+GLIBC_2.27 xdr_authdes_cred F
+GLIBC_2.27 xdr_authdes_verf F
+GLIBC_2.27 xdr_authunix_parms F
+GLIBC_2.27 xdr_bool F
+GLIBC_2.27 xdr_bytes F
+GLIBC_2.27 xdr_callhdr F
+GLIBC_2.27 xdr_callmsg F
+GLIBC_2.27 xdr_char F
+GLIBC_2.27 xdr_cryptkeyarg F
+GLIBC_2.27 xdr_cryptkeyarg2 F
+GLIBC_2.27 xdr_cryptkeyres F
+GLIBC_2.27 xdr_des_block F
+GLIBC_2.27 xdr_double F
+GLIBC_2.27 xdr_enum F
+GLIBC_2.27 xdr_float F
+GLIBC_2.27 xdr_free F
+GLIBC_2.27 xdr_getcredres F
+GLIBC_2.27 xdr_hyper F
+GLIBC_2.27 xdr_int F
+GLIBC_2.27 xdr_int16_t F
+GLIBC_2.27 xdr_int32_t F
+GLIBC_2.27 xdr_int64_t F
+GLIBC_2.27 xdr_int8_t F
+GLIBC_2.27 xdr_key_netstarg F
+GLIBC_2.27 xdr_key_netstres F
+GLIBC_2.27 xdr_keybuf F
+GLIBC_2.27 xdr_keystatus F
+GLIBC_2.27 xdr_long F
+GLIBC_2.27 xdr_longlong_t F
+GLIBC_2.27 xdr_netnamestr F
+GLIBC_2.27 xdr_netobj F
+GLIBC_2.27 xdr_opaque F
+GLIBC_2.27 xdr_opaque_auth F
+GLIBC_2.27 xdr_pmap F
+GLIBC_2.27 xdr_pmaplist F
+GLIBC_2.27 xdr_pointer F
+GLIBC_2.27 xdr_quad_t F
+GLIBC_2.27 xdr_reference F
+GLIBC_2.27 xdr_rejected_reply F
+GLIBC_2.27 xdr_replymsg F
+GLIBC_2.27 xdr_rmtcall_args F
+GLIBC_2.27 xdr_rmtcallres F
+GLIBC_2.27 xdr_short F
+GLIBC_2.27 xdr_sizeof F
+GLIBC_2.27 xdr_string F
+GLIBC_2.27 xdr_u_char F
+GLIBC_2.27 xdr_u_hyper F
+GLIBC_2.27 xdr_u_int F
+GLIBC_2.27 xdr_u_long F
+GLIBC_2.27 xdr_u_longlong_t F
+GLIBC_2.27 xdr_u_quad_t F
+GLIBC_2.27 xdr_u_short F
+GLIBC_2.27 xdr_uint16_t F
+GLIBC_2.27 xdr_uint32_t F
+GLIBC_2.27 xdr_uint64_t F
+GLIBC_2.27 xdr_uint8_t F
+GLIBC_2.27 xdr_union F
+GLIBC_2.27 xdr_unixcred F
+GLIBC_2.27 xdr_vector F
+GLIBC_2.27 xdr_void F
+GLIBC_2.27 xdr_wrapstring F
+GLIBC_2.27 xdrmem_create F
+GLIBC_2.27 xdrrec_create F
+GLIBC_2.27 xdrrec_endofrecord F
+GLIBC_2.27 xdrrec_eof F
+GLIBC_2.27 xdrrec_skiprecord F
+GLIBC_2.27 xdrstdio_create F
+GLIBC_2.27 xencrypt F
+GLIBC_2.27 xprt_register F
+GLIBC_2.27 xprt_unregister F
diff --git a/sysdeps/unix/sysv/linux/csky/libcrypt.abilist b/sysdeps/unix/sysv/linux/csky/libcrypt.abilist
new file mode 100644
index 0000000..2fe2263
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/libcrypt.abilist
@@ -0,0 +1,8 @@
+GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 crypt F
+GLIBC_2.27 crypt_r F
+GLIBC_2.27 encrypt F
+GLIBC_2.27 encrypt_r F
+GLIBC_2.27 fcrypt F
+GLIBC_2.27 setkey F
+GLIBC_2.27 setkey_r F
diff --git a/sysdeps/unix/sysv/linux/csky/libdl.abilist b/sysdeps/unix/sysv/linux/csky/libdl.abilist
new file mode 100644
index 0000000..ea9b1e3
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/libdl.abilist
@@ -0,0 +1,10 @@
+GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 dladdr F
+GLIBC_2.27 dladdr1 F
+GLIBC_2.27 dlclose F
+GLIBC_2.27 dlerror F
+GLIBC_2.27 dlinfo F
+GLIBC_2.27 dlmopen F
+GLIBC_2.27 dlopen F
+GLIBC_2.27 dlsym F
+GLIBC_2.27 dlvsym F
diff --git a/sysdeps/unix/sysv/linux/csky/libm.abilist b/sysdeps/unix/sysv/linux/csky/libm.abilist
new file mode 100644
index 0000000..0671486
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/libm.abilist
@@ -0,0 +1,737 @@
+GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __acos_finite F
+GLIBC_2.27 __acosf_finite F
+GLIBC_2.27 __acosh_finite F
+GLIBC_2.27 __acoshf_finite F
+GLIBC_2.27 __asin_finite F
+GLIBC_2.27 __asinf_finite F
+GLIBC_2.27 __atan2_finite F
+GLIBC_2.27 __atan2f_finite F
+GLIBC_2.27 __atanh_finite F
+GLIBC_2.27 __atanhf_finite F
+GLIBC_2.27 __clog10 F
+GLIBC_2.27 __clog10f F
+GLIBC_2.27 __clog10l F
+GLIBC_2.27 __cosh_finite F
+GLIBC_2.27 __coshf_finite F
+GLIBC_2.27 __exp10_finite F
+GLIBC_2.27 __exp10f_finite F
+GLIBC_2.27 __exp2_finite F
+GLIBC_2.27 __exp2f_finite F
+GLIBC_2.27 __exp_finite F
+GLIBC_2.27 __expf_finite F
+GLIBC_2.27 __finite F
+GLIBC_2.27 __finitef F
+GLIBC_2.27 __fmod_finite F
+GLIBC_2.27 __fmodf_finite F
+GLIBC_2.27 __fpclassify F
+GLIBC_2.27 __fpclassifyf F
+GLIBC_2.27 __gamma_r_finite F
+GLIBC_2.27 __gammaf_r_finite F
+GLIBC_2.27 __hypot_finite F
+GLIBC_2.27 __hypotf_finite F
+GLIBC_2.27 __iseqsig F
+GLIBC_2.27 __iseqsigf F
+GLIBC_2.27 __issignaling F
+GLIBC_2.27 __issignalingf F
+GLIBC_2.27 __j0_finite F
+GLIBC_2.27 __j0f_finite F
+GLIBC_2.27 __j1_finite F
+GLIBC_2.27 __j1f_finite F
+GLIBC_2.27 __jn_finite F
+GLIBC_2.27 __jnf_finite F
+GLIBC_2.27 __lgamma_r_finite F
+GLIBC_2.27 __lgammaf_r_finite F
+GLIBC_2.27 __log10_finite F
+GLIBC_2.27 __log10f_finite F
+GLIBC_2.27 __log2_finite F
+GLIBC_2.27 __log2f_finite F
+GLIBC_2.27 __log_finite F
+GLIBC_2.27 __logf_finite F
+GLIBC_2.27 __pow_finite F
+GLIBC_2.27 __powf_finite F
+GLIBC_2.27 __remainder_finite F
+GLIBC_2.27 __remainderf_finite F
+GLIBC_2.27 __scalb_finite F
+GLIBC_2.27 __scalbf_finite F
+GLIBC_2.27 __signbit F
+GLIBC_2.27 __signbitf F
+GLIBC_2.27 __signgam D 0x4
+GLIBC_2.27 __sinh_finite F
+GLIBC_2.27 __sinhf_finite F
+GLIBC_2.27 __sqrt_finite F
+GLIBC_2.27 __sqrtf_finite F
+GLIBC_2.27 __y0_finite F
+GLIBC_2.27 __y0f_finite F
+GLIBC_2.27 __y1_finite F
+GLIBC_2.27 __y1f_finite F
+GLIBC_2.27 __yn_finite F
+GLIBC_2.27 __ynf_finite F
+GLIBC_2.27 acos F
+GLIBC_2.27 acosf F
+GLIBC_2.27 acosf32 F
+GLIBC_2.27 acosf32x F
+GLIBC_2.27 acosf64 F
+GLIBC_2.27 acosh F
+GLIBC_2.27 acoshf F
+GLIBC_2.27 acoshf32 F
+GLIBC_2.27 acoshf32x F
+GLIBC_2.27 acoshf64 F
+GLIBC_2.27 acoshl F
+GLIBC_2.27 acosl F
+GLIBC_2.27 asin F
+GLIBC_2.27 asinf F
+GLIBC_2.27 asinf32 F
+GLIBC_2.27 asinf32x F
+GLIBC_2.27 asinf64 F
+GLIBC_2.27 asinh F
+GLIBC_2.27 asinhf F
+GLIBC_2.27 asinhf32 F
+GLIBC_2.27 asinhf32x F
+GLIBC_2.27 asinhf64 F
+GLIBC_2.27 asinhl F
+GLIBC_2.27 asinl F
+GLIBC_2.27 atan F
+GLIBC_2.27 atan2 F
+GLIBC_2.27 atan2f F
+GLIBC_2.27 atan2f32 F
+GLIBC_2.27 atan2f32x F
+GLIBC_2.27 atan2f64 F
+GLIBC_2.27 atan2l F
+GLIBC_2.27 atanf F
+GLIBC_2.27 atanf32 F
+GLIBC_2.27 atanf32x F
+GLIBC_2.27 atanf64 F
+GLIBC_2.27 atanh F
+GLIBC_2.27 atanhf F
+GLIBC_2.27 atanhf32 F
+GLIBC_2.27 atanhf32x F
+GLIBC_2.27 atanhf64 F
+GLIBC_2.27 atanhl F
+GLIBC_2.27 atanl F
+GLIBC_2.27 cabs F
+GLIBC_2.27 cabsf F
+GLIBC_2.27 cabsf32 F
+GLIBC_2.27 cabsf32x F
+GLIBC_2.27 cabsf64 F
+GLIBC_2.27 cabsl F
+GLIBC_2.27 cacos F
+GLIBC_2.27 cacosf F
+GLIBC_2.27 cacosf32 F
+GLIBC_2.27 cacosf32x F
+GLIBC_2.27 cacosf64 F
+GLIBC_2.27 cacosh F
+GLIBC_2.27 cacoshf F
+GLIBC_2.27 cacoshf32 F
+GLIBC_2.27 cacoshf32x F
+GLIBC_2.27 cacoshf64 F
+GLIBC_2.27 cacoshl F
+GLIBC_2.27 cacosl F
+GLIBC_2.27 canonicalize F
+GLIBC_2.27 canonicalizef F
+GLIBC_2.27 canonicalizef32 F
+GLIBC_2.27 canonicalizef32x F
+GLIBC_2.27 canonicalizef64 F
+GLIBC_2.27 canonicalizel F
+GLIBC_2.27 carg F
+GLIBC_2.27 cargf F
+GLIBC_2.27 cargf32 F
+GLIBC_2.27 cargf32x F
+GLIBC_2.27 cargf64 F
+GLIBC_2.27 cargl F
+GLIBC_2.27 casin F
+GLIBC_2.27 casinf F
+GLIBC_2.27 casinf32 F
+GLIBC_2.27 casinf32x F
+GLIBC_2.27 casinf64 F
+GLIBC_2.27 casinh F
+GLIBC_2.27 casinhf F
+GLIBC_2.27 casinhf32 F
+GLIBC_2.27 casinhf32x F
+GLIBC_2.27 casinhf64 F
+GLIBC_2.27 casinhl F
+GLIBC_2.27 casinl F
+GLIBC_2.27 catan F
+GLIBC_2.27 catanf F
+GLIBC_2.27 catanf32 F
+GLIBC_2.27 catanf32x F
+GLIBC_2.27 catanf64 F
+GLIBC_2.27 catanh F
+GLIBC_2.27 catanhf F
+GLIBC_2.27 catanhf32 F
+GLIBC_2.27 catanhf32x F
+GLIBC_2.27 catanhf64 F
+GLIBC_2.27 catanhl F
+GLIBC_2.27 catanl F
+GLIBC_2.27 cbrt F
+GLIBC_2.27 cbrtf F
+GLIBC_2.27 cbrtf32 F
+GLIBC_2.27 cbrtf32x F
+GLIBC_2.27 cbrtf64 F
+GLIBC_2.27 cbrtl F
+GLIBC_2.27 ccos F
+GLIBC_2.27 ccosf F
+GLIBC_2.27 ccosf32 F
+GLIBC_2.27 ccosf32x F
+GLIBC_2.27 ccosf64 F
+GLIBC_2.27 ccosh F
+GLIBC_2.27 ccoshf F
+GLIBC_2.27 ccoshf32 F
+GLIBC_2.27 ccoshf32x F
+GLIBC_2.27 ccoshf64 F
+GLIBC_2.27 ccoshl F
+GLIBC_2.27 ccosl F
+GLIBC_2.27 ceil F
+GLIBC_2.27 ceilf F
+GLIBC_2.27 ceilf32 F
+GLIBC_2.27 ceilf32x F
+GLIBC_2.27 ceilf64 F
+GLIBC_2.27 ceill F
+GLIBC_2.27 cexp F
+GLIBC_2.27 cexpf F
+GLIBC_2.27 cexpf32 F
+GLIBC_2.27 cexpf32x F
+GLIBC_2.27 cexpf64 F
+GLIBC_2.27 cexpl F
+GLIBC_2.27 cimag F
+GLIBC_2.27 cimagf F
+GLIBC_2.27 cimagf32 F
+GLIBC_2.27 cimagf32x F
+GLIBC_2.27 cimagf64 F
+GLIBC_2.27 cimagl F
+GLIBC_2.27 clog F
+GLIBC_2.27 clog10 F
+GLIBC_2.27 clog10f F
+GLIBC_2.27 clog10f32 F
+GLIBC_2.27 clog10f32x F
+GLIBC_2.27 clog10f64 F
+GLIBC_2.27 clog10l F
+GLIBC_2.27 clogf F
+GLIBC_2.27 clogf32 F
+GLIBC_2.27 clogf32x F
+GLIBC_2.27 clogf64 F
+GLIBC_2.27 clogl F
+GLIBC_2.27 conj F
+GLIBC_2.27 conjf F
+GLIBC_2.27 conjf32 F
+GLIBC_2.27 conjf32x F
+GLIBC_2.27 conjf64 F
+GLIBC_2.27 conjl F
+GLIBC_2.27 copysign F
+GLIBC_2.27 copysignf F
+GLIBC_2.27 copysignf32 F
+GLIBC_2.27 copysignf32x F
+GLIBC_2.27 copysignf64 F
+GLIBC_2.27 copysignl F
+GLIBC_2.27 cos F
+GLIBC_2.27 cosf F
+GLIBC_2.27 cosf32 F
+GLIBC_2.27 cosf32x F
+GLIBC_2.27 cosf64 F
+GLIBC_2.27 cosh F
+GLIBC_2.27 coshf F
+GLIBC_2.27 coshf32 F
+GLIBC_2.27 coshf32x F
+GLIBC_2.27 coshf64 F
+GLIBC_2.27 coshl F
+GLIBC_2.27 cosl F
+GLIBC_2.27 cpow F
+GLIBC_2.27 cpowf F
+GLIBC_2.27 cpowf32 F
+GLIBC_2.27 cpowf32x F
+GLIBC_2.27 cpowf64 F
+GLIBC_2.27 cpowl F
+GLIBC_2.27 cproj F
+GLIBC_2.27 cprojf F
+GLIBC_2.27 cprojf32 F
+GLIBC_2.27 cprojf32x F
+GLIBC_2.27 cprojf64 F
+GLIBC_2.27 cprojl F
+GLIBC_2.27 creal F
+GLIBC_2.27 crealf F
+GLIBC_2.27 crealf32 F
+GLIBC_2.27 crealf32x F
+GLIBC_2.27 crealf64 F
+GLIBC_2.27 creall F
+GLIBC_2.27 csin F
+GLIBC_2.27 csinf F
+GLIBC_2.27 csinf32 F
+GLIBC_2.27 csinf32x F
+GLIBC_2.27 csinf64 F
+GLIBC_2.27 csinh F
+GLIBC_2.27 csinhf F
+GLIBC_2.27 csinhf32 F
+GLIBC_2.27 csinhf32x F
+GLIBC_2.27 csinhf64 F
+GLIBC_2.27 csinhl F
+GLIBC_2.27 csinl F
+GLIBC_2.27 csqrt F
+GLIBC_2.27 csqrtf F
+GLIBC_2.27 csqrtf32 F
+GLIBC_2.27 csqrtf32x F
+GLIBC_2.27 csqrtf64 F
+GLIBC_2.27 csqrtl F
+GLIBC_2.27 ctan F
+GLIBC_2.27 ctanf F
+GLIBC_2.27 ctanf32 F
+GLIBC_2.27 ctanf32x F
+GLIBC_2.27 ctanf64 F
+GLIBC_2.27 ctanh F
+GLIBC_2.27 ctanhf F
+GLIBC_2.27 ctanhf32 F
+GLIBC_2.27 ctanhf32x F
+GLIBC_2.27 ctanhf64 F
+GLIBC_2.27 ctanhl F
+GLIBC_2.27 ctanl F
+GLIBC_2.27 drem F
+GLIBC_2.27 dremf F
+GLIBC_2.27 dreml F
+GLIBC_2.27 erf F
+GLIBC_2.27 erfc F
+GLIBC_2.27 erfcf F
+GLIBC_2.27 erfcf32 F
+GLIBC_2.27 erfcf32x F
+GLIBC_2.27 erfcf64 F
+GLIBC_2.27 erfcl F
+GLIBC_2.27 erff F
+GLIBC_2.27 erff32 F
+GLIBC_2.27 erff32x F
+GLIBC_2.27 erff64 F
+GLIBC_2.27 erfl F
+GLIBC_2.27 exp F
+GLIBC_2.27 exp10 F
+GLIBC_2.27 exp10f F
+GLIBC_2.27 exp10f32 F
+GLIBC_2.27 exp10f32x F
+GLIBC_2.27 exp10f64 F
+GLIBC_2.27 exp10l F
+GLIBC_2.27 exp2 F
+GLIBC_2.27 exp2f F
+GLIBC_2.27 exp2f32 F
+GLIBC_2.27 exp2f32x F
+GLIBC_2.27 exp2f64 F
+GLIBC_2.27 exp2l F
+GLIBC_2.27 expf F
+GLIBC_2.27 expf32 F
+GLIBC_2.27 expf32x F
+GLIBC_2.27 expf64 F
+GLIBC_2.27 expl F
+GLIBC_2.27 expm1 F
+GLIBC_2.27 expm1f F
+GLIBC_2.27 expm1f32 F
+GLIBC_2.27 expm1f32x F
+GLIBC_2.27 expm1f64 F
+GLIBC_2.27 expm1l F
+GLIBC_2.27 fabs F
+GLIBC_2.27 fabsf F
+GLIBC_2.27 fabsf32 F
+GLIBC_2.27 fabsf32x F
+GLIBC_2.27 fabsf64 F
+GLIBC_2.27 fabsl F
+GLIBC_2.27 fdim F
+GLIBC_2.27 fdimf F
+GLIBC_2.27 fdimf32 F
+GLIBC_2.27 fdimf32x F
+GLIBC_2.27 fdimf64 F
+GLIBC_2.27 fdiml F
+GLIBC_2.27 feclearexcept F
+GLIBC_2.27 fedisableexcept F
+GLIBC_2.27 feenableexcept F
+GLIBC_2.27 fegetenv F
+GLIBC_2.27 fegetexcept F
+GLIBC_2.27 fegetexceptflag F
+GLIBC_2.27 fegetmode F
+GLIBC_2.27 fegetround F
+GLIBC_2.27 feholdexcept F
+GLIBC_2.27 feraiseexcept F
+GLIBC_2.27 fesetenv F
+GLIBC_2.27 fesetexcept F
+GLIBC_2.27 fesetexceptflag F
+GLIBC_2.27 fesetmode F
+GLIBC_2.27 fesetround F
+GLIBC_2.27 fetestexcept F
+GLIBC_2.27 fetestexceptflag F
+GLIBC_2.27 feupdateenv F
+GLIBC_2.27 finite F
+GLIBC_2.27 finitef F
+GLIBC_2.27 finitel F
+GLIBC_2.27 floor F
+GLIBC_2.27 floorf F
+GLIBC_2.27 floorf32 F
+GLIBC_2.27 floorf32x F
+GLIBC_2.27 floorf64 F
+GLIBC_2.27 floorl F
+GLIBC_2.27 fma F
+GLIBC_2.27 fmaf F
+GLIBC_2.27 fmaf32 F
+GLIBC_2.27 fmaf32x F
+GLIBC_2.27 fmaf64 F
+GLIBC_2.27 fmal F
+GLIBC_2.27 fmax F
+GLIBC_2.27 fmaxf F
+GLIBC_2.27 fmaxf32 F
+GLIBC_2.27 fmaxf32x F
+GLIBC_2.27 fmaxf64 F
+GLIBC_2.27 fmaxl F
+GLIBC_2.27 fmaxmag F
+GLIBC_2.27 fmaxmagf F
+GLIBC_2.27 fmaxmagf32 F
+GLIBC_2.27 fmaxmagf32x F
+GLIBC_2.27 fmaxmagf64 F
+GLIBC_2.27 fmaxmagl F
+GLIBC_2.27 fmin F
+GLIBC_2.27 fminf F
+GLIBC_2.27 fminf32 F
+GLIBC_2.27 fminf32x F
+GLIBC_2.27 fminf64 F
+GLIBC_2.27 fminl F
+GLIBC_2.27 fminmag F
+GLIBC_2.27 fminmagf F
+GLIBC_2.27 fminmagf32 F
+GLIBC_2.27 fminmagf32x F
+GLIBC_2.27 fminmagf64 F
+GLIBC_2.27 fminmagl F
+GLIBC_2.27 fmod F
+GLIBC_2.27 fmodf F
+GLIBC_2.27 fmodf32 F
+GLIBC_2.27 fmodf32x F
+GLIBC_2.27 fmodf64 F
+GLIBC_2.27 fmodl F
+GLIBC_2.27 frexp F
+GLIBC_2.27 frexpf F
+GLIBC_2.27 frexpf32 F
+GLIBC_2.27 frexpf32x F
+GLIBC_2.27 frexpf64 F
+GLIBC_2.27 frexpl F
+GLIBC_2.27 fromfp F
+GLIBC_2.27 fromfpf F
+GLIBC_2.27 fromfpf32 F
+GLIBC_2.27 fromfpf32x F
+GLIBC_2.27 fromfpf64 F
+GLIBC_2.27 fromfpl F
+GLIBC_2.27 fromfpx F
+GLIBC_2.27 fromfpxf F
+GLIBC_2.27 fromfpxf32 F
+GLIBC_2.27 fromfpxf32x F
+GLIBC_2.27 fromfpxf64 F
+GLIBC_2.27 fromfpxl F
+GLIBC_2.27 gamma F
+GLIBC_2.27 gammaf F
+GLIBC_2.27 gammal F
+GLIBC_2.27 getpayload F
+GLIBC_2.27 getpayloadf F
+GLIBC_2.27 getpayloadf32 F
+GLIBC_2.27 getpayloadf32x F
+GLIBC_2.27 getpayloadf64 F
+GLIBC_2.27 getpayloadl F
+GLIBC_2.27 hypot F
+GLIBC_2.27 hypotf F
+GLIBC_2.27 hypotf32 F
+GLIBC_2.27 hypotf32x F
+GLIBC_2.27 hypotf64 F
+GLIBC_2.27 hypotl F
+GLIBC_2.27 ilogb F
+GLIBC_2.27 ilogbf F
+GLIBC_2.27 ilogbf32 F
+GLIBC_2.27 ilogbf32x F
+GLIBC_2.27 ilogbf64 F
+GLIBC_2.27 ilogbl F
+GLIBC_2.27 j0 F
+GLIBC_2.27 j0f F
+GLIBC_2.27 j0f32 F
+GLIBC_2.27 j0f32x F
+GLIBC_2.27 j0f64 F
+GLIBC_2.27 j0l F
+GLIBC_2.27 j1 F
+GLIBC_2.27 j1f F
+GLIBC_2.27 j1f32 F
+GLIBC_2.27 j1f32x F
+GLIBC_2.27 j1f64 F
+GLIBC_2.27 j1l F
+GLIBC_2.27 jn F
+GLIBC_2.27 jnf F
+GLIBC_2.27 jnf32 F
+GLIBC_2.27 jnf32x F
+GLIBC_2.27 jnf64 F
+GLIBC_2.27 jnl F
+GLIBC_2.27 ldexp F
+GLIBC_2.27 ldexpf F
+GLIBC_2.27 ldexpf32 F
+GLIBC_2.27 ldexpf32x F
+GLIBC_2.27 ldexpf64 F
+GLIBC_2.27 ldexpl F
+GLIBC_2.27 lgamma F
+GLIBC_2.27 lgamma_r F
+GLIBC_2.27 lgammaf F
+GLIBC_2.27 lgammaf32 F
+GLIBC_2.27 lgammaf32_r F
+GLIBC_2.27 lgammaf32x F
+GLIBC_2.27 lgammaf32x_r F
+GLIBC_2.27 lgammaf64 F
+GLIBC_2.27 lgammaf64_r F
+GLIBC_2.27 lgammaf_r F
+GLIBC_2.27 lgammal F
+GLIBC_2.27 lgammal_r F
+GLIBC_2.27 llogb F
+GLIBC_2.27 llogbf F
+GLIBC_2.27 llogbf32 F
+GLIBC_2.27 llogbf32x F
+GLIBC_2.27 llogbf64 F
+GLIBC_2.27 llogbl F
+GLIBC_2.27 llrint F
+GLIBC_2.27 llrintf F
+GLIBC_2.27 llrintf32 F
+GLIBC_2.27 llrintf32x F
+GLIBC_2.27 llrintf64 F
+GLIBC_2.27 llrintl F
+GLIBC_2.27 llround F
+GLIBC_2.27 llroundf F
+GLIBC_2.27 llroundf32 F
+GLIBC_2.27 llroundf32x F
+GLIBC_2.27 llroundf64 F
+GLIBC_2.27 llroundl F
+GLIBC_2.27 log F
+GLIBC_2.27 log10 F
+GLIBC_2.27 log10f F
+GLIBC_2.27 log10f32 F
+GLIBC_2.27 log10f32x F
+GLIBC_2.27 log10f64 F
+GLIBC_2.27 log10l F
+GLIBC_2.27 log1p F
+GLIBC_2.27 log1pf F
+GLIBC_2.27 log1pf32 F
+GLIBC_2.27 log1pf32x F
+GLIBC_2.27 log1pf64 F
+GLIBC_2.27 log1pl F
+GLIBC_2.27 log2 F
+GLIBC_2.27 log2f F
+GLIBC_2.27 log2f32 F
+GLIBC_2.27 log2f32x F
+GLIBC_2.27 log2f64 F
+GLIBC_2.27 log2l F
+GLIBC_2.27 logb F
+GLIBC_2.27 logbf F
+GLIBC_2.27 logbf32 F
+GLIBC_2.27 logbf32x F
+GLIBC_2.27 logbf64 F
+GLIBC_2.27 logbl F
+GLIBC_2.27 logf F
+GLIBC_2.27 logf32 F
+GLIBC_2.27 logf32x F
+GLIBC_2.27 logf64 F
+GLIBC_2.27 logl F
+GLIBC_2.27 lrint F
+GLIBC_2.27 lrintf F
+GLIBC_2.27 lrintf32 F
+GLIBC_2.27 lrintf32x F
+GLIBC_2.27 lrintf64 F
+GLIBC_2.27 lrintl F
+GLIBC_2.27 lround F
+GLIBC_2.27 lroundf F
+GLIBC_2.27 lroundf32 F
+GLIBC_2.27 lroundf32x F
+GLIBC_2.27 lroundf64 F
+GLIBC_2.27 lroundl F
+GLIBC_2.27 modf F
+GLIBC_2.27 modff F
+GLIBC_2.27 modff32 F
+GLIBC_2.27 modff32x F
+GLIBC_2.27 modff64 F
+GLIBC_2.27 modfl F
+GLIBC_2.27 nan F
+GLIBC_2.27 nanf F
+GLIBC_2.27 nanf32 F
+GLIBC_2.27 nanf32x F
+GLIBC_2.27 nanf64 F
+GLIBC_2.27 nanl F
+GLIBC_2.27 nearbyint F
+GLIBC_2.27 nearbyintf F
+GLIBC_2.27 nearbyintf32 F
+GLIBC_2.27 nearbyintf32x F
+GLIBC_2.27 nearbyintf64 F
+GLIBC_2.27 nearbyintl F
+GLIBC_2.27 nextafter F
+GLIBC_2.27 nextafterf F
+GLIBC_2.27 nextafterf32 F
+GLIBC_2.27 nextafterf32x F
+GLIBC_2.27 nextafterf64 F
+GLIBC_2.27 nextafterl F
+GLIBC_2.27 nextdown F
+GLIBC_2.27 nextdownf F
+GLIBC_2.27 nextdownf32 F
+GLIBC_2.27 nextdownf32x F
+GLIBC_2.27 nextdownf64 F
+GLIBC_2.27 nextdownl F
+GLIBC_2.27 nexttoward F
+GLIBC_2.27 nexttowardf F
+GLIBC_2.27 nexttowardl F
+GLIBC_2.27 nextup F
+GLIBC_2.27 nextupf F
+GLIBC_2.27 nextupf32 F
+GLIBC_2.27 nextupf32x F
+GLIBC_2.27 nextupf64 F
+GLIBC_2.27 nextupl F
+GLIBC_2.27 pow F
+GLIBC_2.27 powf F
+GLIBC_2.27 powf32 F
+GLIBC_2.27 powf32x F
+GLIBC_2.27 powf64 F
+GLIBC_2.27 powl F
+GLIBC_2.27 remainder F
+GLIBC_2.27 remainderf F
+GLIBC_2.27 remainderf32 F
+GLIBC_2.27 remainderf32x F
+GLIBC_2.27 remainderf64 F
+GLIBC_2.27 remainderl F
+GLIBC_2.27 remquo F
+GLIBC_2.27 remquof F
+GLIBC_2.27 remquof32 F
+GLIBC_2.27 remquof32x F
+GLIBC_2.27 remquof64 F
+GLIBC_2.27 remquol F
+GLIBC_2.27 rint F
+GLIBC_2.27 rintf F
+GLIBC_2.27 rintf32 F
+GLIBC_2.27 rintf32x F
+GLIBC_2.27 rintf64 F
+GLIBC_2.27 rintl F
+GLIBC_2.27 round F
+GLIBC_2.27 roundeven F
+GLIBC_2.27 roundevenf F
+GLIBC_2.27 roundevenf32 F
+GLIBC_2.27 roundevenf32x F
+GLIBC_2.27 roundevenf64 F
+GLIBC_2.27 roundevenl F
+GLIBC_2.27 roundf F
+GLIBC_2.27 roundf32 F
+GLIBC_2.27 roundf32x F
+GLIBC_2.27 roundf64 F
+GLIBC_2.27 roundl F
+GLIBC_2.27 scalb F
+GLIBC_2.27 scalbf F
+GLIBC_2.27 scalbl F
+GLIBC_2.27 scalbln F
+GLIBC_2.27 scalblnf F
+GLIBC_2.27 scalblnf32 F
+GLIBC_2.27 scalblnf32x F
+GLIBC_2.27 scalblnf64 F
+GLIBC_2.27 scalblnl F
+GLIBC_2.27 scalbn F
+GLIBC_2.27 scalbnf F
+GLIBC_2.27 scalbnf32 F
+GLIBC_2.27 scalbnf32x F
+GLIBC_2.27 scalbnf64 F
+GLIBC_2.27 scalbnl F
+GLIBC_2.27 setpayload F
+GLIBC_2.27 setpayloadf F
+GLIBC_2.27 setpayloadf32 F
+GLIBC_2.27 setpayloadf32x F
+GLIBC_2.27 setpayloadf64 F
+GLIBC_2.27 setpayloadl F
+GLIBC_2.27 setpayloadsig F
+GLIBC_2.27 setpayloadsigf F
+GLIBC_2.27 setpayloadsigf32 F
+GLIBC_2.27 setpayloadsigf32x F
+GLIBC_2.27 setpayloadsigf64 F
+GLIBC_2.27 setpayloadsigl F
+GLIBC_2.27 signgam D 0x4
+GLIBC_2.27 significand F
+GLIBC_2.27 significandf F
+GLIBC_2.27 significandl F
+GLIBC_2.27 sin F
+GLIBC_2.27 sincos F
+GLIBC_2.27 sincosf F
+GLIBC_2.27 sincosf32 F
+GLIBC_2.27 sincosf32x F
+GLIBC_2.27 sincosf64 F
+GLIBC_2.27 sincosl F
+GLIBC_2.27 sinf F
+GLIBC_2.27 sinf32 F
+GLIBC_2.27 sinf32x F
+GLIBC_2.27 sinf64 F
+GLIBC_2.27 sinh F
+GLIBC_2.27 sinhf F
+GLIBC_2.27 sinhf32 F
+GLIBC_2.27 sinhf32x F
+GLIBC_2.27 sinhf64 F
+GLIBC_2.27 sinhl F
+GLIBC_2.27 sinl F
+GLIBC_2.27 sqrt F
+GLIBC_2.27 sqrtf F
+GLIBC_2.27 sqrtf32 F
+GLIBC_2.27 sqrtf32x F
+GLIBC_2.27 sqrtf64 F
+GLIBC_2.27 sqrtl F
+GLIBC_2.27 tan F
+GLIBC_2.27 tanf F
+GLIBC_2.27 tanf32 F
+GLIBC_2.27 tanf32x F
+GLIBC_2.27 tanf64 F
+GLIBC_2.27 tanh F
+GLIBC_2.27 tanhf F
+GLIBC_2.27 tanhf32 F
+GLIBC_2.27 tanhf32x F
+GLIBC_2.27 tanhf64 F
+GLIBC_2.27 tanhl F
+GLIBC_2.27 tanl F
+GLIBC_2.27 tgamma F
+GLIBC_2.27 tgammaf F
+GLIBC_2.27 tgammaf32 F
+GLIBC_2.27 tgammaf32x F
+GLIBC_2.27 tgammaf64 F
+GLIBC_2.27 tgammal F
+GLIBC_2.27 totalorder F
+GLIBC_2.27 totalorderf F
+GLIBC_2.27 totalorderf32 F
+GLIBC_2.27 totalorderf32x F
+GLIBC_2.27 totalorderf64 F
+GLIBC_2.27 totalorderl F
+GLIBC_2.27 totalordermag F
+GLIBC_2.27 totalordermagf F
+GLIBC_2.27 totalordermagf32 F
+GLIBC_2.27 totalordermagf32x F
+GLIBC_2.27 totalordermagf64 F
+GLIBC_2.27 totalordermagl F
+GLIBC_2.27 trunc F
+GLIBC_2.27 truncf F
+GLIBC_2.27 truncf32 F
+GLIBC_2.27 truncf32x F
+GLIBC_2.27 truncf64 F
+GLIBC_2.27 truncl F
+GLIBC_2.27 ufromfp F
+GLIBC_2.27 ufromfpf F
+GLIBC_2.27 ufromfpf32 F
+GLIBC_2.27 ufromfpf32x F
+GLIBC_2.27 ufromfpf64 F
+GLIBC_2.27 ufromfpl F
+GLIBC_2.27 ufromfpx F
+GLIBC_2.27 ufromfpxf F
+GLIBC_2.27 ufromfpxf32 F
+GLIBC_2.27 ufromfpxf32x F
+GLIBC_2.27 ufromfpxf64 F
+GLIBC_2.27 ufromfpxl F
+GLIBC_2.27 y0 F
+GLIBC_2.27 y0f F
+GLIBC_2.27 y0f32 F
+GLIBC_2.27 y0f32x F
+GLIBC_2.27 y0f64 F
+GLIBC_2.27 y0l F
+GLIBC_2.27 y1 F
+GLIBC_2.27 y1f F
+GLIBC_2.27 y1f32 F
+GLIBC_2.27 y1f32x F
+GLIBC_2.27 y1f64 F
+GLIBC_2.27 y1l F
+GLIBC_2.27 yn F
+GLIBC_2.27 ynf F
+GLIBC_2.27 ynf32 F
+GLIBC_2.27 ynf32x F
+GLIBC_2.27 ynf64 F
+GLIBC_2.27 ynl F
+GLIBC_2.28 GLIBC_2.28 A
+GLIBC_2.28 daddl F
+GLIBC_2.28 f32addf32x F
+GLIBC_2.28 f32addf64 F
+GLIBC_2.28 f32xaddf64 F
+GLIBC_2.28 fadd F
+GLIBC_2.28 faddl F
diff --git a/sysdeps/unix/sysv/linux/csky/libnsl.abilist b/sysdeps/unix/sysv/linux/csky/libnsl.abilist
new file mode 100644
index 0000000..b7a0f82
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/libnsl.abilist
@@ -0,0 +1,121 @@
+GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __free_fdresult F
+GLIBC_2.27 __nis_default_access F
+GLIBC_2.27 __nis_default_group F
+GLIBC_2.27 __nis_default_owner F
+GLIBC_2.27 __nis_default_ttl F
+GLIBC_2.27 __nis_finddirectory F
+GLIBC_2.27 __nisbind_connect F
+GLIBC_2.27 __nisbind_create F
+GLIBC_2.27 __nisbind_destroy F
+GLIBC_2.27 __nisbind_next F
+GLIBC_2.27 __yp_check F
+GLIBC_2.27 nis_add F
+GLIBC_2.27 nis_add_entry F
+GLIBC_2.27 nis_addmember F
+GLIBC_2.27 nis_checkpoint F
+GLIBC_2.27 nis_clone_directory F
+GLIBC_2.27 nis_clone_object F
+GLIBC_2.27 nis_clone_result F
+GLIBC_2.27 nis_creategroup F
+GLIBC_2.27 nis_destroy_object F
+GLIBC_2.27 nis_destroygroup F
+GLIBC_2.27 nis_dir_cmp F
+GLIBC_2.27 nis_domain_of F
+GLIBC_2.27 nis_domain_of_r F
+GLIBC_2.27 nis_first_entry F
+GLIBC_2.27 nis_free_directory F
+GLIBC_2.27 nis_free_object F
+GLIBC_2.27 nis_free_request F
+GLIBC_2.27 nis_freenames F
+GLIBC_2.27 nis_freeresult F
+GLIBC_2.27 nis_freeservlist F
+GLIBC_2.27 nis_freetags F
+GLIBC_2.27 nis_getnames F
+GLIBC_2.27 nis_getservlist F
+GLIBC_2.27 nis_ismember F
+GLIBC_2.27 nis_leaf_of F
+GLIBC_2.27 nis_leaf_of_r F
+GLIBC_2.27 nis_lerror F
+GLIBC_2.27 nis_list F
+GLIBC_2.27 nis_local_directory F
+GLIBC_2.27 nis_local_group F
+GLIBC_2.27 nis_local_host F
+GLIBC_2.27 nis_local_principal F
+GLIBC_2.27 nis_lookup F
+GLIBC_2.27 nis_mkdir F
+GLIBC_2.27 nis_modify F
+GLIBC_2.27 nis_modify_entry F
+GLIBC_2.27 nis_name_of F
+GLIBC_2.27 nis_name_of_r F
+GLIBC_2.27 nis_next_entry F
+GLIBC_2.27 nis_perror F
+GLIBC_2.27 nis_ping F
+GLIBC_2.27 nis_print_directory F
+GLIBC_2.27 nis_print_entry F
+GLIBC_2.27 nis_print_group F
+GLIBC_2.27 nis_print_group_entry F
+GLIBC_2.27 nis_print_link F
+GLIBC_2.27 nis_print_object F
+GLIBC_2.27 nis_print_result F
+GLIBC_2.27 nis_print_rights F
+GLIBC_2.27 nis_print_table F
+GLIBC_2.27 nis_read_obj F
+GLIBC_2.27 nis_remove F
+GLIBC_2.27 nis_remove_entry F
+GLIBC_2.27 nis_removemember F
+GLIBC_2.27 nis_rmdir F
+GLIBC_2.27 nis_servstate F
+GLIBC_2.27 nis_sperrno F
+GLIBC_2.27 nis_sperror F
+GLIBC_2.27 nis_sperror_r F
+GLIBC_2.27 nis_stats F
+GLIBC_2.27 nis_verifygroup F
+GLIBC_2.27 nis_write_obj F
+GLIBC_2.27 readColdStartFile F
+GLIBC_2.27 writeColdStartFile F
+GLIBC_2.27 xdr_cback_data F
+GLIBC_2.27 xdr_domainname F
+GLIBC_2.27 xdr_keydat F
+GLIBC_2.27 xdr_mapname F
+GLIBC_2.27 xdr_obj_p F
+GLIBC_2.27 xdr_peername F
+GLIBC_2.27 xdr_valdat F
+GLIBC_2.27 xdr_yp_buf F
+GLIBC_2.27 xdr_ypall F
+GLIBC_2.27 xdr_ypbind_binding F
+GLIBC_2.27 xdr_ypbind_resp F
+GLIBC_2.27 xdr_ypbind_resptype F
+GLIBC_2.27 xdr_ypbind_setdom F
+GLIBC_2.27 xdr_ypdelete_args F
+GLIBC_2.27 xdr_ypmap_parms F
+GLIBC_2.27 xdr_ypmaplist F
+GLIBC_2.27 xdr_yppush_status F
+GLIBC_2.27 xdr_yppushresp_xfr F
+GLIBC_2.27 xdr_ypreq_key F
+GLIBC_2.27 xdr_ypreq_nokey F
+GLIBC_2.27 xdr_ypreq_xfr F
+GLIBC_2.27 xdr_ypresp_all F
+GLIBC_2.27 xdr_ypresp_key_val F
+GLIBC_2.27 xdr_ypresp_maplist F
+GLIBC_2.27 xdr_ypresp_master F
+GLIBC_2.27 xdr_ypresp_order F
+GLIBC_2.27 xdr_ypresp_val F
+GLIBC_2.27 xdr_ypresp_xfr F
+GLIBC_2.27 xdr_ypstat F
+GLIBC_2.27 xdr_ypupdate_args F
+GLIBC_2.27 xdr_ypxfrstat F
+GLIBC_2.27 yp_all F
+GLIBC_2.27 yp_bind F
+GLIBC_2.27 yp_first F
+GLIBC_2.27 yp_get_default_domain F
+GLIBC_2.27 yp_maplist F
+GLIBC_2.27 yp_master F
+GLIBC_2.27 yp_match F
+GLIBC_2.27 yp_next F
+GLIBC_2.27 yp_order F
+GLIBC_2.27 yp_unbind F
+GLIBC_2.27 yp_update F
+GLIBC_2.27 ypbinderr_string F
+GLIBC_2.27 yperr_string F
+GLIBC_2.27 ypprot_err F
diff --git a/sysdeps/unix/sysv/linux/csky/libpthread.abilist b/sysdeps/unix/sysv/linux/csky/libpthread.abilist
new file mode 100644
index 0000000..fcc14ed
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/libpthread.abilist
@@ -0,0 +1,217 @@
+GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 _IO_flockfile F
+GLIBC_2.27 _IO_ftrylockfile F
+GLIBC_2.27 _IO_funlockfile F
+GLIBC_2.27 __close F
+GLIBC_2.27 __connect F
+GLIBC_2.27 __errno_location F
+GLIBC_2.27 __fcntl F
+GLIBC_2.27 __h_errno_location F
+GLIBC_2.27 __libc_allocate_rtsig F
+GLIBC_2.27 __libc_current_sigrtmax F
+GLIBC_2.27 __libc_current_sigrtmin F
+GLIBC_2.27 __lseek F
+GLIBC_2.27 __nanosleep F
+GLIBC_2.27 __open F
+GLIBC_2.27 __open64 F
+GLIBC_2.27 __pread64 F
+GLIBC_2.27 __pthread_cleanup_routine F
+GLIBC_2.27 __pthread_getspecific F
+GLIBC_2.27 __pthread_key_create F
+GLIBC_2.27 __pthread_mutex_destroy F
+GLIBC_2.27 __pthread_mutex_init F
+GLIBC_2.27 __pthread_mutex_lock F
+GLIBC_2.27 __pthread_mutex_trylock F
+GLIBC_2.27 __pthread_mutex_unlock F
+GLIBC_2.27 __pthread_mutexattr_destroy F
+GLIBC_2.27 __pthread_mutexattr_init F
+GLIBC_2.27 __pthread_mutexattr_settype F
+GLIBC_2.27 __pthread_once F
+GLIBC_2.27 __pthread_register_cancel F
+GLIBC_2.27 __pthread_register_cancel_defer F
+GLIBC_2.27 __pthread_rwlock_destroy F
+GLIBC_2.27 __pthread_rwlock_init F
+GLIBC_2.27 __pthread_rwlock_rdlock F
+GLIBC_2.27 __pthread_rwlock_tryrdlock F
+GLIBC_2.27 __pthread_rwlock_trywrlock F
+GLIBC_2.27 __pthread_rwlock_unlock F
+GLIBC_2.27 __pthread_rwlock_wrlock F
+GLIBC_2.27 __pthread_setspecific F
+GLIBC_2.27 __pthread_unregister_cancel F
+GLIBC_2.27 __pthread_unregister_cancel_restore F
+GLIBC_2.27 __pthread_unwind_next F
+GLIBC_2.27 __pwrite64 F
+GLIBC_2.27 __read F
+GLIBC_2.27 __res_state F
+GLIBC_2.27 __send F
+GLIBC_2.27 __sigaction F
+GLIBC_2.27 __wait F
+GLIBC_2.27 __write F
+GLIBC_2.27 _pthread_cleanup_pop F
+GLIBC_2.27 _pthread_cleanup_pop_restore F
+GLIBC_2.27 _pthread_cleanup_push F
+GLIBC_2.27 _pthread_cleanup_push_defer F
+GLIBC_2.27 accept F
+GLIBC_2.27 close F
+GLIBC_2.27 connect F
+GLIBC_2.27 fcntl F
+GLIBC_2.27 flockfile F
+GLIBC_2.27 fsync F
+GLIBC_2.27 ftrylockfile F
+GLIBC_2.27 funlockfile F
+GLIBC_2.27 lseek F
+GLIBC_2.27 lseek64 F
+GLIBC_2.27 msync F
+GLIBC_2.27 nanosleep F
+GLIBC_2.27 open F
+GLIBC_2.27 open64 F
+GLIBC_2.27 pause F
+GLIBC_2.27 pread F
+GLIBC_2.27 pread64 F
+GLIBC_2.27 pthread_attr_destroy F
+GLIBC_2.27 pthread_attr_getaffinity_np F
+GLIBC_2.27 pthread_attr_getdetachstate F
+GLIBC_2.27 pthread_attr_getguardsize F
+GLIBC_2.27 pthread_attr_getinheritsched F
+GLIBC_2.27 pthread_attr_getschedparam F
+GLIBC_2.27 pthread_attr_getschedpolicy F
+GLIBC_2.27 pthread_attr_getscope F
+GLIBC_2.27 pthread_attr_getstack F
+GLIBC_2.27 pthread_attr_getstackaddr F
+GLIBC_2.27 pthread_attr_getstacksize F
+GLIBC_2.27 pthread_attr_init F
+GLIBC_2.27 pthread_attr_setaffinity_np F
+GLIBC_2.27 pthread_attr_setdetachstate F
+GLIBC_2.27 pthread_attr_setguardsize F
+GLIBC_2.27 pthread_attr_setinheritsched F
+GLIBC_2.27 pthread_attr_setschedparam F
+GLIBC_2.27 pthread_attr_setschedpolicy F
+GLIBC_2.27 pthread_attr_setscope F
+GLIBC_2.27 pthread_attr_setstack F
+GLIBC_2.27 pthread_attr_setstackaddr F
+GLIBC_2.27 pthread_attr_setstacksize F
+GLIBC_2.27 pthread_barrier_destroy F
+GLIBC_2.27 pthread_barrier_init F
+GLIBC_2.27 pthread_barrier_wait F
+GLIBC_2.27 pthread_barrierattr_destroy F
+GLIBC_2.27 pthread_barrierattr_getpshared F
+GLIBC_2.27 pthread_barrierattr_init F
+GLIBC_2.27 pthread_barrierattr_setpshared F
+GLIBC_2.27 pthread_cancel F
+GLIBC_2.27 pthread_cond_broadcast F
+GLIBC_2.27 pthread_cond_destroy F
+GLIBC_2.27 pthread_cond_init F
+GLIBC_2.27 pthread_cond_signal F
+GLIBC_2.27 pthread_cond_timedwait F
+GLIBC_2.27 pthread_cond_wait F
+GLIBC_2.27 pthread_condattr_destroy F
+GLIBC_2.27 pthread_condattr_getclock F
+GLIBC_2.27 pthread_condattr_getpshared F
+GLIBC_2.27 pthread_condattr_init F
+GLIBC_2.27 pthread_condattr_setclock F
+GLIBC_2.27 pthread_condattr_setpshared F
+GLIBC_2.27 pthread_create F
+GLIBC_2.27 pthread_detach F
+GLIBC_2.27 pthread_equal F
+GLIBC_2.27 pthread_exit F
+GLIBC_2.27 pthread_getaffinity_np F
+GLIBC_2.27 pthread_getattr_default_np F
+GLIBC_2.27 pthread_getattr_np F
+GLIBC_2.27 pthread_getconcurrency F
+GLIBC_2.27 pthread_getcpuclockid F
+GLIBC_2.27 pthread_getname_np F
+GLIBC_2.27 pthread_getschedparam F
+GLIBC_2.27 pthread_getspecific F
+GLIBC_2.27 pthread_join F
+GLIBC_2.27 pthread_key_create F
+GLIBC_2.27 pthread_key_delete F
+GLIBC_2.27 pthread_kill F
+GLIBC_2.27 pthread_kill_other_threads_np F
+GLIBC_2.27 pthread_mutex_consistent F
+GLIBC_2.27 pthread_mutex_consistent_np F
+GLIBC_2.27 pthread_mutex_destroy F
+GLIBC_2.27 pthread_mutex_getprioceiling F
+GLIBC_2.27 pthread_mutex_init F
+GLIBC_2.27 pthread_mutex_lock F
+GLIBC_2.27 pthread_mutex_setprioceiling F
+GLIBC_2.27 pthread_mutex_timedlock F
+GLIBC_2.27 pthread_mutex_trylock F
+GLIBC_2.27 pthread_mutex_unlock F
+GLIBC_2.27 pthread_mutexattr_destroy F
+GLIBC_2.27 pthread_mutexattr_getkind_np F
+GLIBC_2.27 pthread_mutexattr_getprioceiling F
+GLIBC_2.27 pthread_mutexattr_getprotocol F
+GLIBC_2.27 pthread_mutexattr_getpshared F
+GLIBC_2.27 pthread_mutexattr_getrobust F
+GLIBC_2.27 pthread_mutexattr_getrobust_np F
+GLIBC_2.27 pthread_mutexattr_gettype F
+GLIBC_2.27 pthread_mutexattr_init F
+GLIBC_2.27 pthread_mutexattr_setkind_np F
+GLIBC_2.27 pthread_mutexattr_setprioceiling F
+GLIBC_2.27 pthread_mutexattr_setprotocol F
+GLIBC_2.27 pthread_mutexattr_setpshared F
+GLIBC_2.27 pthread_mutexattr_setrobust F
+GLIBC_2.27 pthread_mutexattr_setrobust_np F
+GLIBC_2.27 pthread_mutexattr_settype F
+GLIBC_2.27 pthread_once F
+GLIBC_2.27 pthread_rwlock_destroy F
+GLIBC_2.27 pthread_rwlock_init F
+GLIBC_2.27 pthread_rwlock_rdlock F
+GLIBC_2.27 pthread_rwlock_timedrdlock F
+GLIBC_2.27 pthread_rwlock_timedwrlock F
+GLIBC_2.27 pthread_rwlock_tryrdlock F
+GLIBC_2.27 pthread_rwlock_trywrlock F
+GLIBC_2.27 pthread_rwlock_unlock F
+GLIBC_2.27 pthread_rwlock_wrlock F
+GLIBC_2.27 pthread_rwlockattr_destroy F
+GLIBC_2.27 pthread_rwlockattr_getkind_np F
+GLIBC_2.27 pthread_rwlockattr_getpshared F
+GLIBC_2.27 pthread_rwlockattr_init F
+GLIBC_2.27 pthread_rwlockattr_setkind_np F
+GLIBC_2.27 pthread_rwlockattr_setpshared F
+GLIBC_2.27 pthread_setaffinity_np F
+GLIBC_2.27 pthread_setattr_default_np F
+GLIBC_2.27 pthread_setcancelstate F
+GLIBC_2.27 pthread_setcanceltype F
+GLIBC_2.27 pthread_setconcurrency F
+GLIBC_2.27 pthread_setname_np F
+GLIBC_2.27 pthread_setschedparam F
+GLIBC_2.27 pthread_setschedprio F
+GLIBC_2.27 pthread_setspecific F
+GLIBC_2.27 pthread_sigmask F
+GLIBC_2.27 pthread_sigqueue F
+GLIBC_2.27 pthread_spin_destroy F
+GLIBC_2.27 pthread_spin_init F
+GLIBC_2.27 pthread_spin_lock F
+GLIBC_2.27 pthread_spin_trylock F
+GLIBC_2.27 pthread_spin_unlock F
+GLIBC_2.27 pthread_testcancel F
+GLIBC_2.27 pthread_timedjoin_np F
+GLIBC_2.27 pthread_tryjoin_np F
+GLIBC_2.27 pthread_yield F
+GLIBC_2.27 pwrite F
+GLIBC_2.27 pwrite64 F
+GLIBC_2.27 raise F
+GLIBC_2.27 read F
+GLIBC_2.27 recv F
+GLIBC_2.27 recvfrom F
+GLIBC_2.27 recvmsg F
+GLIBC_2.27 sem_close F
+GLIBC_2.27 sem_destroy F
+GLIBC_2.27 sem_getvalue F
+GLIBC_2.27 sem_init F
+GLIBC_2.27 sem_open F
+GLIBC_2.27 sem_post F
+GLIBC_2.27 sem_timedwait F
+GLIBC_2.27 sem_trywait F
+GLIBC_2.27 sem_unlink F
+GLIBC_2.27 sem_wait F
+GLIBC_2.27 send F
+GLIBC_2.27 sendmsg F
+GLIBC_2.27 sendto F
+GLIBC_2.27 sigaction F
+GLIBC_2.27 sigwait F
+GLIBC_2.27 tcdrain F
+GLIBC_2.27 wait F
+GLIBC_2.27 waitpid F
+GLIBC_2.27 write F
diff --git a/sysdeps/unix/sysv/linux/csky/libresolv.abilist b/sysdeps/unix/sysv/linux/csky/libresolv.abilist
new file mode 100644
index 0000000..42af265
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/libresolv.abilist
@@ -0,0 +1,80 @@
+GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __b64_ntop F
+GLIBC_2.27 __b64_pton F
+GLIBC_2.27 __dn_comp F
+GLIBC_2.27 __dn_count_labels F
+GLIBC_2.27 __dn_expand F
+GLIBC_2.27 __dn_skipname F
+GLIBC_2.27 __fp_nquery F
+GLIBC_2.27 __fp_query F
+GLIBC_2.27 __fp_resstat F
+GLIBC_2.27 __hostalias F
+GLIBC_2.27 __loc_aton F
+GLIBC_2.27 __loc_ntoa F
+GLIBC_2.27 __p_cdname F
+GLIBC_2.27 __p_cdnname F
+GLIBC_2.27 __p_class F
+GLIBC_2.27 __p_class_syms D 0x54
+GLIBC_2.27 __p_fqname F
+GLIBC_2.27 __p_fqnname F
+GLIBC_2.27 __p_option F
+GLIBC_2.27 __p_query F
+GLIBC_2.27 __p_rcode F
+GLIBC_2.27 __p_time F
+GLIBC_2.27 __p_type F
+GLIBC_2.27 __p_type_syms D 0x228
+GLIBC_2.27 __putlong F
+GLIBC_2.27 __putshort F
+GLIBC_2.27 __res_close F
+GLIBC_2.27 __res_dnok F
+GLIBC_2.27 __res_hnok F
+GLIBC_2.27 __res_hostalias F
+GLIBC_2.27 __res_isourserver F
+GLIBC_2.27 __res_mailok F
+GLIBC_2.27 __res_mkquery F
+GLIBC_2.27 __res_nameinquery F
+GLIBC_2.27 __res_nmkquery F
+GLIBC_2.27 __res_nquery F
+GLIBC_2.27 __res_nquerydomain F
+GLIBC_2.27 __res_nsearch F
+GLIBC_2.27 __res_nsend F
+GLIBC_2.27 __res_ownok F
+GLIBC_2.27 __res_queriesmatch F
+GLIBC_2.27 __res_query F
+GLIBC_2.27 __res_querydomain F
+GLIBC_2.27 __res_search F
+GLIBC_2.27 __res_send F
+GLIBC_2.27 __sym_ntop F
+GLIBC_2.27 __sym_ntos F
+GLIBC_2.27 __sym_ston F
+GLIBC_2.27 _getlong F
+GLIBC_2.27 _getshort F
+GLIBC_2.27 inet_net_ntop F
+GLIBC_2.27 inet_net_pton F
+GLIBC_2.27 inet_neta F
+GLIBC_2.27 ns_datetosecs F
+GLIBC_2.27 ns_format_ttl F
+GLIBC_2.27 ns_get16 F
+GLIBC_2.27 ns_get32 F
+GLIBC_2.27 ns_initparse F
+GLIBC_2.27 ns_makecanon F
+GLIBC_2.27 ns_msg_getflag F
+GLIBC_2.27 ns_name_compress F
+GLIBC_2.27 ns_name_ntol F
+GLIBC_2.27 ns_name_ntop F
+GLIBC_2.27 ns_name_pack F
+GLIBC_2.27 ns_name_pton F
+GLIBC_2.27 ns_name_rollback F
+GLIBC_2.27 ns_name_skip F
+GLIBC_2.27 ns_name_uncompress F
+GLIBC_2.27 ns_name_unpack F
+GLIBC_2.27 ns_parse_ttl F
+GLIBC_2.27 ns_parserr F
+GLIBC_2.27 ns_put16 F
+GLIBC_2.27 ns_put32 F
+GLIBC_2.27 ns_samedomain F
+GLIBC_2.27 ns_samename F
+GLIBC_2.27 ns_skiprr F
+GLIBC_2.27 ns_sprintrr F
+GLIBC_2.27 ns_sprintrrf F
+GLIBC_2.27 ns_subdomain F
diff --git a/sysdeps/unix/sysv/linux/csky/librt.abilist b/sysdeps/unix/sysv/linux/csky/librt.abilist
new file mode 100644
index 0000000..8442d01
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/librt.abilist
@@ -0,0 +1,36 @@
+GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 __mq_open_2 F
+GLIBC_2.27 aio_cancel F
+GLIBC_2.27 aio_cancel64 F
+GLIBC_2.27 aio_error F
+GLIBC_2.27 aio_error64 F
+GLIBC_2.27 aio_fsync F
+GLIBC_2.27 aio_fsync64 F
+GLIBC_2.27 aio_init F
+GLIBC_2.27 aio_read F
+GLIBC_2.27 aio_read64 F
+GLIBC_2.27 aio_return F
+GLIBC_2.27 aio_return64 F
+GLIBC_2.27 aio_suspend F
+GLIBC_2.27 aio_suspend64 F
+GLIBC_2.27 aio_write F
+GLIBC_2.27 aio_write64 F
+GLIBC_2.27 lio_listio F
+GLIBC_2.27 lio_listio64 F
+GLIBC_2.27 mq_close F
+GLIBC_2.27 mq_getattr F
+GLIBC_2.27 mq_notify F
+GLIBC_2.27 mq_open F
+GLIBC_2.27 mq_receive F
+GLIBC_2.27 mq_send F
+GLIBC_2.27 mq_setattr F
+GLIBC_2.27 mq_timedreceive F
+GLIBC_2.27 mq_timedsend F
+GLIBC_2.27 mq_unlink F
+GLIBC_2.27 shm_open F
+GLIBC_2.27 shm_unlink F
+GLIBC_2.27 timer_create F
+GLIBC_2.27 timer_delete F
+GLIBC_2.27 timer_getoverrun F
+GLIBC_2.27 timer_gettime F
+GLIBC_2.27 timer_settime F
diff --git a/sysdeps/unix/sysv/linux/csky/libthread_db.abilist b/sysdeps/unix/sysv/linux/csky/libthread_db.abilist
new file mode 100644
index 0000000..3d34d78
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/libthread_db.abilist
@@ -0,0 +1,41 @@
+GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 td_init F
+GLIBC_2.27 td_log F
+GLIBC_2.27 td_symbol_list F
+GLIBC_2.27 td_ta_clear_event F
+GLIBC_2.27 td_ta_delete F
+GLIBC_2.27 td_ta_enable_stats F
+GLIBC_2.27 td_ta_event_addr F
+GLIBC_2.27 td_ta_event_getmsg F
+GLIBC_2.27 td_ta_get_nthreads F
+GLIBC_2.27 td_ta_get_ph F
+GLIBC_2.27 td_ta_get_stats F
+GLIBC_2.27 td_ta_map_id2thr F
+GLIBC_2.27 td_ta_map_lwp2thr F
+GLIBC_2.27 td_ta_new F
+GLIBC_2.27 td_ta_reset_stats F
+GLIBC_2.27 td_ta_set_event F
+GLIBC_2.27 td_ta_setconcurrency F
+GLIBC_2.27 td_ta_thr_iter F
+GLIBC_2.27 td_ta_tsd_iter F
+GLIBC_2.27 td_thr_clear_event F
+GLIBC_2.27 td_thr_dbresume F
+GLIBC_2.27 td_thr_dbsuspend F
+GLIBC_2.27 td_thr_event_enable F
+GLIBC_2.27 td_thr_event_getmsg F
+GLIBC_2.27 td_thr_get_info F
+GLIBC_2.27 td_thr_getfpregs F
+GLIBC_2.27 td_thr_getgregs F
+GLIBC_2.27 td_thr_getxregs F
+GLIBC_2.27 td_thr_getxregsize F
+GLIBC_2.27 td_thr_set_event F
+GLIBC_2.27 td_thr_setfpregs F
+GLIBC_2.27 td_thr_setgregs F
+GLIBC_2.27 td_thr_setprio F
+GLIBC_2.27 td_thr_setsigpending F
+GLIBC_2.27 td_thr_setxregs F
+GLIBC_2.27 td_thr_sigsetmask F
+GLIBC_2.27 td_thr_tls_get_addr F
+GLIBC_2.27 td_thr_tlsbase F
+GLIBC_2.27 td_thr_tsd F
+GLIBC_2.27 td_thr_validate F
diff --git a/sysdeps/unix/sysv/linux/csky/libutil.abilist b/sysdeps/unix/sysv/linux/csky/libutil.abilist
new file mode 100644
index 0000000..612e168
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/libutil.abilist
@@ -0,0 +1,7 @@
+GLIBC_2.27 GLIBC_2.27 A
+GLIBC_2.27 forkpty F
+GLIBC_2.27 login F
+GLIBC_2.27 login_tty F
+GLIBC_2.27 logout F
+GLIBC_2.27 logwtmp F
+GLIBC_2.27 openpty F
--
2.7.4
^ permalink raw reply [flat|nested] 22+ messages in thread
* [RFC PATCH 10/10] C-SKY: Linux ABI
2018-03-16 9:59 [RFC PATCH 00/10] port C-SKY to glibc Mao Han
` (6 preceding siblings ...)
2018-03-16 9:59 ` [RFC PATCH 07/10] C-SKY: Atomic and Locking Routines Mao Han
@ 2018-03-16 9:59 ` Mao Han
2018-03-20 9:42 ` Adhemerval Zanella
2018-03-16 9:59 ` [RFC PATCH 06/10] C-SKY: Build Infastructure Mao Han
` (2 subsequent siblings)
10 siblings, 1 reply; 22+ messages in thread
From: Mao Han @ 2018-03-16 9:59 UTC (permalink / raw)
To: libc-help; +Cc: han_mao, ren_guo, yunhai_shang, qijie_tong, chunqiang_li
Linux-specific code that is required for maintaining ABI compatibility.
This doesn't contain the actual system call interface.
*sysdeps/csky/nptl/pthread-offsets.h: New file
*sysdeps/csky/nptl/pthreaddef.h: New file
*sysdeps/unix/sysv/linux/csky/bits/fcntl.h: New file
*sysdeps/unix/sysv/linux/csky/bits/mman.h: New file
*sysdeps/unix/sysv/linux/csky/bits/shm.h: New file
*sysdeps/unix/sysv/linux/csky/c++-types.data: New file
*sysdeps/unix/sysv/linux/csky/csky_readtp.h: New file
*sysdeps/unix/sysv/linux/csky/jmp_buf-macros.h: New file
*sysdeps/unix/sysv/linux/csky/kernel-features.h: New file
*sysdeps/unix/sysv/linux/csky/makecontext.c: New file
*sysdeps/unix/sysv/linux/csky/profil-counter.h: New file
*sysdeps/unix/sysv/linux/csky/register-dump.h: New file
*sysdeps/unix/sysv/linux/csky/setcontext.S: New file
*sysdeps/unix/sysv/linux/csky/shlib-versions: New file
*sysdeps/unix/sysv/linux/csky/sigcontextinfo.h: New file
*sysdeps/unix/sysv/linux/csky/swapcontext.S: New file
*sysdeps/unix/sysv/linux/csky/sys/cachectl.h: New file
*sysdeps/unix/sysv/linux/csky/sys/procfs.h: New file
*sysdeps/unix/sysv/linux/csky/sys/ucontext.h: New file
*sysdeps/unix/sysv/linux/csky/sys/user.h: New file
*sysdeps/unix/sysv/linux/csky/sysdep-cancel.h: New file
*sysdeps/unix/sysv/linux/csky/sysdep.S: New file
*sysdeps/unix/sysv/linux/csky/sysdep.h: New file
*sysdeps/unix/sysv/linux/csky/ucontext_i.sym: New file
---
sysdeps/csky/nptl/pthread-offsets.h | 5 +
sysdeps/csky/nptl/pthreaddef.h | 40 ++
sysdeps/unix/sysv/linux/csky/bits/fcntl.h | 54 ++
sysdeps/unix/sysv/linux/csky/bits/mman.h | 42 ++
sysdeps/unix/sysv/linux/csky/bits/shm.h | 103 ++++
sysdeps/unix/sysv/linux/csky/c++-types.data | 67 +++
sysdeps/unix/sysv/linux/csky/csky_readtp.h | 24 +
sysdeps/unix/sysv/linux/csky/jmp_buf-macros.h | 6 +
sysdeps/unix/sysv/linux/csky/kernel-features.h | 29 +
sysdeps/unix/sysv/linux/csky/makecontext.c | 81 +++
sysdeps/unix/sysv/linux/csky/profil-counter.h | 34 ++
sysdeps/unix/sysv/linux/csky/register-dump.h | 218 ++++++++
sysdeps/unix/sysv/linux/csky/setcontext.S | 128 +++++
sysdeps/unix/sysv/linux/csky/shlib-versions | 3 +
sysdeps/unix/sysv/linux/csky/sigcontextinfo.h | 37 ++
sysdeps/unix/sysv/linux/csky/swapcontext.S | 112 ++++
sysdeps/unix/sysv/linux/csky/sys/cachectl.h | 35 ++
sysdeps/unix/sysv/linux/csky/sys/procfs.h | 123 +++++
sysdeps/unix/sysv/linux/csky/sys/ucontext.h | 111 ++++
sysdeps/unix/sysv/linux/csky/sys/user.h | 65 +++
sysdeps/unix/sysv/linux/csky/sysdep-cancel.h | 407 ++++++++++++++
sysdeps/unix/sysv/linux/csky/sysdep.S | 119 ++++
sysdeps/unix/sysv/linux/csky/sysdep.h | 730 +++++++++++++++++++++++++
sysdeps/unix/sysv/linux/csky/ucontext_i.sym | 31 ++
24 files changed, 2604 insertions(+)
create mode 100644 sysdeps/csky/nptl/pthread-offsets.h
create mode 100644 sysdeps/csky/nptl/pthreaddef.h
create mode 100644 sysdeps/unix/sysv/linux/csky/bits/fcntl.h
create mode 100644 sysdeps/unix/sysv/linux/csky/bits/mman.h
create mode 100644 sysdeps/unix/sysv/linux/csky/bits/shm.h
create mode 100644 sysdeps/unix/sysv/linux/csky/c++-types.data
create mode 100644 sysdeps/unix/sysv/linux/csky/csky_readtp.h
create mode 100644 sysdeps/unix/sysv/linux/csky/jmp_buf-macros.h
create mode 100644 sysdeps/unix/sysv/linux/csky/kernel-features.h
create mode 100644 sysdeps/unix/sysv/linux/csky/makecontext.c
create mode 100644 sysdeps/unix/sysv/linux/csky/profil-counter.h
create mode 100644 sysdeps/unix/sysv/linux/csky/register-dump.h
create mode 100644 sysdeps/unix/sysv/linux/csky/setcontext.S
create mode 100644 sysdeps/unix/sysv/linux/csky/shlib-versions
create mode 100644 sysdeps/unix/sysv/linux/csky/sigcontextinfo.h
create mode 100644 sysdeps/unix/sysv/linux/csky/swapcontext.S
create mode 100644 sysdeps/unix/sysv/linux/csky/sys/cachectl.h
create mode 100644 sysdeps/unix/sysv/linux/csky/sys/procfs.h
create mode 100644 sysdeps/unix/sysv/linux/csky/sys/ucontext.h
create mode 100644 sysdeps/unix/sysv/linux/csky/sys/user.h
create mode 100644 sysdeps/unix/sysv/linux/csky/sysdep-cancel.h
create mode 100644 sysdeps/unix/sysv/linux/csky/sysdep.S
create mode 100644 sysdeps/unix/sysv/linux/csky/sysdep.h
create mode 100644 sysdeps/unix/sysv/linux/csky/ucontext_i.sym
diff --git a/sysdeps/csky/nptl/pthread-offsets.h b/sysdeps/csky/nptl/pthread-offsets.h
new file mode 100644
index 0000000..9617354
--- /dev/null
+++ b/sysdeps/csky/nptl/pthread-offsets.h
@@ -0,0 +1,5 @@
+#define __PTHREAD_MUTEX_NUSERS_OFFSET 16
+#define __PTHREAD_MUTEX_KIND_OFFSET 12
+#define __PTHREAD_MUTEX_SPINS_OFFSET 20
+#define __PTHREAD_MUTEX_ELISION_OFFSET 22
+#define __PTHREAD_MUTEX_LIST_OFFSET 20
diff --git a/sysdeps/csky/nptl/pthreaddef.h b/sysdeps/csky/nptl/pthreaddef.h
new file mode 100644
index 0000000..f6e3b65
--- /dev/null
+++ b/sysdeps/csky/nptl/pthreaddef.h
@@ -0,0 +1,40 @@
+/* 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/>. */
+
+/* Default stack size. */
+#define ARCH_STACK_DEFAULT_SIZE (2 * 1024 * 1024)
+
+/* Required stack pointer alignment at beginning. */
+#define STACK_ALIGN 8
+
+/* Minimal stack size after allocating thread descriptor and guard size. */
+#define MINIMAL_REST_STACK 2048
+
+/* Alignment requirement for TCB. */
+#define TCB_ALIGNMENT 8
+
+
+/* Location of current stack frame.
+
+ __builtin_frame_address (0) returns the value of the hard frame
+ pointer, which will point at the location of the saved PC on the
+ stack. Below this in memory is the remainder of the linkage info,
+ occupying 12 bytes. Therefore in order to address from
+ CURRENT_STACK_FRAME using "struct layout", we need to have the macro
+ return the hard FP minus 12. Of course, this makes no sense
+ without the obsolete APCS stack layout... */
+#define CURRENT_STACK_FRAME (__builtin_frame_address (0) - 12)
diff --git a/sysdeps/unix/sysv/linux/csky/bits/fcntl.h b/sysdeps/unix/sysv/linux/csky/bits/fcntl.h
new file mode 100644
index 0000000..60d617b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/bits/fcntl.h
@@ -0,0 +1,54 @@
+/* O_*, F_*, FD_* bit values for Linux.
+ 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/>. */
+
+#ifndef _FCNTL_H
+# error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead."
+#endif
+
+#define __O_DIRECTORY 040000 /* Must be a directory. */
+#define __O_NOFOLLOW 0100000 /* Do not follow links. */
+#define __O_DIRECT 0200000 /* Direct disk access. */
+#define __O_LARGEFILE 0400000
+
+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. */
+ };
+
+#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/csky/bits/mman.h b/sysdeps/unix/sysv/linux/csky/bits/mman.h
new file mode 100644
index 0000000..7c30271
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/bits/mman.h
@@ -0,0 +1,42 @@
+/* Definitions for POSIX memory map interface. Linux/C-SKY version.
+ Copyright (C) 1997-2017 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
+
+/* The following definitions basically come from the kernel headers.
+ But the kernel header is not namespace clean. */
+
+/* These are Linux-specific. */
+#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 /* Lock the mapping. */
+# 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. */
+# define MAP_SYNC 0x80000 /* Perform synchronous page
+ faults for the mapping. */
+#endif
+
+/* Include generic Linux declarations. */
+#include <bits/mman-linux.h>
diff --git a/sysdeps/unix/sysv/linux/csky/bits/shm.h b/sysdeps/unix/sysv/linux/csky/bits/shm.h
new file mode 100644
index 0000000..eeb0d84
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/bits/shm.h
@@ -0,0 +1,103 @@
+/* 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 (__getpagesize () << 2)
+extern int __getpagesize (void) __THROW __attribute__ ((__const__));
+
+
+/* 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/csky/c++-types.data b/sysdeps/unix/sysv/linux/csky/c++-types.data
new file mode 100644
index 0000000..fde53bf
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/c++-types.data
@@ -0,0 +1,67 @@
+blkcnt64_t:x
+blkcnt_t:l
+blksize_t:l
+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/csky/csky_readtp.h b/sysdeps/unix/sysv/linux/csky/csky_readtp.h
new file mode 100644
index 0000000..fffd52c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/csky_readtp.h
@@ -0,0 +1,24 @@
+/* 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/>. */
+
+#ifdef __CSKYABIV2__
+# define csky_read_tp \
+ mov a0, r31
+#else
+# define csky_read_tp \
+ trap 3
+#endif
diff --git a/sysdeps/unix/sysv/linux/csky/jmp_buf-macros.h b/sysdeps/unix/sysv/linux/csky/jmp_buf-macros.h
new file mode 100644
index 0000000..ed61b1c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/jmp_buf-macros.h
@@ -0,0 +1,6 @@
+#define JMP_BUF_SIZE 204
+#define SIGJMP_BUF_SIZE 204
+#define JMP_BUF_ALIGN 4
+#define SIGJMP_BUF_ALIGN 4
+#define MASK_WAS_SAVED_OFFSET 72
+#define SAVED_MASK_OFFSET 76
diff --git a/sysdeps/unix/sysv/linux/csky/kernel-features.h b/sysdeps/unix/sysv/linux/csky/kernel-features.h
new file mode 100644
index 0000000..f1fbc71
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/kernel-features.h
@@ -0,0 +1,29 @@
+/* Set flags signalling availability of kernel features based on given
+ kernel version number.
+ 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_next <kernel-features.h>
+
+/* fadvise64_64 reorganize the syscall arguments. */
+#define __ASSUME_FADVISE64_64_6ARG 1
+
+/* Define this if your 32-bit syscall API requires 64-bit register
+ pairs to start with an even-number register. */
+#ifdef __CSKYABIV1__
+# define __ASSUME_ALIGNED_REGISTER_PAIRS 1
+#endif
diff --git a/sysdeps/unix/sysv/linux/csky/makecontext.c b/sysdeps/unix/sysv/linux/csky/makecontext.c
new file mode 100644
index 0000000..8585c5e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/makecontext.c
@@ -0,0 +1,81 @@
+/* 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 <stdarg.h>
+#include <ucontext.h>
+
+/* Number of arguments that go in registers. */
+#ifdef __CSKYABIV2__
+# define NREG_ARGS 4
+#else
+# define NREG_ARGS 6
+#endif
+
+/* Take a context previously prepared via getcontext() and set to
+ call func() with the given int only args. */
+void
+__makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
+{
+ extern void __startcontext (void);
+ unsigned long *funcstack;
+ va_list vl;
+ unsigned long *regptr;
+ unsigned int reg;
+ int misaligned;
+
+ /* Start at the top of stack. */
+ funcstack = (unsigned long *) (ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size);
+
+ /* Ensure the stack stays eight byte aligned. */
+ misaligned = ((unsigned long) funcstack & 4) != 0;
+
+ if ((argc > NREG_ARGS) && (argc & 1) != 0)
+ misaligned = !misaligned;
+
+ if (misaligned)
+ funcstack -= 1;
+
+ va_start (vl, argc);
+
+ /* Reserve space for the on-stack arguments. */
+ if (argc > NREG_ARGS)
+ funcstack -= (argc - NREG_ARGS);
+
+ ucp->uc_mcontext.sc_usp = (unsigned long) funcstack;
+ ucp->uc_mcontext.sc_pc = (unsigned long) func;
+
+ /* Exit to startcontext() with the next context in R9 */
+#ifdef __CSKYABIV2__
+ ucp->uc_mcontext.sc_regs[5] = (unsigned long) ucp->uc_link;
+#else
+ ucp->uc_mcontext.sc_regs[3] = (unsigned long) ucp->uc_link;
+#endif
+ ucp->uc_mcontext.sc_r15 = (unsigned long) __startcontext;
+
+ /* The first four arguments go into registers. */
+ regptr = &(ucp->uc_mcontext.sc_a0);
+
+ for (reg = 0; (reg < argc) && (reg < NREG_ARGS); reg++)
+ *regptr++ = va_arg (vl, unsigned long);
+
+ /* And the remainder on the stack. */
+ for (; reg < argc; reg++)
+ *funcstack++ = va_arg (vl, unsigned long);
+
+ va_end (vl);
+}
+weak_alias (__makecontext, makecontext)
diff --git a/sysdeps/unix/sysv/linux/csky/profil-counter.h b/sysdeps/unix/sysv/linux/csky/profil-counter.h
new file mode 100644
index 0000000..5d5ac34
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/profil-counter.h
@@ -0,0 +1,34 @@
+/* Low-level statistical profiling support function. Linux/C-SKY 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 <signal.h>
+#include <sigcontextinfo.h>
+
+void
+__profil_counter (int signo, const SIGCONTEXT 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 ("");
+}
+#ifndef __profil_counter
+weak_alias (__profil_counter, profil_counter)
+#endif
diff --git a/sysdeps/unix/sysv/linux/csky/register-dump.h b/sysdeps/unix/sysv/linux/csky/register-dump.h
new file mode 100644
index 0000000..2fe6f9c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/register-dump.h
@@ -0,0 +1,218 @@
+/* Dump registers.
+ 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/uio.h>
+#include <_itoa.h>
+#include <bits/sigcontext.h>
+#include <sys/ucontext.h>
+
+/* We will print the register dump in this format:
+
+ PSR: XXXXXXXX PC: XXXXXXXX SP: XXXXXXXX LR: XXXXXXXX
+ MASK: XXXXXXXX
+
+ A0: XXXXXXXX A1: XXXXXXXX A2: XXXXXXXX A3: XXXXXXXX
+ R6: XXXXXXXX R7: XXXXXXXX R8: XXXXXXXX R9: XXXXXXXX
+ R10: XXXXXXXX R11: XXXXXXXX R12: XXXXXXXX R13: XXXXXXXX
+ R14: XXXXXXXX R1: XXXXXXXX
+
+************************ I am cutter! *********************
+
+ PSR: XXXXXXXX PC: XXXXXXXX SP: XXXXXXXX LR: XXXXXXXX
+ MASK: XXXXXXXX
+
+ A0: XXXXXXXX A1: XXXXXXXX A2: XXXXXXXX A3: XXXXXXXX
+ R4: XXXXXXXX R5: XXXXXXXX R6: XXXXXXXX R7: XXXXXXXX
+ R8: XXXXXXXX R9: XXXXXXXX R10: XXXXXXXX R11: XXXXXXXX
+ R12: XXXXXXXX R13: XXXXXXXX R14: XXXXXXXX R15: XXXXXXXX
+ R16: XXXXXXXX R17: XXXXXXXX R18: XXXXXXXX R19: XXXXXXXX
+ R20: XXXXXXXX R21: XXXXXXXX R22: XXXXXXXX R23: XXXXXXXX
+ R24: XXXXXXXX R25: XXXXXXXX R26: XXXXXXXX R27: XXXXXXXX
+ R28: XXXXXXXX R29: XXXXXXXX R30: XXXXXXXX R31: XXXXXXXX
+
+ */
+
+static void
+hexvalue (unsigned long int value, char *buf, size_t len)
+{
+ char *cp = _itoa_word (value, buf + len, 16, 0);
+ while (cp > buf)
+ *--cp = '0';
+}
+
+static void
+register_dump (int fd, const struct ucontext *ctx)
+{
+ char regs[35][8];
+ struct iovec iov[97];
+ size_t nr = 0;
+
+#define ADD_STRING(str) \
+ iov[nr].iov_base = (char *) str; \
+ iov[nr].iov_len = strlen (str); \
+ ++nr
+#define ADD_MEM(str, len) \
+ iov[nr].iov_base = str; \
+ iov[nr].iov_len = len; \
+ ++nr
+
+ /* Generate strings of register contents. */
+ hexvalue (ctx->uc_mcontext.sc_sr, regs[0], 8);
+ hexvalue (ctx->uc_mcontext.sc_pc, regs[1], 8);
+ hexvalue (ctx->uc_mcontext.sc_usp, regs[2], 8);
+ hexvalue (ctx->uc_mcontext.sc_r15, regs[3], 8);
+ hexvalue (ctx->uc_mcontext.sc_mask, regs[4], 8);
+ hexvalue (ctx->uc_mcontext.sc_a0, regs[5], 8);
+ hexvalue (ctx->uc_mcontext.sc_a1, regs[6], 8);
+ hexvalue (ctx->uc_mcontext.sc_a2, regs[7], 8);
+ hexvalue (ctx->uc_mcontext.sc_a3, regs[8], 8);
+ hexvalue (ctx->uc_mcontext.sc_regs[0], regs[9], 8);
+ hexvalue (ctx->uc_mcontext.sc_regs[1], regs[10], 8);
+ hexvalue (ctx->uc_mcontext.sc_regs[2], regs[11], 8);
+ hexvalue (ctx->uc_mcontext.sc_regs[3], regs[12], 8);
+ hexvalue (ctx->uc_mcontext.sc_regs[4], regs[13], 8);
+ hexvalue (ctx->uc_mcontext.sc_regs[5], regs[14], 8);
+ hexvalue (ctx->uc_mcontext.sc_regs[6], regs[15], 8);
+ hexvalue (ctx->uc_mcontext.sc_regs[7], regs[16], 8);
+ hexvalue (ctx->uc_mcontext.sc_regs[8], regs[17], 8);
+ hexvalue (ctx->uc_mcontext.sc_regs[9], regs[18], 8);
+#ifdef __CSKYABIV2__
+ hexvalue (ctx->uc_mcontext.sc_exregs[0], regs[19], 8);
+ hexvalue (ctx->uc_mcontext.sc_exregs[1], regs[20], 8);
+ hexvalue (ctx->uc_mcontext.sc_exregs[2], regs[21], 8);
+ hexvalue (ctx->uc_mcontext.sc_exregs[3], regs[22], 8);
+ hexvalue (ctx->uc_mcontext.sc_exregs[4], regs[23], 8);
+ hexvalue (ctx->uc_mcontext.sc_exregs[5], regs[24], 8);
+ hexvalue (ctx->uc_mcontext.sc_exregs[6], regs[25], 8);
+ hexvalue (ctx->uc_mcontext.sc_exregs[7], regs[26], 8);
+ hexvalue (ctx->uc_mcontext.sc_exregs[8], regs[27], 8);
+ hexvalue (ctx->uc_mcontext.sc_exregs[9], regs[28], 8);
+ hexvalue (ctx->uc_mcontext.sc_exregs[10], regs[29], 8);
+ hexvalue (ctx->uc_mcontext.sc_exregs[11], regs[30], 8);
+ hexvalue (ctx->uc_mcontext.sc_exregs[12], regs[31], 8);
+ hexvalue (ctx->uc_mcontext.sc_exregs[13], regs[32], 8);
+ hexvalue (ctx->uc_mcontext.sc_exregs[14], regs[33], 8);
+ hexvalue (ctx->uc_mcontext.sc_exregs[15], regs[34], 8);
+#endif
+
+ /* Generate the output. */
+ ADD_STRING ("Register dump:\n\n PSR: ");
+ ADD_MEM (regs[0], 8);
+ ADD_STRING (" PC: ");
+ ADD_MEM (regs[1], 8);
+ ADD_STRING (" SP: ");
+ ADD_MEM (regs[2], 8);
+ ADD_STRING (" LR: ");
+ ADD_MEM (regs[3], 8);
+ ADD_STRING ("\n MASK: ");
+ ADD_MEM (regs[4], 8);
+ ADD_STRING ("\n\n A0: ");
+ ADD_MEM (regs[5], 8);
+ ADD_STRING (" A1: ");
+ ADD_MEM (regs[6], 8);
+ ADD_STRING (" A2: ");
+ ADD_MEM (regs[7], 8);
+ ADD_STRING (" A3: ");
+ ADD_MEM (regs[8], 8);
+#ifdef __CSKYABIV2__
+ ADD_STRING ("\n R4: ");
+ ADD_MEM (regs[9], 8);
+ ADD_STRING (" r5: ");
+ ADD_MEM (regs[10], 8);
+ ADD_STRING (" r6: ");
+ ADD_MEM (regs[11], 8);
+ ADD_STRING (" r7: ");
+ ADD_MEM (regs[12], 8);
+ ADD_STRING ("\n R8: ");
+ ADD_MEM (regs[13], 8);
+ ADD_STRING (" R9: ");
+ ADD_MEM (regs[14], 8);
+ ADD_STRING (" R10: ");
+ ADD_MEM (regs[15], 8);
+ ADD_STRING (" R11: ");
+ ADD_MEM (regs[16], 8);
+ ADD_STRING ("\n R12: ");
+ ADD_MEM (regs[17], 8);
+ ADD_STRING (" R13: ");
+ ADD_MEM (regs[18], 8);
+ ADD_STRING (" R14: ");
+ ADD_MEM (regs[19], 8);
+ ADD_STRING (" R15: ");
+ ADD_MEM (regs[20], 8);
+ ADD_STRING ("\n R16: ");
+ ADD_MEM (regs[21], 8);
+ ADD_STRING (" R17: ");
+ ADD_MEM (regs[22], 8);
+ ADD_STRING (" R18: ");
+ ADD_MEM (regs[23], 8);
+ ADD_STRING (" R19: ");
+ ADD_MEM (regs[24], 8);
+ ADD_STRING ("\n R20: ");
+ ADD_MEM (regs[25], 8);
+ ADD_STRING (" R21: ");
+ ADD_MEM (regs[26], 8);
+ ADD_STRING (" R22: ");
+ ADD_MEM (regs[27], 8);
+ ADD_STRING (" R23: ");
+ ADD_MEM (regs[28], 8);
+ ADD_STRING ("\n R24: ");
+ ADD_MEM (regs[29], 8);
+ ADD_STRING (" R25: ");
+ ADD_MEM (regs[30], 8);
+ ADD_STRING (" R26: ");
+ ADD_MEM (regs[31], 8);
+ ADD_STRING (" R27: ");
+ ADD_MEM (regs[32], 8);
+ ADD_STRING ("\n R28: ");
+ ADD_MEM (regs[33], 8);
+ ADD_STRING (" R29: ");
+ ADD_MEM (regs[34], 8);
+ ADD_STRING (" R30: ");
+ ADD_MEM (regs[33], 8);
+ ADD_STRING (" R31: ");
+ ADD_MEM (regs[34], 8);
+#else
+ ADD_STRING (" R6: ");
+ ADD_MEM (regs[9], 8);
+ ADD_STRING (" R7: ");
+ ADD_MEM (regs[10], 8);
+ ADD_STRING (" R8: ");
+ ADD_MEM (regs[11], 8);
+ ADD_STRING (" R9: ");
+ ADD_MEM (regs[12], 8);
+ ADD_STRING ("\n R10: ");
+ ADD_MEM (regs[13], 8);
+ ADD_STRING (" R11: ");
+ ADD_MEM (regs[14], 8);
+ ADD_STRING (" R12: ");
+ ADD_MEM (regs[15], 8);
+ ADD_STRING (" R13: ");
+ ADD_MEM (regs[16], 8);
+ ADD_STRING ("\n R14: ");
+ ADD_MEM (regs[17], 8);
+ ADD_STRING (" R1: ");
+ ADD_MEM (regs[18], 8);
+#endif
+
+ ADD_STRING ("\n");
+
+ /* Write the stuff out. */
+ writev (fd, iov, nr);
+}
+
+#define REGISTER_DUMP register_dump (fd, ctx)
diff --git a/sysdeps/unix/sysv/linux/csky/setcontext.S b/sysdeps/unix/sysv/linux/csky/setcontext.S
new file mode 100644
index 0000000..8c92938
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/setcontext.S
@@ -0,0 +1,128 @@
+/* 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/>. */
+
+#ifdef __CSKYABIV2__
+# include "abiv2_setcontext.S"
+#else
+
+# include <sysdep.h>
+
+# include "ucontext_i.h"
+
+/* int setcontext (const ucontext_t *ucp) */
+
+ENTRY(__setcontext)
+ mov r7, r2
+
+ /* set sigmask */
+ movi r2, SIG_SETMASK
+ lrw r3, UCONTEXT_SIGMASK
+ add r3, r7
+ movi r4, 0
+
+ subi sp, 8
+ stw r7, (sp, 0) /* save r7(ucp) */
+
+ /* do sigprocmask syscall */
+# ifdef __PIC__
+ subi sp, 8
+ stw gb, (sp, 0)
+ stw lr, (sp, 4)
+ bsr .Lgetpc1
+.Lgetpc1:
+ lrw gb, .Lgetpc1@GOTPC
+ addu gb, r15
+ lrw r7, __sigprocmask@PLT
+ addu r7, gb
+ ldw r7, (r7)
+ jsr r7
+ ldw gb, (sp, 0)
+ ldw lr, (sp, 4)
+ addi sp, 8
+# else
+ jsri __sigprocmask
+# endif /* __PIC__ */
+
+ ldw r1, (sp, 0) /* restore r7(ucp) */
+ addi sp, 8
+
+ lrw r2, MCONTEXT_CSKY_A0
+ add r2, r1
+
+ /* set r2-r14. Load r2-r7, for makecontext requires */
+ ldw r3, (r2, 4)
+ ldw r4, (r2, 8)
+ ldw r5, (r2, 12)
+ ldw r6, (r2, 16)
+ ldw r7, (r2, 20)
+ ldw r8, (r2, 24)
+ ldw r9, (r2, 28)
+ ldw r10, (r2, 32)
+ ldw r11, (r2, 36)
+ ldw r12, (r2, 40)
+ ldw r13, (r2, 44)
+ ldw r14, (r2, 48)
+
+ ldw r15, (r2, 56) /* load lr */
+
+ lrw r2, MCONTEXT_CSKY_SP
+ add r2, r1
+ ldw sp, (r2) /* load sp */
+
+ lrw r2, MCONTEXT_CSKY_PC
+ add r2, r1
+ ldw r2, (r2) /* load start addr */
+
+ subi sp, 8 /* for getcontext success */
+ stw r2, (sp, 0)
+ lrw r2, MCONTEXT_CSKY_A0
+ add r2, r1
+ ldw r2, (r2) /* load a0 */
+ ldw r1, (sp, 0)
+ addi sp, 8
+
+ jmp r1
+END(setcontext)
+weak_alias(__setcontext, setcontext)
+
+ENTRY(__startcontext)
+ mov a0, r9
+ cmpnei r9, 0 /* r9 was set in makecontext */
+ bf 1f /* null, then exit */
+
+ /* call setcontext */
+# ifdef __PIC__
+ mov r5, r15 /* save r15 */
+ bsr .Lgetpc2
+.Lgetpc2:
+ lrw r6, .Lgetpc2@GOTPC
+ addu r6, r15
+ lrw r7, __setcontext@GOT
+ addu r7, r6
+ ldw r7, (r7)
+ mov r15, r5 /* restore r15 */
+# else
+ lrw r7, __setcontext
+# endif
+ jsr r7
+
+1:
+ lrw r1, __NR_exit
+ trap 0
+END(__startcontext)
+
+#endif /* __CSKYAVBI2__*/
diff --git a/sysdeps/unix/sysv/linux/csky/shlib-versions b/sysdeps/unix/sysv/linux/csky/shlib-versions
new file mode 100644
index 0000000..6c1ca16
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/shlib-versions
@@ -0,0 +1,3 @@
+DEFAULT GLIBC_2.27
+
+ld=ld.so.1
diff --git a/sysdeps/unix/sysv/linux/csky/sigcontextinfo.h b/sysdeps/unix/sysv/linux/csky/sigcontextinfo.h
new file mode 100644
index 0000000..ba69f36
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/sigcontextinfo.h
@@ -0,0 +1,37 @@
+/* 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 SIGCONTEXT siginfo_t *_si, struct ucontext *
+#define SIGCONTEXT_EXTRA_ARGS _si,
+#define GET_PC(ctx) ((void *) (ctx)->uc_mcontext.sc_pc)
+/* r8 is fp, make sure it is in the same area in sigcontext. */
+#define GET_FRAME(ctx) ((void *) (ctx)->uc_mcontext.sc_regs[2])
+#define GET_STACK(ctx) ((void *) (ctx)->uc_mcontext.sc_usp)
+#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/csky/swapcontext.S b/sysdeps/unix/sysv/linux/csky/swapcontext.S
new file mode 100644
index 0000000..db3c2f8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/swapcontext.S
@@ -0,0 +1,112 @@
+/* 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 <sysdep.h>
+
+#include "ucontext_i.h"
+
+/* int swapcontext (ucontext_t *oucp, const ucontext_t *ucp) */
+
+ENTRY(swapcontext)
+ /* save params and lr */
+ subi sp, 16
+ stw a0, (sp, 0)
+ stw a1, (sp, 4)
+ stw r15, (sp, 8)
+
+ /* call getcontext */
+#ifdef __PIC__
+# ifdef __CSKYABIV2__
+ grs t1, .Lgetpc1
+.Lgetpc1:
+ lrw t0, .Lgetpc1@GOTPC
+ addu t1, t1, t0
+ lrw t0, __getcontext@GOT
+ ldr.w t0, (t1, t0 << 0)
+ jsr t0
+# else /* __CSKYABIV1 */
+ mov r7, lr
+ bsr .Lgetpc1
+.Lgetpc1: /* do not use gb here, and restore lr before call getcontext*/
+ lrw r6, .Lgetpc1@GOTPC
+ addu r6, r15
+ mov lr, r7 /* restore r15 */
+ lrw r5, __getcontext@GOT
+ addu r5, r6
+ ldw r5, (r5)
+ jsr r5
+# endif
+#else /* no pic */
+ jsri __getcontext
+#endif
+
+ mov a3, a0 /* save return value */
+
+ /* restore params and lr */
+ ldw a0, (sp, 0)
+ ldw a1, (sp, 4)
+ ldw r15, (sp, 8)
+ addi sp, 16
+
+ cmpnei a3, 0
+ bt error_exit
+
+ /* Fix up LR and the PC */
+#ifdef __CSKYABIV2__
+ stw sp, (a0, MCONTEXT_CSKY_SP)
+ stw r15, (a0, MCONTEXT_CSKY_LR)
+ stw r15, (a0, MCONTEXT_CSKY_PC)
+#else
+ lrw r4, MCONTEXT_CSKY_SP
+ add r4, a0
+ stw sp, (r4)
+ lrw r4, MCONTEXT_CSKY_LR
+ add r4, a0
+ stw r15, (r4)
+ stw r15, (r4, 8) /* MCONTEXT_CSKY_PC */
+#endif
+
+ /* set setcontext's arg */
+ mov a0, a1
+
+#ifdef __PIC__
+# ifdef __CSKYABIV2__
+ grs t1, .Lgetpc2
+.Lgetpc2:
+ lrw a3, .Lgetpc2@GOTPC
+ addu t1, t1, a3
+ lrw a3, __setcontext@GOT
+ ldr.w a3, (t1, a3 << 0)
+# else
+ mov r7, r15 /* save r15 */
+ bsr .Lgetpc2
+.Lgetpc2:
+ lrw r6, .Lgetpc2@GOTPC
+ addu r6, r15
+ lrw r5, __setcontext@GOT
+ addu r5, r6
+ ldw r5, (r5)
+ mov r15, r7 /* restore r15 */
+# endif /* __CSKYABIV2__ */
+#else /* __PIC__ */
+ lrw a3, __setcontext
+#endif /* __PIC__ */
+ jmp a3
+
+error_exit:
+ jmp r15
+END(swapcontext)
diff --git a/sysdeps/unix/sysv/linux/csky/sys/cachectl.h b/sysdeps/unix/sysv/linux/csky/sys/cachectl.h
new file mode 100644
index 0000000..1aeacde
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/sys/cachectl.h
@@ -0,0 +1,35 @@
+/* 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/>. */
+
+#ifndef _SYS_CACHECTL_H
+#define _SYS_CACHECTL_H 1
+
+#include <features.h>
+
+/* Get the kernel definition for the op bits. */
+#include <asm/cachectl.h>
+
+__BEGIN_DECLS
+
+#ifdef __USE_MISC
+extern int cacheflush (void *__addr, const int __nbytes, const int __op) __THROW;
+#endif
+extern int _flush_cache (char *__addr, const int __nbytes, const int __op) __THROW;
+
+__END_DECLS
+
+#endif /* sys/cachectl.h */
diff --git a/sysdeps/unix/sysv/linux/csky/sys/procfs.h b/sysdeps/unix/sysv/linux/csky/sys/procfs.h
new file mode 100644
index 0000000..4c9721b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/sys/procfs.h
@@ -0,0 +1,123 @@
+/* Core image file related definitions, C-SKY 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/>. */
+
+#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_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;
+ /* Lots missing */
+ 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/csky/sys/ucontext.h b/sysdeps/unix/sysv/linux/csky/sys/ucontext.h
new file mode 100644
index 0000000..d5cb0c6
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/sys/ucontext.h
@@ -0,0 +1,111 @@
+/* System V/C-SKY ABI compliant context switching support.
+ 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/>. */
+
+#ifndef _SYS_UCONTEXT_H
+#define _SYS_UCONTEXT_H 1
+
+#include <features.h>
+#include <signal.h>
+
+#include <bits/sigcontext.h>
+#include <bits/types/sigset_t.h>
+#include <bits/types/stack_t.h>
+
+/* Type for general register. */
+typedef int greg_t;
+
+/* Number of general registers. */
+#if (__CSKY__ == 2)
+#define NGREG 34
+#else
+#define NGREG 18
+#endif
+/* Container for all general registers. */
+typedef greg_t gregset_t[NGREG];
+
+/* Number of each register is the `gregset_t' array. */
+enum
+{
+ R_R0 = 0,
+#define R_R0 R_R0
+ R_R1 = 1,
+#define R_R1 R_R1
+ R_R2 = 2,
+#define R_R2 R_R2
+ R_R3 = 3,
+#define R_R3 R_R3
+ R_R4 = 4,
+#define R_R4 R_R4
+ R_R5 = 5,
+#define R_R5 R_R5
+ R_R6 = 6,
+#define R_R6 R_R6
+ R_R7 = 7,
+#define R8R7 R_R7
+ R_R8 = 8,
+#define R_R8 R_R8
+ R_R9 = 9,
+#define R_R9 R_R9
+ R_R10 = 10,
+#define R_R10 R_R10
+ R_R11 = 11,
+#define R_R11 R_R11
+ R_R12 = 12,
+#define R_R12 R_R12
+ R_R13 = 13,
+#define R_R13 R_R13
+ R_R14 = 14,
+#define R_R14 R_R14
+ R_R15 = 15,
+#define R_R15 R_R15
+#if (__CSKY__ == 2)
+ R_SR = 32,
+#define R_SR R_SR
+ R_PC = 33,
+#define R_PC R_PC
+#else
+ R_SR = 16,
+#define R_SR R_SR
+ R_PC = 17,
+#define R_PC R_PC
+#endif
+};
+
+/* Structure to describe FPU registers. */
+typedef struct fpregset
+{
+ unsigned long fesr; /* fpu exception status reg */
+ unsigned long fsr; /* fpu status reg, nothing in CPU_CSKYV2 */
+ unsigned long fp[32]; /* fpu general regs */
+} fpregset_t;
+
+/* store common registers and fp registers etc. */
+typedef struct sigcontext mcontext_t;
+
+/* Userlevel context. */
+typedef struct ucontext
+{
+ unsigned long uc_flags;
+ struct ucontext *uc_link;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext; /* struct sigcontext */
+ __sigset_t uc_sigmask;
+ unsigned long uc_filler[80];
+} ucontext_t;
+
+#endif /* sys/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/csky/sys/user.h b/sysdeps/unix/sysv/linux/csky/sys/user.h
new file mode 100644
index 0000000..e46c9de
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/sys/user.h
@@ -0,0 +1,65 @@
+/* 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/>. */
+
+#ifndef _SYS_USER_H
+#define _SYS_USER_H 1
+
+struct user_fpregs {
+ unsigned long fsr; /* fpu status reg */
+ unsigned long fesr; /* fpu exception status reg */
+ unsigned long fp[32]; /* fpu general regs */
+};
+
+struct user_regs {
+#if defined(__ck807__) || defined(__ck810__) || defined(__ck860__)
+ unsigned long int uregs[34]; /* CSKY V2 has 32 general rgister */
+#else
+ unsigned long int uregs[18]; /* CSKY V1 has 16 general rgister */
+#endif
+};
+
+/*
+ * When the kernel dumps core, it starts by dumping the user struct -
+ * this will be used by gdb to figure out where the data and stack segments
+ * are within the file, and what virtual addresses to use.
+ */
+struct user{
+/* We start with the registers, to mimic the way that "memory" is returned
+ from the ptrace(3,...) function. */
+ struct user_regs regs; /* The registers are actually stored */
+ int u_fpvalid; /* True if math co-processor being used. */
+
+/* The rest of this junk is to help gdb figure out what goes where */
+ unsigned long int u_tsize; /* Text segment size (pages). */
+ unsigned long int u_dsize; /* Data segment size (pages). */
+ unsigned long int u_ssize; /* Stack segment size (pages). */
+ unsigned long start_code; /* Starting virtual address of text. */
+ unsigned long start_stack; /* Starting virtual address of stack area.
+ This is actually the bottom of the stack
+ the top of the stack is always found in
+ the esp register. */
+ long int signal; /* Signal that caused the core dump. */
+ int reserved; /* No longer used */
+ struct user_regs * u_ar0; /* Used by gdb to help find the values
+ for the registers. */
+ unsigned long magic; /* To uniquely identify a core file */
+ char u_comm[32]; /* User command that was responsible */
+ struct user_fpregs u_fp;
+ struct user_fpregs* u_fpstate; /* Math Co-processor pointer. */
+};
+
+#endif /* _SYS_USER_H */
diff --git a/sysdeps/unix/sysv/linux/csky/sysdep-cancel.h b/sysdeps/unix/sysv/linux/csky/sysdep-cancel.h
new file mode 100644
index 0000000..dd39ecf
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/sysdep-cancel.h
@@ -0,0 +1,407 @@
+/* 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 <sysdep.h>
+#include <tls.h>
+#include <csky_readtp.h>
+#ifndef __ASSEMBLER__
+# include <nptl/pthreadP.h>
+#endif
+
+#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
+
+# ifdef __PIC__
+# define __GET_GB \
+ bsr 1f; 1: lrw gb, 1b@GOTPC; addu gb, lr;
+# define __JSR(symbol) \
+ lrw a2, symbol@PLT; add a2, gb; ld.w a2, (a2); jsr a2;
+
+# if !IS_IN (libc)
+# define PSEUDO_ERRJMP \
+ subi sp, 8; st.w lr, (sp); st.w gb, (sp, 4); \
+ __GET_GB \
+ bsr SYSCALL_ERROR; \
+ ld.w lr, (sp); ld.w gb, (sp, 4); addi sp, 8; \
+ rts;
+# else /* !IS_IN (libc) */
+# define PSEUDO_ERRJMP \
+ subi sp, 8; st.w lr, (sp); st.w gb, (sp, 4); \
+ __GET_GB \
+ lrw a2, SYSCALL_ERROR@PLT; add a2, gb; ld.w a2, (a2); \
+ jsr a2; \
+ ld.w lr, (sp); ld.w gb, (sp, 4); addi sp, 8; \
+ rts;
+# endif
+
+# else
+
+# define __GET_GB
+# define __JSR(symbol) jsri symbol;
+# define PSEUDO_ERRJMP jmpi SYSCALL_ERROR;
+# endif
+
+
+#ifdef __CSKYABIV2__
+#undef PSEUDO
+#define PSEUDO(name, syscall_name, args) \
+ .section ".text"; \
+ 99: PSEUDO_ERRJMP \
+ .type __##syscall_name##_nocancel,@function; \
+ .globl __##syscall_name##_nocancel; \
+ __##syscall_name##_nocancel: \
+ cfi_startproc; \
+ DO_CALL (syscall_name, args); \
+ btsti a0, 31; \
+ bt 99b; \
+ rts; \
+ cfi_endproc; \
+ .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
+ ENTRY (name); \
+ SINGLE_THREAD_P; \
+ bt .Lpseudo_cancel; \
+ DO_CALL (syscall_name, args); \
+ btsti a0, 31; \
+ bt 99b; \
+ rts; \
+.Lpseudo_cancel: \
+ DOCARGS_##args; /* save syscall reg(r7), syscall args and lr */ \
+ __GET_GB; \
+ CENABLE; \
+ mov t0, a0; /* Save result of CENABLE */ \
+ UNDOSYSARGS_##args; /* restore syscall args */ \
+ DO_CALL_2 (syscall_name, args); \
+ mov r7, a0; /* save result of syscall */ \
+ mov a0, t0; /* restore result of CENABLE */ \
+ CDISABLE; \
+ mov a0, r7; /* restore result of syscall */ \
+ RESTORE_LR_R7_##args; \
+ btsti a0, 31; \
+ bt 99b; \
+ rts; \
+
+
+#else /* __CSKYABIV1__ */
+
+#undef PSEUDO
+#define PSEUDO(name, syscall_name, args) \
+ .section ".text"; \
+ 99: PSEUDO_ERRJMP \
+ .type __##syscall_name##_nocancel,@function; \
+ .globl __##syscall_name##_nocancel; \
+ __##syscall_name##_nocancel: \
+ DO_CALL (syscall_name, args); \
+ btsti a0, 31; \
+ bt 99b; \
+ rts; \
+ .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
+ ENTRY (name); \
+ SINGLE_THREAD_P; \
+ bt .Lpseudo_cancel; \
+ DO_CALL (syscall_name, args); \
+ btsti a0, 31; \
+ bt 99b; \
+ rts; \
+.Lpseudo_cancel: \
+ DOCARGS_##args; /* save syscall args and lr */ \
+ __GET_GB; \
+ CENABLE; \
+ mov r9, a0; \
+ UNDOSYSARGS_##args; /* restore syscall args */ \
+ lrw r1, SYS_ify (syscall_name); \
+ trap 0; \
+ mov r1, a0; /* save result of syscall */ \
+ mov a0, r9; /* restore result of CENABLE */ \
+ mov r9, r1; \
+ CDISABLE; \
+ mov a0, r9; /* restore result of syscall */ \
+ RESTORE_LR_##args; \
+ btsti a0, 31; \
+ bt 99b; \
+ rts; \
+
+#endif /* __CSKYABIV2__ */
+
+#ifdef __CSKYABIV2__
+#define DOCARGS_0 \
+ subi sp, 12; .cfi_def_cfa_offset 12; \
+ stw r15, (sp, 0); .cfi_offset 15, -12; \
+ stw gb, (sp, 4); .cfi_offset 28, -8; \
+ stw r7, (sp, 8); .cfi_offset 7, -4;
+#define UNDOSYSARGS_0
+#define RESTORE_LR_R7_0 \
+ ldw r15, (sp, 0); \
+ ldw gb, (sp, 4); \
+ ldw r7, (sp, 8); \
+ addi sp, 12
+
+#define DOCARGS_1 \
+ subi sp, 16; .cfi_def_cfa_offset 16; \
+ stw a0, (sp, 0); \
+ stw r15, (sp, 4); .cfi_offset 15, -12; \
+ stw gb, (sp, 8); .cfi_offset 28, -8; \
+ stw r7, (sp, 12); .cfi_offset 7, -4;
+#define UNDOSYSARGS_1 \
+ ldw a0, (sp, 0); \
+ addi sp, 4; .cfi_adjust_cfa_offset -4;
+#define RESTORE_LR_R7_1 RESTORE_LR_R7_0
+
+#define DOCARGS_2 \
+ subi sp, 20; .cfi_def_cfa_offset 20; \
+ stw a0, (sp, 0); \
+ stw a1, (sp, 4); \
+ stw r15, (sp, 8); .cfi_offset 15, -12; \
+ stw gb, (sp, 12); .cfi_offset 28, -8; \
+ stw r7, (sp, 16); .cfi_offset 7, -4;
+#define UNDOSYSARGS_2 \
+ ldw a0, (sp, 0); \
+ ldw a1, (sp, 4); \
+ addi sp, 8; .cfi_adjust_cfa_offset -8;
+#define RESTORE_LR_R7_2 RESTORE_LR_R7_0
+
+#define DOCARGS_3 \
+ subi sp, 24; .cfi_def_cfa_offset 24; \
+ stw a0, (sp, 0); \
+ stw a1, (sp, 4); \
+ stw a2, (sp, 8); \
+ stw r15, (sp, 12); .cfi_offset 15, -12; \
+ stw gb, (sp, 16); .cfi_offset 28, -8; \
+ stw r7, (sp, 20); .cfi_offset 7, -4;
+#define UNDOSYSARGS_3 \
+ ldw a0, (sp, 0); \
+ ldw a1, (sp, 4); \
+ ldw a2, (sp, 8); \
+ addi sp, 12; .cfi_adjust_cfa_offset -12;
+#define RESTORE_LR_R7_3 RESTORE_LR_R7_0
+
+#define DOCARGS_4 \
+ subi sp, 28;; .cfi_def_cfa_offset 28; \
+ stw a0, (sp, 0); \
+ stw a1, (sp, 4); \
+ stw a2, (sp, 8); \
+ stw a3, (sp, 12); \
+ stw r15, (sp, 16); .cfi_offset 15, -12; \
+ stw gb, (sp, 20); .cfi_offset 28, -8; \
+ stw r7, (sp, 24); .cfi_offset 7, -4;
+#define UNDOSYSARGS_4 \
+ ldw a0, (sp, 0); \
+ ldw a1, (sp, 4); \
+ ldw a2, (sp, 8); \
+ ldw a3, (sp, 12); \
+ addi sp, 16; .cfi_adjust_cfa_offset -16;
+#define RESTORE_LR_R7_4 RESTORE_LR_R7_0
+
+#define DOCARGS_5 DOCARGS_4
+#define UNDOSYSARGS_5 UNDOSYSARGS_4
+#define RESTORE_LR_R7_5 RESTORE_LR_R7_0
+#define DOCARGS_6 DOCARGS_4
+#define UNDOSYSARGS_6 UNDOSYSARGS_4
+#define RESTORE_LR_R7_6 RESTORE_LR_R7_0
+#else /* __CSKYABIV1__ */
+#define DOCARGS_0 \
+ subi sp, 16; .cfi_def_cfa_offset 16; \
+ stw r15, (sp, 0); .cfi_offset 15, -16; \
+ stw r9, (sp, 4); .cfi_offset 9, -12; \
+ stw r14, (sp, 8); .cfi_offset 14, -8;
+#define UNDOSYSARGS_0
+#define RESTORE_LR_0 \
+ ldw r15, (sp, 0); \
+ ldw r9, (sp, 4); \
+ ldw r14, (sp, 8); \
+ addi sp, 16
+
+#define DOCARGS_1 \
+ subi sp, 16; .cfi_def_cfa_offset 16; \
+ stw r15, (sp, 0); .cfi_offset 15, -16; \
+ stw r9, (sp, 4); .cfi_offset 9, -12; \
+ stw r14, (sp, 8); .cfi_offset 14, -8; \
+ stw r2, (sp, 12);
+#define UNDOSYSARGS_1 \
+ ldw r2, (sp, 12);
+#define RESTORE_LR_1 RESTORE_LR_0
+
+#define DOCARGS_2 \
+ subi sp, 24; .cfi_def_cfa_offset 24; \
+ stw r2, (sp, 0); \
+ stw r3, (sp, 4); \
+ stw r15, (sp, 8); .cfi_offset 15, -16; \
+ stw r9, (sp, 12); .cfi_offset 9, -12; \
+ stw r14, (sp, 16); .cfi_offset 14, -8;
+#define UNDOSYSARGS_2 \
+ ldw r2, (sp, 0); \
+ ldw r3, (sp, 4); \
+ addi sp, 8; .cfi_adjust_cfa_offset -8;
+#define RESTORE_LR_2 RESTORE_LR_0
+
+#define DOCARGS_3 \
+ subi sp, 24; .cfi_def_cfa_offset 24; \
+ stw r2, (sp, 0); \
+ stw r3, (sp, 4); \
+ stw r15, (sp, 8); .cfi_offset 15, -16; \
+ stw r9, (sp, 12); .cfi_offset 9, -12; \
+ stw r14, (sp, 16); .cfi_offset 14, -8; \
+ stw r4, (sp, 20);
+#define UNDOSYSARGS_3 \
+ ldw r2, (sp, 0); \
+ ldw r3, (sp, 4); \
+ ldw r4, (sp, 20); \
+ addi sp, 8; .cfi_adjust_cfa_offset -8;
+#define RESTORE_LR_3 RESTORE_LR_0
+
+#define DOCARGS_4 \
+ subi sp, 32; .cfi_def_cfa_offset 32; \
+ stw r2, (sp, 0); \
+ stw r3, (sp, 4); \
+ stw r4, (sp, 8); \
+ stw r5, (sp, 12); \
+ stw r15, (sp, 16); .cfi_offset 15, -16; \
+ stw r9, (sp, 20); .cfi_offset 9, -12; \
+ stw r14, (sp, 24); .cfi_offset 14, -8;
+#define UNDOSYSARGS_4 \
+ ldw r2, (sp, 0); \
+ ldw r3, (sp, 4); \
+ ldw r4, (sp, 8); \
+ ldw r5, (sp, 12); \
+ addi sp, 16; .cfi_adjust_cfa_offset -16;
+#define RESTORE_LR_4 RESTORE_LR_0
+
+#define DOCARGS_5 \
+ subi sp, 32; .cfi_def_cfa_offset 32; \
+ stw r2, (sp, 0); \
+ stw r3, (sp, 4); \
+ stw r4, (sp, 8); \
+ stw r5, (sp, 12); \
+ stw r15, (sp, 16); .cfi_offset 15, -16; \
+ stw r9, (sp, 20); .cfi_offset 9, -12; \
+ stw r14, (sp, 24); .cfi_offset 14, -8; \
+ stw r6, (sp, 28);
+#define UNDOSYSARGS_5 \
+ ldw r2, (sp, 0); \
+ ldw r3, (sp, 4); \
+ ldw r4, (sp, 8); \
+ ldw r5, (sp, 12); \
+ ldw r6, (sp, 28); \
+ addi sp, 16; .cfi_adjust_cfa_offset -16;
+#define RESTORE_LR_5 RESTORE_LR_0
+
+#define DOCARGS_6 \
+ subi sp, 32; .cfi_def_cfa_offset 32; \
+ subi sp, 8; .cfi_def_cfa_offset 8; \
+ stw r2, (sp, 0); \
+ stw r3, (sp, 4); \
+ stw r4, (sp, 8); \
+ stw r5, (sp, 12); \
+ stw r6, (sp, 16); \
+ stw r7, (sp, 20); \
+ stw r15, (sp, 24); .cfi_offset 15, -16; \
+ stw r9, (sp, 28); .cfi_offset 9, -12; \
+ stw r14, (sp, 32); .cfi_offset 14, -8;
+#define UNDOSYSARGS_6 \
+ ldw r2, (sp, 0); \
+ ldw r3, (sp, 4); \
+ ldw r4, (sp, 8); \
+ ldw r5, (sp, 12); \
+ ldw r6, (sp, 16); \
+ ldw r7, (sp, 20); \
+ addi sp, 24; .cfi_adjust_cfa_offset -24;
+#define RESTORE_LR_6 RESTORE_LR_0
+
+#define UNDOARGS_0
+#define UNDOARGS_1
+#define UNDOARGS_2
+#define UNDOARGS_3
+#define UNDOARGS_4
+#define UNDOARGS_5
+#define UNDOARGS_6
+
+#endif /* __CSKYABIV2__ */
+
+
+
+# if IS_IN (libpthread)
+# ifdef __PIC__
+# define CENABLE __JSR (__pthread_enable_asynccancel)
+# define CDISABLE __JSR (__pthread_disable_asynccancel)
+# else
+# define CENABLE __JSR (__pthread_enable_asynccancel)
+# define CDISABLE __JSR (__pthread_disable_asynccancel)
+# endif
+# elif IS_IN (libc)
+# ifdef __PIC__
+# define CENABLE __JSR (__libc_enable_asynccancel)
+# define CDISABLE __JSR (__libc_disable_asynccancel)
+# else
+# define CENABLE __JSR (__libc_enable_asynccancel)
+# define CDISABLE __JSR (__libc_disable_asynccancel)
+# endif
+# else
+# ifdef __PIC__
+# define CENABLE __JSR (__librt_enable_asynccancel)
+# define CDISABLE __JSR (__librt_disable_asynccancel)
+# else
+# define CENABLE __JSR (__librt_enable_asynccancel)
+# define CDISABLE __JSR (__librt_disable_asynccancel)
+# endif
+# endif
+
+# if IS_IN (libc)
+# define __local_multiple_threads __libc_multiple_threads
+# elif IS_IN (libpthread)
+# define __local_multiple_threads __pthread_multiple_threads
+# else
+# define __local_multiple_threads __librt_multiple_threads
+# endif
+
+#ifndef __ASSEMBLER__
+# if IS_IN (libpthread) || IS_IN (libc)
+extern int __local_multiple_threads attribute_hidden;
+# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
+# else /* IS_IN_libpthread || !defined NOT_IN_libc */
+# define SINGLE_THREAD_P \
+ __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
+ header.multiple_threads) == 0, 1)
+# endif
+#else
+# define SINGLE_THREAD_P \
+ subi sp, 8; \
+ stw a0, (sp, 0); \
+ stw a1, (sp, 4); \
+ csky_read_tp; \
+ lrw a1, MULTIPLE_THREADS_OFFSET; \
+ add a0, a1; \
+ ldw a0, (a0); \
+ cmpnei a0, 0; \
+ ldw a0, (sp, 0); \
+ ldw a1, (sp, 4); \
+ addi sp, 8
+# endif
+
+
+
+#elif !defined __ASSEMBLER__
+
+/* This code should never be used but we define it anyhow. */
+# define SINGLE_THREAD_P (1)
+# define NO_CANCELLATION (1)
+
+#endif
+
+#ifndef __ASSEMBLER__
+# define RTLD_SINGLE_THREAD_P \
+ __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
+ header.multiple_threads) == 0, \
+ 1)
+#endif
diff --git a/sysdeps/unix/sysv/linux/csky/sysdep.S b/sysdeps/unix/sysv/linux/csky/sysdep.S
new file mode 100644
index 0000000..7b919ec
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/sysdep.S
@@ -0,0 +1,119 @@
+/* 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 <sysdep.h>
+#include <csky_readtp.h>
+
+/* The syscall stubs jump here when they detect an error.
+ The code for Linux is almost identical to the canonical Unix
+ code, except that the error number in R0 is negated. */
+
+#undef CALL_MCOUNT
+#define CALL_MCOUNT /* Don't insert the profiling call, it clobbers R0. */
+
+ .text
+ENTRY(__syscall_error)
+ movi a1, 0
+ rsub a0, a0, a1
+
+#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
+ /* We translate the system's EWOULDBLOCK error into EAGAIN.
+ The GNU C library always defines EWOULDBLOCK==EAGAIN.
+ EWOULDBLOCK_sys is the original number. */
+ cmpnei a0, EWOULDBLOCK /* Is it the old EWOULDBLOCK? */
+ bt 1f
+ mov a0, EAGAIN /* Yes; translate it to EAGAIN. */
+#endif
+
+#ifdef __CSKYABIV2__
+1:
+# if !IS_IN (rtld)
+ mov a1, a0
+ csky_read_tp
+
+ grs t1, .Lgetpc1
+.Lgetpc1:
+ lrw t0, errno@gottpoff
+ add t1, t1, t0
+ ldw t1, (t1)
+ add t1, a0
+ stw a1, (t1)
+ bmaski a0, 0
+ rts
+# elif RTLD_PRIVATE_ERRNO /* !IS_IN (rtld) */
+# ifdef __PIC__
+ grs t1, .Lgetpc2
+.Lgetpc2:
+ lrw t0, .Lgetpc2@GOTPC
+ addu t1, t1, t0
+ lrw t0, rtld_errno@PLT
+ ldr.w t0, (t1, t0 << 0)
+# else
+ lrw t0, rtld_errno
+# endif /* __PIC__ */
+ stw a0, (t0)
+ bmaski a0, 0
+ rts
+# else
+# error "Unsupported non-TLS case"
+# endif /* RTLD_PRIVATE_ERRNO */
+
+# undef __syscall_error
+END (__syscall_error)
+
+#else /* __CSKYABIV2__ */
+
+1:
+# if !IS_IN (rtld)
+ mov r7, r15
+ mov r1, r2
+ csky_read_tp
+
+ bsr .Lgetpc1
+.Lgetpc1:
+ lrw r5, errno@gottpoff
+ add r5, r15
+ ldw r5, (r5)
+ add r5, r2
+ stw r1, (r5)
+ bmaski r2, 0
+ mov r15, r7
+ rts
+# elif RTLD_PRIVATE_ERRNO /* !IS_IN (rtld) */
+# ifdef __PIC__
+ mov r7, r15
+ bsr .Lgetpc2
+.Lgetpc2:
+ lrw r6, .Lgetpc2@GOTPC
+ addu r6, r15
+ lrw r5, rtld_errno@PLT
+ addu r5, r6
+ ldw r5, (r5)
+ mov r15, r7
+# else /* __PIC__ */
+ lrw r5, rtld_errno
+# endif /* __PIC__ */
+ stw r2, (r5)
+ bmaski r2, 0
+ rts
+# else
+# error "Unsupported non-TLS case"
+# endif /* RTLD_PRIVATE_ERRNO */
+
+END (__syscall_error)
+
+#endif /* __CSKYABIV2__ */
diff --git a/sysdeps/unix/sysv/linux/csky/sysdep.h b/sysdeps/unix/sysv/linux/csky/sysdep.h
new file mode 100644
index 0000000..7edc559
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/sysdep.h
@@ -0,0 +1,730 @@
+/* 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/>. */
+
+#ifndef _LINUX_CSKY_SYSDEP_H
+#define _LINUX_CSKY_SYSDEP_H 1
+
+/* There is some commonality. */
+#include <sysdeps/unix/sysv/linux/sysdep.h>
+#include <sysdeps/unix/csky/sysdep.h>
+
+/* Defines RTLD_PRIVATE_ERRNO and USE_DL_SYSINFO. */
+#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__
+/* Linux uses a negative return value to indicate syscall errors,
+ unlike most Unices, which use the condition codes' carry flag.
+
+ Since version 2.1 the return value of a system call might be
+ negative even if the call succeeded. E.g., the `lseek' system call
+ might return a large offset. Therefore we must not anymore test
+ for < 0, but test for a real error by making sure the value in R0
+ is a real error number. Linus said he will make sure the no syscall
+ returns a value in -1 .. -4095 as a valid result so we can safely
+ test with -4095. */
+
+# undef PSEUDO
+# define PSEUDO(name, syscall_name, args) \
+ .text; \
+ ENTRY (name); \
+ DO_CALL (syscall_name, args);
+
+
+# if defined (__PIC__)
+# define __GET_GB1 \
+ bsr getgb; getgb: lrw gb, getgb@GOTPC; addu gb, lr;
+# else
+# define __GET_GB1
+# endif /* !__PIC__ */
+
+# undef PSEUDO_RET
+# ifdef __PIC__
+# if !IS_IN (libc)
+# define PSEUDO_RET \
+ btsti a0, 31; \
+ bf 1f; \
+ subi sp, 8; st.w lr, (sp); st.w gb, (sp, 4); \
+ __GET_GB1 \
+ bsr SYSCALL_ERROR; \
+ ld.w lr, (sp); ld.w gb, (sp, 4); addi sp, 8; \
+1: \
+ rts
+# else
+# define PSEUDO_RET \
+ btsti a0, 31; \
+ bf 2f; \
+ subi sp, 8; st.w lr, (sp); st.w gb, (sp, 4); \
+ __GET_GB1; \
+ lrw a2, SYSCALL_ERROR@PLT; \
+ add a2, gb; \
+ ld.w a2, (a2); \
+ jsr a2; \
+ ld.w lr, (sp); ld.w gb, (sp, 4); addi sp, 8; \
+2: \
+ rts
+# endif /* IS_IN (libc) */
+# else
+# if !IS_IN (libc)
+# define PSEUDO_RET \
+ btsti a0, 31; \
+ bt SYSCALL_ERROR; \
+ rts
+# else
+# define PSEUDO_RET \
+ btsti a0, 31; \
+ bf 3f; \
+ jmpi SYSCALL_ERROR; \
+3: \
+ rts
+# endif /* !IS_IN (libc) */
+# endif /* __PIC__ */
+
+
+# undef ret
+# define ret PSEUDO_RET
+
+# undef PSEUDO_END
+# define PSEUDO_END(name) \
+ .align 4; \
+ SYSCALL_ERROR_HANDLER; \
+ END (name)
+
+# undef PSEUDO_NOERRNO
+# define PSEUDO_NOERRNO(name, syscall_name, args) \
+ .text; \
+ ENTRY (name); \
+ DO_CALL (syscall_name, args)
+
+# define PSEUDO_RET_NOERRNO \
+ jmp r15;
+
+# undef ret_NOERRNO
+# define ret_NOERRNO PSEUDO_RET_NOERRNO
+
+# undef PSEUDO_END_NOERRNO
+# define PSEUDO_END_NOERRNO(name) \
+ END (name)
+
+/* The function has to return the error code. */
+# undef PSEUDO_ERRVAL
+# define PSEUDO_ERRVAL(name, syscall_name, args) \
+ .text; \
+ ENTRY (name) \
+ DO_CALL (syscall_name, args); \
+ not a0; \
+ addi a0, 1
+
+# undef PSEUDO_END_ERRVAL
+# define PSEUDO_END_ERRVAL(name) \
+ END (name)
+
+# define ret_ERRVAL rts
+
+# if !IS_IN (libc)
+# define SYSCALL_ERROR __local_syscall_error
+# if RTLD_PRIVATE_ERRNO
+# ifdef __PIC__
+# define SYSCALL_ERROR_HANDLER \
+__local_syscall_error: \
+ lrw a1, rtld_errno@PLT; \
+ addu a1, gb; \
+ ldw a1, (a1); \
+ rsubi a0, 0; \
+ stw a0, (a1); \
+ bmaski a0, 0; \
+ rts
+# else /* __PIC__ */
+# define SYSCALL_ERROR_HANDLER \
+__local_syscall_error: \
+ lrw a1, rtld_errno; \
+ rsubi a0, 0; \
+ stw a0, (a1); \
+ bmaski a0, 0; \
+ rts
+# endif /* __PIC__ */
+# else /* !RTLD_PRIVATE_ERRNO */
+# ifdef __PIC__
+# define SYSCALL_ERROR_HANDLER \
+__local_syscall_error: \
+ subi sp, 8; \
+ stw a0, (sp, 0); \
+ stw r15, (sp, 4); \
+ lrw a1, __errno_location@PLT; \
+ add a1, gb; \
+ ldw a1, (a1); \
+ jsr a1; \
+ ldw a1, (sp, 0); /* load errno*/ \
+ ldw r15, (sp, 4); \
+ addi sp, 8; \
+ movi a2, 0; \
+ rsub a1, a1, a2; \
+ stw a1, (a0); \
+ bmaski a0, 0; \
+ rts
+# else
+# define SYSCALL_ERROR_HANDLER \
+__local_syscall_error: \
+ subi sp, 8; \
+ stw a0, (sp, 0); \
+ stw r15, (sp, 4); \
+ lrw a1, __errno_location; \
+ jsr a1; \
+ ldw a1, (sp, 0); /* load errno */ \
+ ldw r15, (sp, 4); \
+ addi sp, 8; \
+ movi a2, 0; \
+ rsub a1, a1, a2; \
+ stw a1, (a0); \
+ bmaski a0, 0; \
+ rts
+# endif /* __PIC__ */
+# endif/* RTLD_PRIVATE_ERROR */
+# else
+# define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */
+# define SYSCALL_ERROR __syscall_error
+# endif/* IS_IN (libc) */
+
+/* define DO_CALL */
+#ifdef __CSKYABIV2__
+#undef DO_CALL
+#define DO_CALL(syscall_name, args) \
+ DOARGS_##args; \
+ lrw r7, SYS_ify(syscall_name); \
+ trap 0; \
+ UNDOARGS_##args
+
+#undef DOARGS_0
+#define DOARGS_0 \
+ subi sp, 8; \
+ cfi_adjust_cfa_offset (8); \
+ stw r7, (sp, 0); \
+ cfi_rel_offset (r7, 0);
+
+#undef DOARGS_1
+#define DOARGS_1 DOARGS_0
+#undef DOARGS_2
+#define DOARGS_2 DOARGS_0
+#undef DOARGS_3
+#define DOARGS_3 DOARGS_0
+#undef DOARGS_4
+#define DOARGS_4 DOARGS_0
+#undef DOARGS_5
+#define DOARGS_5 \
+ subi sp, 8; \
+ cfi_adjust_cfa_offset (8); \
+ stw r7, (sp, 0); \
+ cfi_rel_offset (7, 0); \
+ stw r4, (sp, 4); \
+ cfi_rel_offset (4, 4); \
+ ldw r4, (sp, 8)
+#undef DOARGS_6
+#define DOARGS_6 \
+ subi sp, 16; \
+ cfi_adjust_cfa_offset (16); \
+ stw r7, (sp, 0); \
+ cfi_rel_offset (7, 0); \
+ stw r4, (sp, 4); \
+ cfi_rel_offset (4, 4); \
+ stw r5, (sp, 8); \
+ cfi_rel_offset (5, 8); \
+ ldw r4, (sp, 16); \
+ ldw r5, (sp, 20)
+
+#undef UNDOARGS_0
+#define UNDOARGS_0 \
+ ldw r7, (sp, 0); \
+ cfi_restore (r7); \
+ addi sp, 8; \
+ cfi_adjust_cfa_offset (-8);
+
+#undef UNDOARGS_1
+#define UNDOARGS_1 UNDOARGS_0
+#undef UNDOARGS_2
+#define UNDOARGS_2 UNDOARGS_0
+#undef UNDOARGS_3
+#define UNDOARGS_3 UNDOARGS_0
+#undef UNDOARGS_4
+#define UNDOARGS_4 UNDOARGS_0
+#undef UNDOARGS_5
+#define UNDOARGS_5 \
+ ldw r7, (sp, 0); \
+ cfi_restore (r4); \
+ ldw r4, (sp, 4); \
+ cfi_restore (r4); \
+ addi sp, 8; \
+ cfi_adjust_cfa_offset (-8);
+
+#undef UNDOARGS_6
+#define UNDOARGS_6 \
+ ldw r7, (sp, 0); \
+ cfi_restore (r7); \
+ ldw r4, (sp, 4); \
+ cfi_restore (r4); \
+ ldw r5, (sp, 8); \
+ cfi_restore (r5); \
+ addi sp, 16; \
+ cfi_adjust_cfa_offset (-16);
+
+#else /* __CSKYABIV1__ */
+
+#undef DO_CALL
+#define DO_CALL(syscall_name, args) \
+ lrw r1, SYS_ify(syscall_name); \
+ trap 0
+//#endif /* DO_CALL */
+#endif /* __CSKYABIV2__ */
+
+/* define DO_CALL_2, only ABIV2 need DO_CALL_2 */
+#ifdef __CSKYABIV2__
+
+#undef DO_CALL_2
+#define DO_CALL_2(syscall_name, args) \
+ DOARGS2_##args; \
+ lrw r7, SYS_ify(syscall_name); \
+ trap 0; \
+ UNDOARGS2_##args
+
+/*
+ * to be quite different with DO_CALL, DO_CALL_2 need not save r7.
+ */
+#undef DOARGS2_0
+#define DOARGS2_0
+
+#undef DOARGS2_1
+#define DOARGS2_1 DOARGS2_0
+#undef DOARGS2_2
+#define DOARGS2_2 DOARGS2_0
+#undef DOARGS2_3
+#define DOARGS2_3 DOARGS2_0
+#undef DOARGS2_4
+#define DOARGS2_4 DOARGS2_0
+#undef DOARGS2_5
+#define DOARGS2_5 \
+ subi sp, 8; \
+ cfi_adjust_cfa_offset (8); \
+ stw r4, (sp, 0); \
+ cfi_rel_offset (4, 0); \
+ ldw r4, (sp, 20)
+#undef DOARGS2_6
+#define DOARGS2_6 \
+ subi sp, 8; \
+ cfi_adjust_cfa_offset (8); \
+ stw r4, (sp, 0); \
+ cfi_rel_offset (4, 0); \
+ stw r5, (sp, 4); \
+ cfi_rel_offset (5, 0); \
+ ldw r4, (sp, 20); \
+ ldw r5, (sp, 24)
+
+#undef UNDOARGS2_0
+#define UNDOARGS2_0
+
+#undef UNDOARGS2_1
+#define UNDOARGS2_1 UNDOARGS2_0
+#undef UNDOARGS2_2
+#define UNDOARGS2_2 UNDOARGS2_0
+#undef UNDOARGS2_3
+#define UNDOARGS2_3 UNDOARGS2_0
+#undef UNDOARGS2_4
+#define UNDOARGS2_4 UNDOARGS2_0
+#undef UNDOARGS2_5
+#define UNDOARGS2_5 \
+ ldw r4, (sp, 0); \
+ addi sp, 8
+
+#undef UNDOARGS2_6
+#define UNDOARGS2_6 \
+ ldw r4, (sp, 0); \
+ ldw r5, (sp, 4); \
+ addi sp, 8
+
+#endif /* DO_CALL_2 */
+
+#else /* not __ASSEMBLER__ */
+
+
+/* Define a macro which expands into the inline wrapper code for a system
+ call. */
+#undef INLINE_SYSCALL
+#define INLINE_SYSCALL(name, nr, args...) \
+ ({ unsigned int _inline_sys_result = INTERNAL_SYSCALL (name, , nr, args); \
+ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (_inline_sys_result, ), 0)) \
+ { \
+ __set_errno (INTERNAL_SYSCALL_ERRNO (_inline_sys_result, )); \
+ _inline_sys_result = (unsigned int) -1; \
+ } \
+ (int) _inline_sys_result; })
+
+#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) >= 0xffffff01u)
+
+#undef INTERNAL_SYSCALL_ERRNO
+#define INTERNAL_SYSCALL_ERRNO(val, err) (-(val))
+
+
+#undef INTERNAL_SYSCALL_RAW
+#ifndef __CSKYABIV2__
+#define INTERNAL_SYSCALL_RAW0(name, err, dummy...) \
+ ({unsigned int __sys_result; \
+ { \
+ register int _a1 __asm__ ("a0"), _nr __asm__ ("r1"); \
+ _nr = name; \
+ __asm__ __volatile__ ("trap 0 \n\t" \
+ : "=r" (_a1) \
+ : "r" (_nr) \
+ : "memory"); \
+ __sys_result = _a1; \
+ } \
+ (int) __sys_result; })
+
+#define INTERNAL_SYSCALL_RAW1(name, err, arg1) \
+ ({unsigned int __sys_result; \
+ register int _tmp_arg1 = (int)(arg1); \
+ { \
+ register int _a1 __asm__ ("a0"), _nr __asm__ ("r1"); \
+ _a1 = _tmp_arg1; \
+ _nr = name; \
+ __asm__ __volatile__ ("trap 0 \n\t" \
+ : "=r" (_a1) \
+ : "r" (_nr), "r" (_a1) \
+ : "memory"); \
+ __sys_result = _a1; \
+ } \
+ (int) __sys_result; })
+
+#define INTERNAL_SYSCALL_RAW2(name, err, arg1, arg2) \
+ ({unsigned int __sys_result; \
+ register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
+ { \
+ register int _nr __asm__ ("r1"); \
+ register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
+ _a1 = _tmp_arg1, _a2 = _tmp_arg2; \
+ _nr = name; \
+ __asm__ __volatile__ ("trap 0 \n\t" \
+ : "=r" (_a1) \
+ : "r" (_nr), "r" (_a1), "r" (_a2) \
+ : "memory"); \
+ __sys_result = _a1; \
+ } \
+ (int) __sys_result; })
+
+#define INTERNAL_SYSCALL_RAW3(name, err, arg1, arg2, arg3) \
+ ({unsigned int __sys_result; \
+ register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
+ register int _tmp_arg3 = (int)(arg3); \
+ { \
+ register int _nr __asm__ ("r1"); \
+ register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
+ register int _a3 __asm__ ("a2"); \
+ _a1 = _tmp_arg1; \
+ _a2 = _tmp_arg2; \
+ _a3 = _tmp_arg3; \
+ _nr = name; \
+ __asm__ __volatile__ ("trap 0 \n\t" \
+ : "=r" (_a1) \
+ : "r" (_nr), "r" (_a1), "r" (_a2), \
+ "r" (_a3) \
+ : "memory"); \
+ __sys_result = _a1; \
+ } \
+ (int) __sys_result; })
+
+#define INTERNAL_SYSCALL_RAW4(name, err, arg1, arg2, arg3, arg4) \
+ ({unsigned int __sys_result; \
+ register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
+ register int _tmp_arg3 = (int)(arg3), _tmp_arg4 = (int)(arg4); \
+ { \
+ register int _nr __asm__ ("r1"); \
+ register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
+ register int _a3 __asm__ ("a2"), _a4 __asm__ ("a3"); \
+ _a1 = _tmp_arg1, _a2 = _tmp_arg2, _a3 = _tmp_arg3; \
+ _a4 = _tmp_arg4; \
+ _nr = name; \
+ __asm__ __volatile__ ("trap 0 \n\t" \
+ : "=r" (_a1) \
+ : "r" (_nr), "r" (_a1), "r" (_a2), \
+ "r" (_a3), "r" (_a4) \
+ : "memory"); \
+ __sys_result = _a1; \
+ } \
+ (int) __sys_result; })
+
+#define INTERNAL_SYSCALL_RAW5(name, err, arg1, arg2, arg3, arg4, \
+ arg5) \
+ ({unsigned int __sys_result; \
+ register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
+ register int _tmp_arg3 = (int)(arg3), _tmp_arg4 = (int)(arg4); \
+ register int _tmp_arg5 = (int)(arg5); \
+ { \
+ register int _nr __asm__ ("r1"); \
+ register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
+ register int _a3 __asm__ ("a2"), _a4 __asm__ ("a3"); \
+ register int _a5 __asm__ ("a4"); \
+ _a1 = _tmp_arg1, _a2 = _tmp_arg2, _a3 = _tmp_arg3; \
+ _a4 = _tmp_arg4, _a5 = _tmp_arg5; \
+ _nr = name; \
+ __asm__ __volatile__ ("trap 0 \n\t" \
+ : "=r" (_a1) \
+ : "r" (_nr), "r" (_a1), "r" (_a2), \
+ "r" (_a3), "r" (_a4), "r" (_a5) \
+ : "memory"); \
+ __sys_result = _a1; \
+ } \
+ (int) __sys_result; })
+
+#define INTERNAL_SYSCALL_RAW6(name, err, arg1, arg2, arg3, arg4, \
+ arg5, arg6) \
+ ({unsigned int __sys_result; \
+ register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
+ register int _tmp_arg3 = (int)(arg3), _tmp_arg4 = (int)(arg4); \
+ register int _tmp_arg5 = (int)(arg5), _tmp_arg6 = (int)(arg6); \
+ { \
+ register int _nr __asm__ ("r1"); \
+ register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
+ register int _a3 __asm__ ("a2"), _a4 __asm__ ("a3"); \
+ register int _a5 __asm__ ("a4"), _a6 __asm__ ("a5"); \
+ _a1 = _tmp_arg1, _a2 = _tmp_arg2, _a3 = _tmp_arg3; \
+ _a4 = _tmp_arg4, _a5 = _tmp_arg5, _a6 = _tmp_arg6; \
+ _nr = name; \
+ __asm__ __volatile__ ("trap 0 \n\t" \
+ : "=r" (_a1) \
+ : "r" (_nr), "r" (_a1), "r" (_a2), \
+ "r" (_a3), "r" (_a4), "r" (_a5), \
+ "r" (_a6) \
+ : "memory"); \
+ __sys_result = _a1; \
+ } \
+ (int) __sys_result; })
+
+#define INTERNAL_SYSCALL_RAW7(name, err, arg1, arg2, arg3, arg4, \
+ arg5, arg6, arg7) \
+ ({unsigned int __sys_result; \
+ register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
+ register int _tmp_arg3 = (int)(arg3), _tmp_arg4 = (int)(arg4); \
+ register int _tmp_arg5 = (int)(arg5), _tmp_arg6 = (int)(arg6); \
+ register int _tmp_arg7 = (int)(arg7); \
+ { \
+ register int _nr __asm__ ("r1"); \
+ register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
+ register int _a3 __asm__ ("a2"), _a4 __asm__ ("a3"); \
+ register int _a5 __asm__ ("a4"), _a6 __asm__ ("a5"); \
+ register int _a7 __asm__ ("r8"); \
+ _a1 = _tmp_arg1, _a2 = _tmp_arg2, _a3 = _tmp_arg3; \
+ _a4 = _tmp_arg4, _a5 = _tmp_arg5, _a6 = _tmp_arg6; \
+ _a7 = _tmp_arg7; \
+ _nr = name; \
+ __asm__ __volatile__ ("trap 0 \n\t" \
+ : "=r" (_a1) \
+ : "r" (_nr), "r" (_a1), "r" (_a2), \
+ "r" (_a3), "r" (_a4), "r" (_a5), \
+ "r" (_a6), "r" (_a7) \
+ : "memory"); \
+ __sys_result = _a1; \
+ } \
+ (int) __sys_result; })
+
+#else
+#define INTERNAL_SYSCALL_RAW0(name, err, dummy...) \
+ ({unsigned int __sys_result; \
+ { \
+ register int _a1 __asm__ ("a0"), _nr __asm__ ("r7"); \
+ _nr = name; \
+ __asm__ __volatile__ ("trap 0 \n\t" \
+ : "=r" (_a1) \
+ : "r" (_nr) \
+ : "memory"); \
+ __sys_result = _a1; \
+ } \
+ (int) __sys_result; })
+
+#define INTERNAL_SYSCALL_RAW1(name, err, arg1) \
+ ({unsigned int __sys_result; \
+ register int _tmp_arg1 = (int)(arg1); \
+ { \
+ register int _a1 __asm__ ("a0"), _nr __asm__ ("r7"); \
+ _a1 = _tmp_arg1; \
+ _nr = name; \
+ __asm__ __volatile__ ("trap 0 \n\t" \
+ : "=r" (_a1) \
+ : "r" (_nr), "r" (_a1) \
+ : "memory"); \
+ __sys_result = _a1; \
+ } \
+ (int) __sys_result; })
+
+#define INTERNAL_SYSCALL_RAW2(name, err, arg1, arg2) \
+ ({unsigned int __sys_result; \
+ register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
+ { \
+ register int _nr __asm__ ("r7"); \
+ register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
+ _a1 = _tmp_arg1, _a2 = _tmp_arg2; \
+ _nr = name; \
+ __asm__ __volatile__ ("trap 0 \n\t" \
+ : "=r" (_a1) \
+ : "r" (_nr), "r" (_a1), "r" (_a2) \
+ : "memory"); \
+ __sys_result = _a1; \
+ } \
+ (int) __sys_result; })
+
+#define INTERNAL_SYSCALL_RAW3(name, err, arg1, arg2, arg3) \
+ ({unsigned int __sys_result; \
+ register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
+ register int _tmp_arg3 = (int)(arg3); \
+ { \
+ register int _nr __asm__ ("r7"); \
+ register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
+ register int _a3 __asm__ ("a2"); \
+ _a1 = _tmp_arg1; \
+ _a2 = _tmp_arg2; \
+ _a3 = _tmp_arg3; \
+ _nr = name; \
+ __asm__ __volatile__ ("trap 0 \n\t" \
+ : "=r" (_a1) \
+ : "r" (_nr), "r" (_a1), "r" (_a2), \
+ "r" (_a3) \
+ : "memory"); \
+ __sys_result = _a1; \
+ } \
+ (int) __sys_result; })
+
+#define INTERNAL_SYSCALL_RAW4(name, err, arg1, arg2, arg3, arg4) \
+ ({unsigned int __sys_result; \
+ register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
+ register int _tmp_arg3 = (int)(arg3), _tmp_arg4 = (int)(arg4); \
+ { \
+ register int _nr __asm__ ("r7"); \
+ register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
+ register int _a3 __asm__ ("a2"), _a4 __asm__ ("a3"); \
+ _a1 = _tmp_arg1, _a2 = _tmp_arg2, _a3 = _tmp_arg3; \
+ _a4 = _tmp_arg4; \
+ _nr = name; \
+ __asm__ __volatile__ ("trap 0 \n\t" \
+ : "=r" (_a1) \
+ : "r" (_nr), "r" (_a1), "r" (_a2), \
+ "r" (_a3), "r" (_a4) \
+ : "memory"); \
+ __sys_result = _a1; \
+ } \
+ (int) __sys_result; })
+
+#define INTERNAL_SYSCALL_RAW5(name, err, arg1, arg2, arg3, arg4, \
+ arg5) \
+ ({unsigned int __sys_result; \
+ register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
+ register int _tmp_arg3 = (int)(arg3), _tmp_arg4 = (int)(arg4); \
+ register int _tmp_arg5 = (int)(arg5); \
+ { \
+ register int _nr __asm__ ("r7"); \
+ register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
+ register int _a3 __asm__ ("a2"), _a4 __asm__ ("a3"); \
+ register int _a5 __asm__ ("r4"); \
+ _a1 = _tmp_arg1, _a2 = _tmp_arg2, _a3 = _tmp_arg3; \
+ _a4 = _tmp_arg4, _a5 = _tmp_arg5; \
+ _nr = name; \
+ __asm__ __volatile__ ("trap 0 \n\t" \
+ : "=r" (_a1) \
+ : "r" (_nr), "r" (_a1), "r" (_a2), \
+ "r" (_a3), "r" (_a4), "r" (_a5) \
+ : "memory"); \
+ __sys_result = _a1; \
+ } \
+ (int) __sys_result; })
+
+#define INTERNAL_SYSCALL_RAW6(name, err, arg1, arg2, arg3, arg4, \
+ arg5, arg6) \
+ ({unsigned int __sys_result; \
+ register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
+ register int _tmp_arg3 = (int)(arg3), _tmp_arg4 = (int)(arg4); \
+ register int _tmp_arg5 = (int)(arg5), _tmp_arg6 = (int)(arg6); \
+ { \
+ register int _nr __asm__ ("r7"); \
+ register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
+ register int _a3 __asm__ ("a2"), _a4 __asm__ ("a3"); \
+ register int _a5 __asm__ ("r4"), _a6 __asm__ ("r5"); \
+ _a1 = _tmp_arg1, _a2 = _tmp_arg2, _a3 = _tmp_arg3; \
+ _a4 = _tmp_arg4, _a5 = _tmp_arg5, _a6 = _tmp_arg6; \
+ _nr = name; \
+ __asm__ __volatile__ ("trap 0 \n\t" \
+ : "=r" (_a1) \
+ : "r" (_nr), "r" (_a1), "r" (_a2), \
+ "r" (_a3), "r" (_a4), "r" (_a5), \
+ "r" (_a6) \
+ : "memory"); \
+ __sys_result = _a1; \
+ } \
+ (int) __sys_result; })
+
+#define INTERNAL_SYSCALL_RAW7(name, err, arg1, arg2, arg3, arg4, \
+ arg5, arg6, arg7) \
+ ({unsigned int __sys_result; \
+ register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
+ register int _tmp_arg3 = (int)(arg3), _tmp_arg4 = (int)(arg4); \
+ register int _tmp_arg5 = (int)(arg5), _tmp_arg6 = (int)(arg6); \
+ register int _tmp_arg7 = (int)(arg7); \
+ { \
+ register int _nr __asm__ ("r7"); \
+ register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
+ register int _a3 __asm__ ("a2"), _a4 __asm__ ("a3"); \
+ register int _a5 __asm__ ("r4"), _a6 __asm__ ("r5"); \
+ register int _a7 __asm__ ("r6"); \
+ _a1 = _tmp_arg1, _a2 = _tmp_arg2, _a3 = _tmp_arg3; \
+ _a4 = _tmp_arg4, _a5 = _tmp_arg5, _a6 = _tmp_arg6; \
+ _a7 = _tmp_arg7; \
+ _nr = name; \
+ __asm__ __volatile__ ("trap 0 \n\t" \
+ : "=r" (_a1) \
+ : "r" (_nr), "r" (_a1), "r" (_a2), \
+ "r" (_a3), "r" (_a4), "r" (_a5), \
+ "r" (_a6), "r" (_a7) \
+ : "memory"); \
+ __sys_result = _a1; \
+ } \
+ (int) __sys_result; })
+
+#endif /* __ABI_CSKY_V2__ */
+
+#undef INTERNAL_SYSCALL
+#define INTERNAL_SYSCALL(name, err, nr, args...) \
+ INTERNAL_SYSCALL_RAW##nr(SYS_ify(name), err, args)
+
+#undef INTERNAL_SYSCALL_NCS
+#define INTERNAL_SYSCALL_NCS(number, err, nr, args...) \
+ INTERNAL_SYSCALL_RAW##nr (number, err, args)
+
+#endif /* __ASSEMBLER__ */
+
+/* Pointer mangling is not yet supported for CSKY. */
+#define PTR_MANGLE(var) (void) (var)
+#define PTR_DEMANGLE(var) (void) (var)
+
+#endif /* linux/csky/sysdep.h */
diff --git a/sysdeps/unix/sysv/linux/csky/ucontext_i.sym b/sysdeps/unix/sysv/linux/csky/ucontext_i.sym
new file mode 100644
index 0000000..05fcf9d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/ucontext_i.sym
@@ -0,0 +1,31 @@
+#include <inttypes.h>
+#include <stddef.h>
+#include <sys/ucontext.h>
+
+SIG_BLOCK
+SIG_SETMASK
+
+-- Offsets of the fields in the ucontext_t structure.
+#define ucontext(member) offsetof (ucontext_t, member)
+#define mcontext(member) ucontext (uc_mcontext.member)
+
+UCONTEXT_FLAGS ucontext(uc_flags)
+UCONTEXT_LINK ucontext(uc_link)
+UCONTEXT_STACK ucontext(uc_stack)
+UCONTEXT_MCONTEXT ucontext(uc_mcontext)
+UCONTEXT_SIGMASK ucontext(uc_sigmask)
+
+MCONTEXT_CSKY_A0 mcontext(sc_a0)
+MCONTEXT_CSKY_R4 mcontext(sc_regs[0])
+MCONTEXT_CSKY_R8 mcontext(sc_regs[2])
+MCONTEXT_CSKY_SP mcontext(sc_usp)
+MCONTEXT_CSKY_LR mcontext(sc_r15)
+#ifdef __CSKYABIV2__
+MCONTEXT_CSKY_R16 mcontext(sc_exregs[0])
+MCONTEXT_CSKY_HI mcontext(sc_rhi)
+MCONTEXT_CSKY_LO mcontext(sc_rlo)
+#endif
+MCONTEXT_CSKY_PC mcontext(sc_pc)
+MCONTEXT_CSKY_FESR mcontext(sc_fesr)
+MCONTEXT_CSKY_FSR mcontext(sc_fsr)
+MCONTEXT_CSKY_FR0 mcontext(sc_fpregs[0])
--
2.7.4
^ permalink raw reply [flat|nested] 22+ messages in thread
* [RFC PATCH 02/10] C-SKY: TLS support
2018-03-16 9:59 [RFC PATCH 00/10] port C-SKY to glibc Mao Han
2018-03-16 9:59 ` [RFC PATCH 05/10] C-SKY: Linux Startup and Dynamic Loading Code Mao Han
@ 2018-03-16 9:59 ` Mao Han
2018-03-16 14:09 ` Carlos O'Donell
2018-03-16 9:59 ` [RFC PATCH 03/10] C-SKY: Generic math Routines Mao Han
` (8 subsequent siblings)
10 siblings, 1 reply; 22+ messages in thread
From: Mao Han @ 2018-03-16 9:59 UTC (permalink / raw)
To: libc-help; +Cc: han_mao, ren_guo, yunhai_shang, qijie_tong, chunqiang_li
This patch implements TLS support for C-SKY. We support all four
standard TLS addressing modes (LE, IE, LD, and GD) when running on
Linux via NPTL.
*sysdeps/csky/dl-tls.h: New file
*sysdeps/csky/libc-tls.c: New file
*sysdeps/csky/nptl/tcb-offsets.sym: New file
*sysdeps/csky/nptl/tls.h: New file
*sysdeps/csky/stackinfo.h: New file
Signed-off-by: Mao Han <han_mao@c-sky.com>
---
sysdeps/csky/dl-tls.h | 26 ++++++
sysdeps/csky/libc-tls.c | 32 ++++++++
sysdeps/csky/nptl/tcb-offsets.sym | 10 +++
sysdeps/csky/nptl/tls.h | 169 ++++++++++++++++++++++++++++++++++++++
sysdeps/csky/stackinfo.h | 32 ++++++++
5 files changed, 269 insertions(+)
create mode 100644 sysdeps/csky/dl-tls.h
create mode 100644 sysdeps/csky/libc-tls.c
create mode 100644 sysdeps/csky/nptl/tcb-offsets.sym
create mode 100644 sysdeps/csky/nptl/tls.h
create mode 100644 sysdeps/csky/stackinfo.h
diff --git a/sysdeps/csky/dl-tls.h b/sysdeps/csky/dl-tls.h
new file mode 100644
index 0000000..d44fc18
--- /dev/null
+++ b/sysdeps/csky/dl-tls.h
@@ -0,0 +1,26 @@
+/* Thread-local storage handling in the ELF dynamic linker. C-SKY 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/>. */
+
+/* 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/csky/libc-tls.c b/sysdeps/csky/libc-tls.c
new file mode 100644
index 0000000..30baf62
--- /dev/null
+++ b/sysdeps/csky/libc-tls.c
@@ -0,0 +1,32 @@
+/* Thread-local storage handling in the ELF dynamic linker. C-SKY 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 <csu/libc-tls.c>
+#include <dl-tls.h>
+
+/* On C-SKY, linker optimizations are not required, so __tls_get_addr
+ can be called even in statically linked binaries. In this case module
+ must be always 1 and PT_TLS segment exist in the binary, otherwise it
+ would not link. */
+
+void *
+__tls_get_addr (tls_index *ti)
+{
+ dtv_t *dtv = THREAD_DTV ();
+ return (char *) dtv[1].pointer.val + ti->ti_offset;
+}
diff --git a/sysdeps/csky/nptl/tcb-offsets.sym b/sysdeps/csky/nptl/tcb-offsets.sym
new file mode 100644
index 0000000..bf9c0a1
--- /dev/null
+++ b/sysdeps/csky/nptl/tcb-offsets.sym
@@ -0,0 +1,10 @@
+#include <sysdep.h>
+#include <tls.h>
+
+--
+
+-- Derive offsets relative to the thread register.
+#define thread_offsetof(mem) (long)(offsetof(struct pthread, mem) - sizeof(struct pthread))
+
+MULTIPLE_THREADS_OFFSET thread_offsetof (header.multiple_threads)
+TID_OFFSET thread_offsetof (tid)
diff --git a/sysdeps/csky/nptl/tls.h b/sysdeps/csky/nptl/tls.h
new file mode 100644
index 0000000..69fadad
--- /dev/null
+++ b/sysdeps/csky/nptl/tls.h
@@ -0,0 +1,169 @@
+/* Definitions for thread-local data handling. NPTL/csky 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/>. */
+
+#ifndef _TLS_H
+#define _TLS_H 1
+
+#ifndef __ASSEMBLER__
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <dl-dtv.h>
+
+#ifdef __CSKYABIV2__
+/* define r31 as thread pointer register. */
+#define READ_THREAD_POINTER() \
+ ({ void *__result; \
+ __asm__ __volatile__ ("mov %0, r31" \
+ : "=r" (__result)); \
+ __result; })
+#else
+#define READ_THREAD_POINTER() \
+ ({ register unsigned int __result __asm__("a0"); \
+ __asm__ __volatile__ ("trap 3;" \
+ : "=r" (__result) : : ); \
+ __result; })
+#endif
+
+#else /* __ASSEMBLER__ */
+#include <tcb-offsets.h>
+#ifdef __CSKYABIV2__
+/* define r31 as thread pointer register. */
+#define READ_THREAD_POINTER() \
+ mov r0, r31;
+#else
+#define READ_THREAD_POINTER() \
+ trap 3;
+#endif
+#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
+
+/* 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 sizeof (tcbhead_t)
+
+/* Alignment requirements for the initial TCB. */
+#define TLS_INIT_TCB_ALIGN 8
+
+/* This is the size of the TCB. */
+#define TLS_TCB_SIZE sizeof (tcbhead_t)
+
+/* Alignment requirements for the TCB. */
+#define TLS_TCB_ALIGN 8
+
+/* This is the size we need before TCB. */
+#define TLS_PRE_TCB_SIZE sizeof (struct pthread)
+
+/* 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))->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))->dtv)
+
+#define TLS_DEFINE_INIT_TP(tp, pd) void *tp = (pd) + 1
+
+/* Code to initially initialize the thread pointer. This might need
+ special attention since 'errno' is not yet available and if the
+ operation can cause a failure 'errno' must not be touched. */
+#define TLS_INIT_TP(tcbp) \
+ ({ INTERNAL_SYSCALL_DECL (err); \
+ long result_var; \
+ result_var = INTERNAL_SYSCALL (set_thread_area, err, 1, \
+ (char *) (tcbp) + TLS_TCB_OFFSET); \
+ INTERNAL_SYSCALL_ERROR_P (result_var, err) \
+ ? "unknown error" : NULL; })
+
+/* Return the address of the dtv for the current thread. */
+#define THREAD_DTV() \
+ (((tcbhead_t *) (READ_THREAD_POINTER () - TLS_TCB_OFFSET))->dtv)
+
+/* Return the thread descriptor for the current thread. */
+#undef THREAD_SELF
+#define THREAD_SELF \
+ ((struct pthread *) (READ_THREAD_POINTER () \
+ - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE))
+
+/* Magic for libthread_db to know how to do THREAD_SELF. */
+#define DB_THREAD_SELF \
+ CONST_THREAD_AREA (32, sizeof (struct pthread))
+
+/* Access to data in the thread descriptor is easy. */
+#define THREAD_GETMEM(descr, member) \
+ descr->member
+#define THREAD_GETMEM_NC(descr, member, idx) \
+ descr->member[idx]
+#define THREAD_SETMEM(descr, member, value) \
+ descr->member = (value)
+#define THREAD_SETMEM_NC(descr, member, idx, value) \
+ descr->member[idx] = (value)
+
+/* Get and set the global scope generation counter in struct pthread. */
+#define THREAD_GSCOPE_IN_TCB 1
+#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/csky/stackinfo.h b/sysdeps/csky/stackinfo.h
new file mode 100644
index 0000000..7b5eb65
--- /dev/null
+++ b/sysdeps/csky/stackinfo.h
@@ -0,0 +1,32 @@
+/* This file contains a bit of information about the stack allocation
+ of the processor. C-SKY 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/>. */
+
+#ifndef _STACKINFO_H
+#define _STACKINFO_H 1
+
+#include <elf.h>
+
+/* On C-SKY the stack grows down. */
+#define _STACK_GROWS_DOWN 1
+
+/* Default to an executable stack. PF_X can be overridden if PT_GNU_STACK is
+ * present, but it is presumed absent. */
+#define DEFAULT_STACK_PERMS (PF_R|PF_W|PF_X)
+
+#endif /* stackinfo.h */
--
2.7.4
^ permalink raw reply [flat|nested] 22+ messages in thread
* [RFC PATCH 01/10] C-SKY: ABI related code
2018-03-16 9:59 [RFC PATCH 00/10] port C-SKY to glibc Mao Han
` (3 preceding siblings ...)
2018-03-16 9:59 ` [RFC PATCH 08/10] C-SKY: ABI Lists Mao Han
@ 2018-03-16 9:59 ` Mao Han
2018-03-16 14:04 ` Carlos O'Donell
2018-03-16 9:59 ` [RFC PATCH 04/10] C-SKY: Hard Float Support Mao Han
` (5 subsequent siblings)
10 siblings, 1 reply; 22+ messages in thread
From: Mao Han @ 2018-03-16 9:59 UTC (permalink / raw)
To: libc-help; +Cc: han_mao, ren_guo, yunhai_shang, qijie_tong, chunqiang_li
Codes in this patch contains lots of C-SKY ABI related code. They are written
accroding to the registers assgnments, relocations, assemblly described
in C-SKY CPU ABI Standards and C-SKY CPU manual.
This does not contain any linux related code.
*sysdeps/csky/__longjmp.S: New file
*sysdeps/csky/backtrace.c: New file
*sysdeps/csky/bits/endian.h: New file
*sysdeps/csky/bits/setjmp.h: New file
*sysdeps/csky/bsd-_setjmp.S: New file
*sysdeps/csky/bsd-setjmp.S: New file
*sysdeps/csky/dl-trampoline.S: New file
*sysdeps/csky/gccframe.h: New file
*sysdeps/csky/jmpbuf-unwind.h: New file
*sysdeps/csky/setjmp.S: New file
*sysdeps/csky/tls-macros.h: New file
*sysdeps/csky/crti.S: New file
*sysdeps/csky/crtn.S: New file
*sysdeps/csky/csky-mcount.S: New file
*sysdeps/csky/abort-instr.h: New file
*sysdeps/unix/csky/abiv2_sysdep.S: New file
*sysdeps/unix/csky/sysdep.S: New file
*sysdeps/unix/csky/sysdep.h: New file
*sysdeps/csky/start.S: New file
*sysdeps/csky/strcmp.S: New file
*sysdeps/csky/strcpy.S: New file
*sysdeps/csky/memcpy.S: New file
*sysdeps/csky/macro.S: New file
*sysdeps/csky/memusage.h: New file
*sysdeps/csky/machine-gmon.h: New file
*sysdeps/csky/bits/link.h: New file
*sysdeps/csky/sys/ucontext.h: New file
*sysdeps/csky/sysdep.h: New file
Signed-off-by: Mao Han <han_mao@c-sky.com>
---
sysdeps/csky/__longjmp.S | 67 +++++++
sysdeps/csky/abort-instr.h | 2 +
sysdeps/csky/backtrace.c | 128 +++++++++++++
sysdeps/csky/bits/endian.h | 10 +
sysdeps/csky/bits/link.h | 54 ++++++
sysdeps/csky/bits/setjmp.h | 32 ++++
sysdeps/csky/bsd-_setjmp.S | 1 +
sysdeps/csky/bsd-setjmp.S | 1 +
sysdeps/csky/crti.S | 113 +++++++++++
sysdeps/csky/crtn.S | 51 +++++
sysdeps/csky/csky-mcount.S | 87 +++++++++
sysdeps/csky/dl-trampoline.S | 110 +++++++++++
sysdeps/csky/gccframe.h | 21 ++
sysdeps/csky/jmpbuf-unwind.h | 47 +++++
sysdeps/csky/machine-gmon.h | 32 ++++
sysdeps/csky/macro.S | 31 +++
sysdeps/csky/memcpy.S | 400 +++++++++++++++++++++++++++++++++++++++
sysdeps/csky/memusage.h | 20 ++
sysdeps/csky/setjmp.S | 95 ++++++++++
sysdeps/csky/start.S | 133 +++++++++++++
sysdeps/csky/strcmp.S | 337 +++++++++++++++++++++++++++++++++
sysdeps/csky/strcpy.S | 273 ++++++++++++++++++++++++++
sysdeps/csky/sys/ucontext.h | 116 ++++++++++++
sysdeps/csky/sysdep.h | 46 +++++
sysdeps/csky/tls-macros.h | 106 +++++++++++
sysdeps/unix/csky/abiv2_sysdep.S | 73 +++++++
sysdeps/unix/csky/sysdep.S | 84 ++++++++
sysdeps/unix/csky/sysdep.h | 26 +++
28 files changed, 2496 insertions(+)
create mode 100644 sysdeps/csky/__longjmp.S
create mode 100644 sysdeps/csky/abort-instr.h
create mode 100644 sysdeps/csky/backtrace.c
create mode 100644 sysdeps/csky/bits/endian.h
create mode 100644 sysdeps/csky/bits/link.h
create mode 100644 sysdeps/csky/bits/setjmp.h
create mode 100644 sysdeps/csky/bsd-_setjmp.S
create mode 100644 sysdeps/csky/bsd-setjmp.S
create mode 100644 sysdeps/csky/crti.S
create mode 100644 sysdeps/csky/crtn.S
create mode 100644 sysdeps/csky/csky-mcount.S
create mode 100644 sysdeps/csky/dl-trampoline.S
create mode 100644 sysdeps/csky/gccframe.h
create mode 100644 sysdeps/csky/jmpbuf-unwind.h
create mode 100644 sysdeps/csky/machine-gmon.h
create mode 100644 sysdeps/csky/macro.S
create mode 100644 sysdeps/csky/memcpy.S
create mode 100644 sysdeps/csky/memusage.h
create mode 100644 sysdeps/csky/setjmp.S
create mode 100644 sysdeps/csky/start.S
create mode 100644 sysdeps/csky/strcmp.S
create mode 100644 sysdeps/csky/strcpy.S
create mode 100644 sysdeps/csky/sys/ucontext.h
create mode 100644 sysdeps/csky/sysdep.h
create mode 100644 sysdeps/csky/tls-macros.h
create mode 100644 sysdeps/unix/csky/abiv2_sysdep.S
create mode 100644 sysdeps/unix/csky/sysdep.S
create mode 100644 sysdeps/unix/csky/sysdep.h
diff --git a/sysdeps/csky/__longjmp.S b/sysdeps/csky/__longjmp.S
new file mode 100644
index 0000000..9823fce
--- /dev/null
+++ b/sysdeps/csky/__longjmp.S
@@ -0,0 +1,67 @@
+/* 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 <sysdep.h>
+
+ENTRY(__longjmp)
+ mov a2, a0
+ mov a0, a1 /* get the return value in place */
+ cmpnei a0, 0
+ bt have_return
+ movi a0, 1 /* can't let setjmp() return zero! */
+have_return:
+#ifdef CHECK_SP
+ ldw r10, (a2, 0) /* jmpbuf's sp */
+ CHECK_SP(r10)
+#endif
+#ifdef __CSKYABIV2__
+ ldw sp, (a2, 0)
+ ldw lr, (a2, 4)
+ ldw r4, (a2, 8)
+ ldw r5, (a2, 12)
+ ldw r6, (a2, 16)
+ ldw r7, (a2, 20)
+ ldw r8, (a2, 24)
+ ldw r9, (a2, 28)
+ ldw r10, (a2, 32)
+ ldw r11, (a2, 36)
+ ldw r16, (a2, 40)
+ ldw r17, (a2, 44)
+ ldw r26, (a2, 48)
+ ldw r27, (a2, 52)
+ ldw r28, (a2, 56)
+ ldw r29, (a2, 60)
+ ldw r30, (a2, 64)
+ ldw r31, (a2, 68)
+ addi a2, 72
+#else
+ ldw sp, (a2, 0)
+ ldw lr, (a2, 4)
+ ldw r8, (a2, 8)
+ ldw r9, (a2, 12)
+ ldw r10, (a2, 16)
+ ldw r11, (a2, 20)
+ ldw r12, (a2, 24)
+ ldw r13, (a2, 28)
+ ldw r14, (a2, 32)
+ addi a2, 32
+ addi a2, 4
+#endif
+
+ jmp lr
+
+END(__longjmp)
diff --git a/sysdeps/csky/abort-instr.h b/sysdeps/csky/abort-instr.h
new file mode 100644
index 0000000..27a3536
--- /dev/null
+++ b/sysdeps/csky/abort-instr.h
@@ -0,0 +1,2 @@
+/* An instruction which should crash any program is a breakpoint. */
+#define ABORT_INSTRUCTION asm ("bkpt")
diff --git a/sysdeps/csky/backtrace.c b/sysdeps/csky/backtrace.c
new file mode 100644
index 0000000..9a6f36c
--- /dev/null
+++ b/sysdeps/csky/backtrace.c
@@ -0,0 +1,128 @@
+/* Return backtrace of current program state.
+ 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 <libc-lock.h>
+#include <dlfcn.h>
+#include <execinfo.h>
+#include <stdlib.h>
+#include <unwind.h>
+
+struct trace_arg
+{
+ void **array;
+ _Unwind_Word cfa;
+ int cnt;
+ int size;
+};
+
+#ifdef SHARED
+static _Unwind_Reason_Code (*unwind_backtrace) (_Unwind_Trace_Fn, void *);
+static _Unwind_Ptr (*unwind_getip) (struct _Unwind_Context *);
+static _Unwind_Word (*unwind_getcfa) (struct _Unwind_Context *);
+static void *libgcc_handle;
+
+/* Dummy version in case libgcc_s does not contain the real code. */
+static _Unwind_Word
+dummy_getcfa (struct _Unwind_Context *ctx __attribute__ ((unused)))
+{
+ return 0;
+}
+
+
+static void
+init (void)
+{
+ libgcc_handle = __libc_dlopen ("libgcc_s.so.1");
+
+ if (libgcc_handle == NULL)
+ return;
+
+ unwind_backtrace = __libc_dlsym (libgcc_handle, "_Unwind_Backtrace");
+ unwind_getip = __libc_dlsym (libgcc_handle, "_Unwind_GetIP");
+ if (unwind_getip == NULL)
+ unwind_backtrace = NULL;
+ unwind_getcfa = (__libc_dlsym (libgcc_handle, "_Unwind_GetCFA")
+ ?: dummy_getcfa);
+}
+#else
+# define unwind_backtrace _Unwind_Backtrace
+# define unwind_getip _Unwind_GetIP
+# define unwind_getcfa _Unwind_GetCFA
+#endif
+
+static _Unwind_Reason_Code
+backtrace_helper (struct _Unwind_Context *ctx, void *a)
+{
+ struct trace_arg *arg = a;
+
+ /* We are first called with address in the __backtrace function.
+ Skip it. */
+ if (arg->cnt != -1)
+ {
+ arg->array[arg->cnt] = (void *) unwind_getip (ctx);
+
+ /* Check whether we make any progress. */
+ _Unwind_Word cfa = unwind_getcfa (ctx);
+
+ if (arg->cnt > 0 && arg->array[arg->cnt - 1] == arg->array[arg->cnt]
+ && cfa == arg->cfa)
+ return _URC_END_OF_STACK;
+ arg->cfa = cfa;
+ }
+ if (++arg->cnt == arg->size)
+ return _URC_END_OF_STACK;
+ return _URC_NO_REASON;
+}
+
+int
+__backtrace (void **array, int size)
+{
+ struct trace_arg arg = { .array = array, .cfa = 0, .size = size, .cnt = -1 };
+#ifdef SHARED
+ __libc_once_define (static, once);
+
+ __libc_once (once, init);
+ if (unwind_backtrace == NULL)
+ return 0;
+#endif
+
+ if (size >= 1)
+ unwind_backtrace (backtrace_helper, &arg);
+
+ /* _Unwind_Backtrace seems to put NULL address above
+ _start. Fix it up here. */
+ if (arg.cnt > 1 && arg.array[arg.cnt - 1] == NULL)
+ --arg.cnt;
+ return arg.cnt != -1 ? arg.cnt : 0;
+}
+weak_alias (__backtrace, backtrace)
+libc_hidden_def (__backtrace)
+
+
+#ifdef SHARED
+/* Free all resources if necessary. */
+libc_freeres_fn (free_mem)
+{
+ unwind_backtrace = NULL;
+ if (libgcc_handle != NULL)
+ {
+ __libc_dlclose (libgcc_handle);
+ libgcc_handle = NULL;
+ }
+}
+#endif
diff --git a/sysdeps/csky/bits/endian.h b/sysdeps/csky/bits/endian.h
new file mode 100644
index 0000000..cc66abb
--- /dev/null
+++ b/sysdeps/csky/bits/endian.h
@@ -0,0 +1,10 @@
+#ifndef _ENDIAN_H
+# error "Never use <bits/endian.h> directly; include <endian.h> instead."
+#endif
+
+/* CSKY can be either big or little endian. */
+#ifdef __CSKYBE__
+# define __BYTE_ORDER __BIG_ENDIAN
+#else
+# define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
diff --git a/sysdeps/csky/bits/link.h b/sysdeps/csky/bits/link.h
new file mode 100644
index 0000000..87121ca
--- /dev/null
+++ b/sysdeps/csky/bits/link.h
@@ -0,0 +1,54 @@
+/* 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/>. */
+
+#ifndef _LINK_H
+# error "Never include <bits/link.h> directly; use <link.h> instead."
+#endif
+
+/* Registers for entry into PLT on CSKY. */
+typedef struct La_csky_regs
+ {
+ uint32_t lr_reg[4];
+ uint32_t lr_sp;
+ uint32_t lr_lr;
+ } La_csky_regs;
+
+/* Return values for calls from PLT on CSKY. */
+typedef struct La_csky_retval
+ {
+ /* Up to four integer registers can be used for a return value. */
+ uint32_t lrv_reg[4];
+ uint32_t lrv_v0;
+ } La_csky_retval;
+
+__BEGIN_DECLS
+
+extern Elf32_Addr la_csky_gnu_pltenter (Elf32_Sym *__sym, unsigned int __ndx,
+ uintptr_t *__refcook,
+ uintptr_t *__defcook,
+ La_csky_regs *__regs,
+ unsigned int *__flags,
+ const char *__symname,
+ long int *__framesizep);
+extern unsigned int la_csky_gnu_pltexit (Elf32_Sym *__sym, unsigned int __ndx,
+ uintptr_t *__refcook,
+ uintptr_t *__defcook,
+ const La_csky_regs *__inregs,
+ La_csky_retval *__outregs,
+ const char *__symname);
+
+__END_DECLS
diff --git a/sysdeps/csky/bits/setjmp.h b/sysdeps/csky/bits/setjmp.h
new file mode 100644
index 0000000..b3edd38
--- /dev/null
+++ b/sysdeps/csky/bits/setjmp.h
@@ -0,0 +1,32 @@
+/* Define the machine-dependent type `jmp_buf'. C-SKY 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/>. */
+
+#ifndef _CSKY_BITS_SETJMP_H
+#define _CSKY_BITS_SETJMP_H 1
+
+typedef struct __jmp_buf_str
+ {
+ /* Stack pointer. */
+ int __sp;
+ int __lr;
+ /* Callee-saved registers:
+ r4 ~ r11, r16 ~ r17, r26 ~r31 for abiv2; r8 ~ r14 for abiv1. */
+ int __regs[16];
+ } __jmp_buf[1];
+
+#endif
diff --git a/sysdeps/csky/bsd-_setjmp.S b/sysdeps/csky/bsd-_setjmp.S
new file mode 100644
index 0000000..4e6a2da
--- /dev/null
+++ b/sysdeps/csky/bsd-_setjmp.S
@@ -0,0 +1 @@
+/* _setjmp is in setjmp.S */
diff --git a/sysdeps/csky/bsd-setjmp.S b/sysdeps/csky/bsd-setjmp.S
new file mode 100644
index 0000000..1da848d
--- /dev/null
+++ b/sysdeps/csky/bsd-setjmp.S
@@ -0,0 +1 @@
+/* setjmp is in setjmp.S */
diff --git a/sysdeps/csky/crti.S b/sysdeps/csky/crti.S
new file mode 100644
index 0000000..60fa3a7
--- /dev/null
+++ b/sysdeps/csky/crti.S
@@ -0,0 +1,113 @@
+/* Special .init and .fini section support for C-SKY.
+ 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.
+
+ 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
+
+#if PREINIT_FUNCTION_WEAK
+ .align 4
+ .type call_weak_fn, %function
+call_weak_fn:
+ subi sp, 4
+ stw lr, (sp)
+ lrw a2, PREINIT_FUNCTION@GOT
+ addu a2, gb
+ ldw a2, (a2)
+ cmpnei a2, 0
+ bf 1f
+ jsr a2
+1:
+ ldw lr, (sp)
+ addi sp, 4
+ rts
+#endif /* PREINIT_FUNCTION_WEAK */
+
+ .section .init,"ax",@progbits
+ .align 4
+ .globl _init
+ .type _init, @function
+_init:
+ subi sp, 8
+ stw lr, (sp, 0)
+ stw gb, (sp, 4)
+ bsr .Lgetpc
+.Lgetpc:
+ lrw gb, .Lgetpc@GOTPC
+ add gb, lr
+#if PREINIT_FUNCTION_WEAK
+ lrw a2, call_weak_fn@GOTOFF
+ add a2, gb
+ jsr a2
+#else
+ lrw a2, PREINIT_FUNCTION@PLT
+ addu a2, gb
+ ldw a2, (a2)
+ jsr a2
+#endif /* PREINIT_FUNCTION_WEAK */
+ br 2f
+ .literals
+ .align 4
+2:
+
+ .section .fini,"ax",@progbits
+ .align 4
+ .globl _fini
+ .type _fini, @function
+_fini:
+ subi sp,8
+ stw lr, (sp, 0)
+ br 2f
+ .literals
+ .align 4
+2:
diff --git a/sysdeps/csky/crtn.S b/sysdeps/csky/crtn.S
new file mode 100644
index 0000000..a5392d9
--- /dev/null
+++ b/sysdeps/csky/crtn.S
@@ -0,0 +1,51 @@
+/* Special .init and .fini section support for C-SKY.
+ 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.
+
+ 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/>. */
+
+#include <sysdep.h>
+
+/* crtn.S puts function epilogues in the .init and .fini sections
+ corresponding to the prologues in crti.S. */
+
+ .section .init,"ax",@progbits
+ ldw lr, (sp, 0)
+ ldw gb, (sp, 4)
+ addi sp, 8
+ rts
+
+ .section .fini,"ax",@progbits
+ ldw lr, (sp, 0)
+ addi sp,8
+ rts
+
diff --git a/sysdeps/csky/csky-mcount.S b/sysdeps/csky/csky-mcount.S
new file mode 100644
index 0000000..77934f5
--- /dev/null
+++ b/sysdeps/csky/csky-mcount.S
@@ -0,0 +1,87 @@
+/* Implementation of profiling support. C-SKY 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/>. */
+
+/* Don't call mcount when calling mcount... */
+#undef PROF
+
+#include <sysdep.h>
+
+/* Use an assembly stub with a special ABI. The calling lr has been
+ pushed to the stack (which will be misaligned). We should preserve
+ all registers except ip and pop a word off the stack.
+
+ NOTE: This assumes mcount_internal does not clobber any non-core
+ (coprocessor) registers. Currently this is true, but may require
+ additional attention in the future.
+
+ The calling sequence looks something like:
+func:
+ push lr
+ jbsr __gnu_mount_nc
+ <function body>
+*/
+
+ENTRY(_mcount)
+#ifdef __CSKYABIV2__
+ subi sp,20
+ stw a0,(sp, 0)
+ stw a1,(sp, 4)
+ stw a2,(sp, 8)
+ stw a3,(sp, 12)
+ stw lr,(sp, 16)
+ mov a1, lr
+ ldw a0, (sp, 20)
+ jbsr __mcount_internal
+ ldw a0,(sp, 0)
+ ldw a1,(sp, 4)
+ ldw a2,(sp, 8)
+ ldw a3,(sp, 12)
+ ldw t1,(sp, 16)
+ ldw lr,(sp, 20)
+ addi sp,24
+ jmp t1
+#else
+ subi sp,28
+ stw a0,(sp, 0)
+ stw a1,(sp, 4)
+ stw a2,(sp, 8)
+ stw a3,(sp, 12)
+ stw a4,(sp, 16)
+ stw a5,(sp, 20)
+ stw lr,(sp, 24)
+ mov a1, lr
+ ldw a0, (sp, 28)
+ jbsr __mcount_internal
+ ldw a0,(sp, 0)
+ ldw a1,(sp, 4)
+ ldw a2,(sp, 8)
+ ldw a3,(sp, 12)
+ ldw a4,(sp, 16)
+ ldw a5,(sp, 20)
+ ldw r1,(sp, 24)
+ ldw lr,(sp, 28)
+ addi sp,32
+ jmp r1
+#endif
+
+END(_mcount)
+
+/* The canonical name for the function is `_mcount' in both C and asm,
+ but some old asm code might assume it's `mcount'. */
+#undef mcount
+weak_alias (_mcount, mcount)
diff --git a/sysdeps/csky/dl-trampoline.S b/sysdeps/csky/dl-trampoline.S
new file mode 100644
index 0000000..a9eefb3
--- /dev/null
+++ b/sysdeps/csky/dl-trampoline.S
@@ -0,0 +1,110 @@
+/* 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/>. */
+
+/* This function is not called directly. It is jumped when attempting to use a
+ symbol that has not yet been resolved.
+
+ .plt*:
+ subi r0, 32
+ stw r2, (r0, 0)
+ stw r3, (r0, 4)
+ lrw r3, #offset
+ ldw r2, (gb, 8)
+ jmp r2
+ */
+
+.import _dl_fixup
+
+.text
+.globl _dl_runtime_resolve
+.type _dl_runtime_resolve,@function
+
+_dl_runtime_resolve:
+#if !defined(__CSKYABIV2__)
+# if !defined(__ck810__)
+ stw r4, (r0, 8)
+ stw r5, (r0, 12)
+ stw r6, (r0, 16)
+ stw r7, (r0, 20)
+ stw r15,(r0, 24)
+ # load the ID of this module
+ ldw r2, (gb, 4)
+ mov r6, r3
+ addu r6, r6
+ addu r3, r6
+ lsli r3, 2
+ # r2 = id, r3 = offset(do it in plt*)
+# ifdef __PIC__
+ # get global offset table address_
+ bsr .L2
+.L2:
+ lrw r7, .L2@GOTPC
+ add r7, r15
+ # get the address of function (_dl_fixup) in got table
+ lrw r6, _dl_fixup@GOT
+ add r6, r7
+ ldw r5, (r6, 0)
+ jsr r5
+# else
+ jsri _dl_fixup
+# endif /* !__PIC__ */
+ # Return from _dl_fixup, the address of function is in r2
+ mov r1, r2
+ # Restore the registers
+ ldw r2, (r0, 0)
+ ldw r3, (r0, 4)
+ ldw r4, (r0, 8)
+ ldw r5, (r0, 12)
+ ldw r6, (r0, 16)
+ ldw r7, (r0, 20)
+ ldw r15,(r0, 24)
+ # Restore the r0, because r0 is subtracted in PLT table
+ addi r0, 32
+ # The address of function is in r1, call the function without saving pc
+ jmp r1
+# else /* __ck810__ */
+ subi sp, 32
+ stm r2-r7, (sp)
+ stw r15, (sp, 24)
+ ldw r2, (gb, 4)
+ mov r6, r3
+ addu r6, r6
+ addu r3, r6
+ lsli r3, 2
+ mov r3, r21
+ bsr _dl_fixup
+ mov r20, r2
+ ldw r15, (sp, 24)
+ ldm r2-r7, (sp)
+ addi sp, 32
+ jmp r20
+# endif /* __ck810__ */
+#else /* __CSKYABIV2__ */
+ subi sp, 20
+ stm a0-a3, (sp)
+ stw lr, (sp, 16)
+ # a0 = id, a1 = offset(do it in plt*)
+ ldw a0, (gb, 4)
+ movi a1, 12
+ mult a1, t1
+ bsr _dl_fixup
+ mov t0, a0
+ ldw lr, (sp, 16)
+ ldm a0-a3, (sp)
+ addi sp, 20
+ jmp t0
+#endif /* __CSKYABIV2__ */
diff --git a/sysdeps/csky/gccframe.h b/sysdeps/csky/gccframe.h
new file mode 100644
index 0000000..9451101
--- /dev/null
+++ b/sysdeps/csky/gccframe.h
@@ -0,0 +1,21 @@
+/* Definition of object in frame unwind info. C-SKY 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 FIRST_PSEUDO_REGISTER 71
+
+#include <sysdeps/generic/gccframe.h>
diff --git a/sysdeps/csky/jmpbuf-unwind.h b/sysdeps/csky/jmpbuf-unwind.h
new file mode 100644
index 0000000..30b92d0
--- /dev/null
+++ b/sysdeps/csky/jmpbuf-unwind.h
@@ -0,0 +1,47 @@
+/* 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 <setjmp.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) < (void *) demangle ((jmpbuf)[0].__sp))
+
+#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
+ _JMPBUF_UNWINDS_ADJ (_jmpbuf, \
+ (void *) (_Unwind_Ptr) _Unwind_GetCFA (_context), \
+ _adj)
+
+static inline uintptr_t __attribute__ ((unused))
+_jmpbuf_sp (__jmp_buf regs)
+{
+ uintptr_t sp = (uintptr_t) regs[0].__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/csky/machine-gmon.h b/sysdeps/csky/machine-gmon.h
new file mode 100644
index 0000000..96c100e
--- /dev/null
+++ b/sysdeps/csky/machine-gmon.h
@@ -0,0 +1,32 @@
+/* Machine-dependent definitions for profiling support. CSKY 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 <sysdep.h>
+
+/* GCC for the CSKY cannot compile __builtin_return_address(N) for N != 0,
+ so we must use an assembly stub. */
+
+/* We must not pollute the global namespace. */
+#define mcount_internal __mcount_internal
+
+extern void mcount_internal (u_long frompc, u_long selfpc);
+#define _MCOUNT_DECL(frompc, selfpc) \
+ void mcount_internal (u_long frompc, u_long selfpc)
+
+/* Define MCOUNT as empty since we have the implementation in another file. */
+#define MCOUNT
diff --git a/sysdeps/csky/macro.S b/sysdeps/csky/macro.S
new file mode 100644
index 0000000..436d061
--- /dev/null
+++ b/sysdeps/csky/macro.S
@@ -0,0 +1,31 @@
+/* Macro defiation for string/mem operations on different cpu types
+ 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/>. */
+
+.macro M_BEZ rx, label
+ bez \rx, \label
+.endm
+
+.macro M_BNEZ rx, label
+ bnez \rx, \label
+.endm
+
+.macro M_BNE rx, ry, label
+ cmpne \rx, \ry
+ bt \label
+.endm
+
diff --git a/sysdeps/csky/memcpy.S b/sysdeps/csky/memcpy.S
new file mode 100644
index 0000000..e4a34e8
--- /dev/null
+++ b/sysdeps/csky/memcpy.S
@@ -0,0 +1,400 @@
+/* The assembly function for memcpy. C-SKY 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 <sysdep.h>
+
+.macro GET_FRONT_BITS rx ry
+#ifdef __cskyLE__
+ lsr \rx, \ry
+#else
+ lsl \rx, \ry
+#endif
+.endm
+
+.macro GET_AFTER_BITS rx ry
+#ifdef __cskyLE__
+ lsl \rx, \ry
+#else
+ lsr \rx, \ry
+#endif
+.endm
+
+ENTRY(memcpy)
+#ifndef __CSKYABIV2__
+ /* If len less than 4 bytes */
+ mov r7, r2
+ cmplti r4, 4
+ jbt .L_copy_by_byte
+
+ /* If dest is not 4 bytes aligned */
+ mov r6, r2
+ andi r6, 3
+ cmpnei r6, 0
+ jbt .L_dest_not_aligned
+ .L0:
+ mov r6, r3
+ andi r6, 3
+ cmpnei r6, 0
+ /* If dest is aligned, but src is not aligned */
+ jbt .L_dest_aligned_but_src_not_aligned
+
+ /* If dest and src are all aligned and len less than 16 bytes */
+ cmplti r4, 16
+ jbt .L_aligned_and_len_less_16bytes
+
+ /* src and dst are all aligned, and len > 16 bytes */
+ subi sp, 8
+ stw r8, (sp, 0)
+ stw r9, (sp, 4)
+.L_aligned_and_len_larger_16bytes:
+ ldw r1, (r3, 0)
+ ldw r5, (r3, 4)
+ ldw r8, (r3, 8)
+ ldw r9, (r3, 12)
+ stw r1, (r7, 0)
+ stw r5, (r7, 4)
+ stw r8, (r7, 8)
+ stw r9, (r7, 12)
+ subi r4, 16
+ addi r3, 16
+ addi r7, 16
+ cmplti r4, 16
+ jbf .L_aligned_and_len_larger_16bytes
+ ldw r8, (sp, 0)
+ ldw r9, (sp, 4)
+ addi sp, 8
+
+.L_aligned_and_len_less_16bytes:
+ cmplti r4, 4
+ jbt .L_copy_by_byte
+ ldw r1, (r3, 0)
+ stw r1, (r7, 0)
+ subi r4, 4
+ addi r3, 4
+ addi r7, 4
+ jbr .L_aligned_and_len_less_16bytes
+
+ /* len less than 4 bytes */
+.L_copy_by_byte:
+ cmpnei r4, 0
+ jbf .L_return
+ ldb r1, (r3, 0)
+ stb r1, (r7, 0)
+ subi r4, 1
+ addi r3, 1
+ addi r7, 1
+ jbr .L_copy_by_byte
+
+.L_return:
+ rts
+
+ /* If dest is not aligned, we copy some bytes to make dest align.
+ Then we should judge whether src is aligned. */
+
+ /* consider overlapped case */
+.L_dest_not_aligned:
+ mov r5, r3
+ rsub r5, r5, r7
+ abs r5, r5
+ cmplt r5, r4
+ jbt .L_copy_by_byte
+
+ /* Makes the dest align. */
+.L1:
+ ldb r1, (r3, 0)
+ stb r1, (r7, 0)
+ addi r6, 1
+ subi r4, 1
+ addi r3, 1
+ addi r7, 1
+ cmpnei r6, 4
+ jbt .L1
+ cmplti r4, 4
+ jbt .L_copy_by_byte
+ /* Judge whether the src is aligned. */
+ jbf .L0
+
+ /* consider overlapped case */
+.L_dest_aligned_but_src_not_aligned:
+ mov r5, r3
+ rsub r5, r5, r7
+ abs r5, r5
+ cmplt r5, r4
+ jbt .L_copy_by_byte
+
+ bclri r3, 0
+ bclri r3, 1
+ ldw r1, (r3, 0)
+ addi r3, 4
+
+ subi sp, 16
+ stw r11, (sp,0)
+ stw r12, (sp,4)
+ stw r13, (sp,8)
+ movi r5, 8
+ /* r6 is used to store tne misaligned bits */
+ mult r5, r6
+ mov r12, r5
+ rsubi r5, 31
+ addi r5, 1
+ mov r13, r5
+
+ cmplti r4, 16
+ jbt .L_not_aligned_and_len_less_16bytes
+
+ stw r8, (sp, 12)
+ subi sp, 8
+ stw r9, (sp, 0)
+ stw r10, (sp, 4)
+.L_not_aligned_and_len_larger_16bytes:
+ ldw r5, (r3, 0)
+ ldw r11, (r3, 4)
+ ldw r8, (r3, 8)
+ ldw r9, (r3, 12)
+
+ /* little or big endian? */
+ GET_FRONT_BITS r1 r12
+ mov r10, r5
+ GET_AFTER_BITS r5 r13
+ or r5, r1
+
+ GET_FRONT_BITS r10 r12
+ mov r1, r11
+ GET_AFTER_BITS r11 r13
+ or r11, r10
+
+ GET_FRONT_BITS r1 r12
+ mov r10, r8
+ GET_AFTER_BITS r8 r13
+ or r8, r1
+
+ GET_FRONT_BITS r10 r12
+ mov r1, r9
+ GET_AFTER_BITS r9 r13
+ or r9, r10
+
+ stw r5, (r7, 0)
+ stw r11, (r7, 4)
+ stw r8, (r7, 8)
+ stw r9, (r7, 12)
+ subi r4, 16
+ addi r3, 16
+ addi r7, 16
+ cmplti r4, 16
+ jbf .L_not_aligned_and_len_larger_16bytes
+ ldw r9, (sp, 0)
+ ldw r10, (sp, 4)
+ addi sp, 8
+ ldw r8, (sp,12)
+
+.L_not_aligned_and_len_less_16bytes:
+ cmplti r4, 4
+ jbf .L2
+ /* r6 is used to stored the misaligned bits */
+ rsubi r6, 4
+ /* initial the position */
+ subu r3, r6
+ ldw r11, (sp, 0)
+ ldw r12, (sp, 4)
+ ldw r13, (sp, 8)
+ addi sp, 16
+ jbr .L_copy_by_byte
+ .L2:
+ ldw r5, (r3, 0)
+ GET_FRONT_BITS r1 r12
+ mov r11, r1
+ mov r1, r5
+ GET_AFTER_BITS r5 r13
+ or r5, r11
+ stw r5, (r7, 0)
+ subi r4, 4
+ addi r3, 4
+ addi r7, 4
+ jbr .L_not_aligned_and_len_less_16bytes
+
+#else /* __CSKYABIV2__ */
+ /* If len less than 4 bytes */
+ mov r3, r0
+ cmplti r2, 4
+ jbt .L_copy_by_byte
+
+ mov r12, r0
+ andi r12, 3
+ /* If dest is not 4 bytes aligned */
+ bnez r12, .L_dest_not_aligned
+.L0:
+ /* If dest is aligned, but src is not aligned */
+ mov r12, r1
+ andi r12, 3
+ bnez r12, .L_dest_aligned_but_src_not_aligned
+
+ /* dest and src are all aligned */
+ cmplti r2, 16
+ /* If len less than 16 bytes */
+ jbt .L_aligned_and_len_less_16bytes
+
+ /* src and dst are all aligned, and len > 16 bytes */
+.L_aligned_and_len_larger_16bytes:
+ ldw r18, (r1, 0)
+ ldw r19, (r1, 4)
+ ldw r20, (r1, 8)
+ ldw r21, (r1, 12)
+ stw r18, (r3, 0)
+ stw r19, (r3, 4)
+ stw r20, (r3, 8)
+ stw r21, (r3, 12)
+ subi r2, 16
+ addi r1, 16
+ addi r3, 16
+ cmplti r2, 16
+ jbf .L_aligned_and_len_larger_16bytes
+
+.L_aligned_and_len_less_16bytes:
+ cmplti r2, 4
+ jbt .L_copy_by_byte
+ ldw r18, (r1, 0)
+ stw r18, (r3, 0)
+ subi r2, 4
+ addi r1, 4
+ addi r3, 4
+ jbr .L_aligned_and_len_less_16bytes
+
+ /* len less than 4 bytes */
+.L_copy_by_byte:
+ cmpnei r2, 0
+ jbf .L_return
+ ldb r18, (r1, 0)
+ stb r18, (r3, 0)
+ subi r2, 1
+ addi r1, 1
+ addi r3, 1
+ jbr .L_copy_by_byte
+
+.L_return:
+ rts
+
+ /* If dest is not aligned, just copying some bytes makes the dest align.
+ After that, we judge whether the src is aligned. */
+
+ /* consider overlapped case */
+.L_dest_not_aligned:
+ rsub r13, r1, r3
+ abs r13, r13
+ cmplt r13, r2
+ jbt .L_copy_by_byte
+
+.L1:
+ /* makes the dest align. */
+ ldb r18, (r1, 0)
+ stb r18, (r3, 0)
+ addi r12, 1
+ subi r2, 1
+ addi r1, 1
+ addi r3, 1
+ cmpnei r12, 4
+ jbt .L1
+ cmplti r2, 4
+ jbt .L_copy_by_byte
+ /* judge whether the src is aligned. */
+ jbf .L0
+
+ /* consider overlapped case */
+.L_dest_aligned_but_src_not_aligned:
+ rsub r13, r1, r3
+ abs r13, r13
+ cmplt r13, r2
+ jbt .L_copy_by_byte
+
+ bclri r1, 0
+ bclri r1, 1
+ ldw r18, (r1, 0)
+ addi r1, 4
+
+ /* r12 is used to store the misaligned bits */
+ movi r13, 8
+ mult r13, r12
+ mov r24, r13
+ rsubi r13, 32
+ mov r25, r13
+
+ cmplti r2, 16
+ jbt .L_not_aligned_and_len_less_16bytes
+
+.L_not_aligned_and_len_larger_16bytes:
+ ldw r20, (r1, 0)
+ ldw r21, (r1, 4)
+ ldw r22, (r1, 8)
+ ldw r23, (r1, 12)
+
+ /* little or big endian? */
+ GET_FRONT_BITS r18 r24
+ mov r19, r20
+ GET_AFTER_BITS r20 r25
+ or r20, r18
+
+ GET_FRONT_BITS r19 r24
+ mov r18, r21
+ GET_AFTER_BITS r21 r13
+ or r21, r19
+
+ GET_FRONT_BITS r18 r24
+ mov r19, r22
+ GET_AFTER_BITS r22 r25
+ or r22, r18
+
+ GET_FRONT_BITS r19 r24
+ mov r18, r23
+ GET_AFTER_BITS r23 r25
+ or r23, r19
+
+ stw r20, (r3, 0)
+ stw r21, (r3, 4)
+ stw r22, (r3, 8)
+ stw r23, (r3, 12)
+ subi r2, 16
+ addi r1, 16
+ addi r3, 16
+ cmplti r2, 16
+ jbf .L_not_aligned_and_len_larger_16bytes
+
+ .L_not_aligned_and_len_less_16bytes:
+ cmplti r2, 4
+ jbf .L2
+ /* r12 is used to stored the misaligned bits */
+ rsubi r12, 4
+ /* initial the position */
+ subu r1, r12
+ jbr .L_copy_by_byte
+ .L2:
+ ldw r21, (r1, 0)
+ GET_FRONT_BITS r18 r24
+ mov r19, r18
+ mov r18, r21
+ GET_AFTER_BITS r21 r25
+ or r21, r19
+ stw r21, (r3, 0)
+ subi r2, 4
+ addi r1, 4
+ addi r3, 4
+ jbr .L_not_aligned_and_len_less_16bytes
+
+# endif
+END(memcpy)
+
+libc_hidden_builtin_def(memcpy)
+.weak memcpy
diff --git a/sysdeps/csky/memusage.h b/sysdeps/csky/memusage.h
new file mode 100644
index 0000000..5d29e59
--- /dev/null
+++ b/sysdeps/csky/memusage.h
@@ -0,0 +1,20 @@
+/* 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 GETSP() ({ register uintptr_t stack_ptr asm ("sp"); stack_ptr; })
+
+#include <sysdeps/generic/memusage.h>
diff --git a/sysdeps/csky/setjmp.S b/sysdeps/csky/setjmp.S
new file mode 100644
index 0000000..eef7b86
--- /dev/null
+++ b/sysdeps/csky/setjmp.S
@@ -0,0 +1,95 @@
+/* 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 <sysdep.h>
+
+ENTRY(setjmp)
+ movi a1, 1
+ jmpi __sigsetjmp
+END(setjmp)
+
+ENTRY(_setjmp)
+ movi a1, 0
+ jmpi __sigsetjmp
+END(_setjmp)
+
+
+ENTRY(__sigsetjmp)
+ mov a2, a0
+ /* Save registers */
+#ifdef __CSKYABIV2__
+ stw sp, (a2, 0)
+ stw lr, (a2, 4)
+ stw r4, (a2, 8)
+ stw r5, (a2, 12)
+ stw r6, (a2, 16)
+ stw r7, (a2, 20)
+ stw r8, (a2, 24)
+ stw r9, (a2, 28)
+ stw r10, (a2, 32)
+ stw r11, (a2, 36)
+ stw r16, (a2, 40)
+ stw r17, (a2, 44)
+ stw r26, (a2, 48)
+ stw r27, (a2, 52)
+ stw r28, (a2, 56)
+ stw r29, (a2, 60)
+ stw r30, (a2, 64)
+ stw r31, (a2, 68)
+ addi a2, 72
+#else
+ stw sp, (a2, 0)
+ stw lr, (a2, 4)
+ stw r8, (a2, 8)
+ stw r9, (a2, 12)
+ stw r10, (a2, 16)
+ stw r11, (a2, 20)
+ stw r12, (a2, 24)
+ stw r13, (a2, 28)
+ stw r14, (a2, 32)
+ addi a2, 32
+ addi a2, 4
+#endif
+
+#ifdef __PIC__
+# ifdef __CSKYABIV2__
+ grs t1, .Lgetpc
+.Lgetpc:
+ lrw t0, .Lgetpc@GOTPC
+ addu t1, t0
+ lrw a2, __sigjmp_save@PLT
+ ldr.w a2, (t1, a2 << 0)
+ jmp a2
+# else
+ mov a3, lr
+ bsr .Lgetpc
+.Lgetpc:
+ lrw r7, .Lgetpc@GOTPC
+ addu r7, lr
+ lrw a2, __sigjmp_save@PLT
+ addu r7, a2
+ ldw r7, (r7)
+ mov lr, a3
+ jmp r7
+# endif /* !__CSKYABIV2__ */
+#else
+ jmpi __sigjmp_save
+#endif /* !__PIC__ */
+
+END(__sigsetjmp)
+
+hidden_def (__sigsetjmp)
diff --git a/sysdeps/csky/start.S b/sysdeps/csky/start.S
new file mode 100644
index 0000000..9fa5285
--- /dev/null
+++ b/sysdeps/csky/start.S
@@ -0,0 +1,133 @@
+/* Startup code compliant to the ELF C-SKY ABI.
+ 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.
+
+ 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/>. */
+
+/* We need to call:
+ __libc_start_main (int (*main) (int, char **, char **), int argc,
+ char **argv, void (*init) (void), void (*fini) (void),
+ void (*rtld_fini) (void), void *stack_end)
+*/
+
+#include <sysdep.h>
+
+.text
+ .globl _start
+ .type _start,@function
+_start:
+ /* Clear the frame pointer and link register since this is the outermost frame. */
+ movi lr, 0
+ /* Pop argc off the stack and save a pointer to argv */
+ ldw a1, (sp, 0) /* __libc_start_main(arg1): argc */
+ addi sp, 4
+ mov a2, sp /* __libc_start_main(arg1): argv */
+
+ subi sp, 4
+ /* Push stack limit */
+ stw a2, (sp, 0)
+#ifdef __CSKYABIV2__
+ /* Push rtld_fini */
+ subi sp, 4
+ stw a0, (sp, 0)
+#else
+ mov r7, a0
+#endif
+
+#ifdef SHARED
+ subi sp,8
+ stw lr,(sp,0)
+ stw gb,(sp,4)
+ bsr .Lgetpc
+.Lgetpc:
+ lrw gb, .Lgetpc@GOTPC
+ addu gb, lr
+ lrw a3, __libc_csu_fini@GOT
+ addu a3, gb
+ ldw a3, (a3)
+# ifdef __CSKYABIV2__
+ subi sp, 4
+ stw a3, (sp,0)
+# else
+ mov a4, a3
+# endif /* !__CSKYABIV2__ */
+ lrw a3, __libc_csu_init@GOT
+ addu a3, gb
+ ldw a3,(a3,0)
+# ifdef __CSKYABIV2__
+ lrw t0, main@GOT
+ addu t0, gb
+ ldw a0,(t0,0)
+ lrw t1,__libc_start_main@PLT
+ addu t1, gb
+ ldw t1, (t1, 0)
+ jsr t1
+# else
+ lrw a0, main@GOT
+ addu a0, gb
+ ldw a0,(a0,0)
+ lrw r13,__libc_start_main@PLT
+ addu r13, gb
+ ldw r13, (r13, 0)
+ jsr r13
+# endif /* !__CSKYABIV2__ */
+ ldw lr,(sp,0)
+ ldw gb,(sp,4)
+ addi sp, 8
+#else /* !SHARED */
+# ifdef __CSKYABIV2__
+ /* Fetch address of __libc_csu_fini */
+ lrw a0, __libc_csu_fini
+ /* Push __libc_csu_fini */
+ subi sp,4
+ stw a0, (sp,0)
+# else
+ lrw a4, __libc_csu_fini
+# endif /* !__CSKYABIV2__ */
+ /* Set up the other arguments in registers */
+ lrw a0, main
+ lrw a3, __libc_csu_init
+ /* __libc_start_main (main, argc, argv, init, fini, rtld_fini, stack_end) */
+ /* Let the libc call main and exit with its return code. */
+ jsri __libc_start_main
+#endif /* !SHARED */
+
+ /* should never get here....*/
+ jsri abort
+
+/* 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/csky/strcmp.S b/sysdeps/csky/strcmp.S
new file mode 100644
index 0000000..46f4c2a
--- /dev/null
+++ b/sysdeps/csky/strcmp.S
@@ -0,0 +1,337 @@
+/* The assembly function for string compare. C-SKY 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 <sysdep.h>
+#include "macro.S"
+
+/* FIXME attention!!! it may be a bug when WANT_WIDE define */
+ENTRY(strcmp)
+#ifndef __CSKYABIV2__
+ mov r6, r2
+
+ or r2, r3
+ andi r2, 0x3
+ cmpnei r2, 0x0 /* d or s is aligned ?*/
+ bt 4f /* if not aligned, goto 4f*/
+ 1: /* if aligned, load word each time.*/
+ ldw r2, (r6, 0)
+ ldw r7, (r3, 0)
+ cmpne r2, r7
+ bt 1f /* if d[i] != s[i], goto 1f */
+ tstnbz r2 /* if d[i] == s[i], check if d or s is at the end. */
+ bf 3f /* if at the end, goto 3f (finish comparing) */
+
+ ldw r2, (r6, 4)
+ ldw r7, (r3, 4)
+ cmpne r2, r7
+ bt 1f
+ tstnbz r2
+ bf 3f
+
+ ldw r2, (r6, 8)
+ ldw r7, (r3, 8)
+ cmpne r2, r7
+ bt 1f
+ tstnbz r2
+ bf 3f
+
+ ldw r2, (r6, 12)
+ ldw r7, (r3, 12)
+ cmpne r2, r7
+ bt 1f
+ tstnbz r2
+ bf 3f
+
+ ldw r2, (r6, 16)
+ ldw r7, (r3, 16)
+ cmpne r2, r7
+ bt 1f
+ tstnbz r2
+ bf 3f
+
+ ldw r2, (r6, 20)
+ ldw r7, (r3, 20)
+ cmpne r2, r7
+ bt 1f
+ tstnbz r2
+ bf 3f
+
+ ldw r2, (r6, 24)
+ ldw r7, (r3, 24)
+ cmpne r2, r7
+ bt 1f
+ tstnbz r2
+ bf 3f
+
+ ldw r2, (r6, 28)
+ ldw r7, (r3, 28)
+ cmpne r2, r7
+ bt 1f
+ tstnbz r2
+ bf 3f
+
+ addi r6, 32
+ addi r3, 32
+ br 1b
+
+#ifdef __CSKYBE__
+ /* d[i] != s[i] in word, so we check byte 0 ? */
+1:
+ xtrb0 r1, r2
+ mov r4, r1
+ xtrb0 r1, r7
+ cmpne r4, r1
+ bt 2f
+ cmpnei r4, 0
+ bf 2f
+
+ /* d[i] != s[i] in word, so we check byte 1 ? */
+ xtrb1 r1, r2
+ mov r4, r1
+ xtrb1 r1, r7
+ cmpne r4, r1
+ bt 2f
+ cmpnei r4, 0
+ bf 2f
+
+ /* d[i] != s[i] in word, so we check byte 1 ? */
+ xtrb2 r1, r2
+ mov r4, r1
+ xtrb2 r1, r7
+ cmpne r4, r1
+ bt 2f
+ cmpnei r4, 0
+ bf 2f
+
+ /* d[i] != s[i] in word, so we check byte 1 ? */
+ xtrb3 r1, r2
+ mov r4, r1
+ xtrb3 r1, r7
+
+#else /* little endian */
+ /* d[i] != s[i] in word, so we check byte 0 ? */
+1:
+ xtrb3 r1, r2
+ mov r4, r1
+ xtrb3 r1, r7
+ cmpne r4, r1
+ bt 2f
+ cmpnei r4, 0
+ bf 2f
+
+ /* d[i] != s[i] in word, so we check byte 1 ? */
+ xtrb2 r1, r2
+ mov r4, r1
+ xtrb2 r1, r7
+ cmpne r4, r1
+ bt 2f
+ cmpnei r4, 0
+ bf 2f
+
+ /* d[i] != s[i] in word, so we check byte 1 ? */
+ xtrb1 r1, r2
+ mov r4, r1
+ xtrb1 r1, r7
+ cmpne r4, r1
+ bt 2f
+ cmpnei r4, 0
+ bf 2f
+
+ /* d[i] != s[i] in word, so we check byte 1 ? */
+ xtrb0 r1, r2
+ mov r4, r1
+ xtrb0 r1, r7
+
+#endif
+ /* get the result when d[i] != s[i] */
+2:
+ subu r4, r1
+ mov r2, r4
+ jmp r15
+
+ /* return when d[i] == s[i] */
+3:
+ subu r2, r7
+ jmp r15
+
+ /* cmp when d or s is not aligned */
+4:
+ ldb r2, (r6,0)
+ ldb r7, (r3, 0)
+ cmpne r2, r7
+ bt 3b
+ addi r3, 1
+ addi r6, 1
+ cmpnei r2, 0
+ bt 4b
+ jmp r15
+# else /* __CSKYABIV2__ */
+ mov a3, a0
+
+ or a0, a1
+ andi a0, 0x3
+ M_BNEZ a0, 4f
+ 1:
+ /* if aligned, load word each time. */
+ ldw a0, (a3, 0)
+ ldw t0, (a1, 0)
+ /* if d[i] != s[i], goto 1f */
+ M_BNE a0, t0, 1f
+ /* if d[i] == s[i], check if d or s is at the end. */
+ tstnbz a0
+ /* if at the end, goto 3f (finish comparing) */
+ bf 3f
+#if defined ( __ck802__ )
+ addi a3, 4
+ addi a1, 4
+#else
+ ldw a0, (a3, 4)
+ ldw t0, (a1, 4)
+ M_BNE a0, t0, 1f
+ tstnbz a0
+ bf 3f
+
+ ldw a0, (a3, 8)
+ ldw t0, (a1, 8)
+ M_BNE a0, t0, 1f
+ tstnbz a0
+ bf 3f
+
+ ldw a0, (a3, 12)
+ ldw t0, (a1, 12)
+ M_BNE a0, t0, 1f
+ tstnbz a0
+ bf 3f
+
+ ldw a0, (a3, 16)
+ ldw t0, (a1, 16)
+ M_BNE a0, t0, 1f
+ tstnbz a0
+ bf 3f
+
+ ldw a0, (a3, 20)
+ ldw t0, (a1, 20)
+ M_BNE a0, t0, 1f
+ tstnbz a0
+ bf 3f
+
+ ldw a0, (a3, 24)
+ ldw t0, (a1, 24)
+ M_BNE a0, t0, 1f
+ tstnbz a0
+ bf 3f
+
+ ldw a0, (a3, 28)
+ ldw t0, (a1, 28)
+ M_BNE a0, t0, 1f
+ tstnbz a0
+ bf 3f
+
+ addi a3, 32
+ addi a1, 32
+#endif
+ br 1b
+
+# ifdef __CSKYBE__
+ /* d[i] != s[i] in word, so we check byte 0 ? */
+1:
+ xtrb0 t1, a0
+ mov a2, t1
+ xtrb0 t1, t0
+ M_BNE a2, t1, 2f
+ cmpnei a2, 0
+ bf 2f
+
+ /* d[i] != s[i] in word, so we check byte 1 ? */
+ xtrb1 t1, a0
+ mov a2, t1
+ xtrb1 t1, t0
+ M_BNE a2, t1, 2f
+ cmpnei a2, 0
+ bf 2f
+
+ /* d[i] != s[i] in word, so we check byte 1 ? */
+ xtrb2 t1, a0
+ mov a2, t1
+ xtrb2 t1, t0
+ M_BNE a2, t1, 2f
+ cmpnei a2, 0
+ bf 2f
+
+ /* d[i] != s[i] in word, so we check byte 1 ? */
+ xtrb3 t1, a0
+ mov a2, t1
+ xtrb3 t1, t0
+
+# else /* !__CSKYBE__ */
+ /* d[i] != s[i] in word, so we check byte 0 ? */
+1:
+ xtrb3 t1, a0
+ mov a2, t1
+ xtrb3 t1, t0
+ M_BNE a2, t1, 2f
+ cmpnei a2, 0
+ bf 2f
+
+ /* d[i] != s[i] in word, so we check byte 1 ? */
+ xtrb2 t1, a0
+ mov a2, t1
+ xtrb2 t1, t0
+ M_BNE a2, t1, 2f
+ cmpnei a2, 0
+ bf 2f
+
+ /* d[i] != s[i] in word, so we check byte 1 ? */
+ xtrb1 t1, a0
+ mov a2, t1
+ xtrb1 t1, t0
+ M_BNE a2, t1, 2f
+ cmpnei a2, 0
+ bf 2f
+
+ /* d[i] != s[i] in word, so we check byte 1 ? */
+ xtrb0 t1, a0
+ mov a2, t1
+ xtrb0 t1, t0
+
+# endif /* !__CSKYBE__ */
+ /* get the result when d[i] != s[i] */
+2:
+ subu a2, t1
+ mov a0, a2
+ jmp r15
+
+ /* return when d[i] == s[i] */
+3:
+ subu a0, t0
+ jmp r15
+
+ /* cmp when d or s is not aligned */
+4:
+ ldb a0, (a3,0)
+ ldb t0, (a1, 0)
+ M_BNE a0, t0, 3b
+ addi a1, 1
+ addi a3, 1
+ M_BNEZ a0, 4b
+ jmp r15
+#endif /* __CSKYABIV2__ */
+END(strcmp)
+
+libc_hidden_def(strcmp)
+.weak strcmp
diff --git a/sysdeps/csky/strcpy.S b/sysdeps/csky/strcpy.S
new file mode 100644
index 0000000..e757aeb
--- /dev/null
+++ b/sysdeps/csky/strcpy.S
@@ -0,0 +1,273 @@
+/* The assembly function for string copy. C-SKY 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 <sysdep.h>
+#include "macro.S"
+
+ENTRY(strcpy)
+#ifndef __CSKYABIV2__
+ mov r6, r2
+ mov r7, r3
+ or r7, r6
+ andi r7, 3
+ cmpnei r7, 0
+ bf 2f
+1:
+ ldb r5, (r3)
+ stb r5, (r6)
+ addi r3, 1
+ addi r6, 1
+ cmpnei r5, 0
+ bt 1b
+1:
+ jmp r15
+
+2:
+ ldw r5, (r3)
+ tstnbz r5
+ bf 10f
+ stw r5, (r6)
+
+ ldw r5, (r3, 4)
+ tstnbz r5
+ bf 3f
+ stw r5, (r6, 4)
+
+ ldw r5, (r3, 8)
+ tstnbz r5
+ bf 4f
+ stw r5, (r6, 8)
+
+ ldw r5, (r3, 12)
+ tstnbz r5
+ bf 5f
+ stw r5, (r6, 12)
+
+ ldw r5, (r3, 16)
+ tstnbz r5
+ bf 6f
+ stw r5, (r6, 16)
+
+ ldw r5, (r3, 20)
+ tstnbz r5
+ bf 7f
+ stw r5, (r6, 20)
+
+ ldw r5, (r3, 24)
+ tstnbz r5
+ bf 8f
+ stw r5, (r6, 24)
+
+ ldw r5, (r3, 28)
+ tstnbz r5
+ bf 9f
+ stw r5, (r6, 28)
+
+ addi r6, 32
+ addi r3, 32
+ br 2b
+
+3:
+ addi r6, 4
+ br 10f
+
+4:
+ addi r6, 8
+ br 10f
+
+5:
+ addi r6, 12
+ br 10f
+
+6:
+ addi r6, 16
+ br 10f
+
+7:
+ addi r6, 20
+ br 10f
+
+8:
+ addi r6, 24
+ br 10f
+
+9:
+ addi r6, 28
+
+10:
+# ifdef __CSKYBE__
+ xtrb0 r1, r5
+ stb r1, (r6)
+ cmpnei r1, 0
+ bf 5f
+ xtrb1 r1, r5
+ stb r1, (r6, 1)
+ cmpnei r1, 0
+ bf 5f
+ xtrb2 r1, r5
+ stb r1, (r6, 2 )
+ cmpnei r1, 0
+ bf 5f
+ stw r5, (r6)
+
+# else /* !__CSKYBE__ */
+ xtrb3 r1, r5
+ stb r1, (r6)
+ cmpnei r1, 0
+ bf 5f
+ xtrb2 r1, r5
+ stb r1, (r6, 1)
+ cmpnei r1, 0
+ bf 5f
+ xtrb1 r1, r5
+ stb r1, (r6, 2)
+ cmpnei r1, 0
+ bf 5f
+ stw r5, (r6)
+# endif /* !__CSKYBE__ */
+5:
+ jmp r15
+#else /* __CSKYABIV2__ */
+ mov a3, a0
+ or a2, a1, a3
+ andi t0, a2, 3
+ M_BEZ t0, 2f
+ mov t0, a1
+1:
+ ld.b a2, (t0)
+ stb a2, (a3)
+ addi t0, t0, 1
+ addi a3, a3, 1
+ M_BNEZ a2, 1b
+
+ jmp r15
+
+2:
+# if defined (__ck802__)
+ ldw a2, (a1)
+ tstnbz a2
+ bf 11f
+ stw a2, (a3)
+ addi a3, 4
+ addi a1, 4
+ br 2b
+# else /* !__ck802__ */
+ ldw a2, (a1)
+ tstnbz a2
+ bf 11f
+ stw a2, (a3)
+
+ ldw a2, (a1, 4)
+ tstnbz a2
+ bf 4f
+ stw a2, (a3, 4)
+
+ ldw a2, (a1, 8)
+ tstnbz a2
+ bf 5f
+ stw a2, (a3, 8)
+
+ ldw a2, (a1, 12)
+ tstnbz a2
+ bf 6f
+ stw a2, (a3, 12)
+
+ ldw a2, (a1, 16)
+ tstnbz a2
+ bf 7f
+ stw a2, (a3, 16)
+
+ ldw a2, (a1, 20)
+ tstnbz a2
+ bf 8f
+ stw a2, (a3, 20)
+
+ ldw a2, (a1, 24)
+ tstnbz a2
+ bf 9f
+ stw a2, (a3, 24)
+
+ ldw a2, (a1, 28)
+ tstnbz a2
+ bf 10f
+ stw a2, (a3, 28)
+
+ addi a3, 32
+ addi a1, 32
+ br 2b
+
+
+4:
+ addi a3, 4
+ br 11f
+
+5:
+ addi a3, 8
+ br 11f
+
+6:
+ addi a3, 12
+ br 11f
+
+7:
+ addi a3, 16
+ br 11f
+
+8:
+ addi a3, 20
+ br 11f
+
+9:
+ addi a3, 24
+ br 11f
+
+10:
+ addi a3, 28
+# endif /* !__ck802__ */
+11:
+# ifdef __CSKYBE__
+ xtrb0 t0, a2
+ st.b t0, (a3)
+ M_BEZ t0, 5f
+ xtrb1 t0, a2
+ st.b t0, (a3, 1)
+ M_BEZ t0, 5f
+ xtrb2 t0, a2
+ st.b t0, (a3, 2 )
+ M_BEZ t0, 5f
+ stw a2, (a3)
+# else
+ xtrb3 t0, a2
+ st.b t0, (a3)
+ M_BEZ t0, 5f
+ xtrb2 t0, a2
+ st.b t0, (a3, 1)
+ M_BEZ t0, 5f
+ xtrb1 t0, a2
+ st.b t0, (a3, 2)
+ M_BEZ t0, 5f
+ stw a2, (a3)
+# endif /* !__CSKYBE__ */
+5:
+ jmp r15
+
+#endif /* !__CSKYABIV2__ */
+END(strcpy)
+
+libc_hidden_def(strcpy)
+.weak strcpy
diff --git a/sysdeps/csky/sys/ucontext.h b/sysdeps/csky/sys/ucontext.h
new file mode 100644
index 0000000..fd5fad0
--- /dev/null
+++ b/sysdeps/csky/sys/ucontext.h
@@ -0,0 +1,116 @@
+/* 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/>. */
+
+/* System V/ckcore ABI compliant context switching support. */
+
+#ifndef _SYS_UCONTEXT_H
+#define _SYS_UCONTEXT_H 1
+
+#include <features.h>
+#include <signal.h>
+
+#include <bits/types/sigset_t.h>
+#include <bits/types/stack_t.h>
+
+/* Type for general register. */
+typedef int greg_t;
+
+/* Number of general registers. */
+#if (__CSKY__ == 2)
+#define NGREG 34
+#else
+#define NGREG 18
+#endif
+
+/* Container for all general registers. */
+typedef greg_t gregset_t[NGREG];
+
+/* Number of each register is the `gregset_t' array. */
+enum
+{
+ R_R0 = 0,
+#define R_R0 R_R0
+ R_R1 = 1,
+#define R_R1 R_R1
+ R_R2 = 2,
+#define R_R2 R_R2
+ R_R3 = 3,
+#define R_R3 R_R3
+ R_R4 = 4,
+#define R_R4 R_R4
+ R_R5 = 5,
+#define R_R5 R_R5
+ R_R6 = 6,
+#define R_R6 R_R6
+ R_R7 = 7,
+#define R8R7 R_R7
+ R_R8 = 8,
+#define R_R8 R_R8
+ R_R9 = 9,
+#define R_R9 R_R9
+ R_R10 = 10,
+#define R_R10 R_R10
+ R_R11 = 11,
+#define R_R11 R_R11
+ R_R12 = 12,
+#define R_R12 R_R12
+ R_R13 = 13,
+#define R_R13 R_R13
+ R_R14 = 14,
+#define R_R14 R_R14
+ R_R15 = 15,
+#define R_R15 R_R15
+#if (__CSKY__ == 2)
+ R_SR = 32,
+#define R_SR R_SR
+ R_PC = 33,
+#define R_PC R_PC
+#else
+ R_SR = 16,
+#define R_SR R_SR
+ R_PC = 17,
+#define R_PC R_PC
+#endif
+};
+
+/* Structure to describe FPU registers. */
+typedef struct fpregset
+{
+ unsigned long fesr; /* fpu exception status reg */
+ unsigned long fsr; /* fpu status reg, nothing in CPU_CSKYV2 */
+ unsigned long fp[32]; /* fpu general regs */
+} fpregset_t;
+
+/* Context to describe whole processor state. */
+typedef struct
+{
+ gregset_t gregs;
+ fpregset_t fpregs;
+} mcontext_t;
+
+/* Userlevel context. */
+typedef struct ucontext
+{
+ unsigned long int uc_flags;
+ struct ucontext *uc_link;
+ __sigset_t uc_sigmask;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext; /* struct sigcontext */
+ long int uc_filler[201];
+} ucontext_t;
+
+#endif /* sys/ucontext.h */
diff --git a/sysdeps/csky/sysdep.h b/sysdeps/csky/sysdep.h
new file mode 100644
index 0000000..0a20a72
--- /dev/null
+++ b/sysdeps/csky/sysdep.h
@@ -0,0 +1,46 @@
+/* Assembler macros for C-SKY.
+ 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 <sysdeps/generic/sysdep.h>
+#include <features.h>
+
+#ifndef __CSKYABIV2__
+# define CSKY_ABIV1
+#else
+# define CSKY_ABIV2
+#endif
+
+#ifdef __ASSEMBLER__
+
+#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
+
+/* Define an entry point visible from C. */
+#define ENTRY(name) \
+ .globl name; \
+ .type name,@function; \
+ .align 4; \
+ name##:; \
+ cfi_startproc; \
+
+#undef END
+#define END(name) \
+ cfi_endproc; \
+ ASM_SIZE_DIRECTIVE(name)
+
+#endif
+
diff --git a/sysdeps/csky/tls-macros.h b/sysdeps/csky/tls-macros.h
new file mode 100644
index 0000000..3e9976b
--- /dev/null
+++ b/sysdeps/csky/tls-macros.h
@@ -0,0 +1,106 @@
+/* Macros for accessing thread-local storage. C-SKY 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/>. */
+
+#ifdef __CSKYABIV2__
+# define TLS_LE(x) \
+ ({ int *__result; \
+ extern void * __read_tp (void); \
+ void *tp = __read_tp (); \
+ __asm__ ("lrw %0, " #x "@TPOFF; " \
+ "add %0, %1, %0; " \
+ : "=&r" (__result) : "r" (tp)); \
+ __result; })
+
+# define TLS_IE(x) \
+ ({ int *__result; \
+ extern void * __read_tp (void); \
+ void *tp = __read_tp (); \
+ __asm__ ("grs a1, 1f;" \
+ "1: lrw %0, " #x "@GOTTPOFF;" \
+ "ldr.w %0, (a1, %0 << 0);" \
+ "add %0, %1, %0; " \
+ : "=&r" (__result): "r" (tp) : "a1" ); \
+ __result; })
+
+# define TLS_LD(x) \
+ ({ char *__result; \
+ int __offset; \
+ extern void *__tls_get_addr (void *); \
+ __asm__ ("grs a1, 1f;" \
+ "1: lrw %0, " #x "@TLSLDM32;" \
+ "add %0, a1, %0; " \
+ : "=r" (__result) : : "a1"); \
+ __result = (char *)__tls_get_addr (__result); \
+ __asm__ ("lrw %0, " #x "@TLSLDO32; " \
+ : "=r" (__offset)); \
+ (int *) (__result + __offset); })
+
+# define TLS_GD(x) \
+ ({ int *__result; \
+ extern void *__tls_get_addr (void *); \
+ __asm__ ("grs a1, 1f;" \
+ "1: lrw %0, " #x "@TLSGD32; " \
+ "add %0, a1, %0; " \
+ : "=r" (__result) : : "a1" ); \
+ (int *)__tls_get_addr (__result); })
+
+#else
+# define TLS_LE(x) \
+ ({ int *__result; \
+ extern void * __read_tp (void); \
+ void *tp = __read_tp (); \
+ __asm__ ("lrw %0, " #x "@TPOFF\n\t " \
+ "add %0, %1\n\t" \
+ : "=&r" (__result) : "r" (tp)); \
+ __result; })
+
+# define TLS_IE(x) \
+ ({ int *__result; \
+ extern void * __read_tp (void); \
+ void *tp = __read_tp (); \
+ __asm__ ("bsr 1f\n\t" \
+ "1: lrw %0, " #x "@GOTTPOFF\n\t" \
+ "add %0, r15\n\t" \
+ "ldw %0, (%0, 0)\n\t" \
+ "add %0, %1\n\t" \
+ : "=&r" (__result): "r" (tp) : "r15" ); \
+ __result; })
+
+# define TLS_LD(x) \
+ ({ char *__result; \
+ int __offset; \
+ extern void *__tls_get_addr (void *); \
+ __asm__ ("bsr 1f\n\t" \
+ "1: lrw %0, " #x "@TLSLDM32\n\t" \
+ "add %0, r15\n\t" \
+ : "=r" (__result) : : "r15"); \
+ __result = (char *)__tls_get_addr (__result); \
+ __asm__ ("lrw %0, " #x "@TLSLDO32\n\t " \
+ : "=r" (__offset)); \
+ (int *) (__result + __offset); })
+
+# define TLS_GD(x) \
+ ({ int *__result; \
+ extern void *__tls_get_addr (void *); \
+ __asm__ ("bsr 1f;" \
+ "1: lrw %0, " #x "@TLSGD32\n\t " \
+ "add %0, r15\n\t" \
+ : "=r" (__result) : : "r15" ); \
+ (int *)__tls_get_addr (__result); })
+
+#endif
diff --git a/sysdeps/unix/csky/abiv2_sysdep.S b/sysdeps/unix/csky/abiv2_sysdep.S
new file mode 100644
index 0000000..4087b99
--- /dev/null
+++ b/sysdeps/unix/csky/abiv2_sysdep.S
@@ -0,0 +1,73 @@
+/* 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 <sysdep.h>
+#define _ERRNO_H
+#include <bits/errno.h>
+#include <csky_readtp.h>
+
+#if !IS_IN (rtld)
+#include <dl-sysdep.h> /* Defines RTLD_PRIVATE_ERRNO. */
+#endif
+
+#include <tls.h>
+
+#undef syscall_error
+__syscall_error:
+#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
+ /* We translate the system's EWOULDBLOCK error into EAGAIN.
+ The GNU C library always defines EWOULDBLOCK==EAGAIN.
+ EWOULDBLOCK_sys is the original number. */
+ cmpnei a0, EWOULDBLOCK /* Is it the old EWOULDBLOCK? */
+ bt 1f
+ mov a0, EAGAIN /* Yes; translate it to EAGAIN. */
+#endif
+
+1:
+#if !IS_IN (rtld)
+ mov a1, a0
+ csky_read_tp
+
+ grs t1, .Lgetpc1
+.Lgetpc1:
+ lrw t0, errno@gottpoff
+ add t1, t1, t0
+ ldw t1, (t1)
+ add t1, a0
+ stw a1, (t1)
+ bmaski a0, 0
+ jsr r15
+#elif RTLD_PRIVATE_ERRNO
+#ifdef __PIC__
+ grs t1, .Lgetpc2
+.Lgetpc2:
+ lrw t0, .Lgetpc2@GOTPC
+ addu t1, t1, t0
+ lrw t0, rtld_errno@PLT
+ ldr.w t0, (t1, t0 << 0)
+#else
+ lrw t0, rtld_errno
+#endif
+ stw a0, (t0)
+ bmaski a0, 0
+ jsr r15
+#else
+#error "Unsupported non-TLS case"
+#endif
+
+#undef __syscall_error
+END (__syscall_error)
diff --git a/sysdeps/unix/csky/sysdep.S b/sysdeps/unix/csky/sysdep.S
new file mode 100644
index 0000000..9bd6229
--- /dev/null
+++ b/sysdeps/unix/csky/sysdep.S
@@ -0,0 +1,84 @@
+/* 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/>. */
+
+#ifdef __CSKYABIV2__
+#include "abiv2_sysdep.S"
+#else
+
+#include <sysdep.h>
+#define _ERRNO_H
+#include <bits/errno.h>
+#include <csky_readtp.h>
+
+#if IS_IN (rtld)
+#include <dl-sysdep.h> /* Defines RTLD_PRIVATE_ERRNO. */
+#endif
+
+#include <tls.h>
+
+#undef syscall_error
+__syscall_error:
+#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
+ /* We translate the system's EWOULDBLOCK error into EAGAIN.
+ The GNU C library always defines EWOULDBLOCK==EAGAIN.
+ EWOULDBLOCK_sys is the original number. */
+ cmpnei r2, EWOULDBLOCK /* Is it the old EWOULDBLOCK? */
+ bt 1f
+ mov r2, EAGAIN /* Yes; translate it to EAGAIN. */
+#endif
+
+1:
+#if !IS_IN (rtld)
+#ifdef __PIC__
+ mov r7, r15
+ mov r1, r2
+ csky_read_tp
+
+ bsr .Lgetpc1
+.Lgetpc1:
+ lrw r5, errno@gottpoff
+ add r5, r15
+ ldw r5, (r5)
+ add r5, r2
+ stw r1, (r5)
+ bmaski r2, 0
+ jsr r7
+#endif
+#elif RTLD_PRIVATE_ERRNO
+#ifdef __PIC__
+ mov r7, r15
+ bsr .Lgetpc2
+.Lgetpc2:
+ lrw r6, .Lgetpc2@GOTPC
+ addu r6, r15
+ lrw r5, rtld_errno@PLT
+ addu r5, r6
+ ldw r5, (r5)
+#else
+ lrw r5, rtld_errno
+#endif
+ stw r2, (r5)
+ bmaski r2, 0
+ jsr r7
+#else
+#error "Unsupported non-TLS case"
+#endif
+
+#undef __syscall_error
+END (__syscall_error)
+
+#endif /* __CSKYABIV2__*/
diff --git a/sysdeps/unix/csky/sysdep.h b/sysdeps/unix/csky/sysdep.h
new file mode 100644
index 0000000..fb13f3d
--- /dev/null
+++ b/sysdeps/unix/csky/sysdep.h
@@ -0,0 +1,26 @@
+/* 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 <sysdeps/unix/sysdep.h>
+#include <sysdeps/csky/sysdep.h>
+
+#ifdef __ASSEMBLER__
+
+#define ret \
+ jmp r15;
+
+#endif
--
2.7.4
^ permalink raw reply [flat|nested] 22+ messages in thread
* [RFC PATCH 07/10] C-SKY: Atomic and Locking Routines
2018-03-16 9:59 [RFC PATCH 00/10] port C-SKY to glibc Mao Han
` (5 preceding siblings ...)
2018-03-16 9:59 ` [RFC PATCH 04/10] C-SKY: Hard Float Support Mao Han
@ 2018-03-16 9:59 ` Mao Han
2018-03-16 9:59 ` [RFC PATCH 10/10] C-SKY: Linux ABI Mao Han
` (3 subsequent siblings)
10 siblings, 0 replies; 22+ messages in thread
From: Mao Han @ 2018-03-16 9:59 UTC (permalink / raw)
To: libc-help; +Cc: han_mao, ren_guo, yunhai_shang, qijie_tong, chunqiang_li
This patch implements various atomic and locking routines on C-SKY.
*sysdeps/csky/atomic-machine.h: New file
*sysdeps/csky/nptl/bits/pthreadtypes-arch.h: New file
*sysdeps/csky/nptl/bits/semaphore.h: New file
Signed-off-by: Mao Han <han_mao@c-sky.com>
---
sysdeps/csky/atomic-machine.h | 115 +++++++++++++++++++++++++++++
sysdeps/csky/nptl/bits/pthreadtypes-arch.h | 71 ++++++++++++++++++
sysdeps/csky/nptl/bits/semaphore.h | 34 +++++++++
3 files changed, 220 insertions(+)
create mode 100644 sysdeps/csky/atomic-machine.h
create mode 100644 sysdeps/csky/nptl/bits/pthreadtypes-arch.h
create mode 100644 sysdeps/csky/nptl/bits/semaphore.h
diff --git a/sysdeps/csky/atomic-machine.h b/sysdeps/csky/atomic-machine.h
new file mode 100644
index 0000000..130edf3
--- /dev/null
+++ b/sysdeps/csky/atomic-machine.h
@@ -0,0 +1,115 @@
+/* Atomic operations. C-SKY 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/>. */
+
+#ifndef __CSKY_ATOMIC_H_
+#define __CSKY_ATOMIC_H_
+
+#include <stdint.h>
+
+typedef int8_t atomic8_t;
+typedef uint8_t uatomic8_t;
+typedef int_fast8_t atomic_fast8_t;
+typedef uint_fast8_t uatomic_fast8_t;
+
+typedef int16_t atomic16_t;
+typedef uint16_t uatomic16_t;
+typedef int_fast16_t atomic_fast16_t;
+typedef uint_fast16_t uatomic_fast16_t;
+
+typedef int32_t atomic32_t;
+typedef uint32_t uatomic32_t;
+typedef int_fast32_t atomic_fast32_t;
+typedef uint_fast32_t uatomic_fast32_t;
+
+typedef int64_t atomic64_t;
+typedef uint64_t uatomic64_t;
+typedef int_fast64_t atomic_fast64_t;
+typedef uint_fast64_t uatomic_fast64_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 0
+#define ATOMIC_EXCHANGE_USES_CAS 0
+
+# define __arch_compare_and_exchange_bool_8_int(mem, newval, oldval) \
+ (abort (), 0)
+
+# define __arch_compare_and_exchange_bool_16_int(mem, newval, oldval) \
+ (abort (), 0)
+
+# define __arch_compare_and_exchange_bool_32_int(mem, newval, oldval) \
+ ({ __typeof (mem) _mem = (mem); \
+ __typeof (oldval) _oldval = oldval; \
+ __typeof (newval) _newval = newval; \
+ register int _a0 asm ("a0") = (int)_oldval; \
+ register int _a1 asm ("a1") = (int)_newval; \
+ register int _a2 asm ("a2") = (int)_mem; \
+ __asm__ __volatile__ ("trap 2\n" \
+ : "+r" (_a0) : "r" (_a1) , "r" (_a2) \
+ : "a3", "memory"); \
+ (int) _a0; })
+
+# define __arch_compare_and_exchange_bool_64_int(mem, newval, oldval) \
+ (abort (), 0)
+
+# define __arch_compare_and_exchange_val_8_int(mem, newval, oldval) \
+ (abort (), (__typeof (*mem))0)
+
+# define __arch_compare_and_exchange_val_16_int(mem, newval, oldval) \
+ (abort (), (__typeof (*mem))0)
+
+# define __arch_compare_and_exchange_val_32_int(mem, newval, oldval) \
+ ({ __typeof (mem) _mem = (mem); \
+ __typeof (*mem) __gret = *_mem; \
+ unsigned int _tmp = 0; \
+ __typeof (oldval) _oldval = oldval; \
+ __typeof (newval) _newval = newval; \
+ register int _a0 asm ("a0") = (int)_oldval; \
+ register int _a1 asm ("a1") = (int)_newval; \
+ register int _a2 asm ("a2") = (int)_mem; \
+ __asm__ __volatile__ ("1:\n" \
+ "ldw %1, (%4, 0x0)\n" \
+ "cmpne %1, %0\n" \
+ "bt 2f\n" \
+ "mov %2, %0\n" \
+ "trap 2\n" \
+ "cmpnei %0, 0\n" \
+ "mov %0, %2\n" \
+ "bt 1b\n" \
+ "2: \n" \
+ :"+r" (_a0), "+r"(__gret), "+r" (_tmp) :"r" (_a1) , "r" (_a2) \
+ : "a3", "memory"); \
+ __gret; })
+
+# define __arch_compare_and_exchange_val_64_int(mem, newval, oldval) \
+ (abort (), (__typeof (*mem))0)
+
+# define atomic_compare_and_exchange_bool_acq(mem, new, old) \
+ __atomic_bool_bysize (__arch_compare_and_exchange_bool, int, \
+ mem, new, old)
+
+# define atomic_compare_and_exchange_val_acq(mem, new, old) \
+ __atomic_val_bysize (__arch_compare_and_exchange_val, int, \
+ mem, new, old)
+
+#endif
+
diff --git a/sysdeps/csky/nptl/bits/pthreadtypes-arch.h b/sysdeps/csky/nptl/bits/pthreadtypes-arch.h
new file mode 100644
index 0000000..b029243
--- /dev/null
+++ b/sysdeps/csky/nptl/bits/pthreadtypes-arch.h
@@ -0,0 +1,71 @@
+/* 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/>. */
+
+#ifndef _BITS_PTHREADTYPES_ARCH_H
+#define _BITS_PTHREADTYPES_ARCH_H 1
+
+#include <endian.h>
+
+#define __SIZEOF_PTHREAD_ATTR_T 36
+#define __SIZEOF_PTHREAD_MUTEX_T 24
+#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
+
+/* Data structure for mutex handling. */
+#define __PTHREAD_COMPAT_PADDING_MID
+#define __PTHREAD_COMPAT_PADDING_END
+#define __PTHREAD_MUTEX_LOCK_ELISION 0
+#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1
+#define __PTHREAD_MUTEX_USE_UNION 1
+
+#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;
+ /* FLAGS must stay at this position in the structure to maintain
+ binary compatibility. */
+ unsigned char __flags;
+#else
+ /* FLAGS must stay at this position in the structure to maintain
+ binary compatibility. */
+ unsigned char __flags;
+ unsigned char __shared;
+ unsigned char __pad1;
+ unsigned char __pad2;
+#endif
+ int __cur_writer;
+};
+
+#define __PTHREAD_RWLOCK_ELISION_EXTRA 0
+
+#endif
diff --git a/sysdeps/csky/nptl/bits/semaphore.h b/sysdeps/csky/nptl/bits/semaphore.h
new file mode 100644
index 0000000..2cd4014
--- /dev/null
+++ b/sysdeps/csky/nptl/bits/semaphore.h
@@ -0,0 +1,34 @@
+/* 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/>. */
+
+#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;
--
2.7.4
^ permalink raw reply [flat|nested] 22+ messages in thread
* [RFC PATCH 03/10] C-SKY: Generic math Routines
2018-03-16 9:59 [RFC PATCH 00/10] port C-SKY to glibc Mao Han
2018-03-16 9:59 ` [RFC PATCH 05/10] C-SKY: Linux Startup and Dynamic Loading Code Mao Han
2018-03-16 9:59 ` [RFC PATCH 02/10] C-SKY: TLS support Mao Han
@ 2018-03-16 9:59 ` Mao Han
2018-03-16 14:13 ` Carlos O'Donell
2018-03-16 9:59 ` [RFC PATCH 08/10] C-SKY: ABI Lists Mao Han
` (7 subsequent siblings)
10 siblings, 1 reply; 22+ messages in thread
From: Mao Han @ 2018-03-16 9:59 UTC (permalink / raw)
To: libc-help; +Cc: han_mao, ren_guo, yunhai_shang, qijie_tong, chunqiang_li
This patch contains the miscellaneous math routines and headers we have
implemented for C-SKY.
*sysdeps/csky/bits/fenv.h: New file
*sysdeps/csky/libm-test-ulps: New file
*sysdeps/csky/libm-test-ulps-name: New file
*sysdeps/csky/math-tests.h: New file
*sysdeps/csky/sfp-machine.h: New file
*sysdeps/csky/math_private.h: New file
*sysdeps/csky/fenv_private.h: New file
Signed-off-by: Mao Han <han_mao@c-sky.com>
---
sysdeps/csky/bits/fenv.h | 97 +++
sysdeps/csky/fenv_private.h | 288 +++++++
sysdeps/csky/libm-test-ulps | 1682 ++++++++++++++++++++++++++++++++++++++
sysdeps/csky/libm-test-ulps-name | 1 +
sysdeps/csky/math-tests.h | 35 +
sysdeps/csky/math_private.h | 7 +
sysdeps/csky/sfp-machine.h | 51 ++
7 files changed, 2161 insertions(+)
create mode 100644 sysdeps/csky/bits/fenv.h
create mode 100644 sysdeps/csky/fenv_private.h
create mode 100644 sysdeps/csky/libm-test-ulps
create mode 100644 sysdeps/csky/libm-test-ulps-name
create mode 100644 sysdeps/csky/math-tests.h
create mode 100644 sysdeps/csky/math_private.h
create mode 100644 sysdeps/csky/sfp-machine.h
diff --git a/sysdeps/csky/bits/fenv.h b/sysdeps/csky/bits/fenv.h
new file mode 100644
index 0000000..fdd188a
--- /dev/null
+++ b/sysdeps/csky/bits/fenv.h
@@ -0,0 +1,97 @@
+/* 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/>. */
+
+#ifndef _FENV_H
+# error "Never use <bits/fenv.h> directly; include <fenv.h> instead."
+#endif
+
+/* Define bits representing the exception. We use the bit positions
+ of the appropriate bits in the FPU control word. */
+enum
+ {
+ FE_INVALID =
+#define FE_INVALID 0x01
+ FE_INVALID,
+ FE_DIVBYZERO =
+#define FE_DIVBYZERO 0x02
+ FE_DIVBYZERO,
+ FE_OVERFLOW =
+#define FE_OVERFLOW 0x04
+ FE_OVERFLOW,
+ FE_UNDERFLOW =
+#define FE_UNDERFLOW 0x08
+ FE_UNDERFLOW,
+ FE_INEXACT =
+#define FE_INEXACT 0x10
+ FE_INEXACT,
+ FE_DENORMAL =
+#define FE_DENORMAL 0x20
+ FE_DENORMAL,
+ };
+
+#define FE_ALL_EXCEPT \
+ (FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW |\
+ FE_INVALID | FE_DENORMAL)
+
+/* The C-SKY FPU supports all of the four defined rounding modes. We
+ use again the bit positions in the FPU control word as the values
+ for the appropriate macros. */
+enum
+ {
+ FE_TONEAREST =
+#define FE_TONEAREST (0x0 << 24)
+ FE_TONEAREST,
+ FE_TOWARDZERO =
+#define FE_TOWARDZERO (0x1 << 24)
+ FE_TOWARDZERO,
+ FE_UPWARD =
+#define FE_UPWARD (0x2 << 24)
+ FE_UPWARD,
+ FE_DOWNWARD =
+#define FE_DOWNWARD (0x3 << 24)
+ FE_DOWNWARD,
+ FE_ROUND_MASK =
+#define FE_ROUND_MASK (0x3 << 24)
+ FE_ROUND_MASK
+ };
+
+/* Type representing exception flags. */
+typedef unsigned int fexcept_t;
+
+/* Type representing floating-point environment. */
+typedef struct
+ {
+ unsigned int __fpcr;
+ unsigned int __fpsr;
+ }
+fenv_t;
+
+/* If the default argument is used we use this value. */
+#define FE_DFL_ENV ((const fenv_t *) -1)
+
+#ifdef __USE_GNU
+/* Floating-point environment where none of the exceptions are masked. */
+# define FE_NOMASK_ENV ((const fenv_t *) -2)
+#endif
+
+#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/csky/fenv_private.h b/sysdeps/csky/fenv_private.h
new file mode 100644
index 0000000..dc15032
--- /dev/null
+++ b/sysdeps/csky/fenv_private.h
@@ -0,0 +1,288 @@
+/* Private floating point rounding and exceptions handling. C-SKY 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/>. */
+
+#ifndef FENV_PRIVATE_H
+#define FENV_PRIVATE_H 1
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+#ifdef __csky_hard_float__
+# include <fenv_libc.h>
+
+static __always_inline void
+libc_feholdexcept_vfp (fenv_t *envp)
+{
+ unsigned int fpsr;
+ unsigned int fpcr;
+
+ _FPU_GETCW (fpcr);
+ envp->__fpcr = fpcr;
+
+ _FPU_GETFPSR (fpsr);
+ envp->__fpsr = fpsr;
+
+ /* Now set all exceptions to non-stop. */
+ fpcr &= ~FE_ALL_EXCEPT;
+
+ /* And clear all exception flags. */
+ fpsr &= ~(FE_ALL_EXCEPT << CAUSE_SHIFT);
+
+ _FPU_SETFPSR (fpsr);
+
+ _FPU_SETCW (fpcr);
+}
+
+static __always_inline void
+libc_fesetround_vfp (int round)
+{
+ fpu_control_t fpcr;
+
+ _FPU_GETCW (fpcr);
+
+ /* Set new rounding mode if different. */
+ if (__glibc_unlikely ((fpcr & FE_DOWNWARD) != round))
+ _FPU_SETCW ((fpcr & ~FE_DOWNWARD) | round);
+}
+
+static __always_inline void
+libc_feholdexcept_setround_vfp (fenv_t *envp, int round)
+{
+ fpu_control_t fpsr;
+ fpu_control_t fpcr;
+
+ _FPU_GETCW (fpcr);
+ envp->__fpcr = fpcr;
+
+ _FPU_GETFPSR (fpsr);
+ envp->__fpsr = fpsr;
+
+ /* Clear exception flags, set all exceptions to non-stop,
+ and set new rounding mode. */
+ fpcr &= ~(FE_ALL_EXCEPT | FE_DOWNWARD);
+ _FPU_SETCW (fpcr | round);
+
+ fpsr &= ~(FE_ALL_EXCEPT << CAUSE_SHIFT);
+ _FPU_SETFPSR (fpsr);
+}
+
+static __always_inline void
+libc_feholdsetround_vfp (fenv_t *envp, int round)
+{
+ fpu_control_t fpcr;
+
+ _FPU_GETCW (fpcr);
+ envp->__fpcr = fpcr;
+
+ /* Set new rounding mode if different. */
+ if (__glibc_unlikely ((fpcr & FE_DOWNWARD) != round))
+ _FPU_SETCW ((fpcr & ~FE_DOWNWARD) | round);
+}
+
+static __always_inline void
+libc_feresetround_vfp (fenv_t *envp)
+{
+ fpu_control_t fpcr, round;
+
+ _FPU_GETCW (fpcr);
+
+ /* Check whether rounding modes are different. */
+ round = (envp->__fpcr ^ fpcr) & FE_DOWNWARD;
+
+ /* Restore the rounding mode if it was changed. */
+ if (__glibc_unlikely (round != 0))
+ _FPU_SETCW (fpcr ^ round);
+}
+
+static __always_inline int
+libc_fetestexcept_vfp (int ex)
+{
+ fpu_control_t fpsr;
+
+ _FPU_GETFPSR (fpsr);
+ fpsr = fpsr >> CAUSE_SHIFT;
+ return fpsr & ex & FE_ALL_EXCEPT;
+}
+
+static __always_inline void
+libc_fesetenv_vfp (const fenv_t *envp)
+{
+ unsigned int fpcr;
+ unsigned int fpsr;
+
+ _FPU_GETCW (fpcr);
+ _FPU_GETFPSR (fpsr);
+
+ fpcr &= _FPU_RESERVED;
+ fpsr &= _FPU_FPSR_RESERVED;
+
+ if (envp == FE_DFL_ENV)
+ {
+ fpcr |= _FPU_DEFAULT;
+ fpsr |= _FPU_FPSR_DEFAULT;
+ }
+ else if (envp == FE_NOMASK_ENV)
+ {
+ fpcr |= _FPU_FPCR_IEEE;
+ fpsr |= _FPU_FPSR_IEEE;
+ }
+ else
+ {
+ fpcr |= envp->__fpcr & ~_FPU_RESERVED;
+ fpsr |= envp->__fpsr & ~_FPU_FPSR_RESERVED;
+ }
+
+ _FPU_SETFPSR (fpsr);
+
+ _FPU_SETCW (fpcr);
+}
+
+static __always_inline int
+libc_feupdateenv_test_vfp (const fenv_t *envp, int ex)
+{
+ fpu_control_t fpsr, new_fpsr;
+ int excepts;
+
+ _FPU_GETFPSR (fpsr);
+
+ /* Merge current exception flags with the saved fenv. */
+ excepts = (fpsr >> CAUSE_SHIFT) & FE_ALL_EXCEPT;
+ new_fpsr = envp->__fpsr | (excepts << CAUSE_SHIFT);
+
+ /* Write new FPSCR if different (ignoring NZCV flags). */
+ if (__glibc_unlikely (((fpsr ^ new_fpsr)) != 0))
+ _FPU_SETFPSR (new_fpsr);
+
+ /* Raise the exceptions if enabled in the new FP state. */
+ if (__glibc_unlikely (excepts & (new_fpsr >> CAUSE_SHIFT)))
+ __feraiseexcept (excepts);
+
+ return excepts & ex;
+}
+
+static __always_inline void
+libc_feupdateenv_vfp (const fenv_t *envp)
+{
+ libc_feupdateenv_test_vfp (envp, 0);
+}
+
+static __always_inline void
+libc_feholdsetround_vfp_ctx (struct rm_ctx *ctx, int r)
+{
+ fpu_control_t fpcr, round;
+
+ _FPU_GETCW (fpcr);
+ ctx->updated_status = false;
+ ctx->env.__fpcr = fpcr;
+
+ /* Check whether rounding modes are different. */
+ round = (fpcr ^ r) & FE_DOWNWARD;
+
+ /* Set the rounding mode if changed. */
+ if (__glibc_unlikely (round != 0))
+ {
+ ctx->updated_status = true;
+ _FPU_SETCW (fpcr ^ round);
+ }
+}
+
+static __always_inline void
+libc_feresetround_vfp_ctx (struct rm_ctx *ctx)
+{
+ /* Restore the rounding mode if updated. */
+ if (__glibc_unlikely (ctx->updated_status))
+ {
+ fpu_control_t fpcr;
+
+ _FPU_GETCW (fpcr);
+ fpcr = (fpcr & ~FE_DOWNWARD) | (ctx->env.__fpcr & FE_DOWNWARD);
+ _FPU_SETCW (fpcr);
+ }
+}
+
+static __always_inline void
+libc_fesetenv_vfp_ctx (struct rm_ctx *ctx)
+{
+ fpu_control_t fpcr, new_fpcr;
+
+ _FPU_GETCW (fpcr);
+ new_fpcr = ctx->env.__fpcr;
+
+ /* Write new FPSCR if different (ignoring NZCV flags). */
+ if (__glibc_unlikely (((fpcr ^ new_fpcr)) != 0))
+ _FPU_SETCW (new_fpcr);
+}
+
+# define libc_feholdexcept libc_feholdexcept_vfp
+# define libc_feholdexceptf libc_feholdexcept_vfp
+# define libc_feholdexceptl libc_feholdexcept_vfp
+
+# define libc_fesetround libc_fesetround_vfp
+# define libc_fesetroundf libc_fesetround_vfp
+# define libc_fesetroundl libc_fesetround_vfp
+
+# define libc_feresetround libc_feresetround_vfp
+# define libc_feresetroundf libc_feresetround_vfp
+# define libc_feresetroundl libc_feresetround_vfp
+
+# define libc_feresetround_noex libc_fesetenv_vfp
+# define libc_feresetround_noexf libc_fesetenv_vfp
+# define libc_feresetround_noexl libc_fesetenv_vfp
+
+# define libc_feholdexcept_setround libc_feholdexcept_setround_vfp
+# define libc_feholdexcept_setroundf libc_feholdexcept_setround_vfp
+# define libc_feholdexcept_setroundl libc_feholdexcept_setround_vfp
+
+# define libc_feholdsetround libc_feholdsetround_vfp
+# define libc_feholdsetroundf libc_feholdsetround_vfp
+# define libc_feholdsetroundl libc_feholdsetround_vfp
+
+# define libc_fetestexcept libc_fetestexcept_vfp
+# define libc_fetestexceptf libc_fetestexcept_vfp
+# define libc_fetestexceptl libc_fetestexcept_vfp
+
+# define libc_fesetenv libc_fesetenv_vfp
+# define libc_fesetenvf libc_fesetenv_vfp
+# define libc_fesetenvl libc_fesetenv_vfp
+
+# define libc_feupdateenv libc_feupdateenv_vfp
+# define libc_feupdateenvf libc_feupdateenv_vfp
+# define libc_feupdateenvl libc_feupdateenv_vfp
+
+# define libc_feupdateenv_test libc_feupdateenv_test_vfp
+# define libc_feupdateenv_testf libc_feupdateenv_test_vfp
+# define libc_feupdateenv_testl libc_feupdateenv_test_vfp
+
+/* We have support for rounding mode context. */
+# define HAVE_RM_CTX 1
+
+# define libc_feholdsetround_ctx libc_feholdsetround_vfp_ctx
+# define libc_feresetround_ctx libc_feresetround_vfp_ctx
+# define libc_feresetround_noex_ctx libc_fesetenv_vfp_ctx
+
+# define libc_feholdsetroundf_ctx libc_feholdsetround_vfp_ctx
+# define libc_feresetroundf_ctx libc_feresetround_vfp_ctx
+# define libc_feresetround_noexf_ctx libc_fesetenv_vfp_ctx
+
+# define libc_feholdsetroundl_ctx libc_feholdsetround_vfp_ctx
+# define libc_feresetroundl_ctx libc_feresetround_vfp_ctx
+# define libc_feresetround_noexl_ctx libc_fesetenv_vfp_ctx
+
+#endif /* __csky_hard_float__ */
+
+#endif /* FENV_PRIVATE_H */
diff --git a/sysdeps/csky/libm-test-ulps b/sysdeps/csky/libm-test-ulps
new file mode 100644
index 0000000..aa3d696
--- /dev/null
+++ b/sysdeps/csky/libm-test-ulps
@@ -0,0 +1,1682 @@
+# Begin of automatic generation
+
+# Maximal error of functions:
+Function: "acos":
+float: 1
+ifloat: 1
+
+Function: "acos_downward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "acos_towardzero":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "acos_upward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "acosh":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "acosh_downward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "acosh_towardzero":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "acosh_upward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "asin":
+float: 1
+ifloat: 1
+
+Function: "asin_downward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "asin_towardzero":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "asin_upward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "asinh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "asinh_downward":
+double: 3
+float: 3
+idouble: 3
+ifloat: 3
+
+Function: "asinh_towardzero":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "asinh_upward":
+double: 3
+float: 3
+idouble: 3
+ifloat: 3
+
+Function: "atan":
+float: 1
+ifloat: 1
+
+Function: "atan2":
+float: 1
+ifloat: 1
+
+Function: "atan2_downward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "atan2_towardzero":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "atan2_upward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "atan_downward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "atan_towardzero":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "atan_upward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "atanh":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "atanh_downward":
+double: 3
+float: 3
+idouble: 3
+ifloat: 3
+
+Function: "atanh_towardzero":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "atanh_upward":
+double: 3
+float: 3
+idouble: 3
+ifloat: 3
+
+Function: "cabs":
+double: 1
+idouble: 1
+
+Function: "cabs_downward":
+double: 1
+idouble: 1
+
+Function: "cabs_towardzero":
+double: 1
+idouble: 1
+
+Function: "cabs_upward":
+double: 1
+idouble: 1
+
+Function: Real part of "cacos":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Imaginary part of "cacos":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Real part of "cacos_downward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Imaginary part of "cacos_downward":
+double: 5
+float: 3
+idouble: 5
+ifloat: 3
+
+Function: Real part of "cacos_towardzero":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Imaginary part of "cacos_towardzero":
+double: 5
+float: 3
+idouble: 5
+ifloat: 3
+
+Function: Real part of "cacos_upward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Imaginary part of "cacos_upward":
+double: 4
+float: 4
+idouble: 4
+ifloat: 4
+
+Function: Real part of "cacosh":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Imaginary part of "cacosh":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Real part of "cacosh_downward":
+double: 5
+float: 3
+idouble: 5
+ifloat: 3
+
+Function: Imaginary part of "cacosh_downward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Real part of "cacosh_towardzero":
+double: 5
+float: 3
+idouble: 5
+ifloat: 3
+
+Function: Imaginary part of "cacosh_towardzero":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Real part of "cacosh_upward":
+double: 4
+float: 4
+idouble: 4
+ifloat: 4
+
+Function: Imaginary part of "cacosh_upward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "carg":
+float: 1
+ifloat: 1
+
+Function: "carg_downward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "carg_towardzero":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "carg_upward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Real part of "casin":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "casin":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Real part of "casin_downward":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+
+Function: Imaginary part of "casin_downward":
+double: 5
+float: 3
+idouble: 5
+ifloat: 3
+
+Function: Real part of "casin_towardzero":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+
+Function: Imaginary part of "casin_towardzero":
+double: 5
+float: 3
+idouble: 5
+ifloat: 3
+
+Function: Real part of "casin_upward":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: Imaginary part of "casin_upward":
+double: 4
+float: 4
+idouble: 4
+ifloat: 4
+
+Function: Real part of "casinh":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Imaginary part of "casinh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "casinh_downward":
+double: 5
+float: 3
+idouble: 5
+ifloat: 3
+
+Function: Imaginary part of "casinh_downward":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+
+Function: Real part of "casinh_towardzero":
+double: 5
+float: 3
+idouble: 5
+ifloat: 3
+
+Function: Imaginary part of "casinh_towardzero":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+
+Function: Real part of "casinh_upward":
+double: 4
+float: 4
+idouble: 4
+ifloat: 4
+
+Function: Imaginary part of "casinh_upward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Real part of "catan":
+float: 1
+ifloat: 1
+
+Function: Imaginary part of "catan":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "catan_downward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "catan_downward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Real part of "catan_towardzero":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "catan_towardzero":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: Real part of "catan_upward":
+float: 1
+ifloat: 1
+
+Function: Imaginary part of "catan_upward":
+double: 3
+float: 3
+idouble: 3
+ifloat: 3
+
+Function: Real part of "catanh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "catanh":
+float: 1
+ifloat: 1
+
+Function: Real part of "catanh_downward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Imaginary part of "catanh_downward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Real part of "catanh_towardzero":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: Imaginary part of "catanh_towardzero":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Real part of "catanh_upward":
+double: 4
+float: 3
+idouble: 4
+ifloat: 3
+
+Function: Imaginary part of "catanh_upward":
+float: 1
+ifloat: 1
+
+Function: "cbrt":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+
+Function: "cbrt_downward":
+double: 4
+float: 1
+idouble: 4
+ifloat: 1
+
+Function: "cbrt_towardzero":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+
+Function: "cbrt_upward":
+double: 5
+float: 1
+idouble: 5
+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 "ccos_downward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "ccos_downward":
+double: 2
+float: 3
+idouble: 2
+ifloat: 3
+
+Function: Real part of "ccos_towardzero":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Imaginary part of "ccos_towardzero":
+double: 2
+float: 3
+idouble: 2
+ifloat: 3
+
+Function: Real part of "ccos_upward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Imaginary part of "ccos_upward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+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 "ccosh_downward":
+double: 1
+float: 3
+idouble: 1
+ifloat: 3
+
+Function: Imaginary part of "ccosh_downward":
+double: 2
+float: 3
+idouble: 2
+ifloat: 3
+
+Function: Real part of "ccosh_towardzero":
+double: 1
+float: 3
+idouble: 1
+ifloat: 3
+
+Function: Imaginary part of "ccosh_towardzero":
+double: 2
+float: 3
+idouble: 2
+ifloat: 3
+
+Function: Real part of "ccosh_upward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Imaginary part of "ccosh_upward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+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 "cexp_downward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Imaginary part of "cexp_downward":
+double: 1
+float: 3
+idouble: 1
+ifloat: 3
+
+Function: Real part of "cexp_towardzero":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Imaginary part of "cexp_towardzero":
+double: 1
+float: 3
+idouble: 1
+ifloat: 3
+
+Function: Real part of "cexp_upward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Imaginary part of "cexp_upward":
+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: 3
+ifloat: 4
+
+Function: Imaginary part of "clog10":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Real part of "clog10_downward":
+double: 5
+float: 4
+idouble: 5
+ifloat: 4
+
+Function: Imaginary part of "clog10_downward":
+double: 2
+float: 4
+idouble: 2
+ifloat: 4
+
+Function: Real part of "clog10_towardzero":
+double: 5
+float: 5
+idouble: 5
+ifloat: 5
+
+Function: Imaginary part of "clog10_towardzero":
+double: 2
+float: 4
+idouble: 2
+ifloat: 4
+
+Function: Real part of "clog10_upward":
+double: 6
+float: 5
+idouble: 6
+ifloat: 5
+
+Function: Imaginary part of "clog10_upward":
+double: 2
+float: 4
+idouble: 2
+ifloat: 4
+
+Function: Real part of "clog_downward":
+double: 4
+float: 3
+idouble: 4
+ifloat: 3
+
+Function: Imaginary part of "clog_downward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Real part of "clog_towardzero":
+double: 4
+float: 4
+idouble: 4
+ifloat: 4
+
+Function: Imaginary part of "clog_towardzero":
+double: 1
+float: 3
+idouble: 1
+ifloat: 3
+
+Function: Real part of "clog_upward":
+double: 4
+float: 3
+idouble: 4
+ifloat: 3
+
+Function: Imaginary part of "clog_upward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "cos":
+float: 1
+ifloat: 1
+
+Function: "cos_downward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "cos_towardzero":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "cos_upward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "cosh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "cosh_downward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "cosh_towardzero":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "cosh_upward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Real part of "cpow":
+double: 2
+float: 4
+idouble: 2
+ifloat: 4
+
+Function: Imaginary part of "cpow":
+float: 2
+ifloat: 2
+
+Function: Real part of "cpow_downward":
+double: 4
+float: 8
+idouble: 4
+ifloat: 8
+
+Function: Imaginary part of "cpow_downward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Real part of "cpow_towardzero":
+double: 4
+float: 8
+idouble: 4
+ifloat: 8
+
+Function: Imaginary part of "cpow_towardzero":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Real part of "cpow_upward":
+double: 4
+float: 1
+idouble: 4
+ifloat: 1
+
+Function: Imaginary part of "cpow_upward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Real part of "csin":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "csin_downward":
+double: 2
+float: 3
+idouble: 2
+ifloat: 3
+
+Function: Imaginary part of "csin_downward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "csin_towardzero":
+double: 2
+float: 3
+idouble: 2
+ifloat: 3
+
+Function: Imaginary part of "csin_towardzero":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "csin_upward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Imaginary part of "csin_upward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+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 "csinh_downward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Imaginary part of "csinh_downward":
+double: 2
+float: 3
+idouble: 2
+ifloat: 3
+
+Function: Real part of "csinh_towardzero":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Imaginary part of "csinh_towardzero":
+double: 2
+float: 3
+idouble: 2
+ifloat: 3
+
+Function: Real part of "csinh_upward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: Imaginary part of "csinh_upward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+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 "csqrt_downward":
+double: 5
+float: 4
+idouble: 5
+ifloat: 4
+
+Function: Imaginary part of "csqrt_downward":
+double: 4
+float: 3
+idouble: 4
+ifloat: 3
+
+Function: Real part of "csqrt_towardzero":
+double: 4
+float: 3
+idouble: 4
+ifloat: 3
+
+Function: Imaginary part of "csqrt_towardzero":
+double: 4
+float: 3
+idouble: 4
+ifloat: 3
+
+Function: Real part of "csqrt_upward":
+double: 5
+float: 4
+idouble: 5
+ifloat: 4
+
+Function: Imaginary part of "csqrt_upward":
+double: 3
+float: 3
+idouble: 3
+ifloat: 3
+
+Function: Real part of "ctan":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "ctan":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: Real part of "ctan_downward":
+double: 6
+float: 5
+idouble: 6
+ifloat: 5
+
+Function: Imaginary part of "ctan_downward":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: Real part of "ctan_towardzero":
+double: 5
+float: 3
+idouble: 5
+ifloat: 3
+
+Function: Imaginary part of "ctan_towardzero":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Real part of "ctan_upward":
+double: 2
+float: 3
+idouble: 2
+ifloat: 3
+
+Function: Imaginary part of "ctan_upward":
+double: 2
+float: 3
+idouble: 2
+ifloat: 3
+
+Function: Real part of "ctanh":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: Imaginary part of "ctanh":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Real part of "ctanh_downward":
+double: 4
+float: 1
+idouble: 4
+ifloat: 1
+
+Function: Imaginary part of "ctanh_downward":
+double: 6
+float: 5
+idouble: 6
+ifloat: 5
+
+Function: Real part of "ctanh_towardzero":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Imaginary part of "ctanh_towardzero":
+double: 5
+float: 3
+idouble: 5
+ifloat: 3
+
+Function: Real part of "ctanh_upward":
+double: 2
+float: 3
+idouble: 2
+ifloat: 3
+
+Function: Imaginary part of "ctanh_upward":
+double: 2
+float: 3
+idouble: 2
+ifloat: 3
+
+Function: "erf":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "erf_downward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "erf_towardzero":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "erf_upward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "erfc":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+Function: "erfc_downward":
+double: 5
+float: 6
+idouble: 5
+ifloat: 6
+
+Function: "erfc_towardzero":
+double: 3
+float: 4
+idouble: 3
+ifloat: 4
+
+Function: "erfc_upward":
+double: 5
+float: 6
+idouble: 5
+ifloat: 6
+
+Function: "exp":
+float: 1
+ifloat: 1
+
+Function: "exp10":
+double: 2
+idouble: 2
+
+Function: "exp10_downward":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: "exp10_towardzero":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: "exp10_upward":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: "exp2":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "exp2_downward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "exp2_towardzero":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "exp2_upward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "exp_downward":
+double: 1
+idouble: 1
+
+Function: "exp_towardzero":
+double: 1
+idouble: 1
+
+Function: "exp_upward":
+double: 1
+idouble: 1
+
+Function: "expm1":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "expm1_downward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "expm1_towardzero":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "expm1_upward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "gamma":
+double: 4
+float: 4
+idouble: 4
+ifloat: 4
+
+Function: "gamma_downward":
+double: 5
+float: 4
+idouble: 5
+ifloat: 4
+
+Function: "gamma_towardzero":
+double: 5
+float: 4
+idouble: 5
+ifloat: 4
+
+Function: "gamma_upward":
+double: 5
+float: 5
+idouble: 5
+ifloat: 5
+
+Function: "hypot":
+double: 1
+idouble: 1
+
+Function: "hypot_downward":
+double: 1
+idouble: 1
+
+Function: "hypot_towardzero":
+double: 1
+idouble: 1
+
+Function: "hypot_upward":
+double: 1
+idouble: 1
+
+Function: "j0":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "j0_downward":
+double: 2
+float: 3
+idouble: 2
+ifloat: 3
+
+Function: "j0_towardzero":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+Function: "j0_upward":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+Function: "j1":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "j1_downward":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+Function: "j1_towardzero":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+Function: "j1_upward":
+double: 3
+float: 5
+idouble: 3
+ifloat: 5
+
+Function: "jn":
+double: 4
+float: 4
+idouble: 4
+ifloat: 4
+
+Function: "jn_downward":
+double: 5
+float: 5
+idouble: 5
+ifloat: 5
+
+Function: "jn_towardzero":
+double: 5
+float: 5
+idouble: 5
+ifloat: 5
+
+Function: "jn_upward":
+double: 5
+float: 5
+idouble: 5
+ifloat: 5
+
+Function: "lgamma":
+double: 4
+float: 4
+idouble: 4
+ifloat: 4
+
+Function: "lgamma_downward":
+double: 5
+float: 4
+idouble: 5
+ifloat: 4
+
+Function: "lgamma_towardzero":
+double: 5
+float: 4
+idouble: 5
+ifloat: 4
+
+Function: "lgamma_upward":
+double: 5
+float: 5
+idouble: 5
+ifloat: 5
+
+Function: "log":
+float: 1
+ifloat: 1
+
+Function: "log10":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "log10_downward":
+double: 2
+float: 3
+idouble: 2
+ifloat: 3
+
+Function: "log10_towardzero":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "log10_upward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "log1p":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "log1p_downward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "log1p_towardzero":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "log1p_upward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "log2":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: "log2_downward":
+double: 3
+float: 3
+idouble: 3
+ifloat: 3
+
+Function: "log2_towardzero":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "log2_upward":
+double: 3
+float: 3
+idouble: 3
+ifloat: 3
+
+Function: "log_downward":
+float: 2
+ifloat: 2
+
+Function: "log_towardzero":
+float: 2
+ifloat: 2
+
+Function: "log_upward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "pow":
+float: 1
+ifloat: 1
+
+Function: "pow10":
+double: 2
+idouble: 2
+
+Function: "pow10_downward":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: "pow10_towardzero":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: "pow10_upward":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: "pow_downward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "pow_towardzero":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "pow_upward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "sin":
+float: 1
+ifloat: 1
+
+Function: "sin_downward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "sin_towardzero":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "sin_upward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "sincos":
+float: 1
+ifloat: 1
+
+Function: "sincos_downward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "sincos_towardzero":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "sincos_upward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "sinh":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "sinh_downward":
+double: 3
+float: 3
+idouble: 3
+ifloat: 3
+
+Function: "sinh_towardzero":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "sinh_upward":
+double: 3
+float: 3
+idouble: 3
+ifloat: 3
+
+Function: "tan":
+float: 1
+ifloat: 1
+
+Function: "tan_downward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "tan_towardzero":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "tan_upward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "tanh":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "tanh_downward":
+double: 3
+float: 3
+idouble: 3
+ifloat: 3
+
+Function: "tanh_towardzero":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "tanh_upward":
+double: 3
+float: 3
+idouble: 3
+ifloat: 3
+
+Function: "tgamma":
+double: 5
+float: 4
+idouble: 5
+ifloat: 4
+
+Function: "tgamma_downward":
+double: 5
+float: 5
+idouble: 5
+ifloat: 5
+
+Function: "tgamma_towardzero":
+double: 5
+float: 4
+idouble: 5
+ifloat: 4
+
+Function: "tgamma_upward":
+double: 4
+float: 4
+idouble: 4
+ifloat: 4
+
+Function: "y0":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: "y0_downward":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+Function: "y0_towardzero":
+double: 3
+float: 3
+idouble: 3
+ifloat: 3
+
+Function: "y0_upward":
+double: 3
+float: 4
+idouble: 3
+ifloat: 4
+
+Function: "y1":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+Function: "y1_downward":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+Function: "y1_towardzero":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+Function: "y1_upward":
+double: 7
+float: 2
+idouble: 7
+ifloat: 2
+
+Function: "yn":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+Function: "yn_downward":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+Function: "yn_towardzero":
+double: 3
+float: 3
+idouble: 3
+ifloat: 3
+
+Function: "yn_upward":
+double: 4
+float: 4
+idouble: 4
+ifloat: 4
+
+# end of automatic generation
diff --git a/sysdeps/csky/libm-test-ulps-name b/sysdeps/csky/libm-test-ulps-name
new file mode 100644
index 0000000..236b0fb
--- /dev/null
+++ b/sysdeps/csky/libm-test-ulps-name
@@ -0,0 +1 @@
+CSKY
diff --git a/sysdeps/csky/math-tests.h b/sysdeps/csky/math-tests.h
new file mode 100644
index 0000000..30d9b73
--- /dev/null
+++ b/sysdeps/csky/math-tests.h
@@ -0,0 +1,35 @@
+/* Configuration for math tests. C-SKY 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/>. */
+
+/* On systems with VFP support, but where glibc is built for
+ soft-float, the libgcc functions used in libc and libm do not
+ support rounding modes, although fesetround succeeds, and do not
+ support exceptions. */
+#ifdef __CSKY_SOFT_FLOAT__
+# 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
+#endif
+
+/* Not all VFP implementations support trapping exceptions. */
+#define EXCEPTION_ENABLE_SUPPORTED(EXCEPT) ((EXCEPT) == 0)
+
+#include_next <math-tests.h>
diff --git a/sysdeps/csky/math_private.h b/sysdeps/csky/math_private.h
new file mode 100644
index 0000000..db303da
--- /dev/null
+++ b/sysdeps/csky/math_private.h
@@ -0,0 +1,7 @@
+#ifndef CSKY_MATH_PRIVATE_H
+#define CSKY_MATH_PRIVATE_H 1
+
+#include "fenv_private.h"
+#include_next <math_private.h>
+
+#endif
diff --git a/sysdeps/csky/sfp-machine.h b/sysdeps/csky/sfp-machine.h
new file mode 100644
index 0000000..2e7c156
--- /dev/null
+++ b/sysdeps/csky/sfp-machine.h
@@ -0,0 +1,51 @@
+#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
+#define _FP_NANFRAC_D _FP_QNANBIT_D, 0
+#define _FP_NANFRAC_Q _FP_QNANBIT_Q, 0, 0, 0
+#define _FP_NANSIGN_S 0
+#define _FP_NANSIGN_D 0
+#define _FP_NANSIGN_Q 0
+
+#define _FP_KEEPNANFRACP 1
+#define _FP_QNANNEGATEDP 0
+
+/* Someone please check this. */
+#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] 22+ messages in thread
* Re: [RFC PATCH 00/10] port C-SKY to glibc
2018-03-16 9:59 [RFC PATCH 00/10] port C-SKY to glibc Mao Han
` (9 preceding siblings ...)
2018-03-16 9:59 ` [RFC PATCH 09/10] C-SKY: Linux Syscall Interface Mao Han
@ 2018-03-16 13:52 ` Carlos O'Donell
10 siblings, 0 replies; 22+ messages in thread
From: Carlos O'Donell @ 2018-03-16 13:52 UTC (permalink / raw)
To: Mao Han, libc-help; +Cc: ren_guo, yunhai_shang, qijie_tong, chunqiang_li
On 03/16/2018 03:58 AM, Mao Han wrote:
> I am working on editing C-SKY Glibc porting, and want to upstream these
> patches to the official master branch. I send the email for the initial
> review, and want get some suggestion on what I should do next.
> I was Employed by Hangzhou C-SKY Microsystems Co., Ltd.; and responsible
> for the C-SKY porting of Glibc. Meanwhile, we are doing the upstreams of
> C-SKY GCC, binutils, GDB and Linux. Mentor graphic is helping us with the
> upstream submission of GCC, binutils, GDB. More information about us is on
> http://en.c-sky.com/.
>
> This patchset adds architecture support to Glibc for CK610, CK807, CK810
> processor cores. It base on the release version of 2.27.
>
> CK610 is the second-generation CPU of CSKY, fullycompatible with M*Core.
> CK807/CK810 bases on C-SKY V2 instruction set architecture and 16/32-bit
> variable length instruction. Including basic core(CK807/CK810),
> floating-point enhancement(CK807F/CK810F), multimedia enhancement (CK810D)
> and multiple-processing extension (CK807MP/CK810MP).
>
> The porting of C-SKY Glibc is tested in our CI enviroment. Toolchain, kernel,
> test packages are built form source code via builtroot. LTP, Lmbench, dhrystone
> etc are tested in the enviroment.
> Here is our CI envoirnment:
> https://gitlab.com/c-sky/buildroot/pipelines
Thank you for your contribution! Thank you also for starting this process
with enough time to do a proper review before the glibc 2.28 release in
August.
I have confirmed that Hangzhou C-SKY Microsystems Co., Ltd. has a corporate
copyright assignment in place with the FSF. The future assignment means we
can commit this code easily after review.
I assume you are looking for review via libc-help before posting to libc-alpha?
Cheers,
Carlos.
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [RFC PATCH 01/10] C-SKY: ABI related code
2018-03-16 9:59 ` [RFC PATCH 01/10] C-SKY: ABI related code Mao Han
@ 2018-03-16 14:04 ` Carlos O'Donell
0 siblings, 0 replies; 22+ messages in thread
From: Carlos O'Donell @ 2018-03-16 14:04 UTC (permalink / raw)
To: Mao Han, libc-help; +Cc: ren_guo, yunhai_shang, qijie_tong, chunqiang_li
On 03/16/2018 03:58 AM, Mao Han wrote:
> Codes in this patch contains lots of C-SKY ABI related code. They are written
> accroding to the registers assgnments, relocations, assemblly described
> in C-SKY CPU ABI Standards and C-SKY CPU manual.
> This does not contain any linux related code.
>
Looks good overall. There will be more to discuss on libc-alpha, but I don't
see any huge problems, just a question of if you can expand jmpbuf to account
for future changes.
> *sysdeps/csky/__longjmp.S: New file
> *sysdeps/csky/backtrace.c: New file
> *sysdeps/csky/bits/endian.h: New file
> *sysdeps/csky/bits/setjmp.h: New file
> *sysdeps/csky/bsd-_setjmp.S: New file
> *sysdeps/csky/bsd-setjmp.S: New file
> *sysdeps/csky/dl-trampoline.S: New file
> *sysdeps/csky/gccframe.h: New file
> *sysdeps/csky/jmpbuf-unwind.h: New file
> *sysdeps/csky/setjmp.S: New file
> *sysdeps/csky/tls-macros.h: New file
> *sysdeps/csky/crti.S: New file
> *sysdeps/csky/crtn.S: New file
> *sysdeps/csky/csky-mcount.S: New file
> *sysdeps/csky/abort-instr.h: New file
> *sysdeps/unix/csky/abiv2_sysdep.S: New file
> *sysdeps/unix/csky/sysdep.S: New file
> *sysdeps/unix/csky/sysdep.h: New file
> *sysdeps/csky/start.S: New file
> *sysdeps/csky/strcmp.S: New file
> *sysdeps/csky/strcpy.S: New file
> *sysdeps/csky/memcpy.S: New file
> *sysdeps/csky/macro.S: New file
> *sysdeps/csky/memusage.h: New file
> *sysdeps/csky/machine-gmon.h: New file
> *sysdeps/csky/bits/link.h: New file
> *sysdeps/csky/sys/ucontext.h: New file
> *sysdeps/csky/sysdep.h: New file
Proper changelog format is:
'* sysdeps/csky/sysdep.h: New file'
With space after '*'
>
> Signed-off-by: Mao Han <han_mao@c-sky.com>
> ---
> sysdeps/csky/__longjmp.S | 67 +++++++
> sysdeps/csky/abort-instr.h | 2 +
> sysdeps/csky/backtrace.c | 128 +++++++++++++
> sysdeps/csky/bits/endian.h | 10 +
> sysdeps/csky/bits/link.h | 54 ++++++
> sysdeps/csky/bits/setjmp.h | 32 ++++
> sysdeps/csky/bsd-_setjmp.S | 1 +
> sysdeps/csky/bsd-setjmp.S | 1 +
> sysdeps/csky/crti.S | 113 +++++++++++
> sysdeps/csky/crtn.S | 51 +++++
> sysdeps/csky/csky-mcount.S | 87 +++++++++
> sysdeps/csky/dl-trampoline.S | 110 +++++++++++
> sysdeps/csky/gccframe.h | 21 ++
> sysdeps/csky/jmpbuf-unwind.h | 47 +++++
> sysdeps/csky/machine-gmon.h | 32 ++++
> sysdeps/csky/macro.S | 31 +++
> sysdeps/csky/memcpy.S | 400 +++++++++++++++++++++++++++++++++++++++
> sysdeps/csky/memusage.h | 20 ++
> sysdeps/csky/setjmp.S | 95 ++++++++++
> sysdeps/csky/start.S | 133 +++++++++++++
> sysdeps/csky/strcmp.S | 337 +++++++++++++++++++++++++++++++++
> sysdeps/csky/strcpy.S | 273 ++++++++++++++++++++++++++
> sysdeps/csky/sys/ucontext.h | 116 ++++++++++++
> sysdeps/csky/sysdep.h | 46 +++++
> sysdeps/csky/tls-macros.h | 106 +++++++++++
> sysdeps/unix/csky/abiv2_sysdep.S | 73 +++++++
> sysdeps/unix/csky/sysdep.S | 84 ++++++++
> sysdeps/unix/csky/sysdep.h | 26 +++
> 28 files changed, 2496 insertions(+)
> create mode 100644 sysdeps/csky/__longjmp.S
> create mode 100644 sysdeps/csky/abort-instr.h
> create mode 100644 sysdeps/csky/backtrace.c
> create mode 100644 sysdeps/csky/bits/endian.h
> create mode 100644 sysdeps/csky/bits/link.h
> create mode 100644 sysdeps/csky/bits/setjmp.h
> create mode 100644 sysdeps/csky/bsd-_setjmp.S
> create mode 100644 sysdeps/csky/bsd-setjmp.S
> create mode 100644 sysdeps/csky/crti.S
> create mode 100644 sysdeps/csky/crtn.S
> create mode 100644 sysdeps/csky/csky-mcount.S
> create mode 100644 sysdeps/csky/dl-trampoline.S
> create mode 100644 sysdeps/csky/gccframe.h
> create mode 100644 sysdeps/csky/jmpbuf-unwind.h
> create mode 100644 sysdeps/csky/machine-gmon.h
> create mode 100644 sysdeps/csky/macro.S
> create mode 100644 sysdeps/csky/memcpy.S
> create mode 100644 sysdeps/csky/memusage.h
> create mode 100644 sysdeps/csky/setjmp.S
> create mode 100644 sysdeps/csky/start.S
> create mode 100644 sysdeps/csky/strcmp.S
> create mode 100644 sysdeps/csky/strcpy.S
> create mode 100644 sysdeps/csky/sys/ucontext.h
> create mode 100644 sysdeps/csky/sysdep.h
> create mode 100644 sysdeps/csky/tls-macros.h
> create mode 100644 sysdeps/unix/csky/abiv2_sysdep.S
> create mode 100644 sysdeps/unix/csky/sysdep.S
> create mode 100644 sysdeps/unix/csky/sysdep.h
>
> diff --git a/sysdeps/csky/__longjmp.S b/sysdeps/csky/__longjmp.S
> new file mode 100644
> index 0000000..9823fce
> --- /dev/null
> +++ b/sysdeps/csky/__longjmp.S
> @@ -0,0 +1,67 @@
> +/* 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 <sysdep.h>
> +
> +ENTRY(__longjmp)
> + mov a2, a0
> + mov a0, a1 /* get the return value in place */
> + cmpnei a0, 0
> + bt have_return
> + movi a0, 1 /* can't let setjmp() return zero! */
> +have_return:
> +#ifdef CHECK_SP
> + ldw r10, (a2, 0) /* jmpbuf's sp */
> + CHECK_SP(r10)
> +#endif
> +#ifdef __CSKYABIV2__
> + ldw sp, (a2, 0)
> + ldw lr, (a2, 4)
> + ldw r4, (a2, 8)
> + ldw r5, (a2, 12)
> + ldw r6, (a2, 16)
> + ldw r7, (a2, 20)
> + ldw r8, (a2, 24)
> + ldw r9, (a2, 28)
> + ldw r10, (a2, 32)
> + ldw r11, (a2, 36)
> + ldw r16, (a2, 40)
> + ldw r17, (a2, 44)
> + ldw r26, (a2, 48)
> + ldw r27, (a2, 52)
> + ldw r28, (a2, 56)
> + ldw r29, (a2, 60)
> + ldw r30, (a2, 64)
> + ldw r31, (a2, 68)
> + addi a2, 72
> +#else
> + ldw sp, (a2, 0)
> + ldw lr, (a2, 4)
> + ldw r8, (a2, 8)
> + ldw r9, (a2, 12)
> + ldw r10, (a2, 16)
> + ldw r11, (a2, 20)
> + ldw r12, (a2, 24)
> + ldw r13, (a2, 28)
> + ldw r14, (a2, 32)
> + addi a2, 32
> + addi a2, 4
> +#endif
> +
> + jmp lr
> +
> +END(__longjmp)
> diff --git a/sysdeps/csky/abort-instr.h b/sysdeps/csky/abort-instr.h
> new file mode 100644
> index 0000000..27a3536
> --- /dev/null
> +++ b/sysdeps/csky/abort-instr.h
> @@ -0,0 +1,2 @@
> +/* An instruction which should crash any program is a breakpoint. */
> +#define ABORT_INSTRUCTION asm ("bkpt")
> diff --git a/sysdeps/csky/backtrace.c b/sysdeps/csky/backtrace.c
> new file mode 100644
> index 0000000..9a6f36c
> --- /dev/null
> +++ b/sysdeps/csky/backtrace.c
> @@ -0,0 +1,128 @@
> +/* Return backtrace of current program state.
> + 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 <libc-lock.h>
> +#include <dlfcn.h>
> +#include <execinfo.h>
> +#include <stdlib.h>
> +#include <unwind.h>
> +
> +struct trace_arg
> +{
> + void **array;
> + _Unwind_Word cfa;
> + int cnt;
> + int size;
> +};
> +
> +#ifdef SHARED
> +static _Unwind_Reason_Code (*unwind_backtrace) (_Unwind_Trace_Fn, void *);
> +static _Unwind_Ptr (*unwind_getip) (struct _Unwind_Context *);
> +static _Unwind_Word (*unwind_getcfa) (struct _Unwind_Context *);
> +static void *libgcc_handle;
> +
> +/* Dummy version in case libgcc_s does not contain the real code. */
> +static _Unwind_Word
> +dummy_getcfa (struct _Unwind_Context *ctx __attribute__ ((unused)))
> +{
> + return 0;
> +}
> +
> +
> +static void
> +init (void)
> +{
> + libgcc_handle = __libc_dlopen ("libgcc_s.so.1");
> +
> + if (libgcc_handle == NULL)
> + return;
> +
> + unwind_backtrace = __libc_dlsym (libgcc_handle, "_Unwind_Backtrace");
> + unwind_getip = __libc_dlsym (libgcc_handle, "_Unwind_GetIP");
> + if (unwind_getip == NULL)
> + unwind_backtrace = NULL;
> + unwind_getcfa = (__libc_dlsym (libgcc_handle, "_Unwind_GetCFA")
> + ?: dummy_getcfa);
> +}
> +#else
> +# define unwind_backtrace _Unwind_Backtrace
> +# define unwind_getip _Unwind_GetIP
> +# define unwind_getcfa _Unwind_GetCFA
> +#endif
> +
> +static _Unwind_Reason_Code
> +backtrace_helper (struct _Unwind_Context *ctx, void *a)
> +{
> + struct trace_arg *arg = a;
> +
> + /* We are first called with address in the __backtrace function.
> + Skip it. */
> + if (arg->cnt != -1)
> + {
> + arg->array[arg->cnt] = (void *) unwind_getip (ctx);
> +
> + /* Check whether we make any progress. */
> + _Unwind_Word cfa = unwind_getcfa (ctx);
> +
> + if (arg->cnt > 0 && arg->array[arg->cnt - 1] == arg->array[arg->cnt]
> + && cfa == arg->cfa)
> + return _URC_END_OF_STACK;
> + arg->cfa = cfa;
> + }
> + if (++arg->cnt == arg->size)
> + return _URC_END_OF_STACK;
> + return _URC_NO_REASON;
> +}
> +
> +int
> +__backtrace (void **array, int size)
> +{
> + struct trace_arg arg = { .array = array, .cfa = 0, .size = size, .cnt = -1 };
> +#ifdef SHARED
> + __libc_once_define (static, once);
> +
> + __libc_once (once, init);
> + if (unwind_backtrace == NULL)
> + return 0;
> +#endif
> +
> + if (size >= 1)
> + unwind_backtrace (backtrace_helper, &arg);
> +
> + /* _Unwind_Backtrace seems to put NULL address above
> + _start. Fix it up here. */
> + if (arg.cnt > 1 && arg.array[arg.cnt - 1] == NULL)
> + --arg.cnt;
> + return arg.cnt != -1 ? arg.cnt : 0;
> +}
> +weak_alias (__backtrace, backtrace)
> +libc_hidden_def (__backtrace)
> +
> +
> +#ifdef SHARED
> +/* Free all resources if necessary. */
> +libc_freeres_fn (free_mem)
> +{
> + unwind_backtrace = NULL;
> + if (libgcc_handle != NULL)
> + {
> + __libc_dlclose (libgcc_handle);
> + libgcc_handle = NULL;
> + }
> +}
> +#endif
> diff --git a/sysdeps/csky/bits/endian.h b/sysdeps/csky/bits/endian.h
> new file mode 100644
> index 0000000..cc66abb
> --- /dev/null
> +++ b/sysdeps/csky/bits/endian.h
> @@ -0,0 +1,10 @@
> +#ifndef _ENDIAN_H
> +# error "Never use <bits/endian.h> directly; include <endian.h> instead."
> +#endif
> +
> +/* CSKY can be either big or little endian. */
> +#ifdef __CSKYBE__
> +# define __BYTE_ORDER __BIG_ENDIAN
> +#else
> +# define __BYTE_ORDER __LITTLE_ENDIAN
> +#endif
OK.
> diff --git a/sysdeps/csky/bits/link.h b/sysdeps/csky/bits/link.h
> new file mode 100644
> index 0000000..87121ca
> --- /dev/null
> +++ b/sysdeps/csky/bits/link.h
> @@ -0,0 +1,54 @@
> +/* 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/>. */
> +
> +#ifndef _LINK_H
> +# error "Never include <bits/link.h> directly; use <link.h> instead."
> +#endif
> +
> +/* Registers for entry into PLT on CSKY. */
> +typedef struct La_csky_regs
> + {
> + uint32_t lr_reg[4];
> + uint32_t lr_sp;
> + uint32_t lr_lr;
> + } La_csky_regs;
> +
> +/* Return values for calls from PLT on CSKY. */
> +typedef struct La_csky_retval
> + {
> + /* Up to four integer registers can be used for a return value. */
> + uint32_t lrv_reg[4];
> + uint32_t lrv_v0;
> + } La_csky_retval;
> +
> +__BEGIN_DECLS
> +
> +extern Elf32_Addr la_csky_gnu_pltenter (Elf32_Sym *__sym, unsigned int __ndx,
> + uintptr_t *__refcook,
> + uintptr_t *__defcook,
> + La_csky_regs *__regs,
> + unsigned int *__flags,
> + const char *__symname,
> + long int *__framesizep);
> +extern unsigned int la_csky_gnu_pltexit (Elf32_Sym *__sym, unsigned int __ndx,
> + uintptr_t *__refcook,
> + uintptr_t *__defcook,
> + const La_csky_regs *__inregs,
> + La_csky_retval *__outregs,
> + const char *__symname);
> +
> +__END_DECLS
> diff --git a/sysdeps/csky/bits/setjmp.h b/sysdeps/csky/bits/setjmp.h
> new file mode 100644
> index 0000000..b3edd38
> --- /dev/null
> +++ b/sysdeps/csky/bits/setjmp.h
> @@ -0,0 +1,32 @@
> +/* Define the machine-dependent type `jmp_buf'. C-SKY 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/>. */
> +
> +#ifndef _CSKY_BITS_SETJMP_H
> +#define _CSKY_BITS_SETJMP_H 1
> +
> +typedef struct __jmp_buf_str
> + {
> + /* Stack pointer. */
> + int __sp;
> + int __lr;
> + /* Callee-saved registers:
> + r4 ~ r11, r16 ~ r17, r26 ~r31 for abiv2; r8 ~ r14 for abiv1. */
> + int __regs[16];
If this is the first incarnation of an ABI, I would recommend adding space
in your jump buffer and context structures to allow for future growth.
Even some space may be vary valuable later.
> + } __jmp_buf[1];
> +
> +#endif
> diff --git a/sysdeps/csky/bsd-_setjmp.S b/sysdeps/csky/bsd-_setjmp.S
> new file mode 100644
> index 0000000..4e6a2da
> --- /dev/null
> +++ b/sysdeps/csky/bsd-_setjmp.S
> @@ -0,0 +1 @@
> +/* _setjmp is in setjmp.S */
> diff --git a/sysdeps/csky/bsd-setjmp.S b/sysdeps/csky/bsd-setjmp.S
> new file mode 100644
> index 0000000..1da848d
> --- /dev/null
> +++ b/sysdeps/csky/bsd-setjmp.S
> @@ -0,0 +1 @@
> +/* setjmp is in setjmp.S */
> diff --git a/sysdeps/csky/crti.S b/sysdeps/csky/crti.S
> new file mode 100644
> index 0000000..60fa3a7
> --- /dev/null
> +++ b/sysdeps/csky/crti.S
> @@ -0,0 +1,113 @@
> +/* Special .init and .fini section support for C-SKY.
> + 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.
> +
> + 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
> +
> +#if PREINIT_FUNCTION_WEAK
> + .align 4
> + .type call_weak_fn, %function
> +call_weak_fn:
> + subi sp, 4
> + stw lr, (sp)
> + lrw a2, PREINIT_FUNCTION@GOT
> + addu a2, gb
> + ldw a2, (a2)
> + cmpnei a2, 0
> + bf 1f
> + jsr a2
> +1:
> + ldw lr, (sp)
> + addi sp, 4
> + rts
> +#endif /* PREINIT_FUNCTION_WEAK */
> +
> + .section .init,"ax",@progbits
> + .align 4
> + .globl _init
> + .type _init, @function
> +_init:
> + subi sp, 8
> + stw lr, (sp, 0)
> + stw gb, (sp, 4)
> + bsr .Lgetpc
> +.Lgetpc:
> + lrw gb, .Lgetpc@GOTPC
> + add gb, lr
> +#if PREINIT_FUNCTION_WEAK
> + lrw a2, call_weak_fn@GOTOFF
> + add a2, gb
> + jsr a2
> +#else
> + lrw a2, PREINIT_FUNCTION@PLT
> + addu a2, gb
> + ldw a2, (a2)
> + jsr a2
> +#endif /* PREINIT_FUNCTION_WEAK */
> + br 2f
> + .literals
> + .align 4
> +2:
> +
> + .section .fini,"ax",@progbits
> + .align 4
> + .globl _fini
> + .type _fini, @function
> +_fini:
> + subi sp,8
> + stw lr, (sp, 0)
> + br 2f
> + .literals
> + .align 4
> +2:
> diff --git a/sysdeps/csky/crtn.S b/sysdeps/csky/crtn.S
> new file mode 100644
> index 0000000..a5392d9
> --- /dev/null
> +++ b/sysdeps/csky/crtn.S
> @@ -0,0 +1,51 @@
> +/* Special .init and .fini section support for C-SKY.
> + 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.
> +
> + 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/>. */
> +
> +#include <sysdep.h>
> +
> +/* crtn.S puts function epilogues in the .init and .fini sections
> + corresponding to the prologues in crti.S. */
> +
> + .section .init,"ax",@progbits
> + ldw lr, (sp, 0)
> + ldw gb, (sp, 4)
> + addi sp, 8
> + rts
> +
> + .section .fini,"ax",@progbits
> + ldw lr, (sp, 0)
> + addi sp,8
> + rts
> +
> diff --git a/sysdeps/csky/csky-mcount.S b/sysdeps/csky/csky-mcount.S
> new file mode 100644
> index 0000000..77934f5
> --- /dev/null
> +++ b/sysdeps/csky/csky-mcount.S
> @@ -0,0 +1,87 @@
> +/* Implementation of profiling support. C-SKY 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/>. */
> +
> +/* Don't call mcount when calling mcount... */
> +#undef PROF
> +
> +#include <sysdep.h>
> +
> +/* Use an assembly stub with a special ABI. The calling lr has been
> + pushed to the stack (which will be misaligned). We should preserve
> + all registers except ip and pop a word off the stack.
> +
> + NOTE: This assumes mcount_internal does not clobber any non-core
> + (coprocessor) registers. Currently this is true, but may require
> + additional attention in the future.
> +
> + The calling sequence looks something like:
> +func:
> + push lr
> + jbsr __gnu_mount_nc
> + <function body>
> +*/
> +
> +ENTRY(_mcount)
> +#ifdef __CSKYABIV2__
> + subi sp,20
> + stw a0,(sp, 0)
> + stw a1,(sp, 4)
> + stw a2,(sp, 8)
> + stw a3,(sp, 12)
> + stw lr,(sp, 16)
> + mov a1, lr
> + ldw a0, (sp, 20)
> + jbsr __mcount_internal
> + ldw a0,(sp, 0)
> + ldw a1,(sp, 4)
> + ldw a2,(sp, 8)
> + ldw a3,(sp, 12)
> + ldw t1,(sp, 16)
> + ldw lr,(sp, 20)
> + addi sp,24
> + jmp t1
> +#else
> + subi sp,28
> + stw a0,(sp, 0)
> + stw a1,(sp, 4)
> + stw a2,(sp, 8)
> + stw a3,(sp, 12)
> + stw a4,(sp, 16)
> + stw a5,(sp, 20)
> + stw lr,(sp, 24)
> + mov a1, lr
> + ldw a0, (sp, 28)
> + jbsr __mcount_internal
> + ldw a0,(sp, 0)
> + ldw a1,(sp, 4)
> + ldw a2,(sp, 8)
> + ldw a3,(sp, 12)
> + ldw a4,(sp, 16)
> + ldw a5,(sp, 20)
> + ldw r1,(sp, 24)
> + ldw lr,(sp, 28)
> + addi sp,32
> + jmp r1
> +#endif
> +
> +END(_mcount)
> +
> +/* The canonical name for the function is `_mcount' in both C and asm,
> + but some old asm code might assume it's `mcount'. */
> +#undef mcount
> +weak_alias (_mcount, mcount)
> diff --git a/sysdeps/csky/dl-trampoline.S b/sysdeps/csky/dl-trampoline.S
> new file mode 100644
> index 0000000..a9eefb3
> --- /dev/null
> +++ b/sysdeps/csky/dl-trampoline.S
> @@ -0,0 +1,110 @@
> +/* 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/>. */
> +
> +/* This function is not called directly. It is jumped when attempting to use a
> + symbol that has not yet been resolved.
> +
> + .plt*:
> + subi r0, 32
> + stw r2, (r0, 0)
> + stw r3, (r0, 4)
> + lrw r3, #offset
> + ldw r2, (gb, 8)
> + jmp r2
> + */
> +
> +.import _dl_fixup
> +
> +.text
> +.globl _dl_runtime_resolve
> +.type _dl_runtime_resolve,@function
> +
> +_dl_runtime_resolve:
> +#if !defined(__CSKYABIV2__)
> +# if !defined(__ck810__)
> + stw r4, (r0, 8)
> + stw r5, (r0, 12)
> + stw r6, (r0, 16)
> + stw r7, (r0, 20)
> + stw r15,(r0, 24)
> + # load the ID of this module
> + ldw r2, (gb, 4)
> + mov r6, r3
> + addu r6, r6
> + addu r3, r6
> + lsli r3, 2
> + # r2 = id, r3 = offset(do it in plt*)
> +# ifdef __PIC__
> + # get global offset table address_
> + bsr .L2
> +.L2:
> + lrw r7, .L2@GOTPC
> + add r7, r15
> + # get the address of function (_dl_fixup) in got table
> + lrw r6, _dl_fixup@GOT
> + add r6, r7
> + ldw r5, (r6, 0)
> + jsr r5
> +# else
> + jsri _dl_fixup
> +# endif /* !__PIC__ */
> + # Return from _dl_fixup, the address of function is in r2
> + mov r1, r2
> + # Restore the registers
> + ldw r2, (r0, 0)
> + ldw r3, (r0, 4)
> + ldw r4, (r0, 8)
> + ldw r5, (r0, 12)
> + ldw r6, (r0, 16)
> + ldw r7, (r0, 20)
> + ldw r15,(r0, 24)
> + # Restore the r0, because r0 is subtracted in PLT table
> + addi r0, 32
> + # The address of function is in r1, call the function without saving pc
> + jmp r1
> +# else /* __ck810__ */
> + subi sp, 32
> + stm r2-r7, (sp)
> + stw r15, (sp, 24)
> + ldw r2, (gb, 4)
> + mov r6, r3
> + addu r6, r6
> + addu r3, r6
> + lsli r3, 2
> + mov r3, r21
> + bsr _dl_fixup
> + mov r20, r2
> + ldw r15, (sp, 24)
> + ldm r2-r7, (sp)
> + addi sp, 32
> + jmp r20
> +# endif /* __ck810__ */
> +#else /* __CSKYABIV2__ */
> + subi sp, 20
> + stm a0-a3, (sp)
> + stw lr, (sp, 16)
> + # a0 = id, a1 = offset(do it in plt*)
> + ldw a0, (gb, 4)
> + movi a1, 12
> + mult a1, t1
> + bsr _dl_fixup
> + mov t0, a0
> + ldw lr, (sp, 16)
> + ldm a0-a3, (sp)
> + addi sp, 20
> + jmp t0
> +#endif /* __CSKYABIV2__ */
> diff --git a/sysdeps/csky/gccframe.h b/sysdeps/csky/gccframe.h
> new file mode 100644
> index 0000000..9451101
> --- /dev/null
> +++ b/sysdeps/csky/gccframe.h
> @@ -0,0 +1,21 @@
> +/* Definition of object in frame unwind info. C-SKY 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 FIRST_PSEUDO_REGISTER 71
> +
> +#include <sysdeps/generic/gccframe.h>
> diff --git a/sysdeps/csky/jmpbuf-unwind.h b/sysdeps/csky/jmpbuf-unwind.h
> new file mode 100644
> index 0000000..30b92d0
> --- /dev/null
> +++ b/sysdeps/csky/jmpbuf-unwind.h
> @@ -0,0 +1,47 @@
> +/* 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 <setjmp.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) < (void *) demangle ((jmpbuf)[0].__sp))
> +
> +#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
> + _JMPBUF_UNWINDS_ADJ (_jmpbuf, \
> + (void *) (_Unwind_Ptr) _Unwind_GetCFA (_context), \
> + _adj)
> +
> +static inline uintptr_t __attribute__ ((unused))
> +_jmpbuf_sp (__jmp_buf regs)
> +{
> + uintptr_t sp = (uintptr_t) regs[0].__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/csky/machine-gmon.h b/sysdeps/csky/machine-gmon.h
> new file mode 100644
> index 0000000..96c100e
> --- /dev/null
> +++ b/sysdeps/csky/machine-gmon.h
> @@ -0,0 +1,32 @@
> +/* Machine-dependent definitions for profiling support. CSKY 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 <sysdep.h>
> +
> +/* GCC for the CSKY cannot compile __builtin_return_address(N) for N != 0,
> + so we must use an assembly stub. */
> +
> +/* We must not pollute the global namespace. */
> +#define mcount_internal __mcount_internal
> +
> +extern void mcount_internal (u_long frompc, u_long selfpc);
> +#define _MCOUNT_DECL(frompc, selfpc) \
> + void mcount_internal (u_long frompc, u_long selfpc)
> +
> +/* Define MCOUNT as empty since we have the implementation in another file. */
> +#define MCOUNT
> diff --git a/sysdeps/csky/macro.S b/sysdeps/csky/macro.S
> new file mode 100644
> index 0000000..436d061
> --- /dev/null
> +++ b/sysdeps/csky/macro.S
> @@ -0,0 +1,31 @@
> +/* Macro defiation for string/mem operations on different cpu types
> + 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/>. */
> +
> +.macro M_BEZ rx, label
> + bez \rx, \label
> +.endm
> +
> +.macro M_BNEZ rx, label
> + bnez \rx, \label
> +.endm
> +
> +.macro M_BNE rx, ry, label
> + cmpne \rx, \ry
> + bt \label
> +.endm
> +
> diff --git a/sysdeps/csky/memcpy.S b/sysdeps/csky/memcpy.S
> new file mode 100644
> index 0000000..e4a34e8
> --- /dev/null
> +++ b/sysdeps/csky/memcpy.S
> @@ -0,0 +1,400 @@
> +/* The assembly function for memcpy. C-SKY 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 <sysdep.h>
> +
> +.macro GET_FRONT_BITS rx ry
> +#ifdef __cskyLE__
> + lsr \rx, \ry
> +#else
> + lsl \rx, \ry
> +#endif
> +.endm
> +
> +.macro GET_AFTER_BITS rx ry
> +#ifdef __cskyLE__
> + lsl \rx, \ry
> +#else
> + lsr \rx, \ry
> +#endif
> +.endm
> +
> +ENTRY(memcpy)
> +#ifndef __CSKYABIV2__
> + /* If len less than 4 bytes */
> + mov r7, r2
> + cmplti r4, 4
> + jbt .L_copy_by_byte
> +
> + /* If dest is not 4 bytes aligned */
> + mov r6, r2
> + andi r6, 3
> + cmpnei r6, 0
> + jbt .L_dest_not_aligned
> + .L0:
> + mov r6, r3
> + andi r6, 3
> + cmpnei r6, 0
> + /* If dest is aligned, but src is not aligned */
> + jbt .L_dest_aligned_but_src_not_aligned
> +
> + /* If dest and src are all aligned and len less than 16 bytes */
> + cmplti r4, 16
> + jbt .L_aligned_and_len_less_16bytes
> +
> + /* src and dst are all aligned, and len > 16 bytes */
> + subi sp, 8
> + stw r8, (sp, 0)
> + stw r9, (sp, 4)
> +.L_aligned_and_len_larger_16bytes:
> + ldw r1, (r3, 0)
> + ldw r5, (r3, 4)
> + ldw r8, (r3, 8)
> + ldw r9, (r3, 12)
> + stw r1, (r7, 0)
> + stw r5, (r7, 4)
> + stw r8, (r7, 8)
> + stw r9, (r7, 12)
> + subi r4, 16
> + addi r3, 16
> + addi r7, 16
> + cmplti r4, 16
> + jbf .L_aligned_and_len_larger_16bytes
> + ldw r8, (sp, 0)
> + ldw r9, (sp, 4)
> + addi sp, 8
> +
> +.L_aligned_and_len_less_16bytes:
> + cmplti r4, 4
> + jbt .L_copy_by_byte
> + ldw r1, (r3, 0)
> + stw r1, (r7, 0)
> + subi r4, 4
> + addi r3, 4
> + addi r7, 4
> + jbr .L_aligned_and_len_less_16bytes
> +
> + /* len less than 4 bytes */
> +.L_copy_by_byte:
> + cmpnei r4, 0
> + jbf .L_return
> + ldb r1, (r3, 0)
> + stb r1, (r7, 0)
> + subi r4, 1
> + addi r3, 1
> + addi r7, 1
> + jbr .L_copy_by_byte
> +
> +.L_return:
> + rts
> +
> + /* If dest is not aligned, we copy some bytes to make dest align.
> + Then we should judge whether src is aligned. */
> +
> + /* consider overlapped case */
> +.L_dest_not_aligned:
> + mov r5, r3
> + rsub r5, r5, r7
> + abs r5, r5
> + cmplt r5, r4
> + jbt .L_copy_by_byte
> +
> + /* Makes the dest align. */
> +.L1:
> + ldb r1, (r3, 0)
> + stb r1, (r7, 0)
> + addi r6, 1
> + subi r4, 1
> + addi r3, 1
> + addi r7, 1
> + cmpnei r6, 4
> + jbt .L1
> + cmplti r4, 4
> + jbt .L_copy_by_byte
> + /* Judge whether the src is aligned. */
> + jbf .L0
> +
> + /* consider overlapped case */
> +.L_dest_aligned_but_src_not_aligned:
> + mov r5, r3
> + rsub r5, r5, r7
> + abs r5, r5
> + cmplt r5, r4
> + jbt .L_copy_by_byte
> +
> + bclri r3, 0
> + bclri r3, 1
> + ldw r1, (r3, 0)
> + addi r3, 4
> +
> + subi sp, 16
> + stw r11, (sp,0)
> + stw r12, (sp,4)
> + stw r13, (sp,8)
> + movi r5, 8
> + /* r6 is used to store tne misaligned bits */
> + mult r5, r6
> + mov r12, r5
> + rsubi r5, 31
> + addi r5, 1
> + mov r13, r5
> +
> + cmplti r4, 16
> + jbt .L_not_aligned_and_len_less_16bytes
> +
> + stw r8, (sp, 12)
> + subi sp, 8
> + stw r9, (sp, 0)
> + stw r10, (sp, 4)
> +.L_not_aligned_and_len_larger_16bytes:
> + ldw r5, (r3, 0)
> + ldw r11, (r3, 4)
> + ldw r8, (r3, 8)
> + ldw r9, (r3, 12)
> +
> + /* little or big endian? */
> + GET_FRONT_BITS r1 r12
> + mov r10, r5
> + GET_AFTER_BITS r5 r13
> + or r5, r1
> +
> + GET_FRONT_BITS r10 r12
> + mov r1, r11
> + GET_AFTER_BITS r11 r13
> + or r11, r10
> +
> + GET_FRONT_BITS r1 r12
> + mov r10, r8
> + GET_AFTER_BITS r8 r13
> + or r8, r1
> +
> + GET_FRONT_BITS r10 r12
> + mov r1, r9
> + GET_AFTER_BITS r9 r13
> + or r9, r10
> +
> + stw r5, (r7, 0)
> + stw r11, (r7, 4)
> + stw r8, (r7, 8)
> + stw r9, (r7, 12)
> + subi r4, 16
> + addi r3, 16
> + addi r7, 16
> + cmplti r4, 16
> + jbf .L_not_aligned_and_len_larger_16bytes
> + ldw r9, (sp, 0)
> + ldw r10, (sp, 4)
> + addi sp, 8
> + ldw r8, (sp,12)
> +
> +.L_not_aligned_and_len_less_16bytes:
> + cmplti r4, 4
> + jbf .L2
> + /* r6 is used to stored the misaligned bits */
> + rsubi r6, 4
> + /* initial the position */
> + subu r3, r6
> + ldw r11, (sp, 0)
> + ldw r12, (sp, 4)
> + ldw r13, (sp, 8)
> + addi sp, 16
> + jbr .L_copy_by_byte
> + .L2:
> + ldw r5, (r3, 0)
> + GET_FRONT_BITS r1 r12
> + mov r11, r1
> + mov r1, r5
> + GET_AFTER_BITS r5 r13
> + or r5, r11
> + stw r5, (r7, 0)
> + subi r4, 4
> + addi r3, 4
> + addi r7, 4
> + jbr .L_not_aligned_and_len_less_16bytes
> +
> +#else /* __CSKYABIV2__ */
> + /* If len less than 4 bytes */
> + mov r3, r0
> + cmplti r2, 4
> + jbt .L_copy_by_byte
> +
> + mov r12, r0
> + andi r12, 3
> + /* If dest is not 4 bytes aligned */
> + bnez r12, .L_dest_not_aligned
> +.L0:
> + /* If dest is aligned, but src is not aligned */
> + mov r12, r1
> + andi r12, 3
> + bnez r12, .L_dest_aligned_but_src_not_aligned
> +
> + /* dest and src are all aligned */
> + cmplti r2, 16
> + /* If len less than 16 bytes */
> + jbt .L_aligned_and_len_less_16bytes
> +
> + /* src and dst are all aligned, and len > 16 bytes */
> +.L_aligned_and_len_larger_16bytes:
> + ldw r18, (r1, 0)
> + ldw r19, (r1, 4)
> + ldw r20, (r1, 8)
> + ldw r21, (r1, 12)
> + stw r18, (r3, 0)
> + stw r19, (r3, 4)
> + stw r20, (r3, 8)
> + stw r21, (r3, 12)
> + subi r2, 16
> + addi r1, 16
> + addi r3, 16
> + cmplti r2, 16
> + jbf .L_aligned_and_len_larger_16bytes
> +
> +.L_aligned_and_len_less_16bytes:
> + cmplti r2, 4
> + jbt .L_copy_by_byte
> + ldw r18, (r1, 0)
> + stw r18, (r3, 0)
> + subi r2, 4
> + addi r1, 4
> + addi r3, 4
> + jbr .L_aligned_and_len_less_16bytes
> +
> + /* len less than 4 bytes */
> +.L_copy_by_byte:
> + cmpnei r2, 0
> + jbf .L_return
> + ldb r18, (r1, 0)
> + stb r18, (r3, 0)
> + subi r2, 1
> + addi r1, 1
> + addi r3, 1
> + jbr .L_copy_by_byte
> +
> +.L_return:
> + rts
> +
> + /* If dest is not aligned, just copying some bytes makes the dest align.
> + After that, we judge whether the src is aligned. */
> +
> + /* consider overlapped case */
> +.L_dest_not_aligned:
> + rsub r13, r1, r3
> + abs r13, r13
> + cmplt r13, r2
> + jbt .L_copy_by_byte
> +
> +.L1:
> + /* makes the dest align. */
> + ldb r18, (r1, 0)
> + stb r18, (r3, 0)
> + addi r12, 1
> + subi r2, 1
> + addi r1, 1
> + addi r3, 1
> + cmpnei r12, 4
> + jbt .L1
> + cmplti r2, 4
> + jbt .L_copy_by_byte
> + /* judge whether the src is aligned. */
> + jbf .L0
> +
> + /* consider overlapped case */
> +.L_dest_aligned_but_src_not_aligned:
> + rsub r13, r1, r3
> + abs r13, r13
> + cmplt r13, r2
> + jbt .L_copy_by_byte
> +
> + bclri r1, 0
> + bclri r1, 1
> + ldw r18, (r1, 0)
> + addi r1, 4
> +
> + /* r12 is used to store the misaligned bits */
> + movi r13, 8
> + mult r13, r12
> + mov r24, r13
> + rsubi r13, 32
> + mov r25, r13
> +
> + cmplti r2, 16
> + jbt .L_not_aligned_and_len_less_16bytes
> +
> +.L_not_aligned_and_len_larger_16bytes:
> + ldw r20, (r1, 0)
> + ldw r21, (r1, 4)
> + ldw r22, (r1, 8)
> + ldw r23, (r1, 12)
> +
> + /* little or big endian? */
> + GET_FRONT_BITS r18 r24
> + mov r19, r20
> + GET_AFTER_BITS r20 r25
> + or r20, r18
> +
> + GET_FRONT_BITS r19 r24
> + mov r18, r21
> + GET_AFTER_BITS r21 r13
> + or r21, r19
> +
> + GET_FRONT_BITS r18 r24
> + mov r19, r22
> + GET_AFTER_BITS r22 r25
> + or r22, r18
> +
> + GET_FRONT_BITS r19 r24
> + mov r18, r23
> + GET_AFTER_BITS r23 r25
> + or r23, r19
> +
> + stw r20, (r3, 0)
> + stw r21, (r3, 4)
> + stw r22, (r3, 8)
> + stw r23, (r3, 12)
> + subi r2, 16
> + addi r1, 16
> + addi r3, 16
> + cmplti r2, 16
> + jbf .L_not_aligned_and_len_larger_16bytes
> +
> + .L_not_aligned_and_len_less_16bytes:
> + cmplti r2, 4
> + jbf .L2
> + /* r12 is used to stored the misaligned bits */
> + rsubi r12, 4
> + /* initial the position */
> + subu r1, r12
> + jbr .L_copy_by_byte
> + .L2:
> + ldw r21, (r1, 0)
> + GET_FRONT_BITS r18 r24
> + mov r19, r18
> + mov r18, r21
> + GET_AFTER_BITS r21 r25
> + or r21, r19
> + stw r21, (r3, 0)
> + subi r2, 4
> + addi r1, 4
> + addi r3, 4
> + jbr .L_not_aligned_and_len_less_16bytes
> +
> +# endif
> +END(memcpy)
> +
> +libc_hidden_builtin_def(memcpy)
> +.weak memcpy
> diff --git a/sysdeps/csky/memusage.h b/sysdeps/csky/memusage.h
> new file mode 100644
> index 0000000..5d29e59
> --- /dev/null
> +++ b/sysdeps/csky/memusage.h
> @@ -0,0 +1,20 @@
> +/* 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 GETSP() ({ register uintptr_t stack_ptr asm ("sp"); stack_ptr; })
> +
> +#include <sysdeps/generic/memusage.h>
> diff --git a/sysdeps/csky/setjmp.S b/sysdeps/csky/setjmp.S
> new file mode 100644
> index 0000000..eef7b86
> --- /dev/null
> +++ b/sysdeps/csky/setjmp.S
> @@ -0,0 +1,95 @@
> +/* 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 <sysdep.h>
> +
> +ENTRY(setjmp)
> + movi a1, 1
> + jmpi __sigsetjmp
> +END(setjmp)
> +
> +ENTRY(_setjmp)
> + movi a1, 0
> + jmpi __sigsetjmp
> +END(_setjmp)
> +
> +
> +ENTRY(__sigsetjmp)
> + mov a2, a0
> + /* Save registers */
> +#ifdef __CSKYABIV2__
> + stw sp, (a2, 0)
> + stw lr, (a2, 4)
> + stw r4, (a2, 8)
> + stw r5, (a2, 12)
> + stw r6, (a2, 16)
> + stw r7, (a2, 20)
> + stw r8, (a2, 24)
> + stw r9, (a2, 28)
> + stw r10, (a2, 32)
> + stw r11, (a2, 36)
> + stw r16, (a2, 40)
> + stw r17, (a2, 44)
> + stw r26, (a2, 48)
> + stw r27, (a2, 52)
> + stw r28, (a2, 56)
> + stw r29, (a2, 60)
> + stw r30, (a2, 64)
> + stw r31, (a2, 68)
> + addi a2, 72
> +#else
> + stw sp, (a2, 0)
> + stw lr, (a2, 4)
> + stw r8, (a2, 8)
> + stw r9, (a2, 12)
> + stw r10, (a2, 16)
> + stw r11, (a2, 20)
> + stw r12, (a2, 24)
> + stw r13, (a2, 28)
> + stw r14, (a2, 32)
> + addi a2, 32
> + addi a2, 4
> +#endif
> +
> +#ifdef __PIC__
> +# ifdef __CSKYABIV2__
> + grs t1, .Lgetpc
> +.Lgetpc:
> + lrw t0, .Lgetpc@GOTPC
> + addu t1, t0
> + lrw a2, __sigjmp_save@PLT
> + ldr.w a2, (t1, a2 << 0)
> + jmp a2
> +# else
> + mov a3, lr
> + bsr .Lgetpc
> +.Lgetpc:
> + lrw r7, .Lgetpc@GOTPC
> + addu r7, lr
> + lrw a2, __sigjmp_save@PLT
> + addu r7, a2
> + ldw r7, (r7)
> + mov lr, a3
> + jmp r7
> +# endif /* !__CSKYABIV2__ */
> +#else
> + jmpi __sigjmp_save
> +#endif /* !__PIC__ */
> +
> +END(__sigsetjmp)
> +
> +hidden_def (__sigsetjmp)
> diff --git a/sysdeps/csky/start.S b/sysdeps/csky/start.S
> new file mode 100644
> index 0000000..9fa5285
> --- /dev/null
> +++ b/sysdeps/csky/start.S
> @@ -0,0 +1,133 @@
> +/* Startup code compliant to the ELF C-SKY ABI.
> + 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.
> +
> + 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/>. */
> +
> +/* We need to call:
> + __libc_start_main (int (*main) (int, char **, char **), int argc,
> + char **argv, void (*init) (void), void (*fini) (void),
> + void (*rtld_fini) (void), void *stack_end)
> +*/
> +
> +#include <sysdep.h>
> +
> +.text
> + .globl _start
> + .type _start,@function
> +_start:
> + /* Clear the frame pointer and link register since this is the outermost frame. */
> + movi lr, 0
> + /* Pop argc off the stack and save a pointer to argv */
> + ldw a1, (sp, 0) /* __libc_start_main(arg1): argc */
> + addi sp, 4
> + mov a2, sp /* __libc_start_main(arg1): argv */
> +
> + subi sp, 4
> + /* Push stack limit */
> + stw a2, (sp, 0)
> +#ifdef __CSKYABIV2__
> + /* Push rtld_fini */
> + subi sp, 4
> + stw a0, (sp, 0)
> +#else
> + mov r7, a0
> +#endif
> +
> +#ifdef SHARED
> + subi sp,8
> + stw lr,(sp,0)
> + stw gb,(sp,4)
> + bsr .Lgetpc
> +.Lgetpc:
> + lrw gb, .Lgetpc@GOTPC
> + addu gb, lr
> + lrw a3, __libc_csu_fini@GOT
> + addu a3, gb
> + ldw a3, (a3)
> +# ifdef __CSKYABIV2__
> + subi sp, 4
> + stw a3, (sp,0)
> +# else
> + mov a4, a3
> +# endif /* !__CSKYABIV2__ */
> + lrw a3, __libc_csu_init@GOT
> + addu a3, gb
> + ldw a3,(a3,0)
> +# ifdef __CSKYABIV2__
> + lrw t0, main@GOT
> + addu t0, gb
> + ldw a0,(t0,0)
> + lrw t1,__libc_start_main@PLT
> + addu t1, gb
> + ldw t1, (t1, 0)
> + jsr t1
> +# else
> + lrw a0, main@GOT
> + addu a0, gb
> + ldw a0,(a0,0)
> + lrw r13,__libc_start_main@PLT
> + addu r13, gb
> + ldw r13, (r13, 0)
> + jsr r13
> +# endif /* !__CSKYABIV2__ */
> + ldw lr,(sp,0)
> + ldw gb,(sp,4)
> + addi sp, 8
> +#else /* !SHARED */
> +# ifdef __CSKYABIV2__
> + /* Fetch address of __libc_csu_fini */
> + lrw a0, __libc_csu_fini
> + /* Push __libc_csu_fini */
> + subi sp,4
> + stw a0, (sp,0)
> +# else
> + lrw a4, __libc_csu_fini
> +# endif /* !__CSKYABIV2__ */
> + /* Set up the other arguments in registers */
> + lrw a0, main
> + lrw a3, __libc_csu_init
> + /* __libc_start_main (main, argc, argv, init, fini, rtld_fini, stack_end) */
> + /* Let the libc call main and exit with its return code. */
> + jsri __libc_start_main
> +#endif /* !SHARED */
> +
> + /* should never get here....*/
> + jsri abort
> +
> +/* 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/csky/strcmp.S b/sysdeps/csky/strcmp.S
> new file mode 100644
> index 0000000..46f4c2a
> --- /dev/null
> +++ b/sysdeps/csky/strcmp.S
> @@ -0,0 +1,337 @@
> +/* The assembly function for string compare. C-SKY 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 <sysdep.h>
> +#include "macro.S"
> +
> +/* FIXME attention!!! it may be a bug when WANT_WIDE define */
WANT_WIDE is not something we define in glibc. Please clean this up.
> +ENTRY(strcmp)
> +#ifndef __CSKYABIV2__
> + mov r6, r2
> +
> + or r2, r3
> + andi r2, 0x3
> + cmpnei r2, 0x0 /* d or s is aligned ?*/
> + bt 4f /* if not aligned, goto 4f*/
> + 1: /* if aligned, load word each time.*/
> + ldw r2, (r6, 0)
> + ldw r7, (r3, 0)
> + cmpne r2, r7
> + bt 1f /* if d[i] != s[i], goto 1f */
> + tstnbz r2 /* if d[i] == s[i], check if d or s is at the end. */
> + bf 3f /* if at the end, goto 3f (finish comparing) */
> +
> + ldw r2, (r6, 4)
> + ldw r7, (r3, 4)
> + cmpne r2, r7
> + bt 1f
> + tstnbz r2
> + bf 3f
> +
> + ldw r2, (r6, 8)
> + ldw r7, (r3, 8)
> + cmpne r2, r7
> + bt 1f
> + tstnbz r2
> + bf 3f
> +
> + ldw r2, (r6, 12)
> + ldw r7, (r3, 12)
> + cmpne r2, r7
> + bt 1f
> + tstnbz r2
> + bf 3f
> +
> + ldw r2, (r6, 16)
> + ldw r7, (r3, 16)
> + cmpne r2, r7
> + bt 1f
> + tstnbz r2
> + bf 3f
> +
> + ldw r2, (r6, 20)
> + ldw r7, (r3, 20)
> + cmpne r2, r7
> + bt 1f
> + tstnbz r2
> + bf 3f
> +
> + ldw r2, (r6, 24)
> + ldw r7, (r3, 24)
> + cmpne r2, r7
> + bt 1f
> + tstnbz r2
> + bf 3f
> +
> + ldw r2, (r6, 28)
> + ldw r7, (r3, 28)
> + cmpne r2, r7
> + bt 1f
> + tstnbz r2
> + bf 3f
> +
> + addi r6, 32
> + addi r3, 32
> + br 1b
> +
> +#ifdef __CSKYBE__
> + /* d[i] != s[i] in word, so we check byte 0 ? */
> +1:
> + xtrb0 r1, r2
> + mov r4, r1
> + xtrb0 r1, r7
> + cmpne r4, r1
> + bt 2f
> + cmpnei r4, 0
> + bf 2f
> +
> + /* d[i] != s[i] in word, so we check byte 1 ? */
> + xtrb1 r1, r2
> + mov r4, r1
> + xtrb1 r1, r7
> + cmpne r4, r1
> + bt 2f
> + cmpnei r4, 0
> + bf 2f
> +
> + /* d[i] != s[i] in word, so we check byte 1 ? */
> + xtrb2 r1, r2
> + mov r4, r1
> + xtrb2 r1, r7
> + cmpne r4, r1
> + bt 2f
> + cmpnei r4, 0
> + bf 2f
> +
> + /* d[i] != s[i] in word, so we check byte 1 ? */
> + xtrb3 r1, r2
> + mov r4, r1
> + xtrb3 r1, r7
> +
> +#else /* little endian */
> + /* d[i] != s[i] in word, so we check byte 0 ? */
> +1:
> + xtrb3 r1, r2
> + mov r4, r1
> + xtrb3 r1, r7
> + cmpne r4, r1
> + bt 2f
> + cmpnei r4, 0
> + bf 2f
> +
> + /* d[i] != s[i] in word, so we check byte 1 ? */
> + xtrb2 r1, r2
> + mov r4, r1
> + xtrb2 r1, r7
> + cmpne r4, r1
> + bt 2f
> + cmpnei r4, 0
> + bf 2f
> +
> + /* d[i] != s[i] in word, so we check byte 1 ? */
> + xtrb1 r1, r2
> + mov r4, r1
> + xtrb1 r1, r7
> + cmpne r4, r1
> + bt 2f
> + cmpnei r4, 0
> + bf 2f
> +
> + /* d[i] != s[i] in word, so we check byte 1 ? */
> + xtrb0 r1, r2
> + mov r4, r1
> + xtrb0 r1, r7
> +
> +#endif
> + /* get the result when d[i] != s[i] */
> +2:
> + subu r4, r1
> + mov r2, r4
> + jmp r15
> +
> + /* return when d[i] == s[i] */
> +3:
> + subu r2, r7
> + jmp r15
> +
> + /* cmp when d or s is not aligned */
> +4:
> + ldb r2, (r6,0)
> + ldb r7, (r3, 0)
> + cmpne r2, r7
> + bt 3b
> + addi r3, 1
> + addi r6, 1
> + cmpnei r2, 0
> + bt 4b
> + jmp r15
> +# else /* __CSKYABIV2__ */
> + mov a3, a0
> +
> + or a0, a1
> + andi a0, 0x3
> + M_BNEZ a0, 4f
> + 1:
> + /* if aligned, load word each time. */
> + ldw a0, (a3, 0)
> + ldw t0, (a1, 0)
> + /* if d[i] != s[i], goto 1f */
> + M_BNE a0, t0, 1f
> + /* if d[i] == s[i], check if d or s is at the end. */
> + tstnbz a0
> + /* if at the end, goto 3f (finish comparing) */
> + bf 3f
> +#if defined ( __ck802__ )
> + addi a3, 4
> + addi a1, 4
> +#else
> + ldw a0, (a3, 4)
> + ldw t0, (a1, 4)
> + M_BNE a0, t0, 1f
> + tstnbz a0
> + bf 3f
> +
> + ldw a0, (a3, 8)
> + ldw t0, (a1, 8)
> + M_BNE a0, t0, 1f
> + tstnbz a0
> + bf 3f
> +
> + ldw a0, (a3, 12)
> + ldw t0, (a1, 12)
> + M_BNE a0, t0, 1f
> + tstnbz a0
> + bf 3f
> +
> + ldw a0, (a3, 16)
> + ldw t0, (a1, 16)
> + M_BNE a0, t0, 1f
> + tstnbz a0
> + bf 3f
> +
> + ldw a0, (a3, 20)
> + ldw t0, (a1, 20)
> + M_BNE a0, t0, 1f
> + tstnbz a0
> + bf 3f
> +
> + ldw a0, (a3, 24)
> + ldw t0, (a1, 24)
> + M_BNE a0, t0, 1f
> + tstnbz a0
> + bf 3f
> +
> + ldw a0, (a3, 28)
> + ldw t0, (a1, 28)
> + M_BNE a0, t0, 1f
> + tstnbz a0
> + bf 3f
> +
> + addi a3, 32
> + addi a1, 32
> +#endif
> + br 1b
> +
> +# ifdef __CSKYBE__
> + /* d[i] != s[i] in word, so we check byte 0 ? */
> +1:
> + xtrb0 t1, a0
> + mov a2, t1
> + xtrb0 t1, t0
> + M_BNE a2, t1, 2f
> + cmpnei a2, 0
> + bf 2f
> +
> + /* d[i] != s[i] in word, so we check byte 1 ? */
> + xtrb1 t1, a0
> + mov a2, t1
> + xtrb1 t1, t0
> + M_BNE a2, t1, 2f
> + cmpnei a2, 0
> + bf 2f
> +
> + /* d[i] != s[i] in word, so we check byte 1 ? */
> + xtrb2 t1, a0
> + mov a2, t1
> + xtrb2 t1, t0
> + M_BNE a2, t1, 2f
> + cmpnei a2, 0
> + bf 2f
> +
> + /* d[i] != s[i] in word, so we check byte 1 ? */
> + xtrb3 t1, a0
> + mov a2, t1
> + xtrb3 t1, t0
> +
> +# else /* !__CSKYBE__ */
> + /* d[i] != s[i] in word, so we check byte 0 ? */
> +1:
> + xtrb3 t1, a0
> + mov a2, t1
> + xtrb3 t1, t0
> + M_BNE a2, t1, 2f
> + cmpnei a2, 0
> + bf 2f
> +
> + /* d[i] != s[i] in word, so we check byte 1 ? */
> + xtrb2 t1, a0
> + mov a2, t1
> + xtrb2 t1, t0
> + M_BNE a2, t1, 2f
> + cmpnei a2, 0
> + bf 2f
> +
> + /* d[i] != s[i] in word, so we check byte 1 ? */
> + xtrb1 t1, a0
> + mov a2, t1
> + xtrb1 t1, t0
> + M_BNE a2, t1, 2f
> + cmpnei a2, 0
> + bf 2f
> +
> + /* d[i] != s[i] in word, so we check byte 1 ? */
> + xtrb0 t1, a0
> + mov a2, t1
> + xtrb0 t1, t0
> +
> +# endif /* !__CSKYBE__ */
> + /* get the result when d[i] != s[i] */
> +2:
> + subu a2, t1
> + mov a0, a2
> + jmp r15
> +
> + /* return when d[i] == s[i] */
> +3:
> + subu a0, t0
> + jmp r15
> +
> + /* cmp when d or s is not aligned */
> +4:
> + ldb a0, (a3,0)
> + ldb t0, (a1, 0)
> + M_BNE a0, t0, 3b
> + addi a1, 1
> + addi a3, 1
> + M_BNEZ a0, 4b
> + jmp r15
> +#endif /* __CSKYABIV2__ */
> +END(strcmp)
> +
> +libc_hidden_def(strcmp)
> +.weak strcmp
> diff --git a/sysdeps/csky/strcpy.S b/sysdeps/csky/strcpy.S
> new file mode 100644
> index 0000000..e757aeb
> --- /dev/null
> +++ b/sysdeps/csky/strcpy.S
> @@ -0,0 +1,273 @@
> +/* The assembly function for string copy. C-SKY 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 <sysdep.h>
> +#include "macro.S"
> +
> +ENTRY(strcpy)
> +#ifndef __CSKYABIV2__
> + mov r6, r2
> + mov r7, r3
> + or r7, r6
> + andi r7, 3
> + cmpnei r7, 0
> + bf 2f
> +1:
> + ldb r5, (r3)
> + stb r5, (r6)
> + addi r3, 1
> + addi r6, 1
> + cmpnei r5, 0
> + bt 1b
> +1:
> + jmp r15
> +
> +2:
> + ldw r5, (r3)
> + tstnbz r5
> + bf 10f
> + stw r5, (r6)
> +
> + ldw r5, (r3, 4)
> + tstnbz r5
> + bf 3f
> + stw r5, (r6, 4)
> +
> + ldw r5, (r3, 8)
> + tstnbz r5
> + bf 4f
> + stw r5, (r6, 8)
> +
> + ldw r5, (r3, 12)
> + tstnbz r5
> + bf 5f
> + stw r5, (r6, 12)
> +
> + ldw r5, (r3, 16)
> + tstnbz r5
> + bf 6f
> + stw r5, (r6, 16)
> +
> + ldw r5, (r3, 20)
> + tstnbz r5
> + bf 7f
> + stw r5, (r6, 20)
> +
> + ldw r5, (r3, 24)
> + tstnbz r5
> + bf 8f
> + stw r5, (r6, 24)
> +
> + ldw r5, (r3, 28)
> + tstnbz r5
> + bf 9f
> + stw r5, (r6, 28)
> +
> + addi r6, 32
> + addi r3, 32
> + br 2b
> +
> +3:
> + addi r6, 4
> + br 10f
> +
> +4:
> + addi r6, 8
> + br 10f
> +
> +5:
> + addi r6, 12
> + br 10f
> +
> +6:
> + addi r6, 16
> + br 10f
> +
> +7:
> + addi r6, 20
> + br 10f
> +
> +8:
> + addi r6, 24
> + br 10f
> +
> +9:
> + addi r6, 28
> +
> +10:
> +# ifdef __CSKYBE__
> + xtrb0 r1, r5
> + stb r1, (r6)
> + cmpnei r1, 0
> + bf 5f
> + xtrb1 r1, r5
> + stb r1, (r6, 1)
> + cmpnei r1, 0
> + bf 5f
> + xtrb2 r1, r5
> + stb r1, (r6, 2 )
> + cmpnei r1, 0
> + bf 5f
> + stw r5, (r6)
> +
> +# else /* !__CSKYBE__ */
> + xtrb3 r1, r5
> + stb r1, (r6)
> + cmpnei r1, 0
> + bf 5f
> + xtrb2 r1, r5
> + stb r1, (r6, 1)
> + cmpnei r1, 0
> + bf 5f
> + xtrb1 r1, r5
> + stb r1, (r6, 2)
> + cmpnei r1, 0
> + bf 5f
> + stw r5, (r6)
> +# endif /* !__CSKYBE__ */
> +5:
> + jmp r15
> +#else /* __CSKYABIV2__ */
> + mov a3, a0
> + or a2, a1, a3
> + andi t0, a2, 3
> + M_BEZ t0, 2f
> + mov t0, a1
> +1:
> + ld.b a2, (t0)
> + stb a2, (a3)
> + addi t0, t0, 1
> + addi a3, a3, 1
> + M_BNEZ a2, 1b
> +
> + jmp r15
> +
> +2:
> +# if defined (__ck802__)
> + ldw a2, (a1)
> + tstnbz a2
> + bf 11f
> + stw a2, (a3)
> + addi a3, 4
> + addi a1, 4
> + br 2b
> +# else /* !__ck802__ */
> + ldw a2, (a1)
> + tstnbz a2
> + bf 11f
> + stw a2, (a3)
> +
> + ldw a2, (a1, 4)
> + tstnbz a2
> + bf 4f
> + stw a2, (a3, 4)
> +
> + ldw a2, (a1, 8)
> + tstnbz a2
> + bf 5f
> + stw a2, (a3, 8)
> +
> + ldw a2, (a1, 12)
> + tstnbz a2
> + bf 6f
> + stw a2, (a3, 12)
> +
> + ldw a2, (a1, 16)
> + tstnbz a2
> + bf 7f
> + stw a2, (a3, 16)
> +
> + ldw a2, (a1, 20)
> + tstnbz a2
> + bf 8f
> + stw a2, (a3, 20)
> +
> + ldw a2, (a1, 24)
> + tstnbz a2
> + bf 9f
> + stw a2, (a3, 24)
> +
> + ldw a2, (a1, 28)
> + tstnbz a2
> + bf 10f
> + stw a2, (a3, 28)
> +
> + addi a3, 32
> + addi a1, 32
> + br 2b
> +
> +
> +4:
> + addi a3, 4
> + br 11f
> +
> +5:
> + addi a3, 8
> + br 11f
> +
> +6:
> + addi a3, 12
> + br 11f
> +
> +7:
> + addi a3, 16
> + br 11f
> +
> +8:
> + addi a3, 20
> + br 11f
> +
> +9:
> + addi a3, 24
> + br 11f
> +
> +10:
> + addi a3, 28
> +# endif /* !__ck802__ */
> +11:
> +# ifdef __CSKYBE__
> + xtrb0 t0, a2
> + st.b t0, (a3)
> + M_BEZ t0, 5f
> + xtrb1 t0, a2
> + st.b t0, (a3, 1)
> + M_BEZ t0, 5f
> + xtrb2 t0, a2
> + st.b t0, (a3, 2 )
> + M_BEZ t0, 5f
> + stw a2, (a3)
> +# else
> + xtrb3 t0, a2
> + st.b t0, (a3)
> + M_BEZ t0, 5f
> + xtrb2 t0, a2
> + st.b t0, (a3, 1)
> + M_BEZ t0, 5f
> + xtrb1 t0, a2
> + st.b t0, (a3, 2)
> + M_BEZ t0, 5f
> + stw a2, (a3)
> +# endif /* !__CSKYBE__ */
> +5:
> + jmp r15
> +
> +#endif /* !__CSKYABIV2__ */
> +END(strcpy)
> +
> +libc_hidden_def(strcpy)
> +.weak strcpy
> diff --git a/sysdeps/csky/sys/ucontext.h b/sysdeps/csky/sys/ucontext.h
> new file mode 100644
> index 0000000..fd5fad0
> --- /dev/null
> +++ b/sysdeps/csky/sys/ucontext.h
> @@ -0,0 +1,116 @@
> +/* 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/>. */
> +
> +/* System V/ckcore ABI compliant context switching support. */
> +
> +#ifndef _SYS_UCONTEXT_H
> +#define _SYS_UCONTEXT_H 1
> +
> +#include <features.h>
> +#include <signal.h>
> +
> +#include <bits/types/sigset_t.h>
> +#include <bits/types/stack_t.h>
> +
> +/* Type for general register. */
> +typedef int greg_t;
> +
> +/* Number of general registers. */
> +#if (__CSKY__ == 2)
> +#define NGREG 34
> +#else
> +#define NGREG 18
> +#endif
> +
> +/* Container for all general registers. */
> +typedef greg_t gregset_t[NGREG];
> +
> +/* Number of each register is the `gregset_t' array. */
> +enum
> +{
> + R_R0 = 0,
> +#define R_R0 R_R0
> + R_R1 = 1,
> +#define R_R1 R_R1
> + R_R2 = 2,
> +#define R_R2 R_R2
> + R_R3 = 3,
> +#define R_R3 R_R3
> + R_R4 = 4,
> +#define R_R4 R_R4
> + R_R5 = 5,
> +#define R_R5 R_R5
> + R_R6 = 6,
> +#define R_R6 R_R6
> + R_R7 = 7,
> +#define R8R7 R_R7
> + R_R8 = 8,
> +#define R_R8 R_R8
> + R_R9 = 9,
> +#define R_R9 R_R9
> + R_R10 = 10,
> +#define R_R10 R_R10
> + R_R11 = 11,
> +#define R_R11 R_R11
> + R_R12 = 12,
> +#define R_R12 R_R12
> + R_R13 = 13,
> +#define R_R13 R_R13
> + R_R14 = 14,
> +#define R_R14 R_R14
> + R_R15 = 15,
> +#define R_R15 R_R15
> +#if (__CSKY__ == 2)
> + R_SR = 32,
> +#define R_SR R_SR
> + R_PC = 33,
> +#define R_PC R_PC
> +#else
> + R_SR = 16,
> +#define R_SR R_SR
> + R_PC = 17,
> +#define R_PC R_PC
> +#endif
> +};
> +
> +/* Structure to describe FPU registers. */
> +typedef struct fpregset
> +{
> + unsigned long fesr; /* fpu exception status reg */
> + unsigned long fsr; /* fpu status reg, nothing in CPU_CSKYV2 */
> + unsigned long fp[32]; /* fpu general regs */
> +} fpregset_t;
> +
> +/* Context to describe whole processor state. */
> +typedef struct
> +{
> + gregset_t gregs;
> + fpregset_t fpregs;
> +} mcontext_t;
> +
> +/* Userlevel context. */
> +typedef struct ucontext
> +{
> + unsigned long int uc_flags;
> + struct ucontext *uc_link;
> + __sigset_t uc_sigmask;
> + stack_t uc_stack;
> + mcontext_t uc_mcontext; /* struct sigcontext */
> + long int uc_filler[201];
Is this uc_filler space for growth? It is a good idea.
> +} ucontext_t;
> +
> +#endif /* sys/ucontext.h */
> diff --git a/sysdeps/csky/sysdep.h b/sysdeps/csky/sysdep.h
> new file mode 100644
> index 0000000..0a20a72
> --- /dev/null
> +++ b/sysdeps/csky/sysdep.h
> @@ -0,0 +1,46 @@
> +/* Assembler macros for C-SKY.
> + 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 <sysdeps/generic/sysdep.h>
> +#include <features.h>
> +
> +#ifndef __CSKYABIV2__
> +# define CSKY_ABIV1
> +#else
> +# define CSKY_ABIV2
> +#endif
> +
> +#ifdef __ASSEMBLER__
> +
> +#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
> +
> +/* Define an entry point visible from C. */
> +#define ENTRY(name) \
> + .globl name; \
> + .type name,@function; \
> + .align 4; \
> + name##:; \
> + cfi_startproc; \
> +
> +#undef END
> +#define END(name) \
> + cfi_endproc; \
> + ASM_SIZE_DIRECTIVE(name)
> +
> +#endif
> +
> diff --git a/sysdeps/csky/tls-macros.h b/sysdeps/csky/tls-macros.h
> new file mode 100644
> index 0000000..3e9976b
> --- /dev/null
> +++ b/sysdeps/csky/tls-macros.h
> @@ -0,0 +1,106 @@
> +/* Macros for accessing thread-local storage. C-SKY 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/>. */
> +
> +#ifdef __CSKYABIV2__
> +# define TLS_LE(x) \
> + ({ int *__result; \
> + extern void * __read_tp (void); \
> + void *tp = __read_tp (); \
> + __asm__ ("lrw %0, " #x "@TPOFF; " \
> + "add %0, %1, %0; " \
> + : "=&r" (__result) : "r" (tp)); \
> + __result; })
> +
> +# define TLS_IE(x) \
> + ({ int *__result; \
> + extern void * __read_tp (void); \
> + void *tp = __read_tp (); \
> + __asm__ ("grs a1, 1f;" \
> + "1: lrw %0, " #x "@GOTTPOFF;" \
> + "ldr.w %0, (a1, %0 << 0);" \
> + "add %0, %1, %0; " \
> + : "=&r" (__result): "r" (tp) : "a1" ); \
> + __result; })
> +
> +# define TLS_LD(x) \
> + ({ char *__result; \
> + int __offset; \
> + extern void *__tls_get_addr (void *); \
> + __asm__ ("grs a1, 1f;" \
> + "1: lrw %0, " #x "@TLSLDM32;" \
> + "add %0, a1, %0; " \
> + : "=r" (__result) : : "a1"); \
> + __result = (char *)__tls_get_addr (__result); \
> + __asm__ ("lrw %0, " #x "@TLSLDO32; " \
> + : "=r" (__offset)); \
> + (int *) (__result + __offset); })
> +
> +# define TLS_GD(x) \
> + ({ int *__result; \
> + extern void *__tls_get_addr (void *); \
> + __asm__ ("grs a1, 1f;" \
> + "1: lrw %0, " #x "@TLSGD32; " \
> + "add %0, a1, %0; " \
> + : "=r" (__result) : : "a1" ); \
> + (int *)__tls_get_addr (__result); })
> +
> +#else
> +# define TLS_LE(x) \
> + ({ int *__result; \
> + extern void * __read_tp (void); \
> + void *tp = __read_tp (); \
> + __asm__ ("lrw %0, " #x "@TPOFF\n\t " \
> + "add %0, %1\n\t" \
> + : "=&r" (__result) : "r" (tp)); \
> + __result; })
> +
> +# define TLS_IE(x) \
> + ({ int *__result; \
> + extern void * __read_tp (void); \
> + void *tp = __read_tp (); \
> + __asm__ ("bsr 1f\n\t" \
> + "1: lrw %0, " #x "@GOTTPOFF\n\t" \
> + "add %0, r15\n\t" \
> + "ldw %0, (%0, 0)\n\t" \
> + "add %0, %1\n\t" \
> + : "=&r" (__result): "r" (tp) : "r15" ); \
> + __result; })
> +
> +# define TLS_LD(x) \
> + ({ char *__result; \
> + int __offset; \
> + extern void *__tls_get_addr (void *); \
> + __asm__ ("bsr 1f\n\t" \
> + "1: lrw %0, " #x "@TLSLDM32\n\t" \
> + "add %0, r15\n\t" \
> + : "=r" (__result) : : "r15"); \
> + __result = (char *)__tls_get_addr (__result); \
> + __asm__ ("lrw %0, " #x "@TLSLDO32\n\t " \
> + : "=r" (__offset)); \
> + (int *) (__result + __offset); })
> +
> +# define TLS_GD(x) \
> + ({ int *__result; \
> + extern void *__tls_get_addr (void *); \
> + __asm__ ("bsr 1f;" \
> + "1: lrw %0, " #x "@TLSGD32\n\t " \
> + "add %0, r15\n\t" \
> + : "=r" (__result) : : "r15" ); \
> + (int *)__tls_get_addr (__result); })
> +
> +#endif
> diff --git a/sysdeps/unix/csky/abiv2_sysdep.S b/sysdeps/unix/csky/abiv2_sysdep.S
> new file mode 100644
> index 0000000..4087b99
> --- /dev/null
> +++ b/sysdeps/unix/csky/abiv2_sysdep.S
> @@ -0,0 +1,73 @@
> +/* 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 <sysdep.h>
> +#define _ERRNO_H
> +#include <bits/errno.h>
> +#include <csky_readtp.h>
> +
> +#if !IS_IN (rtld)
> +#include <dl-sysdep.h> /* Defines RTLD_PRIVATE_ERRNO. */
> +#endif
> +
> +#include <tls.h>
> +
> +#undef syscall_error
> +__syscall_error:
> +#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
> + /* We translate the system's EWOULDBLOCK error into EAGAIN.
> + The GNU C library always defines EWOULDBLOCK==EAGAIN.
> + EWOULDBLOCK_sys is the original number. */
> + cmpnei a0, EWOULDBLOCK /* Is it the old EWOULDBLOCK? */
> + bt 1f
> + mov a0, EAGAIN /* Yes; translate it to EAGAIN. */
See comment below.
> +#endif
> +
> +1:
> +#if !IS_IN (rtld)
> + mov a1, a0
> + csky_read_tp
> +
> + grs t1, .Lgetpc1
> +.Lgetpc1:
> + lrw t0, errno@gottpoff
> + add t1, t1, t0
> + ldw t1, (t1)
> + add t1, a0
> + stw a1, (t1)
> + bmaski a0, 0
> + jsr r15
> +#elif RTLD_PRIVATE_ERRNO
> +#ifdef __PIC__
> + grs t1, .Lgetpc2
> +.Lgetpc2:
> + lrw t0, .Lgetpc2@GOTPC
> + addu t1, t1, t0
> + lrw t0, rtld_errno@PLT
> + ldr.w t0, (t1, t0 << 0)
> +#else
> + lrw t0, rtld_errno
> +#endif
> + stw a0, (t0)
> + bmaski a0, 0
> + jsr r15
> +#else
> +#error "Unsupported non-TLS case"
> +#endif
> +
> +#undef __syscall_error
> +END (__syscall_error)
> diff --git a/sysdeps/unix/csky/sysdep.S b/sysdeps/unix/csky/sysdep.S
> new file mode 100644
> index 0000000..9bd6229
> --- /dev/null
> +++ b/sysdeps/unix/csky/sysdep.S
> @@ -0,0 +1,84 @@
> +/* 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/>. */
> +
> +#ifdef __CSKYABIV2__
> +#include "abiv2_sysdep.S"
> +#else
> +
> +#include <sysdep.h>
> +#define _ERRNO_H
> +#include <bits/errno.h>
> +#include <csky_readtp.h>
> +
> +#if IS_IN (rtld)
> +#include <dl-sysdep.h> /* Defines RTLD_PRIVATE_ERRNO. */
> +#endif
> +
> +#include <tls.h>
> +
> +#undef syscall_error
> +__syscall_error:
> +#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
> + /* We translate the system's EWOULDBLOCK error into EAGAIN.
> + The GNU C library always defines EWOULDBLOCK==EAGAIN.
> + EWOULDBLOCK_sys is the original number. */
> + cmpnei r2, EWOULDBLOCK /* Is it the old EWOULDBLOCK? */
> + bt 1f
> + mov r2, EAGAIN /* Yes; translate it to EAGAIN. */
If this is a new port why do you have EWOULDBLOCK vs. EAGAIN code?
This is only ever needed if you have a legacy UNIX port that made
the distinction between the two error codes. You should just start
with EWOULDBLOCK==EAGAIN assumption, and code like they are both
the same.
> +#endif
> +
> +1:
> +#if !IS_IN (rtld)
> +#ifdef __PIC__
> + mov r7, r15
> + mov r1, r2
> + csky_read_tp
> +
> + bsr .Lgetpc1
> +.Lgetpc1:
> + lrw r5, errno@gottpoff
> + add r5, r15
> + ldw r5, (r5)
> + add r5, r2
> + stw r1, (r5)
> + bmaski r2, 0
> + jsr r7
> +#endif
> +#elif RTLD_PRIVATE_ERRNO
> +#ifdef __PIC__
> + mov r7, r15
> + bsr .Lgetpc2
> +.Lgetpc2:
> + lrw r6, .Lgetpc2@GOTPC
> + addu r6, r15
> + lrw r5, rtld_errno@PLT
> + addu r5, r6
> + ldw r5, (r5)
> +#else
> + lrw r5, rtld_errno
> +#endif
> + stw r2, (r5)
> + bmaski r2, 0
> + jsr r7
> +#else
> +#error "Unsupported non-TLS case"
> +#endif
> +
> +#undef __syscall_error
> +END (__syscall_error)
> +
> +#endif /* __CSKYABIV2__*/
> diff --git a/sysdeps/unix/csky/sysdep.h b/sysdeps/unix/csky/sysdep.h
> new file mode 100644
> index 0000000..fb13f3d
> --- /dev/null
> +++ b/sysdeps/unix/csky/sysdep.h
> @@ -0,0 +1,26 @@
> +/* 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 <sysdeps/unix/sysdep.h>
> +#include <sysdeps/csky/sysdep.h>
> +
> +#ifdef __ASSEMBLER__
> +
> +#define ret \
> + jmp r15;
> +
> +#endif
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [RFC PATCH 02/10] C-SKY: TLS support
2018-03-16 9:59 ` [RFC PATCH 02/10] C-SKY: TLS support Mao Han
@ 2018-03-16 14:09 ` Carlos O'Donell
2018-03-20 4:57 ` Mao Han
0 siblings, 1 reply; 22+ messages in thread
From: Carlos O'Donell @ 2018-03-16 14:09 UTC (permalink / raw)
To: Mao Han, libc-help; +Cc: ren_guo, yunhai_shang, qijie_tong, chunqiang_li
On 03/16/2018 03:58 AM, Mao Han wrote:
> This patch implements TLS support for C-SKY. We support all four
> standard TLS addressing modes (LE, IE, LD, and GD) when running on
> Linux via NPTL.
>
> *sysdeps/csky/dl-tls.h: New file
> *sysdeps/csky/libc-tls.c: New file
> *sysdeps/csky/nptl/tcb-offsets.sym: New file
> *sysdeps/csky/nptl/tls.h: New file
> *sysdeps/csky/stackinfo.h: New file
>
OK, fairly clean, was curious about stack guard and pointer guard support.
Others may have more to comment on this in libc-alpha.
> Signed-off-by: Mao Han <han_mao@c-sky.com>
> ---
> sysdeps/csky/dl-tls.h | 26 ++++++
> sysdeps/csky/libc-tls.c | 32 ++++++++
> sysdeps/csky/nptl/tcb-offsets.sym | 10 +++
> sysdeps/csky/nptl/tls.h | 169 ++++++++++++++++++++++++++++++++++++++
> sysdeps/csky/stackinfo.h | 32 ++++++++
> 5 files changed, 269 insertions(+)
> create mode 100644 sysdeps/csky/dl-tls.h
> create mode 100644 sysdeps/csky/libc-tls.c
> create mode 100644 sysdeps/csky/nptl/tcb-offsets.sym
> create mode 100644 sysdeps/csky/nptl/tls.h
> create mode 100644 sysdeps/csky/stackinfo.h
>
> diff --git a/sysdeps/csky/dl-tls.h b/sysdeps/csky/dl-tls.h
> new file mode 100644
> index 0000000..d44fc18
> --- /dev/null
> +++ b/sysdeps/csky/dl-tls.h
> @@ -0,0 +1,26 @@
> +/* Thread-local storage handling in the ELF dynamic linker. C-SKY 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/>. */
> +
> +/* 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/csky/libc-tls.c b/sysdeps/csky/libc-tls.c
> new file mode 100644
> index 0000000..30baf62
> --- /dev/null
> +++ b/sysdeps/csky/libc-tls.c
> @@ -0,0 +1,32 @@
> +/* Thread-local storage handling in the ELF dynamic linker. C-SKY 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 <csu/libc-tls.c>
> +#include <dl-tls.h>
> +
> +/* On C-SKY, linker optimizations are not required, so __tls_get_addr
> + can be called even in statically linked binaries. In this case module
> + must be always 1 and PT_TLS segment exist in the binary, otherwise it
> + would not link. */
> +
> +void *
> +__tls_get_addr (tls_index *ti)
> +{
> + dtv_t *dtv = THREAD_DTV ();
> + return (char *) dtv[1].pointer.val + ti->ti_offset;
> +}
> diff --git a/sysdeps/csky/nptl/tcb-offsets.sym b/sysdeps/csky/nptl/tcb-offsets.sym
> new file mode 100644
> index 0000000..bf9c0a1
> --- /dev/null
> +++ b/sysdeps/csky/nptl/tcb-offsets.sym
> @@ -0,0 +1,10 @@
> +#include <sysdep.h>
> +#include <tls.h>
> +
> +--
> +
> +-- Derive offsets relative to the thread register.
> +#define thread_offsetof(mem) (long)(offsetof(struct pthread, mem) - sizeof(struct pthread))
> +
> +MULTIPLE_THREADS_OFFSET thread_offsetof (header.multiple_threads)
> +TID_OFFSET thread_offsetof (tid)
> diff --git a/sysdeps/csky/nptl/tls.h b/sysdeps/csky/nptl/tls.h
> new file mode 100644
> index 0000000..69fadad
> --- /dev/null
> +++ b/sysdeps/csky/nptl/tls.h
> @@ -0,0 +1,169 @@
> +/* Definitions for thread-local data handling. NPTL/csky 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/>. */
> +
> +#ifndef _TLS_H
> +#define _TLS_H 1
> +
> +#ifndef __ASSEMBLER__
> +
> +#include <stdbool.h>
> +#include <stddef.h>
> +#include <stdint.h>
> +#include <dl-dtv.h>
> +
> +#ifdef __CSKYABIV2__
> +/* define r31 as thread pointer register. */
> +#define READ_THREAD_POINTER() \
> + ({ void *__result; \
> + __asm__ __volatile__ ("mov %0, r31" \
> + : "=r" (__result)); \
> + __result; })
> +#else
> +#define READ_THREAD_POINTER() \
> + ({ register unsigned int __result __asm__("a0"); \
> + __asm__ __volatile__ ("trap 3;" \
> + : "=r" (__result) : : ); \
> + __result; })
> +#endif
> +
> +#else /* __ASSEMBLER__ */
> +#include <tcb-offsets.h>
> +#ifdef __CSKYABIV2__
> +/* define r31 as thread pointer register. */
> +#define READ_THREAD_POINTER() \
> + mov r0, r31;
> +#else
> +#define READ_THREAD_POINTER() \
> + trap 3;
> +#endif
> +#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
> +
> +/* Get the thread descriptor definition. */
> +#include <nptl/descr.h>
> +
> +typedef struct
> +{
> + dtv_t *dtv;
> + void *private;
Stack guard or pointer guard support?
> +} tcbhead_t;
> +
> +/* This is the size of the initial TCB. */
> +#define TLS_INIT_TCB_SIZE sizeof (tcbhead_t)
> +
> +/* Alignment requirements for the initial TCB. */
> +#define TLS_INIT_TCB_ALIGN 8
> +
> +/* This is the size of the TCB. */
> +#define TLS_TCB_SIZE sizeof (tcbhead_t)
> +
> +/* Alignment requirements for the TCB. */
> +#define TLS_TCB_ALIGN 8
> +
> +/* This is the size we need before TCB. */
> +#define TLS_PRE_TCB_SIZE sizeof (struct pthread)
> +
> +/* 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))->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))->dtv)
> +
> +#define TLS_DEFINE_INIT_TP(tp, pd) void *tp = (pd) + 1
> +
> +/* Code to initially initialize the thread pointer. This might need
> + special attention since 'errno' is not yet available and if the
> + operation can cause a failure 'errno' must not be touched. */
> +#define TLS_INIT_TP(tcbp) \
> + ({ INTERNAL_SYSCALL_DECL (err); \
> + long result_var; \
> + result_var = INTERNAL_SYSCALL (set_thread_area, err, 1, \
> + (char *) (tcbp) + TLS_TCB_OFFSET); \
> + INTERNAL_SYSCALL_ERROR_P (result_var, err) \
> + ? "unknown error" : NULL; })
> +
> +/* Return the address of the dtv for the current thread. */
> +#define THREAD_DTV() \
> + (((tcbhead_t *) (READ_THREAD_POINTER () - TLS_TCB_OFFSET))->dtv)
> +
> +/* Return the thread descriptor for the current thread. */
> +#undef THREAD_SELF
> +#define THREAD_SELF \
> + ((struct pthread *) (READ_THREAD_POINTER () \
> + - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE))
> +
> +/* Magic for libthread_db to know how to do THREAD_SELF. */
> +#define DB_THREAD_SELF \
> + CONST_THREAD_AREA (32, sizeof (struct pthread))
> +
> +/* Access to data in the thread descriptor is easy. */
> +#define THREAD_GETMEM(descr, member) \
> + descr->member
> +#define THREAD_GETMEM_NC(descr, member, idx) \
> + descr->member[idx]
> +#define THREAD_SETMEM(descr, member, value) \
> + descr->member = (value)
> +#define THREAD_SETMEM_NC(descr, member, idx, value) \
> + descr->member[idx] = (value)
> +
> +/* Get and set the global scope generation counter in struct pthread. */
> +#define THREAD_GSCOPE_IN_TCB 1
> +#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/csky/stackinfo.h b/sysdeps/csky/stackinfo.h
> new file mode 100644
> index 0000000..7b5eb65
> --- /dev/null
> +++ b/sysdeps/csky/stackinfo.h
> @@ -0,0 +1,32 @@
> +/* This file contains a bit of information about the stack allocation
> + of the processor. C-SKY 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/>. */
> +
> +#ifndef _STACKINFO_H
> +#define _STACKINFO_H 1
> +
> +#include <elf.h>
> +
> +/* On C-SKY the stack grows down. */
> +#define _STACK_GROWS_DOWN 1
> +
> +/* Default to an executable stack. PF_X can be overridden if PT_GNU_STACK is
> + * present, but it is presumed absent. */
> +#define DEFAULT_STACK_PERMS (PF_R|PF_W|PF_X)
> +
> +#endif /* stackinfo.h */
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [RFC PATCH 03/10] C-SKY: Generic math Routines
2018-03-16 9:59 ` [RFC PATCH 03/10] C-SKY: Generic math Routines Mao Han
@ 2018-03-16 14:13 ` Carlos O'Donell
0 siblings, 0 replies; 22+ messages in thread
From: Carlos O'Donell @ 2018-03-16 14:13 UTC (permalink / raw)
To: Mao Han, libc-help; +Cc: ren_guo, yunhai_shang, qijie_tong, chunqiang_li
On 03/16/2018 03:58 AM, Mao Han wrote:
> This patch contains the miscellaneous math routines and headers we have
> implemented for C-SKY.
>
> *sysdeps/csky/bits/fenv.h: New file
> *sysdeps/csky/libm-test-ulps: New file
> *sysdeps/csky/libm-test-ulps-name: New file
> *sysdeps/csky/math-tests.h: New file
> *sysdeps/csky/sfp-machine.h: New file
> *sysdeps/csky/math_private.h: New file
> *sysdeps/csky/fenv_private.h: New file
>
Looks OK, you have an odd comment in fenv_private.h about someone needing
to check _FP_CHOOSENAN implementation for softfp, that should be cleaned up.
Overall looks ready to go to libc-alpha for review.
> Signed-off-by: Mao Han <han_mao@c-sky.com>
> ---
> sysdeps/csky/bits/fenv.h | 97 +++
> sysdeps/csky/fenv_private.h | 288 +++++++
> sysdeps/csky/libm-test-ulps | 1682 ++++++++++++++++++++++++++++++++++++++
> sysdeps/csky/libm-test-ulps-name | 1 +
> sysdeps/csky/math-tests.h | 35 +
> sysdeps/csky/math_private.h | 7 +
> sysdeps/csky/sfp-machine.h | 51 ++
> 7 files changed, 2161 insertions(+)
> create mode 100644 sysdeps/csky/bits/fenv.h
> create mode 100644 sysdeps/csky/fenv_private.h
> create mode 100644 sysdeps/csky/libm-test-ulps
> create mode 100644 sysdeps/csky/libm-test-ulps-name
> create mode 100644 sysdeps/csky/math-tests.h
> create mode 100644 sysdeps/csky/math_private.h
> create mode 100644 sysdeps/csky/sfp-machine.h
>
> diff --git a/sysdeps/csky/bits/fenv.h b/sysdeps/csky/bits/fenv.h
> new file mode 100644
> index 0000000..fdd188a
> --- /dev/null
> +++ b/sysdeps/csky/bits/fenv.h
> @@ -0,0 +1,97 @@
> +/* 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/>. */
> +
> +#ifndef _FENV_H
> +# error "Never use <bits/fenv.h> directly; include <fenv.h> instead."
> +#endif
> +
> +/* Define bits representing the exception. We use the bit positions
> + of the appropriate bits in the FPU control word. */
> +enum
> + {
> + FE_INVALID =
> +#define FE_INVALID 0x01
> + FE_INVALID,
> + FE_DIVBYZERO =
> +#define FE_DIVBYZERO 0x02
> + FE_DIVBYZERO,
> + FE_OVERFLOW =
> +#define FE_OVERFLOW 0x04
> + FE_OVERFLOW,
> + FE_UNDERFLOW =
> +#define FE_UNDERFLOW 0x08
> + FE_UNDERFLOW,
> + FE_INEXACT =
> +#define FE_INEXACT 0x10
> + FE_INEXACT,
> + FE_DENORMAL =
> +#define FE_DENORMAL 0x20
> + FE_DENORMAL,
> + };
> +
> +#define FE_ALL_EXCEPT \
> + (FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW |\
> + FE_INVALID | FE_DENORMAL)
> +
> +/* The C-SKY FPU supports all of the four defined rounding modes. We
> + use again the bit positions in the FPU control word as the values
> + for the appropriate macros. */
> +enum
> + {
> + FE_TONEAREST =
> +#define FE_TONEAREST (0x0 << 24)
> + FE_TONEAREST,
> + FE_TOWARDZERO =
> +#define FE_TOWARDZERO (0x1 << 24)
> + FE_TOWARDZERO,
> + FE_UPWARD =
> +#define FE_UPWARD (0x2 << 24)
> + FE_UPWARD,
> + FE_DOWNWARD =
> +#define FE_DOWNWARD (0x3 << 24)
> + FE_DOWNWARD,
> + FE_ROUND_MASK =
> +#define FE_ROUND_MASK (0x3 << 24)
> + FE_ROUND_MASK
> + };
> +
> +/* Type representing exception flags. */
> +typedef unsigned int fexcept_t;
> +
> +/* Type representing floating-point environment. */
> +typedef struct
> + {
> + unsigned int __fpcr;
> + unsigned int __fpsr;
> + }
> +fenv_t;
> +
> +/* If the default argument is used we use this value. */
> +#define FE_DFL_ENV ((const fenv_t *) -1)
> +
> +#ifdef __USE_GNU
> +/* Floating-point environment where none of the exceptions are masked. */
> +# define FE_NOMASK_ENV ((const fenv_t *) -2)
> +#endif
> +
> +#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/csky/fenv_private.h b/sysdeps/csky/fenv_private.h
> new file mode 100644
> index 0000000..dc15032
> --- /dev/null
> +++ b/sysdeps/csky/fenv_private.h
> @@ -0,0 +1,288 @@
> +/* Private floating point rounding and exceptions handling. C-SKY 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/>. */
> +
> +#ifndef FENV_PRIVATE_H
> +#define FENV_PRIVATE_H 1
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +
> +#ifdef __csky_hard_float__
> +# include <fenv_libc.h>
> +
> +static __always_inline void
> +libc_feholdexcept_vfp (fenv_t *envp)
> +{
> + unsigned int fpsr;
> + unsigned int fpcr;
> +
> + _FPU_GETCW (fpcr);
> + envp->__fpcr = fpcr;
> +
> + _FPU_GETFPSR (fpsr);
> + envp->__fpsr = fpsr;
> +
> + /* Now set all exceptions to non-stop. */
> + fpcr &= ~FE_ALL_EXCEPT;
> +
> + /* And clear all exception flags. */
> + fpsr &= ~(FE_ALL_EXCEPT << CAUSE_SHIFT);
> +
> + _FPU_SETFPSR (fpsr);
> +
> + _FPU_SETCW (fpcr);
> +}
> +
> +static __always_inline void
> +libc_fesetround_vfp (int round)
> +{
> + fpu_control_t fpcr;
> +
> + _FPU_GETCW (fpcr);
> +
> + /* Set new rounding mode if different. */
> + if (__glibc_unlikely ((fpcr & FE_DOWNWARD) != round))
> + _FPU_SETCW ((fpcr & ~FE_DOWNWARD) | round);
> +}
> +
> +static __always_inline void
> +libc_feholdexcept_setround_vfp (fenv_t *envp, int round)
> +{
> + fpu_control_t fpsr;
> + fpu_control_t fpcr;
> +
> + _FPU_GETCW (fpcr);
> + envp->__fpcr = fpcr;
> +
> + _FPU_GETFPSR (fpsr);
> + envp->__fpsr = fpsr;
> +
> + /* Clear exception flags, set all exceptions to non-stop,
> + and set new rounding mode. */
> + fpcr &= ~(FE_ALL_EXCEPT | FE_DOWNWARD);
> + _FPU_SETCW (fpcr | round);
> +
> + fpsr &= ~(FE_ALL_EXCEPT << CAUSE_SHIFT);
> + _FPU_SETFPSR (fpsr);
> +}
> +
> +static __always_inline void
> +libc_feholdsetround_vfp (fenv_t *envp, int round)
> +{
> + fpu_control_t fpcr;
> +
> + _FPU_GETCW (fpcr);
> + envp->__fpcr = fpcr;
> +
> + /* Set new rounding mode if different. */
> + if (__glibc_unlikely ((fpcr & FE_DOWNWARD) != round))
> + _FPU_SETCW ((fpcr & ~FE_DOWNWARD) | round);
> +}
> +
> +static __always_inline void
> +libc_feresetround_vfp (fenv_t *envp)
> +{
> + fpu_control_t fpcr, round;
> +
> + _FPU_GETCW (fpcr);
> +
> + /* Check whether rounding modes are different. */
> + round = (envp->__fpcr ^ fpcr) & FE_DOWNWARD;
> +
> + /* Restore the rounding mode if it was changed. */
> + if (__glibc_unlikely (round != 0))
> + _FPU_SETCW (fpcr ^ round);
> +}
> +
> +static __always_inline int
> +libc_fetestexcept_vfp (int ex)
> +{
> + fpu_control_t fpsr;
> +
> + _FPU_GETFPSR (fpsr);
> + fpsr = fpsr >> CAUSE_SHIFT;
> + return fpsr & ex & FE_ALL_EXCEPT;
> +}
> +
> +static __always_inline void
> +libc_fesetenv_vfp (const fenv_t *envp)
> +{
> + unsigned int fpcr;
> + unsigned int fpsr;
> +
> + _FPU_GETCW (fpcr);
> + _FPU_GETFPSR (fpsr);
> +
> + fpcr &= _FPU_RESERVED;
> + fpsr &= _FPU_FPSR_RESERVED;
> +
> + if (envp == FE_DFL_ENV)
> + {
> + fpcr |= _FPU_DEFAULT;
> + fpsr |= _FPU_FPSR_DEFAULT;
> + }
> + else if (envp == FE_NOMASK_ENV)
> + {
> + fpcr |= _FPU_FPCR_IEEE;
> + fpsr |= _FPU_FPSR_IEEE;
> + }
> + else
> + {
> + fpcr |= envp->__fpcr & ~_FPU_RESERVED;
> + fpsr |= envp->__fpsr & ~_FPU_FPSR_RESERVED;
> + }
> +
> + _FPU_SETFPSR (fpsr);
> +
> + _FPU_SETCW (fpcr);
> +}
> +
> +static __always_inline int
> +libc_feupdateenv_test_vfp (const fenv_t *envp, int ex)
> +{
> + fpu_control_t fpsr, new_fpsr;
> + int excepts;
> +
> + _FPU_GETFPSR (fpsr);
> +
> + /* Merge current exception flags with the saved fenv. */
> + excepts = (fpsr >> CAUSE_SHIFT) & FE_ALL_EXCEPT;
> + new_fpsr = envp->__fpsr | (excepts << CAUSE_SHIFT);
> +
> + /* Write new FPSCR if different (ignoring NZCV flags). */
> + if (__glibc_unlikely (((fpsr ^ new_fpsr)) != 0))
> + _FPU_SETFPSR (new_fpsr);
> +
> + /* Raise the exceptions if enabled in the new FP state. */
> + if (__glibc_unlikely (excepts & (new_fpsr >> CAUSE_SHIFT)))
> + __feraiseexcept (excepts);
> +
> + return excepts & ex;
> +}
> +
> +static __always_inline void
> +libc_feupdateenv_vfp (const fenv_t *envp)
> +{
> + libc_feupdateenv_test_vfp (envp, 0);
> +}
> +
> +static __always_inline void
> +libc_feholdsetround_vfp_ctx (struct rm_ctx *ctx, int r)
> +{
> + fpu_control_t fpcr, round;
> +
> + _FPU_GETCW (fpcr);
> + ctx->updated_status = false;
> + ctx->env.__fpcr = fpcr;
> +
> + /* Check whether rounding modes are different. */
> + round = (fpcr ^ r) & FE_DOWNWARD;
> +
> + /* Set the rounding mode if changed. */
> + if (__glibc_unlikely (round != 0))
> + {
> + ctx->updated_status = true;
> + _FPU_SETCW (fpcr ^ round);
> + }
> +}
> +
> +static __always_inline void
> +libc_feresetround_vfp_ctx (struct rm_ctx *ctx)
> +{
> + /* Restore the rounding mode if updated. */
> + if (__glibc_unlikely (ctx->updated_status))
> + {
> + fpu_control_t fpcr;
> +
> + _FPU_GETCW (fpcr);
> + fpcr = (fpcr & ~FE_DOWNWARD) | (ctx->env.__fpcr & FE_DOWNWARD);
> + _FPU_SETCW (fpcr);
> + }
> +}
> +
> +static __always_inline void
> +libc_fesetenv_vfp_ctx (struct rm_ctx *ctx)
> +{
> + fpu_control_t fpcr, new_fpcr;
> +
> + _FPU_GETCW (fpcr);
> + new_fpcr = ctx->env.__fpcr;
> +
> + /* Write new FPSCR if different (ignoring NZCV flags). */
> + if (__glibc_unlikely (((fpcr ^ new_fpcr)) != 0))
> + _FPU_SETCW (new_fpcr);
> +}
> +
> +# define libc_feholdexcept libc_feholdexcept_vfp
> +# define libc_feholdexceptf libc_feholdexcept_vfp
> +# define libc_feholdexceptl libc_feholdexcept_vfp
> +
> +# define libc_fesetround libc_fesetround_vfp
> +# define libc_fesetroundf libc_fesetround_vfp
> +# define libc_fesetroundl libc_fesetround_vfp
> +
> +# define libc_feresetround libc_feresetround_vfp
> +# define libc_feresetroundf libc_feresetround_vfp
> +# define libc_feresetroundl libc_feresetround_vfp
> +
> +# define libc_feresetround_noex libc_fesetenv_vfp
> +# define libc_feresetround_noexf libc_fesetenv_vfp
> +# define libc_feresetround_noexl libc_fesetenv_vfp
> +
> +# define libc_feholdexcept_setround libc_feholdexcept_setround_vfp
> +# define libc_feholdexcept_setroundf libc_feholdexcept_setround_vfp
> +# define libc_feholdexcept_setroundl libc_feholdexcept_setround_vfp
> +
> +# define libc_feholdsetround libc_feholdsetround_vfp
> +# define libc_feholdsetroundf libc_feholdsetround_vfp
> +# define libc_feholdsetroundl libc_feholdsetround_vfp
> +
> +# define libc_fetestexcept libc_fetestexcept_vfp
> +# define libc_fetestexceptf libc_fetestexcept_vfp
> +# define libc_fetestexceptl libc_fetestexcept_vfp
> +
> +# define libc_fesetenv libc_fesetenv_vfp
> +# define libc_fesetenvf libc_fesetenv_vfp
> +# define libc_fesetenvl libc_fesetenv_vfp
> +
> +# define libc_feupdateenv libc_feupdateenv_vfp
> +# define libc_feupdateenvf libc_feupdateenv_vfp
> +# define libc_feupdateenvl libc_feupdateenv_vfp
> +
> +# define libc_feupdateenv_test libc_feupdateenv_test_vfp
> +# define libc_feupdateenv_testf libc_feupdateenv_test_vfp
> +# define libc_feupdateenv_testl libc_feupdateenv_test_vfp
> +
> +/* We have support for rounding mode context. */
> +# define HAVE_RM_CTX 1
> +
> +# define libc_feholdsetround_ctx libc_feholdsetround_vfp_ctx
> +# define libc_feresetround_ctx libc_feresetround_vfp_ctx
> +# define libc_feresetround_noex_ctx libc_fesetenv_vfp_ctx
> +
> +# define libc_feholdsetroundf_ctx libc_feholdsetround_vfp_ctx
> +# define libc_feresetroundf_ctx libc_feresetround_vfp_ctx
> +# define libc_feresetround_noexf_ctx libc_fesetenv_vfp_ctx
> +
> +# define libc_feholdsetroundl_ctx libc_feholdsetround_vfp_ctx
> +# define libc_feresetroundl_ctx libc_feresetround_vfp_ctx
> +# define libc_feresetround_noexl_ctx libc_fesetenv_vfp_ctx
> +
> +#endif /* __csky_hard_float__ */
> +
> +#endif /* FENV_PRIVATE_H */
> diff --git a/sysdeps/csky/libm-test-ulps b/sysdeps/csky/libm-test-ulps
> new file mode 100644
> index 0000000..aa3d696
> --- /dev/null
> +++ b/sysdeps/csky/libm-test-ulps
> @@ -0,0 +1,1682 @@
> +# Begin of automatic generation
> +
> +# Maximal error of functions:
> +Function: "acos":
> +float: 1
> +ifloat: 1
> +
> +Function: "acos_downward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "acos_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "acos_upward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "acosh":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "acosh_downward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "acosh_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "acosh_upward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "asin":
> +float: 1
> +ifloat: 1
> +
> +Function: "asin_downward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "asin_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "asin_upward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "asinh":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "asinh_downward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "asinh_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "asinh_upward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "atan":
> +float: 1
> +ifloat: 1
> +
> +Function: "atan2":
> +float: 1
> +ifloat: 1
> +
> +Function: "atan2_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "atan2_towardzero":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "atan2_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "atan_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "atan_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "atan_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "atanh":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "atanh_downward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "atanh_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "atanh_upward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "cabs":
> +double: 1
> +idouble: 1
> +
> +Function: "cabs_downward":
> +double: 1
> +idouble: 1
> +
> +Function: "cabs_towardzero":
> +double: 1
> +idouble: 1
> +
> +Function: "cabs_upward":
> +double: 1
> +idouble: 1
> +
> +Function: Real part of "cacos":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Imaginary part of "cacos":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "cacos_downward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Imaginary part of "cacos_downward":
> +double: 5
> +float: 3
> +idouble: 5
> +ifloat: 3
> +
> +Function: Real part of "cacos_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Imaginary part of "cacos_towardzero":
> +double: 5
> +float: 3
> +idouble: 5
> +ifloat: 3
> +
> +Function: Real part of "cacos_upward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Imaginary part of "cacos_upward":
> +double: 4
> +float: 4
> +idouble: 4
> +ifloat: 4
> +
> +Function: Real part of "cacosh":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Imaginary part of "cacosh":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "cacosh_downward":
> +double: 5
> +float: 3
> +idouble: 5
> +ifloat: 3
> +
> +Function: Imaginary part of "cacosh_downward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Real part of "cacosh_towardzero":
> +double: 5
> +float: 3
> +idouble: 5
> +ifloat: 3
> +
> +Function: Imaginary part of "cacosh_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Real part of "cacosh_upward":
> +double: 4
> +float: 4
> +idouble: 4
> +ifloat: 4
> +
> +Function: Imaginary part of "cacosh_upward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "carg":
> +float: 1
> +ifloat: 1
> +
> +Function: "carg_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "carg_towardzero":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "carg_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "casin":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Imaginary part of "casin":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "casin_downward":
> +double: 3
> +float: 1
> +idouble: 3
> +ifloat: 1
> +
> +Function: Imaginary part of "casin_downward":
> +double: 5
> +float: 3
> +idouble: 5
> +ifloat: 3
> +
> +Function: Real part of "casin_towardzero":
> +double: 3
> +float: 1
> +idouble: 3
> +ifloat: 1
> +
> +Function: Imaginary part of "casin_towardzero":
> +double: 5
> +float: 3
> +idouble: 5
> +ifloat: 3
> +
> +Function: Real part of "casin_upward":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: Imaginary part of "casin_upward":
> +double: 4
> +float: 4
> +idouble: 4
> +ifloat: 4
> +
> +Function: Real part of "casinh":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Imaginary part of "casinh":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Real part of "casinh_downward":
> +double: 5
> +float: 3
> +idouble: 5
> +ifloat: 3
> +
> +Function: Imaginary part of "casinh_downward":
> +double: 3
> +float: 1
> +idouble: 3
> +ifloat: 1
> +
> +Function: Real part of "casinh_towardzero":
> +double: 5
> +float: 3
> +idouble: 5
> +ifloat: 3
> +
> +Function: Imaginary part of "casinh_towardzero":
> +double: 3
> +float: 1
> +idouble: 3
> +ifloat: 1
> +
> +Function: Real part of "casinh_upward":
> +double: 4
> +float: 4
> +idouble: 4
> +ifloat: 4
> +
> +Function: Imaginary part of "casinh_upward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Real part of "catan":
> +float: 1
> +ifloat: 1
> +
> +Function: Imaginary part of "catan":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Real part of "catan_downward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Imaginary part of "catan_downward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Real part of "catan_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Imaginary part of "catan_towardzero":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: Real part of "catan_upward":
> +float: 1
> +ifloat: 1
> +
> +Function: Imaginary part of "catan_upward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: Real part of "catanh":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Imaginary part of "catanh":
> +float: 1
> +ifloat: 1
> +
> +Function: Real part of "catanh_downward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Imaginary part of "catanh_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "catanh_towardzero":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: Imaginary part of "catanh_towardzero":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "catanh_upward":
> +double: 4
> +float: 3
> +idouble: 4
> +ifloat: 3
> +
> +Function: Imaginary part of "catanh_upward":
> +float: 1
> +ifloat: 1
> +
> +Function: "cbrt":
> +double: 3
> +float: 1
> +idouble: 3
> +ifloat: 1
> +
> +Function: "cbrt_downward":
> +double: 4
> +float: 1
> +idouble: 4
> +ifloat: 1
> +
> +Function: "cbrt_towardzero":
> +double: 3
> +float: 1
> +idouble: 3
> +ifloat: 1
> +
> +Function: "cbrt_upward":
> +double: 5
> +float: 1
> +idouble: 5
> +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 "ccos_downward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Imaginary part of "ccos_downward":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Real part of "ccos_towardzero":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Imaginary part of "ccos_towardzero":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Real part of "ccos_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Imaginary part of "ccos_upward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +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 "ccosh_downward":
> +double: 1
> +float: 3
> +idouble: 1
> +ifloat: 3
> +
> +Function: Imaginary part of "ccosh_downward":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Real part of "ccosh_towardzero":
> +double: 1
> +float: 3
> +idouble: 1
> +ifloat: 3
> +
> +Function: Imaginary part of "ccosh_towardzero":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Real part of "ccosh_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Imaginary part of "ccosh_upward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +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 "cexp_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Imaginary part of "cexp_downward":
> +double: 1
> +float: 3
> +idouble: 1
> +ifloat: 3
> +
> +Function: Real part of "cexp_towardzero":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Imaginary part of "cexp_towardzero":
> +double: 1
> +float: 3
> +idouble: 1
> +ifloat: 3
> +
> +Function: Real part of "cexp_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Imaginary part of "cexp_upward":
> +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: 3
> +ifloat: 4
> +
> +Function: Imaginary part of "clog10":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Real part of "clog10_downward":
> +double: 5
> +float: 4
> +idouble: 5
> +ifloat: 4
> +
> +Function: Imaginary part of "clog10_downward":
> +double: 2
> +float: 4
> +idouble: 2
> +ifloat: 4
> +
> +Function: Real part of "clog10_towardzero":
> +double: 5
> +float: 5
> +idouble: 5
> +ifloat: 5
> +
> +Function: Imaginary part of "clog10_towardzero":
> +double: 2
> +float: 4
> +idouble: 2
> +ifloat: 4
> +
> +Function: Real part of "clog10_upward":
> +double: 6
> +float: 5
> +idouble: 6
> +ifloat: 5
> +
> +Function: Imaginary part of "clog10_upward":
> +double: 2
> +float: 4
> +idouble: 2
> +ifloat: 4
> +
> +Function: Real part of "clog_downward":
> +double: 4
> +float: 3
> +idouble: 4
> +ifloat: 3
> +
> +Function: Imaginary part of "clog_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "clog_towardzero":
> +double: 4
> +float: 4
> +idouble: 4
> +ifloat: 4
> +
> +Function: Imaginary part of "clog_towardzero":
> +double: 1
> +float: 3
> +idouble: 1
> +ifloat: 3
> +
> +Function: Real part of "clog_upward":
> +double: 4
> +float: 3
> +idouble: 4
> +ifloat: 3
> +
> +Function: Imaginary part of "clog_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "cos":
> +float: 1
> +ifloat: 1
> +
> +Function: "cos_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "cos_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "cos_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "cosh":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "cosh_downward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "cosh_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "cosh_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "cpow":
> +double: 2
> +float: 4
> +idouble: 2
> +ifloat: 4
> +
> +Function: Imaginary part of "cpow":
> +float: 2
> +ifloat: 2
> +
> +Function: Real part of "cpow_downward":
> +double: 4
> +float: 8
> +idouble: 4
> +ifloat: 8
> +
> +Function: Imaginary part of "cpow_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "cpow_towardzero":
> +double: 4
> +float: 8
> +idouble: 4
> +ifloat: 8
> +
> +Function: Imaginary part of "cpow_towardzero":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "cpow_upward":
> +double: 4
> +float: 1
> +idouble: 4
> +ifloat: 1
> +
> +Function: Imaginary part of "cpow_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "csin":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Real part of "csin_downward":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Imaginary part of "csin_downward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Real part of "csin_towardzero":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Imaginary part of "csin_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Real part of "csin_upward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Imaginary part of "csin_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +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 "csinh_downward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Imaginary part of "csinh_downward":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Real part of "csinh_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Imaginary part of "csinh_towardzero":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Real part of "csinh_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Imaginary part of "csinh_upward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +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 "csqrt_downward":
> +double: 5
> +float: 4
> +idouble: 5
> +ifloat: 4
> +
> +Function: Imaginary part of "csqrt_downward":
> +double: 4
> +float: 3
> +idouble: 4
> +ifloat: 3
> +
> +Function: Real part of "csqrt_towardzero":
> +double: 4
> +float: 3
> +idouble: 4
> +ifloat: 3
> +
> +Function: Imaginary part of "csqrt_towardzero":
> +double: 4
> +float: 3
> +idouble: 4
> +ifloat: 3
> +
> +Function: Real part of "csqrt_upward":
> +double: 5
> +float: 4
> +idouble: 5
> +ifloat: 4
> +
> +Function: Imaginary part of "csqrt_upward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: Real part of "ctan":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Imaginary part of "ctan":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: Real part of "ctan_downward":
> +double: 6
> +float: 5
> +idouble: 6
> +ifloat: 5
> +
> +Function: Imaginary part of "ctan_downward":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: Real part of "ctan_towardzero":
> +double: 5
> +float: 3
> +idouble: 5
> +ifloat: 3
> +
> +Function: Imaginary part of "ctan_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Real part of "ctan_upward":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Imaginary part of "ctan_upward":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Real part of "ctanh":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: Imaginary part of "ctanh":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Real part of "ctanh_downward":
> +double: 4
> +float: 1
> +idouble: 4
> +ifloat: 1
> +
> +Function: Imaginary part of "ctanh_downward":
> +double: 6
> +float: 5
> +idouble: 6
> +ifloat: 5
> +
> +Function: Real part of "ctanh_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Imaginary part of "ctanh_towardzero":
> +double: 5
> +float: 3
> +idouble: 5
> +ifloat: 3
> +
> +Function: Real part of "ctanh_upward":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Imaginary part of "ctanh_upward":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: "erf":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "erf_downward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "erf_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "erf_upward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "erfc":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "erfc_downward":
> +double: 5
> +float: 6
> +idouble: 5
> +ifloat: 6
> +
> +Function: "erfc_towardzero":
> +double: 3
> +float: 4
> +idouble: 3
> +ifloat: 4
> +
> +Function: "erfc_upward":
> +double: 5
> +float: 6
> +idouble: 5
> +ifloat: 6
> +
> +Function: "exp":
> +float: 1
> +ifloat: 1
> +
> +Function: "exp10":
> +double: 2
> +idouble: 2
> +
> +Function: "exp10_downward":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: "exp10_towardzero":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: "exp10_upward":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: "exp2":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "exp2_downward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "exp2_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "exp2_upward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "exp_downward":
> +double: 1
> +idouble: 1
> +
> +Function: "exp_towardzero":
> +double: 1
> +idouble: 1
> +
> +Function: "exp_upward":
> +double: 1
> +idouble: 1
> +
> +Function: "expm1":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "expm1_downward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "expm1_towardzero":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "expm1_upward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "gamma":
> +double: 4
> +float: 4
> +idouble: 4
> +ifloat: 4
> +
> +Function: "gamma_downward":
> +double: 5
> +float: 4
> +idouble: 5
> +ifloat: 4
> +
> +Function: "gamma_towardzero":
> +double: 5
> +float: 4
> +idouble: 5
> +ifloat: 4
> +
> +Function: "gamma_upward":
> +double: 5
> +float: 5
> +idouble: 5
> +ifloat: 5
> +
> +Function: "hypot":
> +double: 1
> +idouble: 1
> +
> +Function: "hypot_downward":
> +double: 1
> +idouble: 1
> +
> +Function: "hypot_towardzero":
> +double: 1
> +idouble: 1
> +
> +Function: "hypot_upward":
> +double: 1
> +idouble: 1
> +
> +Function: "j0":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "j0_downward":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: "j0_towardzero":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "j0_upward":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "j1":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "j1_downward":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "j1_towardzero":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "j1_upward":
> +double: 3
> +float: 5
> +idouble: 3
> +ifloat: 5
> +
> +Function: "jn":
> +double: 4
> +float: 4
> +idouble: 4
> +ifloat: 4
> +
> +Function: "jn_downward":
> +double: 5
> +float: 5
> +idouble: 5
> +ifloat: 5
> +
> +Function: "jn_towardzero":
> +double: 5
> +float: 5
> +idouble: 5
> +ifloat: 5
> +
> +Function: "jn_upward":
> +double: 5
> +float: 5
> +idouble: 5
> +ifloat: 5
> +
> +Function: "lgamma":
> +double: 4
> +float: 4
> +idouble: 4
> +ifloat: 4
> +
> +Function: "lgamma_downward":
> +double: 5
> +float: 4
> +idouble: 5
> +ifloat: 4
> +
> +Function: "lgamma_towardzero":
> +double: 5
> +float: 4
> +idouble: 5
> +ifloat: 4
> +
> +Function: "lgamma_upward":
> +double: 5
> +float: 5
> +idouble: 5
> +ifloat: 5
> +
> +Function: "log":
> +float: 1
> +ifloat: 1
> +
> +Function: "log10":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "log10_downward":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: "log10_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "log10_upward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "log1p":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "log1p_downward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "log1p_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "log1p_upward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "log2":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: "log2_downward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "log2_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "log2_upward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "log_downward":
> +float: 2
> +ifloat: 2
> +
> +Function: "log_towardzero":
> +float: 2
> +ifloat: 2
> +
> +Function: "log_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "pow":
> +float: 1
> +ifloat: 1
> +
> +Function: "pow10":
> +double: 2
> +idouble: 2
> +
> +Function: "pow10_downward":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: "pow10_towardzero":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: "pow10_upward":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: "pow_downward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "pow_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "pow_upward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "sin":
> +float: 1
> +ifloat: 1
> +
> +Function: "sin_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "sin_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "sin_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "sincos":
> +float: 1
> +ifloat: 1
> +
> +Function: "sincos_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "sincos_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "sincos_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "sinh":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "sinh_downward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "sinh_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "sinh_upward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "tan":
> +float: 1
> +ifloat: 1
> +
> +Function: "tan_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "tan_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "tan_upward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "tanh":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "tanh_downward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "tanh_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "tanh_upward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "tgamma":
> +double: 5
> +float: 4
> +idouble: 5
> +ifloat: 4
> +
> +Function: "tgamma_downward":
> +double: 5
> +float: 5
> +idouble: 5
> +ifloat: 5
> +
> +Function: "tgamma_towardzero":
> +double: 5
> +float: 4
> +idouble: 5
> +ifloat: 4
> +
> +Function: "tgamma_upward":
> +double: 4
> +float: 4
> +idouble: 4
> +ifloat: 4
> +
> +Function: "y0":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: "y0_downward":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "y0_towardzero":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "y0_upward":
> +double: 3
> +float: 4
> +idouble: 3
> +ifloat: 4
> +
> +Function: "y1":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "y1_downward":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "y1_towardzero":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "y1_upward":
> +double: 7
> +float: 2
> +idouble: 7
> +ifloat: 2
> +
> +Function: "yn":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "yn_downward":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "yn_towardzero":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "yn_upward":
> +double: 4
> +float: 4
> +idouble: 4
> +ifloat: 4
> +
> +# end of automatic generation
> diff --git a/sysdeps/csky/libm-test-ulps-name b/sysdeps/csky/libm-test-ulps-name
> new file mode 100644
> index 0000000..236b0fb
> --- /dev/null
> +++ b/sysdeps/csky/libm-test-ulps-name
> @@ -0,0 +1 @@
> +CSKY
> diff --git a/sysdeps/csky/math-tests.h b/sysdeps/csky/math-tests.h
> new file mode 100644
> index 0000000..30d9b73
> --- /dev/null
> +++ b/sysdeps/csky/math-tests.h
> @@ -0,0 +1,35 @@
> +/* Configuration for math tests. C-SKY 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/>. */
> +
> +/* On systems with VFP support, but where glibc is built for
> + soft-float, the libgcc functions used in libc and libm do not
> + support rounding modes, although fesetround succeeds, and do not
> + support exceptions. */
> +#ifdef __CSKY_SOFT_FLOAT__
> +# 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
> +#endif
> +
> +/* Not all VFP implementations support trapping exceptions. */
> +#define EXCEPTION_ENABLE_SUPPORTED(EXCEPT) ((EXCEPT) == 0)
> +
> +#include_next <math-tests.h>
> diff --git a/sysdeps/csky/math_private.h b/sysdeps/csky/math_private.h
> new file mode 100644
> index 0000000..db303da
> --- /dev/null
> +++ b/sysdeps/csky/math_private.h
> @@ -0,0 +1,7 @@
> +#ifndef CSKY_MATH_PRIVATE_H
> +#define CSKY_MATH_PRIVATE_H 1
> +
> +#include "fenv_private.h"
> +#include_next <math_private.h>
> +
> +#endif
> diff --git a/sysdeps/csky/sfp-machine.h b/sysdeps/csky/sfp-machine.h
> new file mode 100644
> index 0000000..2e7c156
> --- /dev/null
> +++ b/sysdeps/csky/sfp-machine.h
> @@ -0,0 +1,51 @@
> +#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
> +#define _FP_NANFRAC_D _FP_QNANBIT_D, 0
> +#define _FP_NANFRAC_Q _FP_QNANBIT_Q, 0, 0, 0
> +#define _FP_NANSIGN_S 0
> +#define _FP_NANSIGN_D 0
> +#define _FP_NANSIGN_Q 0
> +
> +#define _FP_KEEPNANFRACP 1
> +#define _FP_QNANNEGATEDP 0
> +
> +/* Someone please check this. */
What needs to be checked?
> +#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
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [RFC PATCH 04/10] C-SKY: Hard Float Support
2018-03-16 9:59 ` [RFC PATCH 04/10] C-SKY: Hard Float Support Mao Han
@ 2018-03-16 14:15 ` Carlos O'Donell
0 siblings, 0 replies; 22+ messages in thread
From: Carlos O'Donell @ 2018-03-16 14:15 UTC (permalink / raw)
To: Mao Han, libc-help; +Cc: ren_guo, yunhai_shang, qijie_tong, chunqiang_li
On 03/16/2018 03:58 AM, Mao Han wrote:
> This patch contains hardware floating-point support for C-SKY.
>
> *sysdeps/csky/fpu/fclrexcpt.c: New file
> *sysdeps/csky/fpu/fedisblxcpt.c: New file
> *sysdeps/csky/fpu/feenablxcpt.c: New file
> *sysdeps/csky/fpu/fegetenv.c: New file
> *sysdeps/csky/fpu/fegetexcept.c: New file
> *sysdeps/csky/fpu/fegetmode.c: New file
> *sysdeps/csky/fpu/fegetround.c: New file
> *sysdeps/csky/fpu/feholdexcpt.c: New file
> *sysdeps/csky/fpu/fenv_libc.h: New file
> *sysdeps/csky/fpu/fesetenv.c: New file
> *sysdeps/csky/fpu/fesetexcept.c: New file
> *sysdeps/csky/fpu/fesetmode.c: New file
> *sysdeps/csky/fpu/fesetround.c: New file
> *sysdeps/csky/fpu/feupdateenv.c: New file
> *sysdeps/csky/fpu/fgetexcptflg.c: New file
> *sysdeps/csky/fpu/fraiseexcpt.c: New file
> *sysdeps/csky/fpu/fsetexcptflg.c: New file
> *sysdeps/csky/fpu/ftestexcept.c: New file
> *sysdeps/csky/fpu_control.h: New file
>
Fairly straight forward looks OK to me.
Should go to libc-alpha now.
> Signed-off-by: Mao Han <han_mao@c-sky.com>
> ---
> sysdeps/csky/fpu/fclrexcpt.c | 47 +++++++++++++
> sysdeps/csky/fpu/fedisblxcpt.c | 46 ++++++++++++
> sysdeps/csky/fpu/feenablxcpt.c | 45 ++++++++++++
> sysdeps/csky/fpu/fegetenv.c | 43 ++++++++++++
> sysdeps/csky/fpu/fegetexcept.c | 37 ++++++++++
> sysdeps/csky/fpu/fegetmode.c | 29 ++++++++
> sysdeps/csky/fpu/fegetround.c | 39 +++++++++++
> sysdeps/csky/fpu/feholdexcpt.c | 39 +++++++++++
> sysdeps/csky/fpu/fenv_libc.h | 29 ++++++++
> sysdeps/csky/fpu/fesetenv.c | 65 +++++++++++++++++
> sysdeps/csky/fpu/fesetexcept.c | 37 ++++++++++
> sysdeps/csky/fpu/fesetmode.c | 37 ++++++++++
> sysdeps/csky/fpu/fesetround.c | 42 +++++++++++
> sysdeps/csky/fpu/feupdateenv.c | 52 ++++++++++++++
> sysdeps/csky/fpu/fgetexcptflg.c | 37 ++++++++++
> sysdeps/csky/fpu/fraiseexcpt.c | 131 +++++++++++++++++++++++++++++++++++
> sysdeps/csky/fpu/fsetexcptflg.c | 48 +++++++++++++
> sysdeps/csky/fpu/ftestexcept.c | 35 ++++++++++
> sysdeps/csky/fpu_control.h | 150 ++++++++++++++++++++++++++++++++++++++++
> 19 files changed, 988 insertions(+)
> create mode 100644 sysdeps/csky/fpu/fclrexcpt.c
> create mode 100644 sysdeps/csky/fpu/fedisblxcpt.c
> create mode 100644 sysdeps/csky/fpu/feenablxcpt.c
> create mode 100644 sysdeps/csky/fpu/fegetenv.c
> create mode 100644 sysdeps/csky/fpu/fegetexcept.c
> create mode 100644 sysdeps/csky/fpu/fegetmode.c
> create mode 100644 sysdeps/csky/fpu/fegetround.c
> create mode 100644 sysdeps/csky/fpu/feholdexcpt.c
> create mode 100644 sysdeps/csky/fpu/fenv_libc.h
> create mode 100644 sysdeps/csky/fpu/fesetenv.c
> create mode 100644 sysdeps/csky/fpu/fesetexcept.c
> create mode 100644 sysdeps/csky/fpu/fesetmode.c
> create mode 100644 sysdeps/csky/fpu/fesetround.c
> create mode 100644 sysdeps/csky/fpu/feupdateenv.c
> create mode 100644 sysdeps/csky/fpu/fgetexcptflg.c
> create mode 100644 sysdeps/csky/fpu/fraiseexcpt.c
> create mode 100644 sysdeps/csky/fpu/fsetexcptflg.c
> create mode 100644 sysdeps/csky/fpu/ftestexcept.c
> create mode 100644 sysdeps/csky/fpu_control.h
>
> diff --git a/sysdeps/csky/fpu/fclrexcpt.c b/sysdeps/csky/fpu/fclrexcpt.c
> new file mode 100644
> index 0000000..d3bbaf0
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fclrexcpt.c
> @@ -0,0 +1,47 @@
> +/* Clear given exceptions in current floating-point environment.
> + 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 <fenv.h>
> +#include <fenv_libc.h>
> +#include <fpu_control.h>
> +
> +int
> +feclearexcept (int excepts)
> +{
> +#ifdef __csky_hard_float__
> + int fpsr;
> +
> + /* Mask out unsupported bits/exceptions. */
> + excepts &= FE_ALL_EXCEPT;
> +
> + /* Read the complete control word. */
> + _FPU_GETFPSR (fpsr);
> +
> + /* Clear the relevant bits. */
> + fpsr &= ~(excepts | (excepts << CAUSE_SHIFT));
> +
> + /* Put the new data in effect. */
> + _FPU_SETFPSR (fpsr);
> +
> + return 0;
> +#else
> + /* Unsupported, so fail unless nothing needs to be done. */
> + return (excepts != 0);
> +#endif /* __csky_hard_float__ */
> +}
> +libm_hidden_def (feclearexcept)
> diff --git a/sysdeps/csky/fpu/fedisblxcpt.c b/sysdeps/csky/fpu/fedisblxcpt.c
> new file mode 100644
> index 0000000..6a70c0e
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fedisblxcpt.c
> @@ -0,0 +1,46 @@
> +/* Disable floating-point exceptions.
> + 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 <fenv.h>
> +#include <fenv_libc.h>
> +#include <fpu_control.h>
> +
> +int
> +fedisableexcept (int excepts)
> +{
> +#ifdef __csky_hard_float__
> + unsigned int new_exc, old_exc;
> +
> + /* Get the current control word. */
> + _FPU_GETCW (new_exc);
> +
> + old_exc = (new_exc & ENABLE_MASK) >> ENABLE_SHIFT;
> +
> + /* Get the except disable mask. */
> + excepts &= FE_ALL_EXCEPT;
> + new_exc &= ~(excepts << ENABLE_SHIFT);
> +
> + /* Put the new data in effect. */
> + _FPU_SETCW (new_exc);
> +
> + return old_exc;
> +#else
> + /* Unsupported, so return -1 for failure. */
> + return -1;
> +#endif /* __csky_hard_float__ */
> +}
> diff --git a/sysdeps/csky/fpu/feenablxcpt.c b/sysdeps/csky/fpu/feenablxcpt.c
> new file mode 100644
> index 0000000..21c1e77
> --- /dev/null
> +++ b/sysdeps/csky/fpu/feenablxcpt.c
> @@ -0,0 +1,45 @@
> +/* Enable floating-point exceptions.
> + 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 <fenv.h>
> +#include <fenv_libc.h>
> +#include <fpu_control.h>
> +
> +int
> +feenableexcept (int excepts)
> +{
> +#ifdef __csky_hard_float__
> + unsigned int new_exc, old_exc;
> +
> + /* Get the current control word. */
> + _FPU_GETCW (new_exc);
> +
> + old_exc = (new_exc & ENABLE_MASK) >> ENABLE_SHIFT;
> +
> + excepts &= FE_ALL_EXCEPT;
> +
> + new_exc |= excepts << ENABLE_SHIFT;
> +
> + _FPU_SETCW (new_exc);
> +
> + return old_exc;
> +#else
> + /* Unsupported, so return -1 for failure. */
> + return -1;
> +#endif /* __csky_hard_float__ */
> +}
> diff --git a/sysdeps/csky/fpu/fegetenv.c b/sysdeps/csky/fpu/fegetenv.c
> new file mode 100644
> index 0000000..5828c99
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fegetenv.c
> @@ -0,0 +1,43 @@
> +/* Store current floating-point environment.
> + 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 <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +__fegetenv (fenv_t *envp)
> +{
> +#ifdef __csky_hard_float__
> + unsigned int fpcr;
> + unsigned int fpsr;
> +
> + _FPU_GETCW (fpcr);
> + _FPU_GETFPSR (fpsr);
> + envp->__fpcr = fpcr;
> + envp->__fpsr = fpsr;
> +
> + return 0;
> +#else
> + /* Unsupported, so return 1 for failure. */
> + return 1;
> +#endif /* __csky_hard_float__ */
> +}
> +libm_hidden_def (__fegetenv)
> +weak_alias (__fegetenv, fegetenv)
> +libm_hidden_weak (fegetenv)
> +
> diff --git a/sysdeps/csky/fpu/fegetexcept.c b/sysdeps/csky/fpu/fegetexcept.c
> new file mode 100644
> index 0000000..784f4f7
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fegetexcept.c
> @@ -0,0 +1,37 @@
> +/* Get enabled floating-point exceptions.
> + 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 <fenv.h>
> +#include <fenv_libc.h>
> +#include <fpu_control.h>
> +
> +int
> +fegetexcept (void)
> +{
> +#ifdef __csky_hard_float__
> + unsigned int exc;
> +
> + /* Get the current control word. */
> + _FPU_GETCW (exc);
> +
> + return (exc & ENABLE_MASK) >> ENABLE_SHIFT;
> +#else
> + /* Unsupported. Return all exceptions disabled. */
> + return 0;
> +#endif /* __csky_hard_float__ */
> +}
> diff --git a/sysdeps/csky/fpu/fegetmode.c b/sysdeps/csky/fpu/fegetmode.c
> new file mode 100644
> index 0000000..f3115b1
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fegetmode.c
> @@ -0,0 +1,29 @@
> +/* Store current floating-point control modes.
> + 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 <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +fegetmode (femode_t *modep)
> +{
> +#ifdef __csky_hard_float__
> + _FPU_GETCW (*modep);
> +#endif /* __csky_hard_float__ */
> + return 0;
> +}
> diff --git a/sysdeps/csky/fpu/fegetround.c b/sysdeps/csky/fpu/fegetround.c
> new file mode 100644
> index 0000000..6e0fcec
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fegetround.c
> @@ -0,0 +1,39 @@
> +/* Return current rounding direction.
> + 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 <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +__fegetround (void)
> +{
> +#ifdef __csky_hard_float__
> + unsigned int cw;
> +
> + /* Get control word. */
> + _FPU_GETCW (cw);
> +
> + return cw & FE_ROUND_MASK;
> +#else
> + /* The current soft-float implementation only handles TONEAREST. */
> + return FE_TONEAREST;
> +#endif /* __csky_hard_float__ */
> +}
> +libm_hidden_def (__fegetround)
> +weak_alias (__fegetround, fegetround)
> +libm_hidden_weak (fegetround)
> diff --git a/sysdeps/csky/fpu/feholdexcpt.c b/sysdeps/csky/fpu/feholdexcpt.c
> new file mode 100644
> index 0000000..6c466d0
> --- /dev/null
> +++ b/sysdeps/csky/fpu/feholdexcpt.c
> @@ -0,0 +1,39 @@
> +/* Store current floating-point environment and clear exceptions.
> + 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 <fenv.h>
> +#include <fpu_control.h>
> +#include <fenv_libc.h>
> +#include <fenv_private.h>
> +
> +#include <stdio.h>
> +
> +int
> +__feholdexcept (fenv_t *envp)
> +{
> +#ifdef __csky_hard_float__
> + libc_feholdexcept_vfp (envp);
> + return 0;
> +#else
> + /* Unsupported, so fail. */
> + return 1;
> +#endif /* __csky_hard_float__ */
> +}
> +libm_hidden_def (__feholdexcept)
> +weak_alias (__feholdexcept, feholdexcept)
> +libm_hidden_weak (feholdexcept)
> diff --git a/sysdeps/csky/fpu/fenv_libc.h b/sysdeps/csky/fpu/fenv_libc.h
> new file mode 100644
> index 0000000..2dacb2c
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fenv_libc.h
> @@ -0,0 +1,29 @@
> +/* 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/>. */
> +
> +#ifndef _FENV_LIBC_H
> +#define _FENV_LIBC_H 1
> +
> +/* Mask for enabling exceptions and for the CAUSE bits. */
> +#define ENABLE_MASK 0x0003FU
> +#define CAUSE_MASK 0x3F000U
> +
> +/* Shift for FE_* flags to get up to the ENABLE bits and the CAUSE bits. */
> +#define ENABLE_SHIFT 0
> +#define CAUSE_SHIFT 8
> +
> +#endif /* _FENV_LIBC_H */
> diff --git a/sysdeps/csky/fpu/fesetenv.c b/sysdeps/csky/fpu/fesetenv.c
> new file mode 100644
> index 0000000..9a651a6
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fesetenv.c
> @@ -0,0 +1,65 @@
> +/* Install given floating-point environment.
> + 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 <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +__fesetenv (const fenv_t *envp)
> +{
> +#ifdef __csky_hard_float__
> + unsigned int fpcr;
> + unsigned int fpsr;
> +
> + _FPU_GETCW (fpcr);
> + _FPU_GETFPSR (fpsr);
> +
> + fpcr &= _FPU_RESERVED;
> + fpsr &= _FPU_FPSR_RESERVED;
> +
> + if (envp == FE_DFL_ENV)
> + {
> + fpcr |= _FPU_DEFAULT;
> + fpsr |= _FPU_FPSR_DEFAULT;
> + }
> + else if (envp == FE_NOMASK_ENV)
> + {
> + fpcr |= _FPU_FPCR_IEEE;
> + fpsr |= _FPU_FPSR_IEEE;
> + }
> + else
> + {
> + fpcr |= envp->__fpcr & ~_FPU_RESERVED;
> + fpsr |= envp->__fpsr & ~_FPU_FPSR_RESERVED;
> + }
> +
> + _FPU_SETFPSR (fpsr);
> +
> + _FPU_SETCW (fpcr);
> +
> + /* Success. */
> + return 0;
> +#else
> + /* Unsupported, so fail. */
> + return 1;
> +#endif /* __csky_hard_float__ */
> +}
> +libm_hidden_def (__fesetenv)
> +weak_alias (__fesetenv, fesetenv)
> +libm_hidden_weak (fesetenv)
> +
> diff --git a/sysdeps/csky/fpu/fesetexcept.c b/sysdeps/csky/fpu/fesetexcept.c
> new file mode 100644
> index 0000000..e0a90f6
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fesetexcept.c
> @@ -0,0 +1,37 @@
> +/* Set given exception flags.
> + 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 <fenv.h>
> +#include <fpu_control.h>
> +#include <fenv_libc.h>
> +
> +int
> +fesetexcept (int excepts)
> +{
> +#ifdef __csky_hard_float__
> + fpu_control_t fpsr, new_fpsr;
> + _FPU_GETFPSR (fpsr);
> + new_fpsr = fpsr | ((excepts & FE_ALL_EXCEPT) << CAUSE_SHIFT);
> + if (new_fpsr != fpsr)
> + _FPU_SETFPSR (new_fpsr);
> +#else
> + return (excepts != 0);
> +#endif /* __csky_hard_float__ */
> +
> + return 0;
> +}
> diff --git a/sysdeps/csky/fpu/fesetmode.c b/sysdeps/csky/fpu/fesetmode.c
> new file mode 100644
> index 0000000..9e259d0
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fesetmode.c
> @@ -0,0 +1,37 @@
> +/* Install given floating-point control modes.
> + 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 <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +fesetmode (const femode_t *modep)
> +{
> +#ifdef __csky_hard_float__
> + if (modep == FE_DFL_MODE)
> + mode = _FPU_DEFAULT;
> + else
> + mode = *modep;
> + _FPU_SETCW (mode);
> +
> + return 0;
> +#else
> + /* Nothing to do. */
> + return 0;
> +#endif /* __csky_hard_float__ */
> +}
> diff --git a/sysdeps/csky/fpu/fesetround.c b/sysdeps/csky/fpu/fesetround.c
> new file mode 100644
> index 0000000..8e3128c
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fesetround.c
> @@ -0,0 +1,42 @@
> +/* Set current rounding direction.
> + 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 <fenv.h>
> +#include <fpu_control.h>
> +#include <fenv_private.h>
> +
> +#include <stdio.h>
> +int
> +__fesetround (int round)
> +{
> +#ifdef __csky_hard_float__
> + libc_fesetround_vfp (round);
> + return 0;
> +#else
> + if (round == FE_TONEAREST)
> + /* This is the only supported rounding mode for soft-fp. */
> + return 0;
> +
> + /* Unsupported, so fail. */
> + return 1;
> +#endif /* __csky_hard_float__ */
> +}
> +libm_hidden_def (__fesetround)
> +weak_alias (__fesetround, fesetround)
> +libm_hidden_weak (fesetround)
> +
> diff --git a/sysdeps/csky/fpu/feupdateenv.c b/sysdeps/csky/fpu/feupdateenv.c
> new file mode 100644
> index 0000000..992717e
> --- /dev/null
> +++ b/sysdeps/csky/fpu/feupdateenv.c
> @@ -0,0 +1,52 @@
> +/* Install given floating-point environment and raise exceptions.
> + 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 <fenv.h>
> +#include <fpu_control.h>
> +#include <fenv_libc.h>
> +#include <fenv_private.h>
> +#include <stdio.h>
> +
> +int
> +__feupdateenv (const fenv_t *envp)
> +{
> +#ifdef __csky_hard_float__
> + int temp;
> +
> + /* Save current exceptions. */
> + _FPU_GETFPSR(temp);
> + temp = (temp >> CAUSE_SHIFT) & FE_ALL_EXCEPT;
> + /* Install new environment. */
> + libc_fesetenv_vfp (envp);
> +
> + /* Raise the safed exception. Incidently for us the implementation
> + defined format of the values in objects of type fexcept_t is the
> + same as the ones specified using the FE_* constants. */
> + feraiseexcept (temp);
> +
> + /* Success. */
> + return 0;
> +#else
> + /* Unsupported, so fail. */
> + return 1;
> +#endif /* __csky_hard_float__ */
> +}
> +libm_hidden_def (__feupdateenv)
> +weak_alias (__feupdateenv, feupdateenv)
> +libm_hidden_weak (feupdateenv)
> +
> diff --git a/sysdeps/csky/fpu/fgetexcptflg.c b/sysdeps/csky/fpu/fgetexcptflg.c
> new file mode 100644
> index 0000000..73d0ce8
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fgetexcptflg.c
> @@ -0,0 +1,37 @@
> +/* Store current representation for exceptions.
> + 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 <fenv.h>
> +#include <fpu_control.h>
> +#include <fenv_libc.h>
> +#include <fenv_private.h>
> +#include <stdio.h>
> +
> +int
> +fegetexceptflag (fexcept_t *flagp, int excepts)
> +{
> +#ifdef __csky_hard_float__
> + *flagp = libc_fetestexcept_vfp (excepts);
> +
> + /* Success. */
> + return 0;
> +#else
> + /* Unsupported, so fail. */
> + return 1;
> +#endif /* __csky_hard_float__ */
> +}
> diff --git a/sysdeps/csky/fpu/fraiseexcpt.c b/sysdeps/csky/fpu/fraiseexcpt.c
> new file mode 100644
> index 0000000..221533e
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fraiseexcpt.c
> @@ -0,0 +1,131 @@
> +/* Raise given exceptions.
> + 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 <fenv.h>
> +#include <fenv_libc.h>
> +#include <fpu_control.h>
> +#include <float.h>
> +#include <math.h>
> +
> +int
> +__feraiseexcept (int excepts)
> +{
> +#ifdef __csky_hard_float__
> + /* Raise exceptions represented by EXCEPTS. But we must raise only one
> + signal at a time. It is important that if the overflow/underflow
> + exception and the divide by zero exception are given at the same
> + time, the overflow/underflow exception follows the divide by zero
> + exception. */
> +
> +# ifdef __csky_fpuv2__
> + /* First: invalid exception. */
> + if (FE_INVALID & excepts)
> + {
> + /* One example of a invalid operation is 0 * Infinity. */
> + float x = HUGE_VALF, y = 0.0f;
> + __asm__ __volatile__ ("fmuls %0, %0, %1" : "+v" (x) : "v" (y));
> + }
> +
> + /* Next: division by zero. */
> + if (FE_DIVBYZERO & excepts)
> + {
> + float x = 1.0f, y = 0.0f;
> + __asm__ __volatile__ ("fdivs %0, %0, %1" : "+v" (x) : "v" (y));
> + }
> +
> + /* Next: overflow. */
> + if (FE_OVERFLOW & excepts)
> + {
> + float x = FLT_MAX;
> + __asm__ __volatile__ ("fmuls %0, %0, %0" : "+v" (x));
> + }
> + /* Next: underflow. */
> + if (FE_UNDERFLOW & excepts)
> + {
> + float x = -FLT_MIN;
> +
> + __asm__ __volatile__ ("fmuls %0, %0, %0" : "+v" (x));
> + }
> +
> + /* Last: inexact. */
> + if (FE_INEXACT & excepts)
> + {
> + float x = 1.0f, y = 3.0f;
> + __asm__ __volatile__ ("fdivs %0, %0, %1" : "+v" (x) : "v" (y));
> + }
> +
> + if (FE_DENORMAL & excepts)
> + {
> + double x = 4.9406564584124654e-324;
> + __asm__ __volatile__ ("fstod %0, %0" : "+v" (x));
> + }
> +# else /* __csky_fpuv2__ */
> + int tmp = 0;
> + /* First: invalid exception. */
> + if (FE_INVALID & excepts)
> + {
> + /* One example of a invalid operation is 0 * Infinity. */
> + float x = HUGE_VALF, y = 0.0f;
> + __asm__ __volatile__ ("fmuls %0, %0, %2, %1"
> + : "+f" (x), "+r"(tmp) : "f" (y));
> + }
> +
> + /* Next: division by zero. */
> + if (FE_DIVBYZERO & excepts)
> + {
> + float x = 1.0f, y = 0.0f;
> + __asm__ __volatile__ ("fdivs %0, %0, %2, %1"
> + : "+f" (x), "+r"(tmp) : "f" (y));
> + }
> +
> + /* Next: overflow. */
> + if (FE_OVERFLOW & excepts)
> + {
> + float x = FLT_MAX, y = FLT_MAX;
> + __asm__ __volatile__ ("fmuls %0, %0, %2, %1"
> + : "+f" (x), "+r"(tmp) : "f" (y));
> + }
> +
> + /* Next: underflow. */
> + if (FE_UNDERFLOW & excepts)
> + {
> + float x = -FLT_MIN, y = -FLT_MIN;
> +
> + __asm__ __volatile__ ("fmuls %0, %0, %2, %1"
> + : "+f" (x), "+r"(tmp) : "f" (y));
> + }
> +
> + /* Last: inexact. */
> + if (FE_INEXACT & excepts)
> + {
> + float x = 1.0f, y = 3.0f;
> + __asm__ __volatile__ ("fdivs %0, %0, %2, %1"
> + : "+f" (x), "+r"(tmp) : "f" (y));
> + }
> +# endif /* __csky_fpuv2__ */
> +
> + /* Success. */
> + return 0;
> +#else /* __csky_hard_float__ */
> + /* Unsupported, so fail unless nothing needs to be done. */
> + return (excepts != 0);
> +#endif
> +}
> +libm_hidden_def (__feraiseexcept)
> +weak_alias (__feraiseexcept, feraiseexcept)
> +libm_hidden_weak (feraiseexcept)
> diff --git a/sysdeps/csky/fpu/fsetexcptflg.c b/sysdeps/csky/fpu/fsetexcptflg.c
> new file mode 100644
> index 0000000..79ddc50
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fsetexcptflg.c
> @@ -0,0 +1,48 @@
> +/* Set floating-point environment exception handling.
> + 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 <fenv.h>
> +#include <fpu_control.h>
> +#include <fenv_libc.h>
> +
> +int
> +fesetexceptflag (const fexcept_t *flagp, int excepts)
> +{
> +#ifdef __csky_hard_float__
> + fpu_control_t temp;
> +
> + /* Get the current exceptions. */
> + _FPU_GETFPSR (temp);
> +
> + /* Make sure the flags we want restored are legal. */
> + excepts &= FE_ALL_EXCEPT;
> +
> + /* Now clear the bits called for, and copy them in from flagp. Note that
> + we ignore all non-flag bits from *flagp, so they don't matter. */
> + temp = ((temp >> CAUSE_SHIFT) & ~excepts) | (*flagp & excepts);
> + temp = temp << CAUSE_SHIFT;
> +
> + _FPU_SETFPSR (temp);
> +
> + /* Success. */
> + return 0;
> +#else
> + /* Unsupported, so fail unless nothing needs to be done. */
> + return (excepts != 0);
> +#endif
> +}
> diff --git a/sysdeps/csky/fpu/ftestexcept.c b/sysdeps/csky/fpu/ftestexcept.c
> new file mode 100644
> index 0000000..23f7f0b
> --- /dev/null
> +++ b/sysdeps/csky/fpu/ftestexcept.c
> @@ -0,0 +1,35 @@
> +/* Test exception in current environment.
> + 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 <fenv.h>
> +#include <fpu_control.h>
> +#include <fenv_libc.h>
> +#include <fenv_private.h>
> +#include <stdio.h>
> +
> +int
> +fetestexcept (int excepts)
> +{
> +#ifdef __csky_hard_float__
> + return libc_fetestexcept_vfp (excepts);
> +#else
> + /* Unsupported, return 0. */
> + return 0;
> +#endif
> +}
> +libm_hidden_def (fetestexcept)
> diff --git a/sysdeps/csky/fpu_control.h b/sysdeps/csky/fpu_control.h
> new file mode 100644
> index 0000000..c2757f5
> --- /dev/null
> +++ b/sysdeps/csky/fpu_control.h
> @@ -0,0 +1,150 @@
> +/* FPU control word bits. C-SKY 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/>. */
> +
> +#ifndef _FPU_CONTROL_H
> +#define _FPU_CONTROL_H
> +
> +/*
> + * CSKY FPU floating point control register bits.
> + *
> + * 31-28 -> reserved (read as 0, write with 0)
> + * 27 -> 0: flush denormalized results to zero
> + * 1: flush denormalized results to signed minimal normal number.
> + * 26 -> reserved (read as 0, write with 0)
> + * 25-24 -> rounding control
> + * 23-6 -> reserved (read as 0, write with 0)
> + * 5 -> enable exception for input denormalized exception
> + * 4 -> enable exception for inexact exception
> + * 3 -> enable exception for underflow exception
> + * 2 -> enable exception for overflow exception
> + * 1 -> enable exception for division by zero exception
> + * 0 -> enable exception for invalid operation exception
> + *
> + * Rounding Control:
> + * 00 - rounding to nearest (RN)
> + * 01 - rounding toward zero (RZ)
> + * 10 - rounding (up) toward plus infinity (RP)
> + * 11 - rounding (down)toward minus infinity (RM)
> + *
> + * CSKY FPU floating point exception status register bits.
> + *
> + * 15 -> accumulate bit for any exception
> + * 14 -> reserved (read as 0, write with 0)
> + * 13 -> cause bit for input denormalized exception
> + * 12 -> cause bit for inexact exception
> + * 11 -> cause bit for underflow exception
> + * 10 -> cause bit for overflow exception
> + * 9 -> cause bit for division by zero exception
> + * 8 -> cause bit for invalid operation exception
> + * 7 -> flag bit for any exception
> + * 6 -> reserved (read as 0, write with 0)
> + * 5 -> flag exception for input denormalized exception
> + * 4 -> flag exception for inexact exception
> + * 3 -> flag exception for underflow exception
> + * 2 -> flag exception for overflow exception
> + * 1 -> flag exception for division by zero exception
> + * 0 -> flag exception for invalid operation exception
> + */
> +
> +#include <features.h>
> +
> +#ifdef __csky_soft_float__
> +
> +# define _FPU_RESERVED 0xffffffff
> +# define _FPU_DEFAULT 0x00000000
> +typedef unsigned int fpu_control_t;
> +# define _FPU_GETCW(cw) (cw) = 0
> +# define _FPU_SETCW(cw) (void) (cw)
> +# define _FPU_GETFPSR(cw) (cw) = 0
> +# define _FPU_SETFPSR(cw) (void) (cw)
> +extern fpu_control_t __fpu_control;
> +
> +#else /* !__csky_soft_float__ */
> +
> +/* masking of interrupts */
> +# define _FPU_MASK_IDE (1 << 5) /* input denormalized exception */
> +# define _FPU_MASK_IXE (1 << 4) /* inexact exception */
> +# define _FPU_MASK_UFE (1 << 3) /* underflow exception */
> +# define _FPU_MASK_OFE (1 << 2) /* overflow exception */
> +# define _FPU_MASK_DZE (1 << 1) /* division by zero exception */
> +# define _FPU_MASK_IOE (1 << 0) /* invalid operation exception */
> +
> +# define _FPU_MASK_FEA (1 << 15) /* case for any exception */
> +# define _FPU_MASK_FEC (1 << 7) /* flag for any exception */
> +
> +/* flush denormalized numbers to zero */
> +# define _FPU_FLUSH_TZ 0x8000000
> +
> +/* rounding control */
> +# define _FPU_RC_NEAREST (0x0 << 24) /* RECOMMENDED */
> +# define _FPU_RC_ZERO (0x1 << 24)
> +# define _FPU_RC_UP (0x2 << 24)
> +# define _FPU_RC_DOWN (0x3 << 24)
> +
> +# define _FPU_RESERVED 0xf4ffffc0 /* Reserved bits in cw */
> +# define _FPU_FPSR_RESERVED 0x3fff0000
> +
> +/* The fdlibm code requires strict IEEE double precision arithmetic,
> + and no interrupts for exceptions, rounding to nearest. */
> +
> +# define _FPU_DEFAULT 0x00000000
> +# define _FPU_FPSR_DEFAULT 0x00000000
> +
> +/* IEEE: same as above, but exceptions */
> +# define _FPU_FPCR_IEEE 0x0000001F
> +# define _FPU_FPSR_IEEE 0x00000000
> +
> +/* Type of the control word. */
> +typedef unsigned int fpu_control_t;
> +
> +/* Macros for accessing the hardware control word. */
> +# if (__CSKY__ == 2)
> +# define _FPU_GETCW(cw) __asm__ volatile ("mfcr %0, cr<1, 2>" : "=r" (cw))
> +# define _FPU_SETCW(cw) __asm__ volatile ("mtcr %0, cr<1, 2>" : : "r" (cw))
> +# define _FPU_GETFPSR(cw) __asm__ volatile ("mfcr %0, cr<2, 2>" : "=r" (cw))
> +# define _FPU_SETFPSR(cw) __asm__ volatile ("mtcr %0, cr<2, 2>" : : "r" (cw))
> +# else /* __CSKY__ != 2 */
> +# define _FPU_GETCW(cw) __asm__ volatile ("1: cprcr %0, cpcr2 \n" \
> + " btsti %0, 31 \n" \
> + " bt 1b \n" \
> + " cprcr %0, cpcr1\n" : "=b" (cw))
> +
> +# define _FPU_SETCW(cw) __asm__ volatile ("1: cprcr r7, cpcr2 \n" \
> + " btsti r7, 31 \n" \
> + " bt 1b \n" \
> + " cpwcr %0, cpcr1 \n" \
> + : : "b" (cw) : "r7")
> +
> +# define _FPU_GETFPSR(cw) __asm__ volatile ("1: cprcr %0, cpcr2 \n" \
> + " btsti %0, 31 \n" \
> + " bt 1b \n" \
> + " cprcr %0, cpcr4\n" : "=b" (cw))
> +
> +# define _FPU_SETFPSR(cw) __asm__ volatile ("1: cprcr r7, cpcr2 \n" \
> + " btsti r7, 31 \n" \
> + " bt 1b \n" \
> + " cpwcr %0, cpcr4 \n" \
> + : : "b" (cw) : "r7")
> +# endif /* __CSKY__ != 2 */
> +
> +/* Default control word set at startup. */
> +extern fpu_control_t __fpu_control;
> +
> +#endif /* !__csky_soft_float__ */
> +
> +#endif /* fpu_control.h */
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [RFC PATCH 05/10] C-SKY: Linux Startup and Dynamic Loading Code
2018-03-16 9:59 ` [RFC PATCH 05/10] C-SKY: Linux Startup and Dynamic Loading Code Mao Han
@ 2018-03-16 14:37 ` Carlos O'Donell
0 siblings, 0 replies; 22+ messages in thread
From: Carlos O'Donell @ 2018-03-16 14:37 UTC (permalink / raw)
To: Mao Han, libc-help; +Cc: ren_guo, yunhai_shang, qijie_tong, chunqiang_li
On 03/16/2018 03:58 AM, Mao Han wrote:
> This contains the Linux-specific code for loading programs on C-SKY.
>
> *elf/elf.h: Add C-SKY relocale
> *sysdeps/csky/dl-machine.h: New file
> *sysdeps/csky/dl-procinfo.c: New file
> *sysdeps/csky/dl-procinfo.h: New file
> *sysdeps/csky/dl-sysdep.h: New file
> *sysdeps/csky/dl-tlsdesc.h: New file
> *sysdeps/csky/ldsodefs.h: New file
> *sysdeps/csky/linkmap.h: New file
> *sysdeps/csky/sotruss-lib.c: New file
> *sysdeps/unix/sysv/linux/csky/ldconfig.h: New file
>
Some minor nits. You should be able to answer these questions before posting
to libc-alpha.
No IFUNC support?
You create a dl-tlsdesc.h but don't appear to use anything in dl-machine.h?
Do you have TLS descriptor support in the ABI and in gcc?
> Signed-off-by: Mao Han <han_mao@c-sky.com>
> ---
> elf/elf.h | 61 +++++
> sysdeps/csky/dl-machine.h | 471 ++++++++++++++++++++++++++++++++
> sysdeps/csky/dl-procinfo.c | 62 +++++
> sysdeps/csky/dl-procinfo.h | 59 ++++
> sysdeps/csky/dl-sysdep.h | 23 ++
> sysdeps/csky/dl-tlsdesc.h | 61 +++++
> sysdeps/csky/ldsodefs.h | 42 +++
> sysdeps/csky/linkmap.h | 5 +
> sysdeps/csky/sotruss-lib.c | 49 ++++
> sysdeps/unix/sysv/linux/csky/ldconfig.h | 24 ++
> 10 files changed, 857 insertions(+)
> create mode 100644 sysdeps/csky/dl-machine.h
> create mode 100644 sysdeps/csky/dl-procinfo.c
> create mode 100644 sysdeps/csky/dl-procinfo.h
> create mode 100644 sysdeps/csky/dl-sysdep.h
> create mode 100644 sysdeps/csky/dl-tlsdesc.h
> create mode 100644 sysdeps/csky/ldsodefs.h
> create mode 100644 sysdeps/csky/linkmap.h
> create mode 100644 sysdeps/csky/sotruss-lib.c
> create mode 100644 sysdeps/unix/sysv/linux/csky/ldconfig.h
>
> diff --git a/elf/elf.h b/elf/elf.h
> index 4f43577..6ac0a36 100644
> --- a/elf/elf.h
> +++ b/elf/elf.h
> @@ -3013,6 +3013,67 @@ enum
> /* Keep this the last entry. */
> #define R_ARM_NUM 256
>
> +/* csky */
> +#define R_CKCORE_NONE 0 /* */
Why are all the comments empty?
It would be nice if we had some notes about the math behind the relocation
and how it should be handled.
> +#define R_CKCORE_ADDR32 1 /* */
> +#define R_CKCORE_PCRELIMM8BY4 2 /* */
> +#define R_CKCORE_PCRELIMM11BY2 3 /* */
> +#define R_CKCORE_PCRELIMM4BY2 4 /* */
> +#define R_CKCORE_PCREL32 5 /* */
> +#define R_CKCORE_PCRELJSR_IMM11BY2 6 /* */
> +#define R_CKCORE_GNU_VTINHERIT 7 /* */
> +#define R_CKCORE_GNU_VTENTRY 8 /* */
> +#define R_CKCORE_RELATIVE 9 /* */
> +#define R_CKCORE_COPY 10 /* */
> +#define R_CKCORE_GLOB_DAT 11 /* */
> +#define R_CKCORE_JUMP_SLOT 12 /* */
> +#define R_CKCORE_GOTOFF 13 /* */
> +#define R_CKCORE_GOTPC 14 /* */
> +#define R_CKCORE_GOT32 15 /* */
> +#define R_CKCORE_PLT32 16 /* */
> +#define R_CKCORE_ADDRGOT 17 /* */
> +#define R_CKCORE_ADDRPLT 18 /* */
> +#define R_CKCORE_PCREL_IMM26BY2 19 /* */
> +#define R_CKCORE_PCREL_IMM16BY2 20 /* */
> +#define R_CKCORE_PCREL_IMM16BY4 21 /* */
> +#define R_CKCORE_PCREL_IMM10BY2 22 /* */
> +#define R_CKCORE_PCREL_IMM10BY4 23 /* */
> +#define R_CKCORE_ADDR_HI16 24 /* */
> +#define R_CKCORE_ADDR_LO16 25 /* */
> +#define R_CKCORE_GOTPC_HI16 26 /* */
> +#define R_CKCORE_GOTPC_LO16 27 /* */
> +#define R_CKCORE_GOTOFF_HI16 28 /* */
> +#define R_CKCORE_GOTOFF_LO16 29 /* */
> +#define R_CKCORE_GOT12 30 /* */
> +#define R_CKCORE_GOT_HI16 31 /* */
> +#define R_CKCORE_GOT_LO16 32 /* */
> +#define R_CKCORE_PLT12 33 /* */
> +#define R_CKCORE_PLT_HI16 34 /* */
> +#define R_CKCORE_PLT_LO16 35 /* */
> +#define R_CKCORE_ADDRGOT_HI16 36 /* */
> +#define R_CKCORE_ADDRGOT_LO16 37 /* */
> +#define R_CKCORE_ADDRPLT_HI16 38 /* */
> +#define R_CKCORE_ADDRPLT_LO16 39 /* */
> +#define R_CKCORE_PCREL_JSR_IMM26BY2 40 /* */
> +#define R_CKCORE_TOFFSET_LO16 41 /* */
> +#define R_CKCORE_DOFFSET_LO16 42 /* */
> +#define R_CKCORE_PCREL_IMM18BY2 43 /* */
> +#define R_CKCORE_DOFFSET_IMM18 44 /* */
> +#define R_CKCORE_DOFFSET_IMM18BY2 45 /* */
> +#define R_CKCORE_DOFFSET_IMM18BY4 46 /* */
> +#define R_CKCORE_GOTOFF_IMM18 47 /* */
> +#define R_CKCORE_GOT_IMM18BY4 48 /* */
> +#define R_CKCORE_PLT_IMM18BY4 49 /* */
> +#define R_CKCORE_PCREL_IMM7BY4 50 /* */
> +#define R_CKCORE_TLS_LE32 51
> +#define R_CKCORE_TLS_IE32 52
> +#define R_CKCORE_TLS_GD32 53
> +#define R_CKCORE_TLS_LDM32 54
> +#define R_CKCORE_TLS_LDO32 55
> +#define R_CKCORE_TLS_DTPMOD32 56
> +#define R_CKCORE_TLS_DTPOFF32 57
> +#define R_CKCORE_TLS_TPOFF32 58
OK.
> +
> /* IA-64 specific declarations. */
>
Where is your reserved EM_CKCORE value?
> /* Processor specific flags for the Ehdr e_flags field. */
> diff --git a/sysdeps/csky/dl-machine.h b/sysdeps/csky/dl-machine.h
> new file mode 100644
> index 0000000..f38d2c6
> --- /dev/null
> +++ b/sysdeps/csky/dl-machine.h
> @@ -0,0 +1,471 @@
> +/* Machine-dependent ELF dynamic relocation inline functions. C-SKY 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/>. */
> +
> +#ifndef dl_machine_h
> +#define dl_machine_h
> +
> +#define ELF_MACHINE_NAME "csky"
> +
> +#include <sys/param.h>
> +#include <sysdep.h>
> +#include <dl-tls.h>
> +
> +/* Return nonzero iff ELF header is compatible with the running host. */
> +static inline int
> +elf_machine_matches_host (const Elf32_Ehdr *ehdr)
> +{
> + return 1;
This is wrong. You should check against your reserved EM_ value.
Do you have one yet?
> +}
> +
> +/* Return the link-time address of _DYNAMIC.
> + This must be inlined in a function which uses global data. */
> +static inline Elf32_Addr
> +elf_machine_dynamic (void)
> +{
> + register Elf32_Addr *got __asm__ ("gb"); /* need modify */
> + return *got;
> +}
> +
> +/* Return the run-time load address ,of the shared object. */
> +static inline Elf32_Addr
> +elf_machine_load_address (void)
> +{
> +#ifdef __CSKYABIV2__
> + extern Elf32_Addr __dl_start (void *) asm ("_dl_start");
> + Elf32_Addr got_addr = (Elf32_Addr) &__dl_start;
> + Elf32_Addr pcrel_addr;
> + asm ("grs %0,_dl_start\n" : "=r" (pcrel_addr));
> +#else
> + extern Elf32_Addr __start_flag (void *) asm ("start_flag");
> + Elf32_Addr got_addr = (Elf32_Addr) &__start_flag;
> + Elf32_Addr pcrel_addr;
> + asm ("subi sp,8\n" \
> + "stw lr,(sp,0)\n" \
> + "bsr start_flag\n" \
> + "start_flag:" \
> + "mov %0, lr\n" \
> + "ldw lr,(sp,0)\n" \
> + "addi sp,8\n" \
> + : "=r" (pcrel_addr));
> +#endif
> + return pcrel_addr - got_addr;
> +}
> +
> +
> +/* 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__ ((always_inline))
> +elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
> +{
> + Elf32_Addr *got;
> + extern void _dl_runtime_resolve (Elf32_Word);
> + extern void _dl_runtime_profile (Elf32_Word);
> +
> + if (l->l_info[DT_JMPREL] && lazy)
> + {
> + /* 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 .rela.plt section, push
> + _GLOBAL_OFFSET_TABLE_[1], and then jump to
> + _GLOBAL_OFFSET_TABLE_[2]. */
> + got = (Elf32_Addr *) D_PTR (l, l_info[DT_PLTGOT]);
OK, so the static linker sets DT_PLTGOT to the start of the GOT.
> +
> + if (got[1])
> + l->l_mach.plt = got[1] + l->l_addr;
> + got[1] = (Elf32_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. */
> + got[2] = (Elf32_Addr) &_dl_runtime_resolve;
No profile support?
> + }
> + return lazy;
> +}
> +
> +/* Mask identifying addresses reserved for the user program,
> + where the dynamic linker should not map anything. */
> +#define ELF_MACHINE_USER_ADDRESS_MASK 0x80000000UL
> +
> +/* 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. */
> +#ifdef __CSKYABIV2__
> +#define RTLD_START asm ("\
> +.text\n\
> +.globl _start\n\
> +.type _start, @function\n\
> +.globl _dl_start_user\n\
> +.type _dl_start_user, @function\n\
> +_start:\n\
> + grs gb, .Lgetpc1\n\
> +.Lgetpc1:\n\
> + lrw t0, .Lgetpc1@GOTPC\n\
> + addu gb, t0\n\
> + mov a0, sp\n\
> + lrw t1, _dl_start@GOTOFF\n\
> + addu t1, gb\n\
> + jsr t1\n\
> +_dl_start_user:\n\
> + /* get _dl_skip_args */ \n\
> + lrw r11, _dl_skip_args@GOTOFF\n\
> + addu r11, gb\n\
> + ldw r11, (r11, 0)\n\
> + /* store program entry address in r11 */ \n\
> + mov r10, a0\n\
> + /* Get argc */\n\
> + ldw a1, (sp, 0)\n\
> + /* Get **argv */\n\
> + mov a2, sp\n\
> + addi a2, 4\n\
> + cmpnei r11, 0\n\
> + bt .L_fixup_stack\n\
> +.L_done_fixup:\n\
> + mov a3, a1\n\
> + lsli a3, 2\n\
> + add a3, a2\n\
> + addi a3, 4\n\
> + lrw a0, _rtld_local@GOTOFF\n\
> + addu a0, gb\n\
> + ldw a0, (a0, 0)\n\
> + lrw t1, _dl_init@PLT\n\
> + addu t1, gb\n\
> + ldw t1, (t1)\n\
> + jsr t1\n\
> + lrw a0, _dl_fini@GOTOFF\n\
> + addu a0, gb\n\
> + jmp r10\n\
> +.L_fixup_stack:\n\
> + subu a1, r11\n\
> + lsli r11, 2\n\
> + addu sp, r11\n\
> + stw a1, (sp, 0)\n\
> + mov a2, sp\n\
> + addi a2, 4\n\
> + lrw a3, _dl_argv@GOTOFF\n\
> + addu a3, gb\n\
> + stw a2, (a3, 0)\n\
> + br .L_done_fixup\n\
> +");
> +#else
> +#define RTLD_START asm ("\
> +.text\n\
> +.globl _start\n\
> +.type _start, @function\n\
> +.globl _dl_start_user\n\
> +.type _dl_start_user, @function\n\
> +_start:\n\
> + bsr .Lgetpc1\n\
> +.Lgetpc1:\n\
> + lrw gb, .Lgetpc1@GOTPC\n\
> + addu gb, lr\n\
> + mov a0, sp\n\
> + lrw r7, _dl_start@GOTOFF\n\
> + addu r7, gb\n\
> + jsr r7\n\
> +_dl_start_user:\n\
> + /* get _dl_skip_args */ \n\
> + lrw r8, _dl_skip_args@GOTOFF\n\
> + addu r8, gb\n\
> + ldw r8, (r8, 0)\n\
> + /* store program entry address in r11 */ \n\
> + mov r11, a0\n\
> + /* Get argc */\n\
> + ldw a1, (sp, 0)\n\
> + /* Get **argv */\n\
> + mov a2, sp\n\
> + addi a2, 4\n\
> + cmpnei r8, 0\n\
> + bt .L_fixup_stack\n\
> +.L_done_fixup:\n\
> + mov a3, a1\n\
> + lsli a3, 2\n\
> + addu a3, a2\n\
> + addi a3, 4\n\
> + lrw a0, _rtld_local@GOTOFF\n\
> + addu a0, gb\n\
> + ldw a0, (a0, 0)\n\
> + lrw r7, _dl_init@PLT\n\
> + addu r7, gb\n\
> + ldw r7, (r7)\n\
> + jsr r7\n\
> + lrw a0, _dl_fini@GOTOFF\n\
> + addu a0, gb\n\
> + jmp r11\n\
> +.L_fixup_stack:\n\
> + subu a1, r8\n\
> + stw a1, (sp, 0)\n\
> + mov a3, a2\n\
> + lsli r8, 2\n\
> + addu r8, a2\n\
> +1: ldw r10, (r8, 0)\n\
> + stw r10, (a3, 0)\n\
> + addi r8, 4\n\
> + addi a3, 4\n\
> + cmpnei r10, 0\n\
> + bt 1b\n\
> +1: ldw r10, (r8, 0)\n\
> + stw r10, (a3, 0)\n\
> + addi r8, 4\n\
> + addi a3, 4\n\
> + cmpnei r10, 0\n\
> + bt 1b\n\
> + subi r8, 4\n\
> +1: ldw a0, (r8, 0)\n\
> + cmpnei a0, 0\n\
> + ldw r10,(r8, 4)\n\
> + stw a0, (a3, 0)\n\
> + stw r10, (a3, 4)\n\
> + addi a3, 8\n\
> + addi r8, 8\n\
> + ldw a0, (r8, 0)\n\
> + ldw r10,(r8, 4)\n\
> + stw a0, (a3, 0)\n\
> + stw r10, (a3, 4)\n\
> + addi a3, 8\n\
> + addi r8, 8\n\
> + ldw a0, (r8, 0)\n\
> + ldw r10,(r8, 4)\n\
> + stw a0, (a3, 0)\n\
> + stw r10, (a3, 4)\n\
> + addi a3, 8\n\
> + addi r8, 8\n\
> + bt 1b\n\
> + lrw a3, _dl_argv@GOTOFF\n\
> + addu a3, gb\n\
> + stw a2, (a3, 0)\n\
> + br .L_done_fixup\n\
> +");
> +#endif
> +
> +/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry or
> + TLS variable, so undefined references should not be allowed to
> + define the value.
> + ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
> + of the main executable's symbols, as for a COPY reloc. */
> +#ifndef RTLD_BOOTSTRAP
> +# define elf_machine_type_class(type) \
> + ((((type) == R_CKCORE_JUMP_SLOT || (type) == R_CKCORE_TLS_DTPMOD32 \
> + || (type) == R_CKCORE_TLS_DTPOFF32 || (type) == R_CKCORE_TLS_TPOFF32) \
> + * ELF_RTYPE_CLASS_PLT) \
> + | (((type) == R_CKCORE_COPY) * ELF_RTYPE_CLASS_COPY))
> +#else
> +#define elf_machine_type_class(type) \
> + ((((type) == R_CKCORE_JUMP_SLOT \
> + | (((type) == R_CKCORE_COPY) * ELF_RTYPE_CLASS_COPY))
> +#endif
> +
> +/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
> +#define ELF_MACHINE_JMP_SLOT R_CKCORE_JUMP_SLOT
> +
> +/* The csky never uses Elf32_Rel relocations. */
> +#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;
> +}
> +
> +static inline Elf32_Addr
> +elf_machine_fixup_plt (struct link_map *map, lookup_t t,
> + const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
> + const Elf32_Rela *reloc,
> + Elf32_Addr *reloc_addr, Elf32_Addr value)
> +{
> + return *reloc_addr = value;
> +}
> +
> +/* Return the final value of a plt relocation. On the csky the JMP_SLOT
> + relocation ignores the addend. */
> +static inline Elf32_Addr
> +elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
> + Elf32_Addr value)
> +{
> + return value;
> +}
> +
> +/* Names of the architecture-specific auditing callback functions. */
> +#define ARCH_LA_PLTENTER csky_gnu_pltenter
> +#define ARCH_LA_PLTEXIT csky_gnu_pltexit
> +
> +#endif /* !dl_machine_h */
> +#ifdef RESOLVE_MAP
> +
> +/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
> + MAP is the object containing the reloc. */
> +
> +auto inline void __attribute__ ((unused, always_inline))
> +elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
> + const Elf32_Sym *sym, const struct r_found_version *version,
> + void *const reloc_addr_arg, int skip_ifunc)
> +{
> + Elf32_Addr *const reloc_addr = reloc_addr_arg;
> + const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
> + unsigned short __attribute__((unused)) *opcode16_addr;
> + Elf32_Addr __attribute__((unused)) insn_opcode = 0x0;
> +
> + if (__builtin_expect (r_type == R_CKCORE_RELATIVE, 0))
> + *reloc_addr = map->l_addr + reloc->r_addend;
> + else
> + {
> + const Elf32_Sym *const refsym = sym;
> + struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
> + Elf32_Addr value = sym == NULL ? 0 : sym_map->l_addr + sym->st_value;
> + opcode16_addr = (unsigned short *)reloc_addr;
> +
> + switch (r_type)
> + {
> + case R_CKCORE_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 void *) 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_CKCORE_GLOB_DAT:
> + case R_CKCORE_JUMP_SLOT:
> + *reloc_addr = value;
> + break;
> + case R_CKCORE_ADDR32:
> + *reloc_addr = value + reloc->r_addend;
> + break;
> + case R_CKCORE_PCRELIMM4BY2:
> + *(short *) reloc_addr
> + = value + reloc->r_addend - (Elf32_Addr) reloc_addr;
> + break;
> + case R_CKCORE_PCREL32:
> + *reloc_addr = value + reloc->r_addend - (Elf32_Addr) reloc_addr;
> + break;
> +#if defined(__CK810__) || defined(__CK807__)
> + case R_CKCORE_ADDR_HI16:
> + insn_opcode = (*opcode16_addr << 16) | (*(opcode16_addr + 1));
> + insn_opcode = (insn_opcode & 0xffff0000)
> + | (((value + reloc->r_addend) >> 16) & 0xffff);
> + *(opcode16_addr++) = (unsigned short)(insn_opcode >> 16);
> + *opcode16_addr = (unsigned short)(insn_opcode & 0xffff);
> + break;
> + case R_CKCORE_ADDR_LO16:
> + insn_opcode = (*opcode16_addr << 16) | (*(opcode16_addr + 1));
> + insn_opcode = (insn_opcode & 0xffff0000)
> + | ((value + reloc->r_addend) & 0xffff);
> + *(opcode16_addr++) = (unsigned short)(insn_opcode >> 16);
> + *opcode16_addr = (unsigned short)(insn_opcode & 0xffff);
> + break;
> + case R_CKCORE_PCREL_IMM26BY2:
> + {
> + unsigned int offset = ((value + reloc->r_addend -
> + (unsigned int)reloc_addr) >> 1);
> + insn_opcode = (*opcode16_addr << 16) | (*(opcode16_addr + 1));
> + if (offset > 0x3ffffff){
> + const char *strtab;
> + strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
> +
> + _dl_error_printf ("\
> +%s:The reloc R_CKCORE_PCREL_IMM26BY2 cannot reach the symbol '%s'.\n",
> + rtld_progname ?: "<program name unknown>",
> + strtab + refsym->st_name);
> + break;
> + }
> + insn_opcode = (insn_opcode & ~0x3ffffff) | offset;
> + *(opcode16_addr++) = (unsigned short)(insn_opcode >> 16);
> + *opcode16_addr = (unsigned short)(insn_opcode & 0xffff);
> + break;
> + }
> + case R_CKCORE_PCREL_JSR_IMM26BY2:
> + break;
> +#endif
> +#ifndef RTLD_BOOTSTRAP
> + case R_CKCORE_TLS_DTPMOD32:
> + /* Get the information from the link map returned by the
> + resolv function. */
> + if (sym_map != NULL)
> + *reloc_addr = sym_map->l_tls_modid;
> + break;
> + case R_CKCORE_TLS_DTPOFF32:
> + if (sym != NULL)
> + *reloc_addr =(sym == NULL ? 0 : sym->st_value) + reloc->r_addend;
> + break;
> + case R_CKCORE_TLS_TPOFF32:
> + if (sym != NULL)
> + {
> + CHECK_STATIC_TLS (map, sym_map);
> + *reloc_addr = (sym->st_value + sym_map->l_tls_offset
> + + reloc->r_addend);
> + }
> + break;
> +#endif /* !RTLD_BOOTSTRAP */
> + case R_CKCORE_NONE: /* Alright, Wilbur. */
Cargo-culted comment from mips/hppa/m68k?
To be honest I don't know what this comment references.
I just sent an email to Roland McGrath who introduced this comment in 1996.
> + break;
> + default:
> + break;
> + }
> + }
> +}
> +
> +auto inline void __attribute__ ((unused, always_inline))
> +elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
> + void *const reloc_addr_arg)
> +{
> + Elf32_Addr *const reloc_addr = reloc_addr_arg;
> + *reloc_addr = l_addr + reloc->r_addend;
> +}
> +
> +auto inline void __attribute__ ((unused, always_inline))
> +elf_machine_lazy_rel (struct link_map *map,
> + Elf32_Addr l_addr, const Elf32_Rela *reloc,
> + int skip_ifunc)
> +{
> + Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
> + const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
> + if (ELF32_R_TYPE (reloc->r_info) == R_CKCORE_JUMP_SLOT)
> + {
> + /* Check for unexpected PLT reloc type. */
> + if (__builtin_expect (r_type == R_CKCORE_JUMP_SLOT, 1))
> + {
> + if (__builtin_expect (map->l_mach.plt, 0) == 0)
> + *reloc_addr = l_addr+ reloc->r_addend;
s/l_addr+/l_addr +/g
> + else
> + *reloc_addr = map->l_mach.plt;
> + }
> + }
> +}
> +
> +#endif /* RESOLVE_MAP */
> diff --git a/sysdeps/csky/dl-procinfo.c b/sysdeps/csky/dl-procinfo.c
> new file mode 100644
> index 0000000..b0d0054
> --- /dev/null
> +++ b/sysdeps/csky/dl-procinfo.c
> @@ -0,0 +1,62 @@
> +/* Data for C-SKY version of processor capability information.
> + 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/>. */
> +
> +/* This information must be kept in sync with the _DL_PLATFORM_COUNT
> + definitions in procinfo.h.
> +
> + If anything should be added here check whether the size of each string
> + is still ok with the given array size.
> +
> + All the #ifdefs in the definitions are quite irritating but
> + necessary if we want to avoid duplicating the information. There
> + are three different modes:
> +
> + - PROCINFO_DECL is defined. This means we are only interested in
> + declarations.
> +
> + - PROCINFO_DECL is not defined:
> +
> + + if SHARED is defined the file is included in an array
> + initializer. The .element = { ... } syntax is needed.
> +
> + + if SHARED is not defined a normal array initialization is
> + needed.
> + */
> +
> +#ifndef PROCINFO_CLASS
> +#define PROCINFO_CLASS
> +#endif
> +
> +#if !defined PROCINFO_DECL && defined SHARED
> + ._dl_csky_platforms
> +#else
> +PROCINFO_CLASS const char _dl_csky_platforms[4][6]
> +#endif
> +#ifndef PROCINFO_DECL
> += {
> + "ck610", "ck807", "ck810", "ck860"
> + }
> +#endif
> +#if !defined SHARED || defined PROCINFO_DECL
> +;
> +#else
> +,
> +#endif
> +
> +#undef PROCINFO_DECL
> +#undef PROCINFO_CLASS
> diff --git a/sysdeps/csky/dl-procinfo.h b/sysdeps/csky/dl-procinfo.h
> new file mode 100644
> index 0000000..4e7abe7
> --- /dev/null
> +++ b/sysdeps/csky/dl-procinfo.h
> @@ -0,0 +1,59 @@
> +/* C-SKY version of processor capability information handling macros.
> + 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/>. */
> +
> +
> +#ifndef _DL_PROCINFO_H
> +#define _DL_PROCINFO_H 1
> +
> +#include <ldsodefs.h>
> +
> +/* Mask to filter out platforms. */
> +#define _DL_HWCAP_PLATFORM (-1ULL)
> +
> +#define _DL_PLATFORMS_COUNT 4
> +
> +static inline int
> +__attribute__ ((unused, always_inline))
> +_dl_string_platform (const char *str)
> +{
> + int i;
> +
> + if (str != NULL)
> + for (i = 0; i < _DL_PLATFORMS_COUNT; ++i)
> + {
> + if (strcmp (str, GLRO(dl_csky_platforms)[i]) == 0)
> + return i;
> + }
> + return -1;
> +};
> +
> +/* We cannot provide a general printing function. */
> +#define _dl_procinfo(word, val) -1
> +
> +/* There are no hardware capabilities defined. */
> +#define _dl_hwcap_string(idx) ""
> +
> +/* By default there is no important hardware capability. */
> +#define HWCAP_IMPORTANT (0)
> +
> +/* We don't have any hardware capabilities. */
> +#define _DL_HWCAP_COUNT 0
> +
> +#define _dl_string_hwcap(str) (-1)
> +
> +#endif /* dl-procinfo.h */
> diff --git a/sysdeps/csky/dl-sysdep.h b/sysdeps/csky/dl-sysdep.h
> new file mode 100644
> index 0000000..7b3ab87
> --- /dev/null
> +++ b/sysdeps/csky/dl-sysdep.h
> @@ -0,0 +1,23 @@
> +/* System-specific settings for dynamic linker code. Alpha 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_next <dl-sysdep.h>
> +
> +/* _dl_argv cannot be attribute_relro, because _dl_start_user
> + might write into it after _dl_start returns. */
> +#define DL_ARGV_NOT_RELRO 1
> diff --git a/sysdeps/csky/dl-tlsdesc.h b/sysdeps/csky/dl-tlsdesc.h
> new file mode 100644
> index 0000000..16b2bb0
> --- /dev/null
> +++ b/sysdeps/csky/dl-tlsdesc.h
> @@ -0,0 +1,61 @@
> +/* Thread-local storage descriptor handling in the ELF dynamic linker.
> + CSKY 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/>. */
> +
> +#ifndef _CSKY_DL_TLSDESC_H
> +#define _CSKY_DL_TLSDESC_H 1
> +
> +/* Type used to represent a TLS descriptor in the GOT. */
> +struct tlsdesc
> +{
> + union
> + {
> + void *pointer;
> + long value;
> + } argument;
> + ptrdiff_t (*entry)(struct tlsdesc *);
> +};
> +
> +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 *),
> + _dl_tlsdesc_undefweak(struct tlsdesc *),
> + _dl_tlsdesc_resolve_hold(struct tlsdesc *),
> + _dl_tlsdesc_lazy_resolver(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
> diff --git a/sysdeps/csky/ldsodefs.h b/sysdeps/csky/ldsodefs.h
> new file mode 100644
> index 0000000..b002808
> --- /dev/null
> +++ b/sysdeps/csky/ldsodefs.h
> @@ -0,0 +1,42 @@
> +/* Run-time dynamic linker data structures for loaded ELF shared objects.
> + 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/>. */
> +
> +#ifndef _CSKY_LDSODEFS_H
> +#define _CSKY_LDSODEFS_H 1
> +
> +#include <elf.h>
> +
> +struct La_csky_regs;
> +struct La_csky_retval;
> +
> +#define ARCH_PLTENTER_MEMBERS \
> + Elf32_Addr (*csky_gnu_pltenter) (Elf32_Sym *, unsigned int, \
> + uintptr_t *, uintptr_t *, \
> + struct La_csky_regs *, \
> + unsigned int *, const char *name, \
> + long int *framesizep);
> +
> +#define ARCH_PLTEXIT_MEMBERS \
> + unsigned int (*csky_gnu_pltexit) (Elf32_Sym *, unsigned int, \
> + uintptr_t *, uintptr_t *, \
> + const struct La_csky_regs *, \
> + struct La_csky_retval *, \
> + const char *);
> +
> +#include_next <ldsodefs.h>
> +#endif
> diff --git a/sysdeps/csky/linkmap.h b/sysdeps/csky/linkmap.h
> new file mode 100644
> index 0000000..7c2b4a6
> --- /dev/null
> +++ b/sysdeps/csky/linkmap.h
> @@ -0,0 +1,5 @@
> +struct link_map_machine
> + {
> + Elf32_Addr plt; /* Address of .plt */
> + void *tlsdesc_table; /* Address of TLS descriptor hash table. */
> + };
> diff --git a/sysdeps/csky/sotruss-lib.c b/sysdeps/csky/sotruss-lib.c
> new file mode 100644
> index 0000000..dac947e
> --- /dev/null
> +++ b/sysdeps/csky/sotruss-lib.c
> @@ -0,0 +1,49 @@
> +/* Override generic sotruss-lib.c to define actual functions for CSKY.
> + 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 HAVE_ARCH_PLTENTER
> +#define HAVE_ARCH_PLTEXIT
> +
> +#include <elf/sotruss-lib.c>
> +
> +ElfW(Addr)
> +la_csky_gnu_pltenter (ElfW(Sym) *sym __attribute__ ((unused)),
> + unsigned int ndx __attribute__ ((unused)),
> + uintptr_t *refcook, uintptr_t *defcook,
> + La_csky_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_csky_gnu_pltexit (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook,
> + uintptr_t *defcook, const struct La_csky_regs *inregs,
> + struct La_csky_retval *outregs, const char *symname)
> +{
> + print_exit (refcook, defcook, symname, outregs->lrv_v0);
> +
> + return 0;
> +}
> diff --git a/sysdeps/unix/sysv/linux/csky/ldconfig.h b/sysdeps/unix/sysv/linux/csky/ldconfig.h
> new file mode 100644
> index 0000000..912a868
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/ldconfig.h
> @@ -0,0 +1,24 @@
> +/* 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 <sysdeps/generic/ldconfig.h>
> +
> +#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> + { "/lib/ld-linux.so.2", FLAG_ELF_LIBC6 },
> +#define SYSDEP_KNOWN_LIBRARY_NAMES \
> + { "libc.so.6", FLAG_ELF_LIBC6 }, \
> + { "libm.so.6", FLAG_ELF_LIBC6 },
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [RFC PATCH 09/10] C-SKY: Linux Syscall Interface
2018-03-16 9:59 ` [RFC PATCH 09/10] C-SKY: Linux Syscall Interface Mao Han
@ 2018-03-18 3:19 ` Adhemerval Zanella
2018-03-20 6:36 ` Mao Han
0 siblings, 1 reply; 22+ messages in thread
From: Adhemerval Zanella @ 2018-03-18 3:19 UTC (permalink / raw)
To: libc-help
On 16/03/2018 17:58, Mao Han wrote:
> diff --git a/sysdeps/unix/sysv/linux/csky/abiv2_mmap.S b/sysdeps/unix/sysv/linux/csky/abiv2_mmap.S
> new file mode 100644
> index 0000000..e759ba2
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/abiv2_mmap.S
> @@ -0,0 +1,62 @@
> +/* 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 <sysdep.h>
> +
> +/* void *mmap(void *addr, size_t len, int prot, int flags,
> + int fildes, off_t off); */
> +
> +ENTRY (__mmap)
> + subi sp, 24
> + stm a0-a3, (sp) /* store arg1-arg4 */
> + ldw t0, (sp, 24)
> + stw t0, (sp, 16) /* store arg5 */
> + ldw t0, (sp, 28)
> + stw t0, (sp, 20) /* store arg6 */
> +
> + mov t0, r7 /* save r7 */
> + lrw r7, __NR_mmap
> + mov a0, sp
> + trap 0
> + addi sp, sp, 24
> + mov r7, t0
> + lrw t0, 0xfffff000
> + cmphs a0, t0
> + bf 1f
> +#ifdef __PIC__
> + subi sp, 8
> + stw gb, (sp, 0)
> + stw r15, (sp, 4)
> + grs gb, .Lgetpc
> +.Lgetpc:
> + lrw t0, .Lgetpc@GOTPC
> + addu gb, gb, t0
> + lrw t0, __syscall_error@PLT
> + ldr.w t0, (gb, t0 << 0)
> + jsr t0
> + ldw gb, (sp, 0)
> + ldw r15, (sp, 4)
> + addi sp, 8
> +#else
> + jmpi __syscall_error
> +#endif /* __PIC__ */
> +1:
> + rts
> +PSEUDO_END (__mmap)
> +
> +weak_alias (__mmap, mmap)
> +libc_hidden_builtin_def (__mmap)
Is there anything preventing C-SKY to use linux default mmap.c
implementation? It seems it using a kABI similar to s390 which
passes all the argument in the stack, so you just need to
follow the idea of sysdeps/unix/sysv/linux/s390/mmap_internal.h.
> diff --git a/sysdeps/unix/sysv/linux/csky/abiv2_socket.S b/sysdeps/unix/sysv/linux/csky/abiv2_socket.S
> new file mode 100644
> index 0000000..f2b8ca8
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/abiv2_socket.S
> @@ -0,0 +1,152 @@
> +/* 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 <sysdep-cancel.h>
> +#include <socketcall.h>
> +
> +#define P(a, b) P2(a, b)
> +#define P2(a, b) a##b
> +
> +/* The socket-oriented system calls are handled unusally in Linux.
> + They are all gated through the single `socketcall' system call number.
> + `socketcall' takes two arguments: the first is the subcode, specifying
> + which socket function is being called; and the second is a pointer to
> + the arguments to the specific function.
> +
> + The .S files for the other calls just #define socket and #include this. */
> +
> +#ifndef NARGS
> +#ifdef socket
> +#error NARGS not defined
> +#endif
> +#define NARGS 3
> +#endif
> +
> +#ifndef __socket
> +# ifndef NO_WEAK_ALIAS
> +# define __socket P(__,socket)
> +# else
> +# define __socket socket
> +# endif
> +#endif
> +
> +ENTRY (__socket)
> + subi sp, 32
> + .cfi_def_cfa_offset 32
> +#if NARGS >= 1
> + stw a0, (sp, 0)
> +#endif
> +
> +#if NARGS >= 2
> + stw a1, (sp, 4)
> +#endif
> +
> +#if NARGS >= 3
> + stw a2, (sp, 8)
> +#endif
> +
> +#if NARGS >= 4
> + stw a3, (sp, 12)
> +#endif
> +
> +#if NARGS >= 5
> + ldw t0, (sp, 32)
> + stw t0, (sp, 16)
> +#endif
> +
> +#if NARGS >= 6
> + ldw t0, (sp, 36)
> + stw t0, (sp, 20)
> +#endif
> +
> +#if defined NEED_CANCELLATION && defined CENABLE
> + stw r15, (sp, 24)
> + .cfi_offset 15, -8
> + stw gb, (sp, 28)
> + .cfi_offset 28, -4
> + SINGLE_THREAD_P
> + bt .Lsocket_cancel
> +#endif
> +
> + mov t0, r7
> + lrw r7, __NR_socketcall
> + movi a0, P(SOCKOP_, socket)
> + mov a1, sp
> + trap 0
> + cfi_remember_state
> + .cfi_def_cfa_offset 40
> + addi sp, 32
> + .cfi_def_cfa_offset 0
> + mov r7, t0
> + PSEUDO_RET
> +
> +#if defined NEED_CANCELLATION && defined CENABLE
> +.Lsocket_cancel:
> + /* GET GB */
> + cfi_restore_state
> + grs gb, .Lgetpc
> +.Lgetpc:
> + lrw t0, .Lgetpc@GOTPC
> + addu gb, t0
> +
> + CENABLE
> + mov t1, a0 /* save CENABLE return value */
> + mov t0, r7
> + lrw r7, __NR_socketcall
> + movi a0, P(SOCKOP_, socket)
> + mov a1, sp
> + trap 0
> + stw a0, (sp, 0)
> + mov r7, t0
> + mov a0, t1
> + CDISABLE
> + ldw a0, (sp, 0)
> + ldw r15, (sp, 24)
> + .cfi_restore 15
> + ldw gb, (sp, 28)
> + .cfi_restore 28
> + addi sp, 32
> + .cfi_def_cfa_offset 0
> + btsti a0, 31
> + bf 3f
> +#ifdef __PIC__
> + subi sp, 8
> + stw gb, (sp, 0)
> + stw r15, (sp, 4)
> + /* must cal gb here, gb used by SYSCALL_ERROR ,why? FIXME */
> + grs gb, .Lgetpc2
> +.Lgetpc2:
> + lrw t0, .Lgetpc2@GOTPC
> + addu gb, gb, t0
> +
> + bsr SYSCALL_ERROR
> + ldw r15, (sp, 4)
> + ldw gb, (sp, 0)
> + addi sp, 8
> +#else
> + jmpi SYSCALL_ERROR
> +#endif
> +3:
> + rts
> +#endif
> +
> +PSEUDO_END(__socket)
> +
> +libc_hidden_def (__socket)
> +#ifndef NO_WEAK_ALIAS
> +weak_alias (__socket, socket)
> +#endif
The socket.S common gate has been removed on all architectures and I
prefer to continue doing so. If C-SKY does not follow generic kernel
ABI which prefer wire-up socket syscalls it is a matter to define
__ASSUME_SOCKETCALL in kernel-features.h. Current code should use
the wire-up call if the syscall is defined, otherwise the socketcall
is used instead.
> diff --git a/sysdeps/unix/sysv/linux/csky/abiv2_syscall.S b/sysdeps/unix/sysv/linux/csky/abiv2_syscall.S
> new file mode 100644
> index 0000000..90218bf
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/abiv2_syscall.S
> @@ -0,0 +1,69 @@
> +/* 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 <sysdep.h>
> +
> +/* long syscall(long sysnum, long a, long b, long c, long d, long e, long f) */
> +
> +ENTRY (syscall)
> + subi sp, 8
> + stw r4, (sp, 0)
> + stw r5, (sp, 4)
> +
> + mov t0, r7
> + mov r7, a0 /* r7 = sysnum */
> +
> + mov a0, a1 /* arg1 = a */
> + mov a1, a2 /* arg2 = b */
> + mov a2, a3 /* arg3 = c */
> + ldw a3, (sp, 8) /* arg4 = d */
> + ldw r4, (sp, 12) /* arg5 = e */
> + ldw r5, (sp, 16) /* arg6 = f */
> + trap 0
> +
> + mov r7, t0
> +
> + ldw r4, (sp, 0)
> + ldw r5, (sp, 4)
> + addi sp, 8
> +
> + lrw t0, 0xfffff000
> + cmphs a0, t0
> + bt do_syscall_error
> + rts
> +PSEUDO_END (syscall)
> +
> +do_syscall_error:
> +#ifdef __PIC__
> + subi sp, 8
> + stw gb, (sp, 0)
> + stw lr, (sp, 4)
> + grs gb, .Lgetpc
> +.Lgetpc:
> + lrw t0, .Lgetpc@GOTPC
> + addu gb, gb, t0
> + lrw t0, __syscall_error@PLT
> + ldr.w t0, (gb, t0 << 0)
> + jsr t0
> + ldw gb, (sp, 0)
> + ldw lr, (sp, 4)
> + addi sp, 8
> +#else
> + jmpi __syscall_error
> +#endif /* __PIC__ */
> + rts
> +
> diff --git a/sysdeps/unix/sysv/linux/csky/abiv2_vfork.S b/sysdeps/unix/sysv/linux/csky/abiv2_vfork.S
> new file mode 100644
> index 0000000..88cdc8a
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/abiv2_vfork.S
> @@ -0,0 +1,45 @@
> +/* 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 <sysdep.h>
> +#define _ERRNO_H 1
> +#include <bits/errno.h>
> +
> +/* Clone the calling process, but without copying the whole address space.
> + The calling process is suspended until the new process exits or is
> + replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
> + and the process ID of the new process to the old process. */
> +
> +ENTRY (__vfork)
> +#ifdef SAVE_PID
> + SAVE_PID
> +#endif
> + mov t0, r7
> + lrw r7, __NR_vfork
> + trap 0
> + mov r7, t0
> +#ifdef RESTORE_PID
> + RESTORE_PID
> +#endif
> + PSEUDO_RET
> + rts
> +
> +PSEUDO_END (__vfork)
> +libc_hidden_def (__vfork)
> +
> +weak_alias (__vfork, vfork)
> +strong_alias (__vfork, __libc_vfork)
> diff --git a/sysdeps/unix/sysv/linux/csky/alphasort64.c b/sysdeps/unix/sysv/linux/csky/alphasort64.c
> new file mode 100644
> index 0000000..0b5ae47
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/alphasort64.c
> @@ -0,0 +1 @@
> +#include <sysdeps/unix/sysv/linux/i386/alphasort64.c>
> diff --git a/sysdeps/unix/sysv/linux/csky/brk.c b/sysdeps/unix/sysv/linux/csky/brk.c
> new file mode 100644
> index 0000000..00d42c2
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/brk.c
> @@ -0,0 +1,61 @@
> +/* brk system call for Linux/C-SKY.
> + 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/>. */
> +
> +#ifdef __CSKYABIV2__
> +# include "abiv2_brk.c"
> +#else
> +
> +#include <unistd.h>
> +#include <sys/syscall.h>
> +#include <errno.h>
> +
> +/* This must be initialized data because commons can't have aliases. */
> +void * __curbrk = 0;
> +
> +/* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt
> + to work around different old braindamage in the old Linux/x86 ELF
> + dynamic linker. Sigh. */
> +weak_alias (__curbrk, ___brk_addr)
> +
> +int __brk (void *addr)
> +{
> + void *newbrk;
> +
> + {
> + register long int res __asm__("r2") = (long int)addr;
> +
> + __asm__ volatile ("lrw r1, %1\n\t"
> + "trap 0\n\t"
> + :"+r" (res)
> + :"i" (__NR_brk) :"r1");
> + newbrk = (void *) res;
> + }
> + __curbrk = newbrk;
> +
> + if (newbrk < addr)
> + {
> + __set_errno (ENOMEM);
> + return -1;
> + }
> +
> + return 0;
> +}
> +
> +weak_alias (__brk, brk)
> +
> +#endif
> diff --git a/sysdeps/unix/sysv/linux/csky/clone.S b/sysdeps/unix/sysv/linux/csky/clone.S
> new file mode 100644
> index 0000000..67ac7d1
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/clone.S
> @@ -0,0 +1,125 @@
> +/* 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/>. */
> +
> +/* clone() is even more special than fork() as it mucks with stacks
> + and invokes a function in the right context after its all over. */
> +
> +#ifdef __CSKYABIV2__
> +# include "abiv2_clone.S"
> +#else
> +
> +# include <sysdep.h>
> +# define _ERRNO_H 1
> +# include <bits/errno.h>
> +# include <csky_readtp.h>
> +
> +# define CLONE_VM 8 /* 11 makes btsti easier, 0x00000100 in real */
> +# define CLONE_THREAD 16 /* 0x00010000 in real */
> +
> +/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg,
> + pid_t *ptid, struct user_desc *tls, pid_t *ctid); */
> +
> + .text
> +ENTRY(__clone)
> + /* Sanity check arguments. */
> + cmpnei r2, 0
> + bf __error_arg /* no NULL function pointers */
> + cmpnei r3, 0
> + bf __error_arg /* no NULL function pointers */
I think you mean no NULL stack pointer here.
> +
> + subi r3, 8
> + stw r2, (r3, 0) /* insert the args onto the new stack */
> + stw r5, (r3, 4) /* insert the args onto the new stack */
> +
> + ldw r5, (sp, 0) /* arg4 = ctid */
> +# ifdef RESET_PID
> + subi r3, 8
> + stw r4, (r3, 0x0) /* save r4(flags) */
> +# endif
There is no more RESET_PID in upstream, you can drop this code.
> +
> + mov r2, r4 /* arg1 = flags */
> + mov r4, r6 /* arg3 = ptid */
> + mov r6, r7 /* arg5 = tls */
> + lrw r1, __NR_clone /* do syscall */
> + trap 0
> +
> + btsti r2, 31 /* is r2 less than zero? */
> + bt do_syscall_error
> + cmpnei r2, 0
> + bf 1f
> + rts
> +PSEUDO_END (__clone)
> +
> +1:
> +# ifdef RESET_PID
> + ld.w r4, (sp, 0x0)
> + btsti r4, CLONE_THREAD /* judge flags */
> + bt 3f
> + csky_read_tp
> + mov r6, r2
> +
> + btsti r4, CLONE_VM /* judge flags */
> + bmaski r2, 0 /* if CLONE_VM not set, pid=tid=-1 */
> + bt 2f
> + lrw r1, __NR_getpid /* else get pid via getpid syscall */
> + trap 0
> +2:
> + lrw r7, PID_OFFSET
> + add r7, r6
> + stw r2, (r7) /* save pid */
> + lrw r7, TID_OFFSET
> + add r7, r6
> + stw r2, (r7) /* save tid */
> +3:
> + addi sp, 8
> +# endif /* RESET_PID */
Same as before.
> + ldw r2, (sp, 4) /* restore args from new sp */
> + ldw r3, (sp, 0) /* restore args from new sp */
> + addi sp, 8
> +
> + jsr r3
> + lrw r1, __NR_exit
> + trap 0
> +
> +__error_arg:
> + lrw r2, -EINVAL
> +
> +do_syscall_error:
> +# ifdef __PIC__
> + subi sp, 8
> + stw gb, (sp, 0)
> + stw r15, (sp, 4)
> + bsr .Lgetpc
> +.Lgetpc:
> + lrw gb, .Lgetpc@GOTPC
> + addu gb, r15
> + lrw r7, __syscall_error@PLT
> + addu r7, gb
> + ldw r7, (r7)
> + jsr r7
> + ldw gb, (sp, 0)
> + ldw r15, (sp, 4)
> + addi sp, 8
> +# else
> + jmpi __syscall_error
> +# endif /* __PIC__ */
> + rts
> +
> +libc_hidden_def (__clone)
> +weak_alias (__clone, clone)
> +
> +#endif /* __CSKYABIV2__*/
> diff --git a/sysdeps/unix/sysv/linux/csky/ftruncate64.c b/sysdeps/unix/sysv/linux/csky/ftruncate64.c
> new file mode 100644
> index 0000000..47c38e6
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/ftruncate64.c
> @@ -0,0 +1,41 @@
> +/* 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/types.h>
> +#include <errno.h>
> +#include <endian.h>
> +#include <unistd.h>
> +
> +#include <sysdep.h>
> +#include <sys/syscall.h>
> +
> +/* Truncate the file FD refers to to LENGTH bytes. */
> +int
> +__ftruncate64 (int fd, off64_t length)
> +{
> + unsigned int low = length & 0xffffffff;
> + unsigned int high = length >> 32;
> +#ifdef __CSKYABIV2__
> + int result = INLINE_SYSCALL (ftruncate64, 3, fd,
> + __LONG_LONG_PAIR (high, low));
> +#else
> + int result = INLINE_SYSCALL (ftruncate64, 4, fd, 0,
> + __LONG_LONG_PAIR (high, low));
> +#endif
> + return result;
> +}
> +weak_alias (__ftruncate64, ftruncate64)
With recent INLINE_SYSCALL_CALL, which generic linux ftruncate64 uses, you do not
need to condicionaly the code for different argument argument number. You just
need to define the expected SYSCALL_LL64 macro for the required API and
INLINE_SYSCALL_CALL will issue the syscall with correct argument.
So I think this arch-specific implementation is not really required.
> diff --git a/sysdeps/unix/sysv/linux/csky/fxstat.c b/sysdeps/unix/sysv/linux/csky/fxstat.c
> new file mode 100644
> index 0000000..4f219f0
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/fxstat.c
> @@ -0,0 +1 @@
> +#include <sysdeps/unix/sysv/linux/i386/fxstat.c>
> diff --git a/sysdeps/unix/sysv/linux/csky/fxstatat.c b/sysdeps/unix/sysv/linux/csky/fxstatat.c
> new file mode 100644
> index 0000000..0f8b313
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/fxstatat.c
> @@ -0,0 +1 @@
> +#include <sysdeps/unix/sysv/linux/i386/fxstatat.c>
> diff --git a/sysdeps/unix/sysv/linux/csky/getcontext.S b/sysdeps/unix/sysv/linux/csky/getcontext.S
> new file mode 100644
> index 0000000..447c15b
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/getcontext.S
> @@ -0,0 +1,108 @@
> +/* 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/>. */
> +
> +#ifdef __CSKYABIV2__
> +#include "abiv2_getcontext.S"
> +#else
> +
> +#include <sysdep.h>
> +
> +#include "ucontext_i.h"
> +
> +/* int getcontext (ucontext_t *ucp) */
> +
> +ENTRY(__getcontext)
> + /* No need to save r2-r7 or a0-a3 */
> + mov r7, r2
> +
> + /* return zero */
> + lrw r2, MCONTEXT_CSKY_A0
> + add r2, r7
> + movi r1, 0
> + stw r1, (r2)
> +
> + lrw r2, MCONTEXT_CSKY_R8
> + add r2, r7
> + stw r8, (r2, 0) /* save r8 */
> + stw r9, (r2, 4) /* save r9 */
> + stw r10, (r2, 8) /* save r10 */
> + stw r11, (r2, 12) /* save r11 */
> + stw r12, (r2, 16) /* save r12 */
> + stw r13, (r2, 20) /* save r13 */
> + stw r14, (r2, 24) /* save r14 */
> + stw r15, (r2, 28) /* save lr */
> +
> +
> + lrw r2, MCONTEXT_CSKY_SP
> + add r2, r7
> + stw sp, (r2) /* save sp */
> +
> + lrw r2, MCONTEXT_CSKY_LR
> + add r2, r7
> + stw r15, (r2) /* Return to LR */
> +
> + lrw r2, MCONTEXT_CSKY_PC
> + add r2, r7
> + stw r15, (r2) /* Return to LR */
> +
> + lrw r2, MCONTEXT_CSKY_A0
> + add r2, r7
> + movi r3, 0
> + stw r3, (r2) /* Return zero */
> +
> + /* __sigprocmask(SIG_BLOCK, NULL, &(ucontext->uc_sigmask)) */
> + lrw r2, SIG_BLOCK
> + movi r3, 0
> + lrw r4, UCONTEXT_SIGMASK
> + add r4, r7
> +
> + subi sp, 8
> + stw r7, (sp, 0)
> +
> + /* do sigprocmask syscall */
> +#ifdef __PIC__
> + subi sp, 8
> + stw gb, (sp, 0)
> + stw lr, (sp, 4)
> + bsr .Lgetpc
> +.Lgetpc:
> + lrw gb, .Lgetpc@GOTPC
> + addu gb, r15
> + lrw r7, __sigprocmask@PLT
> + addu r7, gb
> + ldw r7, (r7)
> + jsr r7
> + ldw gb, (sp, 0)
> + ldw lr, (sp, 4)
> + addi sp, 8
> +#else
> + jsri __sigprocmask
> +#endif
> +
> + ldw r7, (sp, 0)
> + addi sp, 8
> + lrw r2, MCONTEXT_CSKY_LR
> + add r2, r7
> + /* restore r15 for sigprocmask changes */
> + ldw r15, (r2)
> + movi r2, 0 /* return 0 */
> + jmp r15
> +END(__getcontext)
> +
> +weak_alias(__getcontext, getcontext)
> +
> +#endif /* __CSKYABIV2__*/
> diff --git a/sysdeps/unix/sysv/linux/csky/getdents64.c b/sysdeps/unix/sysv/linux/csky/getdents64.c
> new file mode 100644
> index 0000000..0c75fb5
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/getdents64.c
> @@ -0,0 +1 @@
> +#include <sysdeps/unix/sysv/linux/i386/getdents64.c>
> diff --git a/sysdeps/unix/sysv/linux/csky/libc-read_tp.S b/sysdeps/unix/sysv/linux/csky/libc-read_tp.S
> new file mode 100644
> index 0000000..ca9d2b8
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/libc-read_tp.S
> @@ -0,0 +1 @@
> +#include <read_tp.S>
> diff --git a/sysdeps/unix/sysv/linux/csky/lockf64.c b/sysdeps/unix/sysv/linux/csky/lockf64.c
> new file mode 100644
> index 0000000..a88f5a7
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/lockf64.c
> @@ -0,0 +1 @@
> +#include <sysdeps/unix/sysv/linux/i386/lockf64.c>
> diff --git a/sysdeps/unix/sysv/linux/csky/lxstat.c b/sysdeps/unix/sysv/linux/csky/lxstat.c
> new file mode 100644
> index 0000000..2371cd9
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/lxstat.c
> @@ -0,0 +1,2 @@
> +#include <sysdeps/unix/sysv/linux/i386/lxstat.c>
> +
> diff --git a/sysdeps/unix/sysv/linux/csky/mmap.S b/sysdeps/unix/sysv/linux/csky/mmap.S
> new file mode 100644
> index 0000000..0d27ba5
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/mmap.S
> @@ -0,0 +1,65 @@
> +/* 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/>. */
> +
> +#ifdef __CSKYABIV2__
> +# include "abiv2_mmap.S"
> +#else
> +
> +#include <sysdep.h>
> +
> +/*void *mmap(void *addr, size_t len, int prot, int flags,
> + int fildes, off_t off); */
> +ENTRY (__mmap)
> + subi sp, 24
> + stw r2, (sp, 0)
> + stw r3, (sp, 4)
> + stw r4, (sp, 8)
> + stw r5, (sp, 12)
> + stw r6, (sp, 16)
> + stw r7, (sp, 20)
> + mov r2, sp
> + lrw r1, __NR_mmap
> + trap 0
> + addi sp, 24
> + lrw r3, 0xfffff000
> + cmphs r2, r3
> + bf 1f
> +#ifdef __PIC__
> + subi sp, 8
> + stw gb, (sp, 0)
> + stw r15, (sp, 4)
> + bsr .Lgetpc
> +.Lgetpc:
> + lrw gb, .Lgetpc@GOTPC
> + addu gb, r15
> + lrw r7, __syscall_error@PLT
> + addu r7, gb
> + ldw r7, (r7)
> + jsr r7
> + ldw gb, (sp, 0)
> + ldw r15, (sp, 4)
> + addi sp, 8
> +#else
> + jmpi __syscall_error
> +#endif /* __PIC__ */
> +1:
> + rts
> +PSEUDO_END (__mmap)
> +
> +weak_alias (__mmap, mmap)
> +libc_hidden_builtin_def (__mmap)
> +#endif /* __CSKYABVI2__*/
Same remark for abiv2_mmap.S applies here.
> diff --git a/sysdeps/unix/sysv/linux/csky/pt-vfork.S b/sysdeps/unix/sysv/linux/csky/pt-vfork.S
> new file mode 100644
> index 0000000..9bbd34c
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/pt-vfork.S
> @@ -0,0 +1,50 @@
> +/* 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 <sysdep.h>
> +#define _ERRNO_H 1
> +#include <bits/errno.h>
> +
> +/* Clone the calling process, but without copying the whole address space.
> + The calling process is suspended until the new process exits or is
> + replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
> + and the process ID of the new process to the old process. */
> +
> +ENTRY (vfork_compat)
> +#ifdef SAVE_PID
> + SAVE_PID
> +#endif
> +
> +#ifdef __CSKYABIV2__
> + mov t0, r7
> + lrw r7, __NR_vfork
> + trap 0
> + mov r7, t0
> +#else
> + lrw r1, __NR_vfork
> + trap 0
> +#endif
> +
> +#ifdef RESTORE_PID
> + RESTORE_PID
> +#endif
> + PSEUDO_RET
> + rts
> +
> +PSEUDO_END (vfork_compat)
> +
> +strong_alias (vfork_compat, vfork_compat2)
> diff --git a/sysdeps/unix/sysv/linux/csky/read_tp.S b/sysdeps/unix/sysv/linux/csky/read_tp.S
> new file mode 100644
> index 0000000..99c6d1a
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/read_tp.S
> @@ -0,0 +1,47 @@
> +/* 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 <features.h>
> +#include <sysdep.h>
> +
> +/* This function is exported from libc for use by user code. libpthread, librt,
> + and the dynamic linker get their own private copies, for
> + performance (and in the case of ld.so, out of necessity); those are
> + all hidden. */
> +
> +/*
> + * __read_tp
> + * clobbe r0, others had to be saved
> + *
> + */
> +#if IS_IN (libc)
> + .global __read_tp
> +#else
> + .hidden __read_tp
> +#endif
> +#ifdef __CSKYABIV2__
> +ENTRY (__read_tp)
> + mov r0, r31
> + rts
> +END (__read_tp)
> +#else
> +ENTRY (__read_tp)
> + trap 3
> + rts
> +END (__read_tp)
> +#endif
> +
> diff --git a/sysdeps/unix/sysv/linux/csky/readahead.c b/sysdeps/unix/sysv/linux/csky/readahead.c
> new file mode 100644
> index 0000000..47c44c3
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/readahead.c
> @@ -0,0 +1,44 @@
> +/* Provide kernel hint to read ahead.
> + 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 <errno.h>
> +#include <fcntl.h>
> +#include <sys/types.h>
> +#include <endian.h>
> +
> +#include <sysdep.h>
> +#include <sys/syscall.h>
> +
> +ssize_t
> +__readahead (int fd, off64_t offset, size_t count)
> +{
> +#ifdef __CSKYABVI2__
> + return INLINE_SYSCALL (readahead, 4, fd,
> + __LONG_LONG_PAIR ((off_t) (offset >> 32),
> + (off_t) (offset & 0xffffffff)),
> + count);
> +#else
> + return INLINE_SYSCALL (readahead, 5, fd, 0,
> + __LONG_LONG_PAIR ((off_t) (offset >> 32),
> + (off_t) (offset & 0xffffffff)),
> + count);
> +
> +#endif
> +}
> +
> +weak_alias (__readahead, readahead)
I would like to avoid adding another arch-specific Linux implementation while
we can consolidate Linux implementation.
On generic implementation (sysdeps/unix/sysv/linux/readahead.c) we can drop
the __NR_readahead exist check since for Linux 3.2 the syscall is presented
in all supported architectures. And for generic implementation we can use
current macros to handle kABI with a generic call like:
ssize_t
__readahead (int fd, off64_t offset, size_t count)
{
return INLINE_SYSCALL_CALL (readahead, fd,
__ALIGNMENT_ARG SYSCALL_LL64 (length));
}
So it will be a matter to define both __ALIGNMENT_ARG and SYCALL_LL64 correctly
for C-SKY, as it is already done for other architectures.
> diff --git a/sysdeps/unix/sysv/linux/csky/readdir64.c b/sysdeps/unix/sysv/linux/csky/readdir64.c
> new file mode 100644
> index 0000000..2ea26dd
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/readdir64.c
> @@ -0,0 +1 @@
> +#include <sysdeps/unix/sysv/linux/i386/readdir64.c>
> diff --git a/sysdeps/unix/sysv/linux/csky/readdir64_r.c b/sysdeps/unix/sysv/linux/csky/readdir64_r.c
> new file mode 100644
> index 0000000..9f54f89
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/readdir64_r.c
> @@ -0,0 +1 @@
> +#include <sysdeps/unix/sysv/linux/i386/readdir64_r.c>
> diff --git a/sysdeps/unix/sysv/linux/csky/scandir64.c b/sysdeps/unix/sysv/linux/csky/scandir64.c
> new file mode 100644
> index 0000000..506fd88
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/scandir64.c
> @@ -0,0 +1 @@
> +#include <sysdeps/unix/sysv/linux/i386/scandir64.c>
> diff --git a/sysdeps/unix/sysv/linux/csky/socket.S b/sysdeps/unix/sysv/linux/csky/socket.S
> new file mode 100644
> index 0000000..3ceb232
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/socket.S
> @@ -0,0 +1,171 @@
> +/* 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/>. */
> +
> +#ifdef __CSKYABIV2__
> +#include "abiv2_socket.S"
> +#else
> +
> +#include <sysdep-cancel.h>
> +#include <socketcall.h>
> +
> +#define P(a, b) P2(a, b)
> +#define P2(a, b) a##b
> +
> +/* The socket-oriented system calls are handled unusally in Linux.
> + They are all gated through the single `socketcall' system call number.
> + `socketcall' takes two arguments: the first is the subcode, specifying
> + which socket function is being called; and the second is a pointer to
> + the arguments to the specific function.
> +
> + The .S files for the other calls just #define socket and #include this. */
> +
> +#ifndef NARGS
> +#ifdef socket
> +#error NARGS not defined
> +#endif
> +#define NARGS 3
> +#endif
> +
> +#ifndef __socket
> +# ifndef NO_WEAK_ALIAS
> +# define __socket P(__,socket)
> +# else
> +# define __socket socket
> +# endif
> +#endif
> +
> +ENTRY (__socket)
> + subi sp, 32
> + subi sp, 8
> + .cfi_def_cfa_offset 40
> +#if NARGS >= 1
> + stw r2, (sp, 0)
> + .cfi_offset 2, -40
> +#endif
> +
> +#if NARGS >= 2
> + stw r3, (sp, 4)
> + .cfi_offset 3, -36
> +#endif
> +
> +#if NARGS >= 3
> + stw r4, (sp, 8)
> + .cfi_offset 4, -32
> +#endif
> +
> +#if NARGS >= 4
> + stw r5, (sp, 12)
> + .cfi_offset 5, -28
> +#endif
> +
> +#if NARGS >= 5
> + stw r6, (sp, 16)
> + .cfi_offset 6, -24
> +#endif
> +
> +#if NARGS >= 6
> + stw r7, (sp, 20)
> + .cfi_offset 7, -20
> +#endif
> +
> +#if defined NEED_CANCELLATION && defined CENABLE
> + stw r15, (sp, 24)
> + .cfi_offset 15, -16
> + st.w r14, (sp, 28)
> + .cfi_offset 14, -12
> + st.w r9, (sp, 32)
> + .cfi_offset 9, -8
> + SINGLE_THREAD_P
> + bt .Lsocket_cancel
> +#endif
> +
> + lrw r1, __NR_socketcall
> + movi r2, P(SOCKOP_, socket)
> + mov r3, sp
> + trap 0
> + cfi_remember_state
> + .cfi_def_cfa_offset 40
> + addi sp, 32
> + addi sp, 8
> + .cfi_def_cfa_offset 0
> + mov r1, r15
> + PSEUDO_RET
> +
> +#if defined NEED_CANCELLATION && defined CENABLE
> +.Lsocket_cancel:
> + cfi_restore_state
> + /* GET GB */
> + bsr 1f
> +1:
> + lrw r14, 1b@GOTPC
> + add r14, lr
> +
> + CENABLE
> + mov r4, r2 /* save CENABLE return value */
> + lrw r1, __NR_socketcall
> + movi r2, P(SOCKOP_, socket)
> + mov r3, sp
> + trap 0
> + mov r9, r2 /* (sp,0) save r9 */
> + mov r2, r4
> + CDISABLE
> + mov r2, r9
> + ldw r15, (sp, 24)
> + .cfi_restore 15
> + ldw r14, (sp, 28)
> + .cfi_restore 14
> + ldw r9, (sp, 32)
> + .cfi_restore 9
> + addi sp, 32
> + addi sp, 8
> + .cfi_def_cfa_offset 0
> + btsti r2, 31
> + bf 3f
> +#ifdef __PIC__
> + subi sp, 8
> + .cfi_def_cfa_offset 8
> + stw gb, (sp, 0)
> + .cfi_offset 14, -8
> + stw r15, (sp, 4)
> + .cfi_offset 15, -4
> + bsr .Lgetpc
> +.Lgetpc:
> + lrw gb, .Lgetpc@GOTPC
> + addu gb, r15
> + lrw r7, SYSCALL_ERROR@GOTOFF
> + addu r7, gb
> + jsr r7
> + ldw gb, (sp, 0)
> + ldw r15, (sp, 4)
> + addi sp, 8
> + .cfi_def_cfa_offset 0
> +#else
> + jmpi SYSCALL_ERROR
> +#endif
> +
> +3:
> + rts
> +#endif
> +
> +PSEUDO_END (__socket)
> +
> +libc_hidden_def (__socket)
> +#ifndef NO_WEAK_ALIAS
> +weak_alias (__socket, socket)
> +#endif
> +
> +#endif /* __CSKYABIV2__*/
Same comment for abiv2_socket.S applies here.
> diff --git a/sysdeps/unix/sysv/linux/csky/syscall.S b/sysdeps/unix/sysv/linux/csky/syscall.S
> new file mode 100644
> index 0000000..9b700a3
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/syscall.S
> @@ -0,0 +1,61 @@
> +/* 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/>. */
> +
> +#ifdef __CSKYABIV2__
> +# include "abiv2_syscall.S"
> +#else
> +
> +# include <sysdep.h>
> +
> +ENTRY (syscall)
> + mov r1, r2 /* syscall num */
> +
> + mov r2, r3 /* arg1 */
> + mov r3, r4 /* arg2 */
> + mov r4, r5 /* arg3 */
> + mov r5, r6 /* arg4*/
> + mov r6, r7 /* arg5*/
> + ld r7, (sp, 0) /* arg6 */
> + trap 0
> + lrw r3, 0xfffff000
> + cmphs r2, r3
> + bt do_syscall_error
> + rts
> +PSEUDO_END (syscall)
> +
> +do_syscall_error:
> +# ifdef __PIC__
> + subi sp, 8
> + stw gb, (sp, 0)
> + stw r15, (sp, 4)
> + bsr .Lgetpc
> +.Lgetpc:
> + lrw gb, .Lgetpc@GOTPC
> + addu gb, r15
> + lrw r7, __syscall_error@PLT
> + addu r7, gb
> + ldw r7, (r7)
> + jsr r7
> + ldw gb, (sp, 0)
> + ldw r15, (sp, 4)
> + addi sp, 8
> +# else
> + jmpi __syscall_error
> +# endif /* __PIC__ */
> + rts
> +
> +#endif /* __CSKYABVI2__ */
> diff --git a/sysdeps/unix/sysv/linux/csky/syscalls.list b/sysdeps/unix/sysv/linux/csky/syscalls.list
> new file mode 100644
> index 0000000..53cff69
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/syscalls.list
> @@ -0,0 +1,7 @@
> +# File name Caller Syscall name Args Strong name Weak names
> +
> +chown - chown32 i:sii __chown chown
> +cacheflush - cacheflush i:pii _flush_cache cacheflush
> +
> +prlimit64 EXTRA prlimit64 i:iipp prlimit64
> +fanotify_mark EXTRA fanotify_mark i:iiiiis fanotify_mark
> diff --git a/sysdeps/unix/sysv/linux/csky/versionsort64.c b/sysdeps/unix/sysv/linux/csky/versionsort64.c
> new file mode 100644
> index 0000000..144b691
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/versionsort64.c
> @@ -0,0 +1 @@
> +#include <sysdeps/unix/sysv/linux/i386/versionsort64.c>
> diff --git a/sysdeps/unix/sysv/linux/csky/vfork.S b/sysdeps/unix/sysv/linux/csky/vfork.S
> new file mode 100644
> index 0000000..913ca00
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/vfork.S
> @@ -0,0 +1,49 @@
> +/* 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/>. */
> +
> +#ifdef __CSKYABIV2__
> +# include "abiv2_vfork.S"
> +#else
> +
> +# include <sysdep.h>
> +# define _ERRNO_H 1
> +# include <bits/errno.h>
> +
> +/* Clone the calling process, but without copying the whole address space.
> + The calling process is suspended until the new process exits or is
> + replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
> + and the process ID of the new process to the old process. */
> +
> +ENTRY (__vfork)
> +# ifdef SAVE_PID
> + SAVE_PID
> +# endif
> + lrw r1, __NR_vfork
> + trap 0
> +# ifdef RESTORE_PID
> + RESTORE_PID
> +# endif
> + PSEUDO_RET
> + rts
> +
> +PSEUDO_END (__vfork)
> +libc_hidden_def (__vfork)
> +
> +weak_alias (__vfork, vfork)
> +strong_alias (__vfork, __libc_vfork)
> +
> +#endif /* __CSKYABIV2__*/
> diff --git a/sysdeps/unix/sysv/linux/csky/xstat.c b/sysdeps/unix/sysv/linux/csky/xstat.c
> new file mode 100644
> index 0000000..e9869f5
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/xstat.c
> @@ -0,0 +1 @@
> +#include <sysdeps/unix/sysv/linux/i386/xstat.c>
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [RFC PATCH 02/10] C-SKY: TLS support
2018-03-16 14:09 ` Carlos O'Donell
@ 2018-03-20 4:57 ` Mao Han
0 siblings, 0 replies; 22+ messages in thread
From: Mao Han @ 2018-03-20 4:57 UTC (permalink / raw)
To: Carlos O'Donell; +Cc: c-sky_gcc_upstream, gnu-csky, libc-help
On Fri, Mar 16, 2018 at 08:09:10AM -0600, Carlos O'Donell wrote:
> On 03/16/2018 03:58 AM, Mao Han wrote:
> > This patch implements TLS support for C-SKY. We support all four
> > standard TLS addressing modes (LE, IE, LD, and GD) when running on
> > Linux via NPTL.
> >
> > *sysdeps/csky/dl-tls.h: New file
> > *sysdeps/csky/libc-tls.c: New file
> > *sysdeps/csky/nptl/tcb-offsets.sym: New file
> > *sysdeps/csky/nptl/tls.h: New file
> > *sysdeps/csky/stackinfo.h: New file
> >
>
> OK, fairly clean, was curious about stack guard and pointer guard support.
>
> Others may have more to comment on this in libc-alpha.
>
> > Signed-off-by: Mao Han <han_mao@c-sky.com>
> > ---
> > sysdeps/csky/dl-tls.h | 26 ++++++
> > sysdeps/csky/libc-tls.c | 32 ++++++++
> > sysdeps/csky/nptl/tcb-offsets.sym | 10 +++
> > sysdeps/csky/nptl/tls.h | 169 ++++++++++++++++++++++++++++++++++++++
> > sysdeps/csky/stackinfo.h | 32 ++++++++
> > 5 files changed, 269 insertions(+)
> > create mode 100644 sysdeps/csky/dl-tls.h
> > create mode 100644 sysdeps/csky/libc-tls.c
> > create mode 100644 sysdeps/csky/nptl/tcb-offsets.sym
> > create mode 100644 sysdeps/csky/nptl/tls.h
> > create mode 100644 sysdeps/csky/stackinfo.h
> > index 0000000..69fadad
> > --- /dev/null
> > +++ b/sysdeps/csky/nptl/tls.h
> > @@ -0,0 +1,169 @@
> > +/* Definitions for thread-local data handling. NPTL/csky 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/>. */
> > +
> > +#ifndef _TLS_H
> > +#define _TLS_H 1
> > +
> > +#ifndef __ASSEMBLER__
> > +
> > +#include <stdbool.h>
> > +#include <stddef.h>
> > +#include <stdint.h>
> > +#include <dl-dtv.h>
> > +
> > +#ifdef __CSKYABIV2__
> > +/* define r31 as thread pointer register. */
> > +#define READ_THREAD_POINTER() \
> > + ({ void *__result; \
> > + __asm__ __volatile__ ("mov %0, r31" \
> > + : "=r" (__result)); \
> > + __result; })
> > +#else
> > +#define READ_THREAD_POINTER() \
> > + ({ register unsigned int __result __asm__("a0"); \
> > + __asm__ __volatile__ ("trap 3;" \
> > + : "=r" (__result) : : ); \
> > + __result; })
> > +#endif
> > +
> > +#else /* __ASSEMBLER__ */
> > +#include <tcb-offsets.h>
> > +#ifdef __CSKYABIV2__
> > +/* define r31 as thread pointer register. */
> > +#define READ_THREAD_POINTER() \
> > + mov r0, r31;
> > +#else
> > +#define READ_THREAD_POINTER() \
> > + trap 3;
> > +#endif
> > +#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
> > +
> > +/* Get the thread descriptor definition. */
> > +#include <nptl/descr.h>
> > +
> > +typedef struct
> > +{
> > + dtv_t *dtv;
> > + void *private;
>
> Stack guard or pointer guard support?
We have global stack protect support using __stack_chk_guard, but SSP_TLS
is not supported in our gcc. So there is no stack_guard here.
Pointer guard is not support at present. PTR_DEMANGLE and PTR_MANGLE are
defined empty. I think I'll add support for that later.
>
> > +} tcbhead_t;
> > +
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [RFC PATCH 09/10] C-SKY: Linux Syscall Interface
2018-03-18 3:19 ` Adhemerval Zanella
@ 2018-03-20 6:36 ` Mao Han
0 siblings, 0 replies; 22+ messages in thread
From: Mao Han @ 2018-03-20 6:36 UTC (permalink / raw)
To: Adhemerval Zanella; +Cc: c-sky_gcc_upstream, gnu-csky, libc-help
Hi Adhemerval,
Thanks a lot for the comments!
On Sun, Mar 18, 2018 at 11:19:30AM +0800, Adhemerval Zanella wrote:
>
>
> On 16/03/2018 17:58, Mao Han wrote:
>
> > diff --git a/sysdeps/unix/sysv/linux/csky/abiv2_mmap.S b/sysdeps/unix/sysv/linux/csky/abiv2_mmap.S
> > ...
> > +ENTRY (__mmap)
> > ...
> > +PSEUDO_END (__mmap)
> > +
> > +weak_alias (__mmap, mmap)
> > +libc_hidden_builtin_def (__mmap)
>
> Is there anything preventing C-SKY to use linux default mmap.c
> implementation? It seems it using a kABI similar to s390 which
> passes all the argument in the stack, so you just need to
> follow the idea of sysdeps/unix/sysv/linux/s390/mmap_internal.h.
OK, I'll try the idea of s390
>
> > diff --git a/sysdeps/unix/sysv/linux/csky/abiv2_socket.S b/sysdeps/unix/sysv/linux/csky/abiv2_socket.S
> > ...
> > +ENTRY (__socket)
> > ...
> > +PSEUDO_END(__socket)
> > +
> > +libc_hidden_def (__socket)
> > +#ifndef NO_WEAK_ALIAS
> > +weak_alias (__socket, socket)
> > +#endif
>
> The socket.S common gate has been removed on all architectures and I
> prefer to continue doing so. If C-SKY does not follow generic kernel
> ABI which prefer wire-up socket syscalls it is a matter to define
> __ASSUME_SOCKETCALL in kernel-features.h. Current code should use
> the wire-up call if the syscall is defined, otherwise the socketcall
> is used instead.
>
OK, I'll change to generic kernel ABI.
> > diff --git a/sysdeps/unix/sysv/linux/csky/clone.S b/sysdeps/unix/sysv/linux/csky/clone.S
> > ...
> > + .text
> > +ENTRY(__clone)
> > + /* Sanity check arguments. */
> > + cmpnei r2, 0
> > + bf __error_arg /* no NULL function pointers */
> > + cmpnei r3, 0
> > + bf __error_arg /* no NULL function pointers */
>
> I think you mean no NULL stack pointer here.
Yes, r3 is the child_stack pointer. I'll update the comment.
>
> > +
> > + subi r3, 8
> > + stw r2, (r3, 0) /* insert the args onto the new stack */
> > + stw r5, (r3, 4) /* insert the args onto the new stack */
> > +
> > + ldw r5, (sp, 0) /* arg4 = ctid */
> > +# ifdef RESET_PID
> > + subi r3, 8
> > + stw r4, (r3, 0x0) /* save r4(flags) */
> > +# endif
>
> There is no more RESET_PID in upstream, you can drop this code.
OK.
> > ...
> > +2:
> > + lrw r7, PID_OFFSET
> > + add r7, r6
> > + stw r2, (r7) /* save pid */
> > + lrw r7, TID_OFFSET
> > + add r7, r6
> > + stw r2, (r7) /* save tid */
> > +3:
> > + addi sp, 8
> > +# endif /* RESET_PID */
>
> Same as before.
OK
> > ...
> > +int
> > +__ftruncate64 (int fd, off64_t length)
> > +{
> > + unsigned int low = length & 0xffffffff;
> > + unsigned int high = length >> 32;
> > +#ifdef __CSKYABIV2__
> > + int result = INLINE_SYSCALL (ftruncate64, 3, fd,
> > + __LONG_LONG_PAIR (high, low));
> > +#else
> > + int result = INLINE_SYSCALL (ftruncate64, 4, fd, 0,
> > + __LONG_LONG_PAIR (high, low));
> > +#endif
> > + return result;
> > +}
> > +weak_alias (__ftruncate64, ftruncate64)
>
> With recent INLINE_SYSCALL_CALL, which generic linux ftruncate64 uses, you do not
> need to condicionaly the code for different argument argument number. You just
> need to define the expected SYSCALL_LL64 macro for the required API and
> INLINE_SYSCALL_CALL will issue the syscall with correct argument.
>
> So I think this arch-specific implementation is not really required.
OK, I'll try the generic implementation.
> > diff --git a/sysdeps/unix/sysv/linux/csky/mmap.S b/sysdeps/unix/sysv/linux/csky/mmap.S
> > ...
> > +PSEUDO_END (__mmap)
> > +
> > +weak_alias (__mmap, mmap)
> > +libc_hidden_builtin_def (__mmap)
> > +#endif /* __CSKYABVI2__*/
>
> Same remark for abiv2_mmap.S applies here.
OK
> > ...
> > +ssize_t
> > +__readahead (int fd, off64_t offset, size_t count)
> > +{
> > +#ifdef __CSKYABVI2__
> > + return INLINE_SYSCALL (readahead, 4, fd,
> > + __LONG_LONG_PAIR ((off_t) (offset >> 32),
> > + (off_t) (offset & 0xffffffff)),
> > + count);
> > +#else
> > + return INLINE_SYSCALL (readahead, 5, fd, 0,
> > + __LONG_LONG_PAIR ((off_t) (offset >> 32),
> > + (off_t) (offset & 0xffffffff)),
> > + count);
> > +
> > +#endif
> > +}
> > +
> > +weak_alias (__readahead, readahead)
>
> I would like to avoid adding another arch-specific Linux implementation while
> we can consolidate Linux implementation.
>
> On generic implementation (sysdeps/unix/sysv/linux/readahead.c) we can drop
> the __NR_readahead exist check since for Linux 3.2 the syscall is presented
> in all supported architectures. And for generic implementation we can use
> current macros to handle kABI with a generic call like:
>
> ssize_t
> __readahead (int fd, off64_t offset, size_t count)
> {
> return INLINE_SYSCALL_CALL (readahead, fd,
> __ALIGNMENT_ARG SYSCALL_LL64 (length));
> }
>
> So it will be a matter to define both __ALIGNMENT_ARG and SYCALL_LL64 correctly
> for C-SKY, as it is already done for other architectures.
>
OK. I'll check __ALIGNMENT_ARG and SYCALL_LL64 in C-SKY.
> > diff --git a/sysdeps/unix/sysv/linux/csky/socket.S b/sysdeps/unix/sysv/linux/csky/socket.S
> > ...
> > +PSEUDO_END (__socket)
> > +
> > +libc_hidden_def (__socket)
> > +#ifndef NO_WEAK_ALIAS
> > +weak_alias (__socket, socket)
> > +#endif
> > +
> > +#endif /* __CSKYABIV2__*/
>
> Same comment for abiv2_socket.S applies here.
OK
Best Regards
Mao Han
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [RFC PATCH 10/10] C-SKY: Linux ABI
2018-03-16 9:59 ` [RFC PATCH 10/10] C-SKY: Linux ABI Mao Han
@ 2018-03-20 9:42 ` Adhemerval Zanella
2018-03-20 10:58 ` Mao Han
0 siblings, 1 reply; 22+ messages in thread
From: Adhemerval Zanella @ 2018-03-20 9:42 UTC (permalink / raw)
To: libc-help
On 16/03/2018 17:58, Mao Han wrote:
> diff --git a/sysdeps/unix/sysv/linux/csky/sysdep-cancel.h b/sysdeps/unix/sysv/linux/csky/sysdep-cancel.h
> new file mode 100644
> index 0000000..dd39ecf
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/sysdep-cancel.h
New ports should not provide sysdep-cancel.h any more, cancellable syscall
not generated by syscalls.list and if it an advantage for the ABI, it
can define SINGLE_THREAD_BY_GLOBAL on sysdep.h (so the single-thread
check will be done by a global variable instead of using a TCB field).
> @@ -0,0 +1,407 @@
> +/* 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 <sysdep.h>
> +#include <tls.h>
> +#include <csky_readtp.h>
> +#ifndef __ASSEMBLER__
> +# include <nptl/pthreadP.h>
> +#endif
> +
> +#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> +
> +# ifdef __PIC__
> +# define __GET_GB \
> + bsr 1f; 1: lrw gb, 1b@GOTPC; addu gb, lr;
> +# define __JSR(symbol) \
> + lrw a2, symbol@PLT; add a2, gb; ld.w a2, (a2); jsr a2;
> +
> +# if !IS_IN (libc)
> +# define PSEUDO_ERRJMP \
> + subi sp, 8; st.w lr, (sp); st.w gb, (sp, 4); \
> + __GET_GB \
> + bsr SYSCALL_ERROR; \
> + ld.w lr, (sp); ld.w gb, (sp, 4); addi sp, 8; \
> + rts;
> +# else /* !IS_IN (libc) */
> +# define PSEUDO_ERRJMP \
> + subi sp, 8; st.w lr, (sp); st.w gb, (sp, 4); \
> + __GET_GB \
> + lrw a2, SYSCALL_ERROR@PLT; add a2, gb; ld.w a2, (a2); \
> + jsr a2; \
> + ld.w lr, (sp); ld.w gb, (sp, 4); addi sp, 8; \
> + rts;
> +# endif
> +
> +# else
> +
> +# define __GET_GB
> +# define __JSR(symbol) jsri symbol;
> +# define PSEUDO_ERRJMP jmpi SYSCALL_ERROR;
> +# endif
> +
> +
> +#ifdef __CSKYABIV2__
> +#undef PSEUDO
> +#define PSEUDO(name, syscall_name, args) \
> + .section ".text"; \
> + 99: PSEUDO_ERRJMP \
> + .type __##syscall_name##_nocancel,@function; \
> + .globl __##syscall_name##_nocancel; \
> + __##syscall_name##_nocancel: \
> + cfi_startproc; \
> + DO_CALL (syscall_name, args); \
> + btsti a0, 31; \
> + bt 99b; \
> + rts; \
> + cfi_endproc; \
> + .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
> + ENTRY (name); \
> + SINGLE_THREAD_P; \
> + bt .Lpseudo_cancel; \
> + DO_CALL (syscall_name, args); \
> + btsti a0, 31; \
> + bt 99b; \
> + rts; \
> +.Lpseudo_cancel: \
> + DOCARGS_##args; /* save syscall reg(r7), syscall args and lr */ \
> + __GET_GB; \
> + CENABLE; \
> + mov t0, a0; /* Save result of CENABLE */ \
> + UNDOSYSARGS_##args; /* restore syscall args */ \
> + DO_CALL_2 (syscall_name, args); \
> + mov r7, a0; /* save result of syscall */ \
> + mov a0, t0; /* restore result of CENABLE */ \
> + CDISABLE; \
> + mov a0, r7; /* restore result of syscall */ \
> + RESTORE_LR_R7_##args; \
> + btsti a0, 31; \
> + bt 99b; \
> + rts; \
> +
> +
> +#else /* __CSKYABIV1__ */
> +
> +#undef PSEUDO
> +#define PSEUDO(name, syscall_name, args) \
> + .section ".text"; \
> + 99: PSEUDO_ERRJMP \
> + .type __##syscall_name##_nocancel,@function; \
> + .globl __##syscall_name##_nocancel; \
> + __##syscall_name##_nocancel: \
> + DO_CALL (syscall_name, args); \
> + btsti a0, 31; \
> + bt 99b; \
> + rts; \
> + .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
> + ENTRY (name); \
> + SINGLE_THREAD_P; \
> + bt .Lpseudo_cancel; \
> + DO_CALL (syscall_name, args); \
> + btsti a0, 31; \
> + bt 99b; \
> + rts; \
> +.Lpseudo_cancel: \
> + DOCARGS_##args; /* save syscall args and lr */ \
> + __GET_GB; \
> + CENABLE; \
> + mov r9, a0; \
> + UNDOSYSARGS_##args; /* restore syscall args */ \
> + lrw r1, SYS_ify (syscall_name); \
> + trap 0; \
> + mov r1, a0; /* save result of syscall */ \
> + mov a0, r9; /* restore result of CENABLE */ \
> + mov r9, r1; \
> + CDISABLE; \
> + mov a0, r9; /* restore result of syscall */ \
> + RESTORE_LR_##args; \
> + btsti a0, 31; \
> + bt 99b; \
> + rts; \
> +
> +#endif /* __CSKYABIV2__ */
> +
> +#ifdef __CSKYABIV2__
> +#define DOCARGS_0 \
> + subi sp, 12; .cfi_def_cfa_offset 12; \
> + stw r15, (sp, 0); .cfi_offset 15, -12; \
> + stw gb, (sp, 4); .cfi_offset 28, -8; \
> + stw r7, (sp, 8); .cfi_offset 7, -4;
> +#define UNDOSYSARGS_0
> +#define RESTORE_LR_R7_0 \
> + ldw r15, (sp, 0); \
> + ldw gb, (sp, 4); \
> + ldw r7, (sp, 8); \
> + addi sp, 12
> +
> +#define DOCARGS_1 \
> + subi sp, 16; .cfi_def_cfa_offset 16; \
> + stw a0, (sp, 0); \
> + stw r15, (sp, 4); .cfi_offset 15, -12; \
> + stw gb, (sp, 8); .cfi_offset 28, -8; \
> + stw r7, (sp, 12); .cfi_offset 7, -4;
> +#define UNDOSYSARGS_1 \
> + ldw a0, (sp, 0); \
> + addi sp, 4; .cfi_adjust_cfa_offset -4;
> +#define RESTORE_LR_R7_1 RESTORE_LR_R7_0
> +
> +#define DOCARGS_2 \
> + subi sp, 20; .cfi_def_cfa_offset 20; \
> + stw a0, (sp, 0); \
> + stw a1, (sp, 4); \
> + stw r15, (sp, 8); .cfi_offset 15, -12; \
> + stw gb, (sp, 12); .cfi_offset 28, -8; \
> + stw r7, (sp, 16); .cfi_offset 7, -4;
> +#define UNDOSYSARGS_2 \
> + ldw a0, (sp, 0); \
> + ldw a1, (sp, 4); \
> + addi sp, 8; .cfi_adjust_cfa_offset -8;
> +#define RESTORE_LR_R7_2 RESTORE_LR_R7_0
> +
> +#define DOCARGS_3 \
> + subi sp, 24; .cfi_def_cfa_offset 24; \
> + stw a0, (sp, 0); \
> + stw a1, (sp, 4); \
> + stw a2, (sp, 8); \
> + stw r15, (sp, 12); .cfi_offset 15, -12; \
> + stw gb, (sp, 16); .cfi_offset 28, -8; \
> + stw r7, (sp, 20); .cfi_offset 7, -4;
> +#define UNDOSYSARGS_3 \
> + ldw a0, (sp, 0); \
> + ldw a1, (sp, 4); \
> + ldw a2, (sp, 8); \
> + addi sp, 12; .cfi_adjust_cfa_offset -12;
> +#define RESTORE_LR_R7_3 RESTORE_LR_R7_0
> +
> +#define DOCARGS_4 \
> + subi sp, 28;; .cfi_def_cfa_offset 28; \
> + stw a0, (sp, 0); \
> + stw a1, (sp, 4); \
> + stw a2, (sp, 8); \
> + stw a3, (sp, 12); \
> + stw r15, (sp, 16); .cfi_offset 15, -12; \
> + stw gb, (sp, 20); .cfi_offset 28, -8; \
> + stw r7, (sp, 24); .cfi_offset 7, -4;
> +#define UNDOSYSARGS_4 \
> + ldw a0, (sp, 0); \
> + ldw a1, (sp, 4); \
> + ldw a2, (sp, 8); \
> + ldw a3, (sp, 12); \
> + addi sp, 16; .cfi_adjust_cfa_offset -16;
> +#define RESTORE_LR_R7_4 RESTORE_LR_R7_0
> +
> +#define DOCARGS_5 DOCARGS_4
> +#define UNDOSYSARGS_5 UNDOSYSARGS_4
> +#define RESTORE_LR_R7_5 RESTORE_LR_R7_0
> +#define DOCARGS_6 DOCARGS_4
> +#define UNDOSYSARGS_6 UNDOSYSARGS_4
> +#define RESTORE_LR_R7_6 RESTORE_LR_R7_0
> +#else /* __CSKYABIV1__ */
> +#define DOCARGS_0 \
> + subi sp, 16; .cfi_def_cfa_offset 16; \
> + stw r15, (sp, 0); .cfi_offset 15, -16; \
> + stw r9, (sp, 4); .cfi_offset 9, -12; \
> + stw r14, (sp, 8); .cfi_offset 14, -8;
> +#define UNDOSYSARGS_0
> +#define RESTORE_LR_0 \
> + ldw r15, (sp, 0); \
> + ldw r9, (sp, 4); \
> + ldw r14, (sp, 8); \
> + addi sp, 16
> +
> +#define DOCARGS_1 \
> + subi sp, 16; .cfi_def_cfa_offset 16; \
> + stw r15, (sp, 0); .cfi_offset 15, -16; \
> + stw r9, (sp, 4); .cfi_offset 9, -12; \
> + stw r14, (sp, 8); .cfi_offset 14, -8; \
> + stw r2, (sp, 12);
> +#define UNDOSYSARGS_1 \
> + ldw r2, (sp, 12);
> +#define RESTORE_LR_1 RESTORE_LR_0
> +
> +#define DOCARGS_2 \
> + subi sp, 24; .cfi_def_cfa_offset 24; \
> + stw r2, (sp, 0); \
> + stw r3, (sp, 4); \
> + stw r15, (sp, 8); .cfi_offset 15, -16; \
> + stw r9, (sp, 12); .cfi_offset 9, -12; \
> + stw r14, (sp, 16); .cfi_offset 14, -8;
> +#define UNDOSYSARGS_2 \
> + ldw r2, (sp, 0); \
> + ldw r3, (sp, 4); \
> + addi sp, 8; .cfi_adjust_cfa_offset -8;
> +#define RESTORE_LR_2 RESTORE_LR_0
> +
> +#define DOCARGS_3 \
> + subi sp, 24; .cfi_def_cfa_offset 24; \
> + stw r2, (sp, 0); \
> + stw r3, (sp, 4); \
> + stw r15, (sp, 8); .cfi_offset 15, -16; \
> + stw r9, (sp, 12); .cfi_offset 9, -12; \
> + stw r14, (sp, 16); .cfi_offset 14, -8; \
> + stw r4, (sp, 20);
> +#define UNDOSYSARGS_3 \
> + ldw r2, (sp, 0); \
> + ldw r3, (sp, 4); \
> + ldw r4, (sp, 20); \
> + addi sp, 8; .cfi_adjust_cfa_offset -8;
> +#define RESTORE_LR_3 RESTORE_LR_0
> +
> +#define DOCARGS_4 \
> + subi sp, 32; .cfi_def_cfa_offset 32; \
> + stw r2, (sp, 0); \
> + stw r3, (sp, 4); \
> + stw r4, (sp, 8); \
> + stw r5, (sp, 12); \
> + stw r15, (sp, 16); .cfi_offset 15, -16; \
> + stw r9, (sp, 20); .cfi_offset 9, -12; \
> + stw r14, (sp, 24); .cfi_offset 14, -8;
> +#define UNDOSYSARGS_4 \
> + ldw r2, (sp, 0); \
> + ldw r3, (sp, 4); \
> + ldw r4, (sp, 8); \
> + ldw r5, (sp, 12); \
> + addi sp, 16; .cfi_adjust_cfa_offset -16;
> +#define RESTORE_LR_4 RESTORE_LR_0
> +
> +#define DOCARGS_5 \
> + subi sp, 32; .cfi_def_cfa_offset 32; \
> + stw r2, (sp, 0); \
> + stw r3, (sp, 4); \
> + stw r4, (sp, 8); \
> + stw r5, (sp, 12); \
> + stw r15, (sp, 16); .cfi_offset 15, -16; \
> + stw r9, (sp, 20); .cfi_offset 9, -12; \
> + stw r14, (sp, 24); .cfi_offset 14, -8; \
> + stw r6, (sp, 28);
> +#define UNDOSYSARGS_5 \
> + ldw r2, (sp, 0); \
> + ldw r3, (sp, 4); \
> + ldw r4, (sp, 8); \
> + ldw r5, (sp, 12); \
> + ldw r6, (sp, 28); \
> + addi sp, 16; .cfi_adjust_cfa_offset -16;
> +#define RESTORE_LR_5 RESTORE_LR_0
> +
> +#define DOCARGS_6 \
> + subi sp, 32; .cfi_def_cfa_offset 32; \
> + subi sp, 8; .cfi_def_cfa_offset 8; \
> + stw r2, (sp, 0); \
> + stw r3, (sp, 4); \
> + stw r4, (sp, 8); \
> + stw r5, (sp, 12); \
> + stw r6, (sp, 16); \
> + stw r7, (sp, 20); \
> + stw r15, (sp, 24); .cfi_offset 15, -16; \
> + stw r9, (sp, 28); .cfi_offset 9, -12; \
> + stw r14, (sp, 32); .cfi_offset 14, -8;
> +#define UNDOSYSARGS_6 \
> + ldw r2, (sp, 0); \
> + ldw r3, (sp, 4); \
> + ldw r4, (sp, 8); \
> + ldw r5, (sp, 12); \
> + ldw r6, (sp, 16); \
> + ldw r7, (sp, 20); \
> + addi sp, 24; .cfi_adjust_cfa_offset -24;
> +#define RESTORE_LR_6 RESTORE_LR_0
> +
> +#define UNDOARGS_0
> +#define UNDOARGS_1
> +#define UNDOARGS_2
> +#define UNDOARGS_3
> +#define UNDOARGS_4
> +#define UNDOARGS_5
> +#define UNDOARGS_6
> +
> +#endif /* __CSKYABIV2__ */
> +
> +
> +
> +# if IS_IN (libpthread)
> +# ifdef __PIC__
> +# define CENABLE __JSR (__pthread_enable_asynccancel)
> +# define CDISABLE __JSR (__pthread_disable_asynccancel)
> +# else
> +# define CENABLE __JSR (__pthread_enable_asynccancel)
> +# define CDISABLE __JSR (__pthread_disable_asynccancel)
> +# endif
> +# elif IS_IN (libc)
> +# ifdef __PIC__
> +# define CENABLE __JSR (__libc_enable_asynccancel)
> +# define CDISABLE __JSR (__libc_disable_asynccancel)
> +# else
> +# define CENABLE __JSR (__libc_enable_asynccancel)
> +# define CDISABLE __JSR (__libc_disable_asynccancel)
> +# endif
> +# else
> +# ifdef __PIC__
> +# define CENABLE __JSR (__librt_enable_asynccancel)
> +# define CDISABLE __JSR (__librt_disable_asynccancel)
> +# else
> +# define CENABLE __JSR (__librt_enable_asynccancel)
> +# define CDISABLE __JSR (__librt_disable_asynccancel)
> +# endif
> +# endif
> +
> +# if IS_IN (libc)
> +# define __local_multiple_threads __libc_multiple_threads
> +# elif IS_IN (libpthread)
> +# define __local_multiple_threads __pthread_multiple_threads
> +# else
> +# define __local_multiple_threads __librt_multiple_threads
> +# endif
> +
> +#ifndef __ASSEMBLER__
> +# if IS_IN (libpthread) || IS_IN (libc)
> +extern int __local_multiple_threads attribute_hidden;
> +# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
> +# else /* IS_IN_libpthread || !defined NOT_IN_libc */
> +# define SINGLE_THREAD_P \
> + __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> + header.multiple_threads) == 0, 1)
> +# endif
> +#else
> +# define SINGLE_THREAD_P \
> + subi sp, 8; \
> + stw a0, (sp, 0); \
> + stw a1, (sp, 4); \
> + csky_read_tp; \
> + lrw a1, MULTIPLE_THREADS_OFFSET; \
> + add a0, a1; \
> + ldw a0, (a0); \
> + cmpnei a0, 0; \
> + ldw a0, (sp, 0); \
> + ldw a1, (sp, 4); \
> + addi sp, 8
> +# endif
> +
> +
> +
> +#elif !defined __ASSEMBLER__
> +
> +/* This code should never be used but we define it anyhow. */
> +# define SINGLE_THREAD_P (1)
> +# define NO_CANCELLATION (1)
> +
> +#endif
> +
> +#ifndef __ASSEMBLER__
> +# define RTLD_SINGLE_THREAD_P \
> + __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> + header.multiple_threads) == 0, \
> + 1)
> +#endif
> diff --git a/sysdeps/unix/sysv/linux/csky/sysdep.S b/sysdeps/unix/sysv/linux/csky/sysdep.S
> new file mode 100644
> index 0000000..7b919ec
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/sysdep.S
> @@ -0,0 +1,119 @@
> +/* 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 <sysdep.h>
> +#include <csky_readtp.h>
> +
> +/* The syscall stubs jump here when they detect an error.
> + The code for Linux is almost identical to the canonical Unix
> + code, except that the error number in R0 is negated. */
> +
> +#undef CALL_MCOUNT
> +#define CALL_MCOUNT /* Don't insert the profiling call, it clobbers R0. */
> +
> + .text
> +ENTRY(__syscall_error)
> + movi a1, 0
> + rsub a0, a0, a1
> +
> +#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
> + /* We translate the system's EWOULDBLOCK error into EAGAIN.
> + The GNU C library always defines EWOULDBLOCK==EAGAIN.
> + EWOULDBLOCK_sys is the original number. */
> + cmpnei a0, EWOULDBLOCK /* Is it the old EWOULDBLOCK? */
> + bt 1f
> + mov a0, EAGAIN /* Yes; translate it to EAGAIN. */
> +#endif
I am not sure if this is true or required for new ports, does C-SKY
really require this code snippet?
> +
> +#ifdef __CSKYABIV2__
> +1:
> +# if !IS_IN (rtld)
> + mov a1, a0
> + csky_read_tp
> +
> + grs t1, .Lgetpc1
> +.Lgetpc1:
> + lrw t0, errno@gottpoff
> + add t1, t1, t0
> + ldw t1, (t1)
> + add t1, a0
> + stw a1, (t1)
> + bmaski a0, 0
> + rts
> +# elif RTLD_PRIVATE_ERRNO /* !IS_IN (rtld) */
> +# ifdef __PIC__
> + grs t1, .Lgetpc2
> +.Lgetpc2:
> + lrw t0, .Lgetpc2@GOTPC
> + addu t1, t1, t0
> + lrw t0, rtld_errno@PLT
> + ldr.w t0, (t1, t0 << 0)
> +# else
> + lrw t0, rtld_errno
> +# endif /* __PIC__ */
> + stw a0, (t0)
> + bmaski a0, 0
> + rts
> +# else
> +# error "Unsupported non-TLS case"
> +# endif /* RTLD_PRIVATE_ERRNO */
> +
> +# undef __syscall_error
> +END (__syscall_error)
> +
> +#else /* __CSKYABIV2__ */
> +
> +1:
> +# if !IS_IN (rtld)
> + mov r7, r15
> + mov r1, r2
> + csky_read_tp
> +
> + bsr .Lgetpc1
> +.Lgetpc1:
> + lrw r5, errno@gottpoff
> + add r5, r15
> + ldw r5, (r5)
> + add r5, r2
> + stw r1, (r5)
> + bmaski r2, 0
> + mov r15, r7
> + rts
> +# elif RTLD_PRIVATE_ERRNO /* !IS_IN (rtld) */
> +# ifdef __PIC__
> + mov r7, r15
> + bsr .Lgetpc2
> +.Lgetpc2:
> + lrw r6, .Lgetpc2@GOTPC
> + addu r6, r15
> + lrw r5, rtld_errno@PLT
> + addu r5, r6
> + ldw r5, (r5)
> + mov r15, r7
> +# else /* __PIC__ */
> + lrw r5, rtld_errno
> +# endif /* __PIC__ */
> + stw r2, (r5)
> + bmaski r2, 0
> + rts
> +# else
> +# error "Unsupported non-TLS case"
> +# endif /* RTLD_PRIVATE_ERRNO */
> +
> +END (__syscall_error)
> +
> +#endif /* __CSKYABIV2__ */
> diff --git a/sysdeps/unix/sysv/linux/csky/sysdep.h b/sysdeps/unix/sysv/linux/csky/sysdep.h
> new file mode 100644
> index 0000000..7edc559
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/sysdep.h
> @@ -0,0 +1,730 @@
> +/* 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/>. */
> +
> +#ifndef _LINUX_CSKY_SYSDEP_H
> +#define _LINUX_CSKY_SYSDEP_H 1
> +
> +/* There is some commonality. */
> +#include <sysdeps/unix/sysv/linux/sysdep.h>
> +#include <sysdeps/unix/csky/sysdep.h>
> +
> +/* Defines RTLD_PRIVATE_ERRNO and USE_DL_SYSINFO. */
> +#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__
> +/* Linux uses a negative return value to indicate syscall errors,
> + unlike most Unices, which use the condition codes' carry flag.
> +
> + Since version 2.1 the return value of a system call might be
> + negative even if the call succeeded. E.g., the `lseek' system call
> + might return a large offset. Therefore we must not anymore test
> + for < 0, but test for a real error by making sure the value in R0
> + is a real error number. Linus said he will make sure the no syscall
> + returns a value in -1 .. -4095 as a valid result so we can safely
> + test with -4095. */
> +
> +# undef PSEUDO
> +# define PSEUDO(name, syscall_name, args) \
> + .text; \
> + ENTRY (name); \
> + DO_CALL (syscall_name, args);
> +
> +
> +# if defined (__PIC__)
> +# define __GET_GB1 \
> + bsr getgb; getgb: lrw gb, getgb@GOTPC; addu gb, lr;
> +# else
> +# define __GET_GB1
> +# endif /* !__PIC__ */
> +
> +# undef PSEUDO_RET
> +# ifdef __PIC__
> +# if !IS_IN (libc)
> +# define PSEUDO_RET \
> + btsti a0, 31; \
> + bf 1f; \
> + subi sp, 8; st.w lr, (sp); st.w gb, (sp, 4); \
> + __GET_GB1 \
> + bsr SYSCALL_ERROR; \
> + ld.w lr, (sp); ld.w gb, (sp, 4); addi sp, 8; \
> +1: \
> + rts
> +# else
> +# define PSEUDO_RET \
> + btsti a0, 31; \
> + bf 2f; \
> + subi sp, 8; st.w lr, (sp); st.w gb, (sp, 4); \
> + __GET_GB1; \
> + lrw a2, SYSCALL_ERROR@PLT; \
> + add a2, gb; \
> + ld.w a2, (a2); \
> + jsr a2; \
> + ld.w lr, (sp); ld.w gb, (sp, 4); addi sp, 8; \
> +2: \
> + rts
> +# endif /* IS_IN (libc) */
> +# else
> +# if !IS_IN (libc)
> +# define PSEUDO_RET \
> + btsti a0, 31; \
> + bt SYSCALL_ERROR; \
> + rts
> +# else
> +# define PSEUDO_RET \
> + btsti a0, 31; \
> + bf 3f; \
> + jmpi SYSCALL_ERROR; \
> +3: \
> + rts
> +# endif /* !IS_IN (libc) */
> +# endif /* __PIC__ */
> +
> +
> +# undef ret
> +# define ret PSEUDO_RET
> +
> +# undef PSEUDO_END
> +# define PSEUDO_END(name) \
> + .align 4; \
> + SYSCALL_ERROR_HANDLER; \
> + END (name)
> +
> +# undef PSEUDO_NOERRNO
> +# define PSEUDO_NOERRNO(name, syscall_name, args) \
> + .text; \
> + ENTRY (name); \
> + DO_CALL (syscall_name, args)
> +
> +# define PSEUDO_RET_NOERRNO \
> + jmp r15;
> +
> +# undef ret_NOERRNO
> +# define ret_NOERRNO PSEUDO_RET_NOERRNO
> +
> +# undef PSEUDO_END_NOERRNO
> +# define PSEUDO_END_NOERRNO(name) \
> + END (name)
> +
> +/* The function has to return the error code. */
> +# undef PSEUDO_ERRVAL
> +# define PSEUDO_ERRVAL(name, syscall_name, args) \
> + .text; \
> + ENTRY (name) \
> + DO_CALL (syscall_name, args); \
> + not a0; \
> + addi a0, 1
> +
> +# undef PSEUDO_END_ERRVAL
> +# define PSEUDO_END_ERRVAL(name) \
> + END (name)
> +
> +# define ret_ERRVAL rts
> +
> +# if !IS_IN (libc)
> +# define SYSCALL_ERROR __local_syscall_error
> +# if RTLD_PRIVATE_ERRNO
> +# ifdef __PIC__
> +# define SYSCALL_ERROR_HANDLER \
> +__local_syscall_error: \
> + lrw a1, rtld_errno@PLT; \
> + addu a1, gb; \
> + ldw a1, (a1); \
> + rsubi a0, 0; \
> + stw a0, (a1); \
> + bmaski a0, 0; \
> + rts
> +# else /* __PIC__ */
> +# define SYSCALL_ERROR_HANDLER \
> +__local_syscall_error: \
> + lrw a1, rtld_errno; \
> + rsubi a0, 0; \
> + stw a0, (a1); \
> + bmaski a0, 0; \
> + rts
> +# endif /* __PIC__ */
> +# else /* !RTLD_PRIVATE_ERRNO */
> +# ifdef __PIC__
> +# define SYSCALL_ERROR_HANDLER \
> +__local_syscall_error: \
> + subi sp, 8; \
> + stw a0, (sp, 0); \
> + stw r15, (sp, 4); \
> + lrw a1, __errno_location@PLT; \
> + add a1, gb; \
> + ldw a1, (a1); \
> + jsr a1; \
> + ldw a1, (sp, 0); /* load errno*/ \
> + ldw r15, (sp, 4); \
> + addi sp, 8; \
> + movi a2, 0; \
> + rsub a1, a1, a2; \
> + stw a1, (a0); \
> + bmaski a0, 0; \
> + rts
> +# else
> +# define SYSCALL_ERROR_HANDLER \
> +__local_syscall_error: \
> + subi sp, 8; \
> + stw a0, (sp, 0); \
> + stw r15, (sp, 4); \
> + lrw a1, __errno_location; \
> + jsr a1; \
> + ldw a1, (sp, 0); /* load errno */ \
> + ldw r15, (sp, 4); \
> + addi sp, 8; \
> + movi a2, 0; \
> + rsub a1, a1, a2; \
> + stw a1, (a0); \
> + bmaski a0, 0; \
> + rts
> +# endif /* __PIC__ */
> +# endif/* RTLD_PRIVATE_ERROR */
> +# else
> +# define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */
> +# define SYSCALL_ERROR __syscall_error
> +# endif/* IS_IN (libc) */
> +
> +/* define DO_CALL */
> +#ifdef __CSKYABIV2__
> +#undef DO_CALL
> +#define DO_CALL(syscall_name, args) \
> + DOARGS_##args; \
> + lrw r7, SYS_ify(syscall_name); \
> + trap 0; \
> + UNDOARGS_##args
> +
> +#undef DOARGS_0
> +#define DOARGS_0 \
> + subi sp, 8; \
> + cfi_adjust_cfa_offset (8); \
> + stw r7, (sp, 0); \
> + cfi_rel_offset (r7, 0);
> +
> +#undef DOARGS_1
> +#define DOARGS_1 DOARGS_0
> +#undef DOARGS_2
> +#define DOARGS_2 DOARGS_0
> +#undef DOARGS_3
> +#define DOARGS_3 DOARGS_0
> +#undef DOARGS_4
> +#define DOARGS_4 DOARGS_0
> +#undef DOARGS_5
> +#define DOARGS_5 \
> + subi sp, 8; \
> + cfi_adjust_cfa_offset (8); \
> + stw r7, (sp, 0); \
> + cfi_rel_offset (7, 0); \
> + stw r4, (sp, 4); \
> + cfi_rel_offset (4, 4); \
> + ldw r4, (sp, 8)
> +#undef DOARGS_6
> +#define DOARGS_6 \
> + subi sp, 16; \
> + cfi_adjust_cfa_offset (16); \
> + stw r7, (sp, 0); \
> + cfi_rel_offset (7, 0); \
> + stw r4, (sp, 4); \
> + cfi_rel_offset (4, 4); \
> + stw r5, (sp, 8); \
> + cfi_rel_offset (5, 8); \
> + ldw r4, (sp, 16); \
> + ldw r5, (sp, 20)
> +
> +#undef UNDOARGS_0
> +#define UNDOARGS_0 \
> + ldw r7, (sp, 0); \
> + cfi_restore (r7); \
> + addi sp, 8; \
> + cfi_adjust_cfa_offset (-8);
> +
> +#undef UNDOARGS_1
> +#define UNDOARGS_1 UNDOARGS_0
> +#undef UNDOARGS_2
> +#define UNDOARGS_2 UNDOARGS_0
> +#undef UNDOARGS_3
> +#define UNDOARGS_3 UNDOARGS_0
> +#undef UNDOARGS_4
> +#define UNDOARGS_4 UNDOARGS_0
> +#undef UNDOARGS_5
> +#define UNDOARGS_5 \
> + ldw r7, (sp, 0); \
> + cfi_restore (r4); \
> + ldw r4, (sp, 4); \
> + cfi_restore (r4); \
> + addi sp, 8; \
> + cfi_adjust_cfa_offset (-8);
> +
> +#undef UNDOARGS_6
> +#define UNDOARGS_6 \
> + ldw r7, (sp, 0); \
> + cfi_restore (r7); \
> + ldw r4, (sp, 4); \
> + cfi_restore (r4); \
> + ldw r5, (sp, 8); \
> + cfi_restore (r5); \
> + addi sp, 16; \
> + cfi_adjust_cfa_offset (-16);
> +
> +#else /* __CSKYABIV1__ */
> +
> +#undef DO_CALL
> +#define DO_CALL(syscall_name, args) \
> + lrw r1, SYS_ify(syscall_name); \
> + trap 0
> +//#endif /* DO_CALL */
> +#endif /* __CSKYABIV2__ */
> +
> +/* define DO_CALL_2, only ABIV2 need DO_CALL_2 */
> +#ifdef __CSKYABIV2__
> +
> +#undef DO_CALL_2
> +#define DO_CALL_2(syscall_name, args) \
> + DOARGS2_##args; \
> + lrw r7, SYS_ify(syscall_name); \
> + trap 0; \
> + UNDOARGS2_##args
> +
> +/*
> + * to be quite different with DO_CALL, DO_CALL_2 need not save r7.
> + */
> +#undef DOARGS2_0
> +#define DOARGS2_0
> +
> +#undef DOARGS2_1
> +#define DOARGS2_1 DOARGS2_0
> +#undef DOARGS2_2
> +#define DOARGS2_2 DOARGS2_0
> +#undef DOARGS2_3
> +#define DOARGS2_3 DOARGS2_0
> +#undef DOARGS2_4
> +#define DOARGS2_4 DOARGS2_0
> +#undef DOARGS2_5
> +#define DOARGS2_5 \
> + subi sp, 8; \
> + cfi_adjust_cfa_offset (8); \
> + stw r4, (sp, 0); \
> + cfi_rel_offset (4, 0); \
> + ldw r4, (sp, 20)
> +#undef DOARGS2_6
> +#define DOARGS2_6 \
> + subi sp, 8; \
> + cfi_adjust_cfa_offset (8); \
> + stw r4, (sp, 0); \
> + cfi_rel_offset (4, 0); \
> + stw r5, (sp, 4); \
> + cfi_rel_offset (5, 0); \
> + ldw r4, (sp, 20); \
> + ldw r5, (sp, 24)
> +
> +#undef UNDOARGS2_0
> +#define UNDOARGS2_0
> +
> +#undef UNDOARGS2_1
> +#define UNDOARGS2_1 UNDOARGS2_0
> +#undef UNDOARGS2_2
> +#define UNDOARGS2_2 UNDOARGS2_0
> +#undef UNDOARGS2_3
> +#define UNDOARGS2_3 UNDOARGS2_0
> +#undef UNDOARGS2_4
> +#define UNDOARGS2_4 UNDOARGS2_0
> +#undef UNDOARGS2_5
> +#define UNDOARGS2_5 \
> + ldw r4, (sp, 0); \
> + addi sp, 8
> +
> +#undef UNDOARGS2_6
> +#define UNDOARGS2_6 \
> + ldw r4, (sp, 0); \
> + ldw r5, (sp, 4); \
> + addi sp, 8
> +
> +#endif /* DO_CALL_2 */
> +
> +#else /* not __ASSEMBLER__ */
> +
> +
> +/* Define a macro which expands into the inline wrapper code for a system
> + call. */
> +#undef INLINE_SYSCALL
> +#define INLINE_SYSCALL(name, nr, args...) \
> + ({ unsigned int _inline_sys_result = INTERNAL_SYSCALL (name, , nr, args); \
> + if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (_inline_sys_result, ), 0)) \
> + { \
> + __set_errno (INTERNAL_SYSCALL_ERRNO (_inline_sys_result, )); \
> + _inline_sys_result = (unsigned int) -1; \
> + } \
> + (int) _inline_sys_result; })
> +
> +#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) >= 0xffffff01u)
> +
> +#undef INTERNAL_SYSCALL_ERRNO
> +#define INTERNAL_SYSCALL_ERRNO(val, err) (-(val))
> +
> +
> +#undef INTERNAL_SYSCALL_RAW
> +#ifndef __CSKYABIV2__
> +#define INTERNAL_SYSCALL_RAW0(name, err, dummy...) \
> + ({unsigned int __sys_result; \
> + { \
> + register int _a1 __asm__ ("a0"), _nr __asm__ ("r1"); \
> + _nr = name; \
> + __asm__ __volatile__ ("trap 0 \n\t" \
> + : "=r" (_a1) \
> + : "r" (_nr) \
> + : "memory"); \
> + __sys_result = _a1; \
> + } \
> + (int) __sys_result; })
> +
> +#define INTERNAL_SYSCALL_RAW1(name, err, arg1) \
> + ({unsigned int __sys_result; \
> + register int _tmp_arg1 = (int)(arg1); \
> + { \
> + register int _a1 __asm__ ("a0"), _nr __asm__ ("r1"); \
> + _a1 = _tmp_arg1; \
> + _nr = name; \
> + __asm__ __volatile__ ("trap 0 \n\t" \
> + : "=r" (_a1) \
> + : "r" (_nr), "r" (_a1) \
> + : "memory"); \
> + __sys_result = _a1; \
> + } \
> + (int) __sys_result; })
> +
> +#define INTERNAL_SYSCALL_RAW2(name, err, arg1, arg2) \
> + ({unsigned int __sys_result; \
> + register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
> + { \
> + register int _nr __asm__ ("r1"); \
> + register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
> + _a1 = _tmp_arg1, _a2 = _tmp_arg2; \
> + _nr = name; \
> + __asm__ __volatile__ ("trap 0 \n\t" \
> + : "=r" (_a1) \
> + : "r" (_nr), "r" (_a1), "r" (_a2) \
> + : "memory"); \
> + __sys_result = _a1; \
> + } \
> + (int) __sys_result; })
> +
> +#define INTERNAL_SYSCALL_RAW3(name, err, arg1, arg2, arg3) \
> + ({unsigned int __sys_result; \
> + register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
> + register int _tmp_arg3 = (int)(arg3); \
> + { \
> + register int _nr __asm__ ("r1"); \
> + register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
> + register int _a3 __asm__ ("a2"); \
> + _a1 = _tmp_arg1; \
> + _a2 = _tmp_arg2; \
> + _a3 = _tmp_arg3; \
> + _nr = name; \
> + __asm__ __volatile__ ("trap 0 \n\t" \
> + : "=r" (_a1) \
> + : "r" (_nr), "r" (_a1), "r" (_a2), \
> + "r" (_a3) \
> + : "memory"); \
> + __sys_result = _a1; \
> + } \
> + (int) __sys_result; })
> +
> +#define INTERNAL_SYSCALL_RAW4(name, err, arg1, arg2, arg3, arg4) \
> + ({unsigned int __sys_result; \
> + register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
> + register int _tmp_arg3 = (int)(arg3), _tmp_arg4 = (int)(arg4); \
> + { \
> + register int _nr __asm__ ("r1"); \
> + register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
> + register int _a3 __asm__ ("a2"), _a4 __asm__ ("a3"); \
> + _a1 = _tmp_arg1, _a2 = _tmp_arg2, _a3 = _tmp_arg3; \
> + _a4 = _tmp_arg4; \
> + _nr = name; \
> + __asm__ __volatile__ ("trap 0 \n\t" \
> + : "=r" (_a1) \
> + : "r" (_nr), "r" (_a1), "r" (_a2), \
> + "r" (_a3), "r" (_a4) \
> + : "memory"); \
> + __sys_result = _a1; \
> + } \
> + (int) __sys_result; })
> +
> +#define INTERNAL_SYSCALL_RAW5(name, err, arg1, arg2, arg3, arg4, \
> + arg5) \
> + ({unsigned int __sys_result; \
> + register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
> + register int _tmp_arg3 = (int)(arg3), _tmp_arg4 = (int)(arg4); \
> + register int _tmp_arg5 = (int)(arg5); \
> + { \
> + register int _nr __asm__ ("r1"); \
> + register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
> + register int _a3 __asm__ ("a2"), _a4 __asm__ ("a3"); \
> + register int _a5 __asm__ ("a4"); \
> + _a1 = _tmp_arg1, _a2 = _tmp_arg2, _a3 = _tmp_arg3; \
> + _a4 = _tmp_arg4, _a5 = _tmp_arg5; \
> + _nr = name; \
> + __asm__ __volatile__ ("trap 0 \n\t" \
> + : "=r" (_a1) \
> + : "r" (_nr), "r" (_a1), "r" (_a2), \
> + "r" (_a3), "r" (_a4), "r" (_a5) \
> + : "memory"); \
> + __sys_result = _a1; \
> + } \
> + (int) __sys_result; })
> +
> +#define INTERNAL_SYSCALL_RAW6(name, err, arg1, arg2, arg3, arg4, \
> + arg5, arg6) \
> + ({unsigned int __sys_result; \
> + register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
> + register int _tmp_arg3 = (int)(arg3), _tmp_arg4 = (int)(arg4); \
> + register int _tmp_arg5 = (int)(arg5), _tmp_arg6 = (int)(arg6); \
> + { \
> + register int _nr __asm__ ("r1"); \
> + register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
> + register int _a3 __asm__ ("a2"), _a4 __asm__ ("a3"); \
> + register int _a5 __asm__ ("a4"), _a6 __asm__ ("a5"); \
> + _a1 = _tmp_arg1, _a2 = _tmp_arg2, _a3 = _tmp_arg3; \
> + _a4 = _tmp_arg4, _a5 = _tmp_arg5, _a6 = _tmp_arg6; \
> + _nr = name; \
> + __asm__ __volatile__ ("trap 0 \n\t" \
> + : "=r" (_a1) \
> + : "r" (_nr), "r" (_a1), "r" (_a2), \
> + "r" (_a3), "r" (_a4), "r" (_a5), \
> + "r" (_a6) \
> + : "memory"); \
> + __sys_result = _a1; \
> + } \
> + (int) __sys_result; })
> +
> +#define INTERNAL_SYSCALL_RAW7(name, err, arg1, arg2, arg3, arg4, \
> + arg5, arg6, arg7) \
> + ({unsigned int __sys_result; \
> + register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
> + register int _tmp_arg3 = (int)(arg3), _tmp_arg4 = (int)(arg4); \
> + register int _tmp_arg5 = (int)(arg5), _tmp_arg6 = (int)(arg6); \
> + register int _tmp_arg7 = (int)(arg7); \
> + { \
> + register int _nr __asm__ ("r1"); \
> + register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
> + register int _a3 __asm__ ("a2"), _a4 __asm__ ("a3"); \
> + register int _a5 __asm__ ("a4"), _a6 __asm__ ("a5"); \
> + register int _a7 __asm__ ("r8"); \
> + _a1 = _tmp_arg1, _a2 = _tmp_arg2, _a3 = _tmp_arg3; \
> + _a4 = _tmp_arg4, _a5 = _tmp_arg5, _a6 = _tmp_arg6; \
> + _a7 = _tmp_arg7; \
> + _nr = name; \
> + __asm__ __volatile__ ("trap 0 \n\t" \
> + : "=r" (_a1) \
> + : "r" (_nr), "r" (_a1), "r" (_a2), \
> + "r" (_a3), "r" (_a4), "r" (_a5), \
> + "r" (_a6), "r" (_a7) \
> + : "memory"); \
> + __sys_result = _a1; \
> + } \
> + (int) __sys_result; })
> +
> +#else
> +#define INTERNAL_SYSCALL_RAW0(name, err, dummy...) \
> + ({unsigned int __sys_result; \
> + { \
> + register int _a1 __asm__ ("a0"), _nr __asm__ ("r7"); \
> + _nr = name; \
> + __asm__ __volatile__ ("trap 0 \n\t" \
> + : "=r" (_a1) \
> + : "r" (_nr) \
> + : "memory"); \
> + __sys_result = _a1; \
> + } \
> + (int) __sys_result; })
> +
> +#define INTERNAL_SYSCALL_RAW1(name, err, arg1) \
> + ({unsigned int __sys_result; \
> + register int _tmp_arg1 = (int)(arg1); \
> + { \
> + register int _a1 __asm__ ("a0"), _nr __asm__ ("r7"); \
> + _a1 = _tmp_arg1; \
> + _nr = name; \
> + __asm__ __volatile__ ("trap 0 \n\t" \
> + : "=r" (_a1) \
> + : "r" (_nr), "r" (_a1) \
> + : "memory"); \
> + __sys_result = _a1; \
> + } \
> + (int) __sys_result; })
> +
> +#define INTERNAL_SYSCALL_RAW2(name, err, arg1, arg2) \
> + ({unsigned int __sys_result; \
> + register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
> + { \
> + register int _nr __asm__ ("r7"); \
> + register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
> + _a1 = _tmp_arg1, _a2 = _tmp_arg2; \
> + _nr = name; \
> + __asm__ __volatile__ ("trap 0 \n\t" \
> + : "=r" (_a1) \
> + : "r" (_nr), "r" (_a1), "r" (_a2) \
> + : "memory"); \
> + __sys_result = _a1; \
> + } \
> + (int) __sys_result; })
> +
> +#define INTERNAL_SYSCALL_RAW3(name, err, arg1, arg2, arg3) \
> + ({unsigned int __sys_result; \
> + register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
> + register int _tmp_arg3 = (int)(arg3); \
> + { \
> + register int _nr __asm__ ("r7"); \
> + register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
> + register int _a3 __asm__ ("a2"); \
> + _a1 = _tmp_arg1; \
> + _a2 = _tmp_arg2; \
> + _a3 = _tmp_arg3; \
> + _nr = name; \
> + __asm__ __volatile__ ("trap 0 \n\t" \
> + : "=r" (_a1) \
> + : "r" (_nr), "r" (_a1), "r" (_a2), \
> + "r" (_a3) \
> + : "memory"); \
> + __sys_result = _a1; \
> + } \
> + (int) __sys_result; })
> +
> +#define INTERNAL_SYSCALL_RAW4(name, err, arg1, arg2, arg3, arg4) \
> + ({unsigned int __sys_result; \
> + register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
> + register int _tmp_arg3 = (int)(arg3), _tmp_arg4 = (int)(arg4); \
> + { \
> + register int _nr __asm__ ("r7"); \
> + register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
> + register int _a3 __asm__ ("a2"), _a4 __asm__ ("a3"); \
> + _a1 = _tmp_arg1, _a2 = _tmp_arg2, _a3 = _tmp_arg3; \
> + _a4 = _tmp_arg4; \
> + _nr = name; \
> + __asm__ __volatile__ ("trap 0 \n\t" \
> + : "=r" (_a1) \
> + : "r" (_nr), "r" (_a1), "r" (_a2), \
> + "r" (_a3), "r" (_a4) \
> + : "memory"); \
> + __sys_result = _a1; \
> + } \
> + (int) __sys_result; })
> +
> +#define INTERNAL_SYSCALL_RAW5(name, err, arg1, arg2, arg3, arg4, \
> + arg5) \
> + ({unsigned int __sys_result; \
> + register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
> + register int _tmp_arg3 = (int)(arg3), _tmp_arg4 = (int)(arg4); \
> + register int _tmp_arg5 = (int)(arg5); \
> + { \
> + register int _nr __asm__ ("r7"); \
> + register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
> + register int _a3 __asm__ ("a2"), _a4 __asm__ ("a3"); \
> + register int _a5 __asm__ ("r4"); \
> + _a1 = _tmp_arg1, _a2 = _tmp_arg2, _a3 = _tmp_arg3; \
> + _a4 = _tmp_arg4, _a5 = _tmp_arg5; \
> + _nr = name; \
> + __asm__ __volatile__ ("trap 0 \n\t" \
> + : "=r" (_a1) \
> + : "r" (_nr), "r" (_a1), "r" (_a2), \
> + "r" (_a3), "r" (_a4), "r" (_a5) \
> + : "memory"); \
> + __sys_result = _a1; \
> + } \
> + (int) __sys_result; })
> +
> +#define INTERNAL_SYSCALL_RAW6(name, err, arg1, arg2, arg3, arg4, \
> + arg5, arg6) \
> + ({unsigned int __sys_result; \
> + register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
> + register int _tmp_arg3 = (int)(arg3), _tmp_arg4 = (int)(arg4); \
> + register int _tmp_arg5 = (int)(arg5), _tmp_arg6 = (int)(arg6); \
> + { \
> + register int _nr __asm__ ("r7"); \
> + register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
> + register int _a3 __asm__ ("a2"), _a4 __asm__ ("a3"); \
> + register int _a5 __asm__ ("r4"), _a6 __asm__ ("r5"); \
> + _a1 = _tmp_arg1, _a2 = _tmp_arg2, _a3 = _tmp_arg3; \
> + _a4 = _tmp_arg4, _a5 = _tmp_arg5, _a6 = _tmp_arg6; \
> + _nr = name; \
> + __asm__ __volatile__ ("trap 0 \n\t" \
> + : "=r" (_a1) \
> + : "r" (_nr), "r" (_a1), "r" (_a2), \
> + "r" (_a3), "r" (_a4), "r" (_a5), \
> + "r" (_a6) \
> + : "memory"); \
> + __sys_result = _a1; \
> + } \
> + (int) __sys_result; })
> +
> +#define INTERNAL_SYSCALL_RAW7(name, err, arg1, arg2, arg3, arg4, \
> + arg5, arg6, arg7) \
> + ({unsigned int __sys_result; \
> + register int _tmp_arg1 = (int)(arg1), _tmp_arg2 = (int)(arg2); \
> + register int _tmp_arg3 = (int)(arg3), _tmp_arg4 = (int)(arg4); \
> + register int _tmp_arg5 = (int)(arg5), _tmp_arg6 = (int)(arg6); \
> + register int _tmp_arg7 = (int)(arg7); \
> + { \
> + register int _nr __asm__ ("r7"); \
> + register int _a1 __asm__ ("a0"), _a2 __asm__ ("a1"); \
> + register int _a3 __asm__ ("a2"), _a4 __asm__ ("a3"); \
> + register int _a5 __asm__ ("r4"), _a6 __asm__ ("r5"); \
> + register int _a7 __asm__ ("r6"); \
> + _a1 = _tmp_arg1, _a2 = _tmp_arg2, _a3 = _tmp_arg3; \
> + _a4 = _tmp_arg4, _a5 = _tmp_arg5, _a6 = _tmp_arg6; \
> + _a7 = _tmp_arg7; \
> + _nr = name; \
> + __asm__ __volatile__ ("trap 0 \n\t" \
> + : "=r" (_a1) \
> + : "r" (_nr), "r" (_a1), "r" (_a2), \
> + "r" (_a3), "r" (_a4), "r" (_a5), \
> + "r" (_a6), "r" (_a7) \
> + : "memory"); \
> + __sys_result = _a1; \
> + } \
> + (int) __sys_result; })
> +
> +#endif /* __ABI_CSKY_V2__ */
> +
> +#undef INTERNAL_SYSCALL
> +#define INTERNAL_SYSCALL(name, err, nr, args...) \
> + INTERNAL_SYSCALL_RAW##nr(SYS_ify(name), err, args)
> +
> +#undef INTERNAL_SYSCALL_NCS
> +#define INTERNAL_SYSCALL_NCS(number, err, nr, args...) \
> + INTERNAL_SYSCALL_RAW##nr (number, err, args)
> +
> +#endif /* __ASSEMBLER__ */
> +
> +/* Pointer mangling is not yet supported for CSKY. */
> +#define PTR_MANGLE(var) (void) (var)
> +#define PTR_DEMANGLE(var) (void) (var)
Is there any special reason to not support it? Other architecture accomplish
by either using a global variable or a TCB field.
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [RFC PATCH 10/10] C-SKY: Linux ABI
2018-03-20 9:42 ` Adhemerval Zanella
@ 2018-03-20 10:58 ` Mao Han
0 siblings, 0 replies; 22+ messages in thread
From: Mao Han @ 2018-03-20 10:58 UTC (permalink / raw)
To: Adhemerval Zanella; +Cc: c-sky_gcc_upstream, gnu-csky, libc-help
Hi Adhemerval,
Thanks a lot for the comment.
On Tue, Mar 20, 2018 at 05:41:59PM +0800, Adhemerval Zanella wrote:
>
>
> On 16/03/2018 17:58, Mao Han wrote:
> > diff --git a/sysdeps/unix/sysv/linux/csky/sysdep-cancel.h b/sysdeps/unix/sysv/linux/csky/sysdep-cancel.h
> > new file mode 100644
> > index 0000000..dd39ecf
> > --- /dev/null
> > +++ b/sysdeps/unix/sysv/linux/csky/sysdep-cancel.h
>
> New ports should not provide sysdep-cancel.h any more, cancellable syscall
> not generated by syscalls.list and if it an advantage for the ABI, it
> can define SINGLE_THREAD_BY_GLOBAL on sysdep.h (so the single-thread
> check will be done by a global variable instead of using a TCB field).
>
OK. I'll remove csky/sysdep-cancel.h, Seems no dependece on this file
as ./socket.S is nolonger used. We are suggest to use __ASSUME_SOCKET_SYSCALL
while upsteam linux kernel. So no need to keep these files.
> > +#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
> > + /* We translate the system's EWOULDBLOCK error into EAGAIN.
> > + The GNU C library always defines EWOULDBLOCK==EAGAIN.
> > + EWOULDBLOCK_sys is the original number. */
> > + cmpnei a0, EWOULDBLOCK /* Is it the old EWOULDBLOCK? */
> > + bt 1f
> > + mov a0, EAGAIN /* Yes; translate it to EAGAIN. */
> > +#endif
>
> I am not sure if this is true or required for new ports, does C-SKY
> really require this code snippet?
>
Carlos O'Donell mentions this too. It is not required for new ports.
We do not have legacy UNIX port, It is always true EWOULDBLOCK==EAGAIN
In linux errno.h
#define EWOULDBLOCK EAGAIN /* Operation would block */
I don't think C-SKY needs these code. I'll clean all these up.
> > +/* Pointer mangling is not yet supported for CSKY. */
> > +#define PTR_MANGLE(var) (void) (var)
> > +#define PTR_DEMANGLE(var) (void) (var)
>
> Is there any special reason to not support it? Other architecture accomplish
> by either using a global variable or a TCB field.
We haven't spent much time work on the safty and profile in glibc.
It seems not hard to implement it. I will add support for pointer mangling.
^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2018-03-20 10:58 UTC | newest]
Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-16 9:59 [RFC PATCH 00/10] port C-SKY to glibc Mao Han
2018-03-16 9:59 ` [RFC PATCH 05/10] C-SKY: Linux Startup and Dynamic Loading Code Mao Han
2018-03-16 14:37 ` Carlos O'Donell
2018-03-16 9:59 ` [RFC PATCH 02/10] C-SKY: TLS support Mao Han
2018-03-16 14:09 ` Carlos O'Donell
2018-03-20 4:57 ` Mao Han
2018-03-16 9:59 ` [RFC PATCH 03/10] C-SKY: Generic math Routines Mao Han
2018-03-16 14:13 ` Carlos O'Donell
2018-03-16 9:59 ` [RFC PATCH 08/10] C-SKY: ABI Lists Mao Han
2018-03-16 9:59 ` [RFC PATCH 01/10] C-SKY: ABI related code Mao Han
2018-03-16 14:04 ` Carlos O'Donell
2018-03-16 9:59 ` [RFC PATCH 04/10] C-SKY: Hard Float Support Mao Han
2018-03-16 14:15 ` Carlos O'Donell
2018-03-16 9:59 ` [RFC PATCH 07/10] C-SKY: Atomic and Locking Routines Mao Han
2018-03-16 9:59 ` [RFC PATCH 10/10] C-SKY: Linux ABI Mao Han
2018-03-20 9:42 ` Adhemerval Zanella
2018-03-20 10:58 ` Mao Han
2018-03-16 9:59 ` [RFC PATCH 06/10] C-SKY: Build Infastructure Mao Han
2018-03-16 9:59 ` [RFC PATCH 09/10] C-SKY: Linux Syscall Interface Mao Han
2018-03-18 3:19 ` Adhemerval Zanella
2018-03-20 6:36 ` Mao Han
2018-03-16 13:52 ` [RFC PATCH 00/10] port C-SKY to glibc Carlos O'Donell
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).