glibc: add arc700 patch
[openwrt/staging/rmilecki.git] / toolchain / glibc / patches / 300-arc.patch
diff --git a/toolchain/glibc/patches/300-arc.patch b/toolchain/glibc/patches/300-arc.patch
new file mode 100644 (file)
index 0000000..66f7aeb
--- /dev/null
@@ -0,0 +1,55 @@
+--- a/sysdeps/arc/atomic-machine.h
++++ b/sysdeps/arc/atomic-machine.h
+@@ -64,6 +64,10 @@ typedef uintmax_t uatomic_max_t;
+   __atomic_val_bysize (__arch_compare_and_exchange_val, int,          \
+                      mem, new, old, __ATOMIC_ACQUIRE)
++#ifdef __ARC700__
++#define atomic_full_barrier()  ({ asm volatile ("sync":::"memory"); })
++#else
+ #define atomic_full_barrier()  ({ asm volatile ("dmb 3":::"memory"); })
++#endif
+ #endif /* _ARC_BITS_ATOMIC_H */
+--- a/sysdeps/unix/sysv/linux/arc/syscall.S
++++ b/sysdeps/unix/sysv/linux/arc/syscall.S
+@@ -24,8 +24,13 @@ ENTRY (syscall)
+       mov_s   r1, r2
+       mov_s   r2, r3
+       mov_s   r3, r4
++#ifdef __ARC700__
++      mov     r4, r5
++      mov     r5, r6
++#else
+       mov_s   r4, r5
+       mov_s   r5, r6
++#endif
+       ARC_TRAP_INSN
+       brhi    r0, -4096, L (call_syscall_err)
+--- a/sysdeps/unix/sysv/linux/arc/sysdep.h
++++ b/sysdeps/unix/sysv/linux/arc/sysdep.h
+@@ -128,7 +128,11 @@ L (call_syscall_err):                     ASM_LINE_SEP    \
+     mov    r8, __NR_##syscall_name    ASM_LINE_SEP    \
+     ARC_TRAP_INSN                     ASM_LINE_SEP
++# ifdef __ARC700__
++# define ARC_TRAP_INSN        trap0
++# else
+ # define ARC_TRAP_INSN        trap_s 0
++# endif
+ #else  /* !__ASSEMBLER__ */
+@@ -139,7 +143,11 @@ extern long int __syscall_error (long in
+ hidden_proto (__syscall_error)
+ # endif
++# ifdef __ARC700__
++# define ARC_TRAP_INSN        "trap0          \n\t"
++# else
+ # define ARC_TRAP_INSN        "trap_s 0       \n\t"
++#endif
+ # undef INTERNAL_SYSCALL_NCS
+ # define INTERNAL_SYSCALL_NCS(number, nr_args, args...)       \