Patchwork [RFC,V2,06/10] C-SKY: Linux Syscall Interface

login
register
mail settings
Submitter Han Mao
Date April 8, 2018, 7:02 a.m.
Message ID <34f1011affb007e6cc1e4435ca0bd68f4ff4cfd4.1523169833.git.han_mao@c-sky.com>
Download mbox | patch
Permalink /patch/26648/
State New
Headers show

Comments

Han Mao - April 8, 2018, 7:02 a.m.
Contains the Linux system call interface.

        * sysdeps/unix/sysv/linux/csky/____longjmp_chk.S: New file
        * 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_setcontext.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/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/getcontext.S: New file
        * sysdeps/unix/sysv/linux/csky/libc-read_tp.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/scandir64.c: 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/____longjmp_chk.S  | 129 ++++++++++++++++++++++++
 sysdeps/unix/sysv/linux/csky/abiv2_brk.c        |  56 ++++++++++
 sysdeps/unix/sysv/linux/csky/abiv2_clone.S      | 106 +++++++++++++++++++
 sysdeps/unix/sysv/linux/csky/abiv2_getcontext.S |  72 +++++++++++++
 sysdeps/unix/sysv/linux/csky/abiv2_setcontext.S |  95 +++++++++++++++++
 sysdeps/unix/sysv/linux/csky/abiv2_syscall.S    |  68 +++++++++++++
 sysdeps/unix/sysv/linux/csky/abiv2_vfork.S      |  45 +++++++++
 sysdeps/unix/sysv/linux/csky/brk.c              |  61 +++++++++++
 sysdeps/unix/sysv/linux/csky/clone.S            |  99 ++++++++++++++++++
 sysdeps/unix/sysv/linux/csky/ftruncate64.c      |  41 ++++++++
 sysdeps/unix/sysv/linux/csky/getcontext.S       | 108 ++++++++++++++++++++
 sysdeps/unix/sysv/linux/csky/libc-read_tp.S     |   1 +
 sysdeps/unix/sysv/linux/csky/pt-vfork.S         |   1 +
 sysdeps/unix/sysv/linux/csky/read_tp.S          |  46 +++++++++
 sysdeps/unix/sysv/linux/csky/readahead.c        |  34 +++++++
 sysdeps/unix/sysv/linux/csky/scandir64.c        |   1 +
 sysdeps/unix/sysv/linux/csky/syscall.S          |  61 +++++++++++
 sysdeps/unix/sysv/linux/csky/syscalls.list      |   7 ++
 18 files changed, 1031 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_setcontext.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/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/getcontext.S
 create mode 100644 sysdeps/unix/sysv/linux/csky/libc-read_tp.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/scandir64.c
 create mode 100644 sysdeps/unix/sysv/linux/csky/syscall.S
 create mode 100644 sysdeps/unix/sysv/linux/csky/syscalls.list
arnd@arndb.de - April 15, 2018, 8:29 p.m.
On Sun, Apr 8, 2018 at 9:02 AM, Mao Han <han_mao@c-sky.com> wrote:

> 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

I can understand the need for the cacheflush syscall here, but why do you need
to override those other three? Shouldn't the defaults be correct for new
architectures?

       Arnd
Han Mao - April 16, 2018, 5:54 a.m.
On Sun, Apr 15, 2018 at 10:29:41PM +0200, Arnd Bergmann wrote:
> > 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
> 
> I can understand the need for the cacheflush syscall here, but why do you need
> to override those other three? Shouldn't the defaults be correct for new
> architectures?
> 
>        Arnd
Thanks for the comment. The default implimentation of the other three are ok
for C-SKY. I'll remove them in syscalls.list.

Best Regards
Mao Han
Adhemerval Zanella Netto - April 23, 2018, 11:32 a.m.
On 08/04/2018 04:02, Mao Han wrote:
> 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 @@

> +/* 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)

If I understand correctly the ABIv1 requires oven register for 64 bit argument
passing, which is represented inside glibc as __ASSUME_ALIGNED_REGISTER_PAIRS
set to 1.  So setting it correctly for ABIv1 should make it possible to use
the generic 'sysdeps/unix/sysv/linux/ftruncate64.c' for c-sky.

> diff --git a/sysdeps/unix/sysv/linux/csky/readahead.c b/sysdeps/unix/sysv/linux/csky/readahead.c
> new file mode 100644
> index 0000000..255361c
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/csky/readahead.c
> @@ -0,0 +1,34 @@

> +
> +ssize_t
> +__readahead (int fd, off64_t offset, size_t count)
> +{
> +  return INLINE_SYSCALL_CALL (readahead, fd,
> +                              __ALIGNMENT_ARG SYSCALL_LL64 (offset), count);
> +}
> +
> +weak_alias (__readahead, readahead)

I just sent a patch to consolidate Linux readahead implementation [1]. So most
likely this new arch-specific file for c-sky would be unnecessary. 


> 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>

The 'scandir{at}{64}' consolidation is pushed upstream [2], so this file should
be unnecessary as well.

[1] https://sourceware.org/ml/libc-alpha/2018-04/msg00471.html
[2] https://sourceware.org/git/?p=glibc.git;a=commit;h=c0123b3b1118419210879e935620eb2ad987c2f1
Han Mao - April 26, 2018, 7:39 a.m.
Hi,
Thanks for the comment.
On Mon, Apr 23, 2018 at 08:32:16AM -0300, Adhemerval Zanella wrote:
> > +#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)
> 
> If I understand correctly the ABIv1 requires oven register for 64 bit argument
> passing, which is represented inside glibc as __ASSUME_ALIGNED_REGISTER_PAIRS
> set to 1.  So setting it correctly for ABIv1 should make it possible to use
> the generic 'sysdeps/unix/sysv/linux/ftruncate64.c' for c-sky.
>
OK, I'll try the macro and the generic implementation.
 
> > +
> > +ssize_t
> > +__readahead (int fd, off64_t offset, size_t count)
> > +{
> > +  return INLINE_SYSCALL_CALL (readahead, fd,
> > +                              __ALIGNMENT_ARG SYSCALL_LL64 (offset), count);
> > +}
> > +
> > +weak_alias (__readahead, readahead)
> 
> I just sent a patch to consolidate Linux readahead implementation [1]. So most
> likely this new arch-specific file for c-sky would be unnecessary. 
> 
> 
> > +++ b/sysdeps/unix/sysv/linux/csky/scandir64.c
> > @@ -0,0 +1 @@
> > +#include <sysdeps/unix/sysv/linux/i386/scandir64.c>
> 
> The 'scandir{at}{64}' consolidation is pushed upstream [2], so this file should
> be unnecessary as well.
> 
> [1] https://sourceware.org/ml/libc-alpha/2018-04/msg00471.html
> [2] https://sourceware.org/git/?p=glibc.git;a=commit;h=c0123b3b1118419210879e935620eb2ad987c2f1
OK, I'll change to the consolidated implementation.

Best Regards,
Mao Han

Patch

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..7e50d92
--- /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..bebde43
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/abiv2_clone.S
@@ -0,0 +1,106 @@ 
+/* 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 */
+
+	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:
+	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_setcontext.S b/sysdeps/unix/sysv/linux/csky/abiv2_setcontext.S
new file mode 100644
index 0000000..50c47eb
--- /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_syscall.S b/sysdeps/unix/sysv/linux/csky/abiv2_syscall.S
new file mode 100644
index 0000000..d1d1cb3
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/abiv2_syscall.S
@@ -0,0 +1,68 @@ 
+/* 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/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..38531f9
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/clone.S
@@ -0,0 +1,99 @@ 
+/* 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 */
+
+	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:
+	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/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/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/pt-vfork.S b/sysdeps/unix/sysv/linux/csky/pt-vfork.S
new file mode 100644
index 0000000..65cc382
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/pt-vfork.S
@@ -0,0 +1 @@ 
+#include <sysdeps/unix/sysv/linux/alpha/pt-vfork.S>
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..dc403da
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/read_tp.S
@@ -0,0 +1,46 @@ 
+/* 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..255361c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/csky/readahead.c
@@ -0,0 +1,34 @@ 
+/* 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)
+{
+  return INLINE_SYSCALL_CALL (readahead, fd,
+                              __ALIGNMENT_ARG SYSCALL_LL64 (offset), count);
+}
+
+weak_alias (__readahead, readahead)
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/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