This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "uClibc-ng - small C library for embedded systems".
The branch, master has been updated
via 0ff3c7882867f1270e072a6d93dd085bf9728be1 (commit)
via 2559592659fe8225fc7d67fa5bc83a1589819054 (commit)
via b1fb0d0bf5d09bf9dbdbc320814bd087d4d26460 (commit)
from 6a8ccc95528f5e86a8770ed15ce89609b5b3dee9 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 0ff3c7882867f1270e072a6d93dd085bf9728be1
Author: Waldemar Brodkorb <wbx(a)openadk.org>
Date: Tue May 24 20:37:14 2016 +0200
microblaze: fix linuxthreads support
Got the working code from
https://github.com/jdkoftinoff/mb-linux-msli/,
otherwise SIGILL while using linuxthreads.
commit 2559592659fe8225fc7d67fa5bc83a1589819054
Author: Waldemar Brodkorb <wbx(a)openadk.org>
Date: Mon May 23 03:38:00 2016 +0200
microblaze: fix setjmp/longjmp
Sync mostly with GNU libc implementation of setjmp/longjmp.
Just generate PIC compatible code, so no difference for static
builds are made. Add sysdep.h with some handy assembly macros
used inside setjmp.S/__longjmp.S.
This unbreaks dynamic linker support, first test suite run
only shows 10 errors, which doesn't look so bad.
commit b1fb0d0bf5d09bf9dbdbc320814bd087d4d26460
Author: Waldemar Brodkorb <wbx(a)openadk.org>
Date: Sun May 22 10:26:26 2016 +0200
microblaze: fix ELF detection in ld.so
-----------------------------------------------------------------------
Summary of changes:
include/elf.h | 5 --
ldso/ldso/microblaze/dl-sysdep.h | 5 +-
libc/sysdeps/linux/microblaze/__longjmp.S | 92 ++++++++++++----------
libc/sysdeps/linux/microblaze/setjmp.S | 43 ++++------
libc/sysdeps/linux/microblaze/sysdep.h | 25 ++++++
.../linuxthreads/sysdeps/microblaze/pt-machine.h | 86 +++++++-------------
utils/ldd.c | 2 +-
7 files changed, 124 insertions(+), 134 deletions(-)
create mode 100644 libc/sysdeps/linux/microblaze/sysdep.h
diff --git a/include/elf.h b/include/elf.h
index 5f47905..4a0280b 100644
--- a/include/elf.h
+++ b/include/elf.h
@@ -362,11 +362,6 @@ typedef struct
/* V850 backend magic number. Written in the absense of an ABI. */
#define EM_CYGNUS_V850 0x9080
-/* Xilinx Microblaze (unofficial). Note that there is now an official microblaze
- * magic number, but all the toolchains currently in existence use the old number
- */
-#define EM_MICROBLAZE_OLD 0xbaab
-
/* Legal values for e_version (version). */
#define EV_NONE 0 /* Invalid ELF version */
diff --git a/ldso/ldso/microblaze/dl-sysdep.h b/ldso/ldso/microblaze/dl-sysdep.h
index 2b55218..b293d27 100644
--- a/ldso/ldso/microblaze/dl-sysdep.h
+++ b/ldso/ldso/microblaze/dl-sysdep.h
@@ -30,11 +30,14 @@ do { \
/* Here we define the magic numbers that this dynamic loader should accept */
-#define MAGIC1 EM_MICROBLAZE_OLD
+#define MAGIC1 EM_MICROBLAZE
#undef MAGIC2
/* Used for error messages */
#define ELF_TARGET "microblaze"
+struct elf_resolve;
+unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);
+
#define elf_machine_type_class(type) \
(((type) == R_MICROBLAZE_JUMP_SLOT) * ELF_RTYPE_CLASS_PLT \
| ((type) == R_MICROBLAZE_COPY) * ELF_RTYPE_CLASS_COPY)
diff --git a/libc/sysdeps/linux/microblaze/__longjmp.S
b/libc/sysdeps/linux/microblaze/__longjmp.S
index c7fce34..0e0e2f4 100644
--- a/libc/sysdeps/linux/microblaze/__longjmp.S
+++ b/libc/sysdeps/linux/microblaze/__longjmp.S
@@ -1,45 +1,51 @@
-/*
- * libc/sysdeps/linux/microblaze/longjmp.S -- `longjmp' for microblaze
- *
- * Copyright (C) 2003 John Williams <jwilliams(a)itee.uq.edu.au>
- * Copyright (C) 2001 NEC Corporation
- * Copyright (C) 2001 Miles Bader <miles(a)gnu.org>
- *
- * This file is subject to the terms and conditions of the GNU Lesser
- * General Public License. See the file COPYING.LIB in the main
- * directory of this archive for more details.
- *
- * Written by Miles Bader <miles(a)gnu.org>
- */
-
-#include <libc-symbols.h>
-
- .text
- .globl C_SYMBOL_NAME(__longjmp)
- .align 4
-C_SYMBOL_NAME(__longjmp):
- /* load registers from memory to r5 (arg0) */
- lwi r1, r5, 0
- lwi r15, r5, 4
- lwi r2, r5, 8
- lwi r13, r5, 12
- lwi r18, r5, 16
- lwi r19, r5, 20
- lwi r20, r5, 24
- lwi r21, r5, 28
- lwi r22, r5, 32
- lwi r23, r5, 36
- lwi r24, r5, 40
- lwi r25, r5, 44
- lwi r26, r5, 48
- lwi r27, r5, 52
- lwi r28, r5, 56
- lwi r29, r5, 60
- lwi r30, r5, 64
- lwi r31, r5, 68
-
- addi r3, r0, 1 /* return val */
- rtsd r15, 8 /* normal return */
- nop
+/* Copyright (C) 1997-2016 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have 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)
+
+ lwi r1, r5, 0
+ lwi r15, r5, 4
+ lwi r2, r5, 8
+ lwi r13, r5, 12
+ lwi r18, r5, 16
+ lwi r19, r5, 20
+ lwi r20, r5, 24
+ lwi r21, r5, 28
+ lwi r22, r5, 32
+ lwi r23, r5, 36
+ lwi r24, r5, 40
+ lwi r25, r5, 44
+ lwi r26, r5, 48
+ lwi r27, r5, 52
+ lwi r28, r5, 56
+ lwi r29, r5, 60
+ lwi r30, r5, 64
+ lwi r31, r5, 68
+
+ addk r3,r6,r0
+ beqi r3,L(return_1)
+ rtsd r15,8
+ nop
+L(return_1):
+ rtsd r15,8
+ addik r3,r0,1 /* delay slot. */
+
+END(__longjmp)
libc_hidden_def(__longjmp)
diff --git a/libc/sysdeps/linux/microblaze/setjmp.S
b/libc/sysdeps/linux/microblaze/setjmp.S
index 3c1d8a1..b40850c 100644
--- a/libc/sysdeps/linux/microblaze/setjmp.S
+++ b/libc/sysdeps/linux/microblaze/setjmp.S
@@ -28,27 +28,21 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#include <libc-symbols.h>
+#include <sysdep.h>
- .text
- .globl C_SYMBOL_NAME(setjmp)
- .align 4
-C_SYMBOL_NAME(setjmp):
-#ifdef __PIC__
- brid 1f
-#else
- braid C_SYMBOL_NAME(__sigsetjmp)
-#endif
- addi r6, r0, 1 /* Save the signal mask. */
+ENTRY(_setjmp)
+ addik r6, r0, 0
+END(_setjmp)
+libc_hidden_def(_setjmp)
- .globl C_SYMBOL_NAME(_setjmp)
-C_SYMBOL_NAME(_setjmp):
- and r6, r0, r0 /* Don't save the signal mask. */
+ENTRY(setjmp)
+ brid 1f
+ addik r6, r0, 1
+END(setjmp)
+libc_hidden_def(setjmp)
- .globl C_SYMBOL_NAME(__sigsetjmp)
-C_SYMBOL_NAME(__sigsetjmp):
+ENTRY(__sigsetjmp)
1:
- /* Save registers relative to r5 (arg0)*/
swi r1, r5, 0 /* stack pointer */
swi r15, r5, 4 /* link register */
swi r2, r5, 8 /* SDA and SDA2 ptrs */
@@ -68,14 +62,7 @@ C_SYMBOL_NAME(__sigsetjmp):
swi r30, r5, 64
swi r31, r5, 68
- /* Make a tail call to __sigjmp_save; it takes the same args. */
-#ifdef __PIC__
- mfs r12,rpc
- addik r12,r12,_GLOBAL_OFFSET_TABLE_+8
- lwi r12,r12,__sigjmp_save@GOT
- brad r12
- nop
-#else
- braid C_SYMBOL_NAME(__sigjmp_save)
- nop
-#endif
+ bri __sigjmp_save
+
+END(__sigsetjmp)
+libc_hidden_def(__sigsetjmp)
diff --git a/libc/sysdeps/linux/microblaze/sysdep.h
b/libc/sysdeps/linux/microblaze/sysdep.h
new file mode 100644
index 0000000..1f01a2a
--- /dev/null
+++ b/libc/sysdeps/linux/microblaze/sysdep.h
@@ -0,0 +1,25 @@
+#include <common/sysdep.h>
+
+#ifdef __ASSEMBLER__
+
+/* Syntactic details of assembler. */
+
+# define ALIGNARG(log2) log2
+# define ASM_SIZE_DIRECTIVE(name) .size name,.-name
+
+/* Define an entry point visible from C. */
+# define ENTRY(name) \
+ .globl C_SYMBOL_NAME(name); \
+ .type C_SYMBOL_NAME(name),@function; \
+ .align ALIGNARG(2); \
+ C_LABEL(name)
+
+# undef END
+# define END(name) ASM_SIZE_DIRECTIVE(name)
+
+/* Local label name for asm code. */
+# ifndef L
+# define L(name) $L##name
+# endif
+
+#endif
diff --git a/libpthread/linuxthreads/sysdeps/microblaze/pt-machine.h
b/libpthread/linuxthreads/sysdeps/microblaze/pt-machine.h
index e8c03f9..2184c92 100644
--- a/libpthread/linuxthreads/sysdeps/microblaze/pt-machine.h
+++ b/libpthread/linuxthreads/sysdeps/microblaze/pt-machine.h
@@ -9,7 +9,6 @@
* General Public License. See the file COPYING.LIB in the main
* directory of this archive for more details.
*
- * Written by Miles Bader <miles(a)gnu.org>
*/
#ifndef _PT_MACHINE_H
@@ -18,12 +17,9 @@
#include <features.h>
#ifndef PT_EI
-# define PT_EI extern inline
+# define PT_EI __extern_always_inline
#endif
-extern long int testandset (int *spinlock);
-extern int __compare_and_swap (long *ptr, long old, long new);
-
/* Get some notion of the current stack. Need not be exactly the top
of the stack, just something somewhere in the current frame. */
#define CURRENT_STACK_FRAME __stack_pointer
@@ -31,76 +27,54 @@ register char *__stack_pointer __asm__ ("r1");
#define HAS_COMPARE_AND_SWAP
#define HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS
-#define IMPLEMENT_TAS_WITH_CAS
+#define MEMORY_BARRIER() __asm__ __volatile__("": : :"memory")
/* Atomically: If *PTR == OLD, set *PTR to NEW and return true,
otherwise do nothing and return false. */
PT_EI int __compare_and_swap (long *ptr, long old, long new)
{
- unsigned long psw;
-
- /* disable interrupts */
- /* This is ugly ugly ugly! */
- __asm__ __volatile__ ("mfs %0, rmsr;"
- "andi r3, %0, ~2;"
- "mts rmsr, r3;"
- : "=&r" (psw)
- :
- : "r3");
+ long prev, cmp, retval;
+ __asm__ __volatile__ (" addi %2, r0, 0;"
+ "1: lwx %0, %3, r0;"
+ " cmp %1, %0, %4;"
+ " bnei %1, 2f;"
+ " swx %5, %3, r0;"
+ " addic %1, r0, 0;"
+ " bnei %1, 1b;"
+ " addi %2, r0, 1;"
+ "2:"
+ : "=&r" (prev), "=&r" (cmp),
"=&r" (retval)
+ : "r" (ptr), "r" (old), "r" (new)
+ : "cc", "memory");
- if (likely (*ptr == old))
- {
- *ptr = new;
- __asm__ __volatile__ ("mts rmsr, %0;" :: "r" (psw)); /*
re-enable */
- return 1;
- }
- else
- {
- __asm__ __volatile__ ("mts rmsr, %0;" :: "r" (psw)); /*
re-enable */
- return 0;
- }
+ return retval;
}
-/* like above's __compare_and_swap() but it first syncs the memory
- (This is also the difference between both functions in e.g.
- ../powerpc/pt-machine.h)
- Doing this additional sync fixes a hang of __pthread_alt_unlock()
- (Falk Brettschneider <fbrettschneider(a)baumeroptronic.de>) */
PT_EI int
__compare_and_swap_with_release_semantics (long *p,
long oldval, long newval)
{
- __asm__ __volatile__ ("" : : : "memory"); /*MEMORY_BARRIER ();*/
+ MEMORY_BARRIER();
return __compare_and_swap (p, oldval, newval);
}
-
-#ifndef IMPLEMENT_TAS_WITH_CAS
-/* Spinlock implementation; required. */
+/* Spinlock implementation; required. */
PT_EI long int testandset (int *spinlock)
{
- unsigned psw;
+ long int retval;
- /* disable interrupts */
- __asm__ __volatile__ ("mfs %0, rmsr;"
- "andi r3, %0, ~2;"
- "mts rmsr, r3;"
- : "=&r" (psw)
- :
- : "r3");
+ __asm__ __volatile__ ("1: lwx %0, %1, r0;"
+ " bnei %0, 2f;"
+ " addik %0, r0, 1;"
+ " swx %0, %1, r0;"
+ " addic %0, r0, 0;"
+ " bnei %0, 1b;"
+ "2:"
+ : "=&r" (retval)
+ : "r" (spinlock)
+ : "cc", "memory");
- if (*spinlock)
- {
- /* Enable ints */
- __asm__ __volatile__ ("mts rmsr, %0;" :: "r" (psw));
- return 1;
- } else {
- *spinlock=1;
- /* Enable ints */
- __asm__ __volatile__ ("mts rmsr, %0;" :: "r" (psw));
- return 0;
- }
+ return retval;
}
-#endif
#endif /* pt-machine.h */
diff --git a/utils/ldd.c b/utils/ldd.c
index 7fd4f7b..f6413c6 100644
--- a/utils/ldd.c
+++ b/utils/ldd.c
@@ -107,7 +107,7 @@
#endif
#if defined(__microblaze__)
-#define MATCH_MACHINE(x) (x == EM_MICROBLAZE_OLD)
+#define MATCH_MACHINE(x) (x == EM_MICROBLAZE)
#define ELFCLASSM ELFCLASS32
#endif
hooks/post-receive
--
uClibc-ng - small C library for embedded systems