new file mode 100644
@@ -0,0 +1,81 @@
+/* longjmp with sp check for C-SKY ABIV2
+ 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__
+# 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 /* __PIC__ */
+# define CALL_FAIL \
+ lrw a0, longjmp_msg; \
+ jsri HIDDEN_JUMPTARGET (__fortify_fail);
+#endif/* __PIC__ */
+
+# 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:
+
+#include <__longjmp.S>
new file mode 100644
@@ -0,0 +1,88 @@
+/* Wrapper around clone system call. C-SKY ABIV2 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/>. */
+
+/* clone() is even more special than fork() as it mucks with stacks
+ and invokes a function in the right context after its all over. */
+
+#include <sysdep.h>
+#define _ERRNO_H 1
+#include <bits/errno.h>
+
+/* int clone (int (*fn) (void *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 */
+
+ 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 __child
+ rts
+
+__error_arg:
+ lrw a0, -EINVAL
+
+__do_syscall_error:
+#ifdef __PIC__
+ 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
+#else
+ jmpi __syscall_error
+#endif /* __PIC__ */
+ rts
+PSEUDO_END (__clone)
+
+__child:
+ ldw a0, (sp, 4) /* restore args from new sp */
+ ldw a1, (sp, 0) /* restore args from new sp */
+ addi sp, 8
+ jsr a1
+
+ /* exit */
+ lrw r7, __NR_exit
+ trap 0
+
+libc_hidden_def (__clone)
+weak_alias (__clone, clone)
new file mode 100644
@@ -0,0 +1,73 @@
+/* Save current context. C-SKY ABIV2 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 "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)
new file mode 100644
@@ -0,0 +1,96 @@
+/* Set saved user context to current context. C-SKY ABIV2 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 "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)
new file mode 100644
@@ -0,0 +1,78 @@
+/* Save and set current context. C-SKY ABIV2 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 "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__
+ 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 /* 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 */
+ stw sp, (a0, MCONTEXT_CSKY_SP)
+ stw r15, (a0, MCONTEXT_CSKY_LR)
+ stw r15, (a0, MCONTEXT_CSKY_PC)
+
+ /* set setcontext's arg */
+ mov a0, a1
+
+#ifdef __PIC__
+ grs t1, .Lgetpc2
+.Lgetpc2:
+ lrw a3, .Lgetpc2@GOTPC
+ addu t1, t1, a3
+ lrw a3, __setcontext@GOT
+ ldr.w a3, (t1, a3 << 0)
+#else /* __PIC__ */
+ lrw a3, __setcontext
+#endif /* __PIC__ */
+ jmp a3
+
+error_exit:
+ jmp r15
+END (swapcontext)
new file mode 100644
@@ -0,0 +1,61 @@
+/* System call interface. C-SKY ABIV2 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>
+
+/* 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
+ bf 1f
+#ifdef __PIC__
+ 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
+#else
+ jmpi __syscall_error
+#endif /* __PIC__ */
+1:
+ rts
+PSEUDO_END (syscall)
new file mode 100644
@@ -0,0 +1,65 @@
+/* syscall error handlers. C-SKY ABIV2 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>
+
+/* 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 !IS_IN (rtld)
+ mov a1, a0
+ mov a0, tls
+
+ 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)
new file mode 100644
@@ -0,0 +1 @@
+/* Not needed. */
new file mode 100644
@@ -0,0 +1,2 @@
+# File name Caller Syscall name Args Strong name Weak names
+cacheflush - cacheflush i:pii _flush_cache cacheflush