Browse Source

merge uClibc changes

Waldemar Brodkorb 9 years ago
parent
commit
928ab832ca

+ 2 - 0
Rules.mak

@@ -293,6 +293,8 @@ CPU_CFLAGS-y := -funsigned-char -fno-builtin
 
 
 $(eval $(call check-gcc-var,-fno-asm))
 $(eval $(call check-gcc-var,-fno-asm))
 CPU_CFLAGS-y += $(CFLAG_-fno-asm)
 CPU_CFLAGS-y += $(CFLAG_-fno-asm)
+$(eval $(call check-gcc-var,-fmerge-all-constants))
+CPU_CFLAGS-y += $(CFLAG_-fmerge-all-constants)
 
 
 ifeq ($(UCLIBC_HAS_SOFT_FLOAT),y)
 ifeq ($(UCLIBC_HAS_SOFT_FLOAT),y)
 ifneq ($(TARGET_ARCH),bfin)
 ifneq ($(TARGET_ARCH),bfin)

+ 6 - 0
extra/Configs/defconfigs/arc/arcv2_defconfig

@@ -10,16 +10,22 @@ LDSO_RUNPATH=y
 UCLIBC_HAS_THREADS_NATIVE=y
 UCLIBC_HAS_THREADS_NATIVE=y
 PTHREADS_DEBUG_SUPPORT=y
 PTHREADS_DEBUG_SUPPORT=y
 UCLIBC_HAS_OBSTACK=y
 UCLIBC_HAS_OBSTACK=y
+UCLIBC_HAS_UTMPX=y
+UCLIBC_HAS_UTMP=y
 UCLIBC_SUSV2_LEGACY=y
 UCLIBC_SUSV2_LEGACY=y
 UCLIBC_SUSV3_LEGACY=y
 UCLIBC_SUSV3_LEGACY=y
 UCLIBC_SUSV4_LEGACY=y
 UCLIBC_SUSV4_LEGACY=y
 UCLIBC_HAS_PROGRAM_INVOCATION_NAME=y
 UCLIBC_HAS_PROGRAM_INVOCATION_NAME=y
+UCLIBC_HAS_LIBUTIL=y
 UCLIBC_HAS_OBSOLETE_BSD_SIGNAL=y
 UCLIBC_HAS_OBSOLETE_BSD_SIGNAL=y
 UCLIBC_SV4_DEPRECATED=y
 UCLIBC_SV4_DEPRECATED=y
 UCLIBC_HAS_RPC=y
 UCLIBC_HAS_RPC=y
 UCLIBC_HAS_FULL_RPC=y
 UCLIBC_HAS_FULL_RPC=y
+UCLIBC_USE_NETLINK=y
+UCLIBC_SUPPORT_AI_ADDRCONFIG=y
 UCLIBC_HAS_RESOLVER_SUPPORT=y
 UCLIBC_HAS_RESOLVER_SUPPORT=y
 UCLIBC_HAS_LIBRESOLV_STUB=y
 UCLIBC_HAS_LIBRESOLV_STUB=y
+UCLIBC_HAS_LIBNSL_STUB=y
 UCLIBC_HAS_LOCALE=y
 UCLIBC_HAS_LOCALE=y
 UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y
 UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y
 UCLIBC_HAS_NFTW=y
 UCLIBC_HAS_NFTW=y

+ 6 - 0
extra/Configs/defconfigs/arc/defconfig

@@ -9,16 +9,22 @@ LDSO_RUNPATH=y
 UCLIBC_HAS_THREADS_NATIVE=y
 UCLIBC_HAS_THREADS_NATIVE=y
 PTHREADS_DEBUG_SUPPORT=y
 PTHREADS_DEBUG_SUPPORT=y
 UCLIBC_HAS_OBSTACK=y
 UCLIBC_HAS_OBSTACK=y
+UCLIBC_HAS_UTMPX=y
+UCLIBC_HAS_UTMP=y
 UCLIBC_SUSV2_LEGACY=y
 UCLIBC_SUSV2_LEGACY=y
 UCLIBC_SUSV3_LEGACY=y
 UCLIBC_SUSV3_LEGACY=y
 UCLIBC_SUSV4_LEGACY=y
 UCLIBC_SUSV4_LEGACY=y
 UCLIBC_HAS_PROGRAM_INVOCATION_NAME=y
 UCLIBC_HAS_PROGRAM_INVOCATION_NAME=y
+UCLIBC_HAS_LIBUTIL=y
 UCLIBC_HAS_OBSOLETE_BSD_SIGNAL=y
 UCLIBC_HAS_OBSOLETE_BSD_SIGNAL=y
 UCLIBC_SV4_DEPRECATED=y
 UCLIBC_SV4_DEPRECATED=y
 UCLIBC_HAS_RPC=y
 UCLIBC_HAS_RPC=y
 UCLIBC_HAS_FULL_RPC=y
 UCLIBC_HAS_FULL_RPC=y
+UCLIBC_USE_NETLINK=y
+UCLIBC_SUPPORT_AI_ADDRCONFIG=y
 UCLIBC_HAS_RESOLVER_SUPPORT=y
 UCLIBC_HAS_RESOLVER_SUPPORT=y
 UCLIBC_HAS_LIBRESOLV_STUB=y
 UCLIBC_HAS_LIBRESOLV_STUB=y
+UCLIBC_HAS_LIBNSL_STUB=y
 UCLIBC_HAS_LOCALE=y
 UCLIBC_HAS_LOCALE=y
 UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y
 UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y
 UCLIBC_HAS_NFTW=y
 UCLIBC_HAS_NFTW=y

+ 2 - 2
extra/locale/Makefile.in

@@ -46,7 +46,7 @@ locale_OBJ := $(locale_OUT)/locale_data.o
 
 
 CFLAGS-locale_data.c := -D__WCHAR_ENABLED -I$(locale_OUT) -I$(locale_DIR)
 CFLAGS-locale_data.c := -D__WCHAR_ENABLED -I$(locale_OUT) -I$(locale_DIR)
 
 
-#headers-$(UCLIBC_HAS_LOCALE) += $(locale_headers-y)
+headers_dep += $(locale_headers-y)
 headers: $(locale_headers-y)
 headers: $(locale_headers-y)
 
 
 libc-$(UCLIBC_HAS_LOCALE) += $(locale_OBJ)
 libc-$(UCLIBC_HAS_LOCALE) += $(locale_OBJ)
@@ -68,7 +68,7 @@ $(locale_OUT)%.s:  $(locale_OUT)%.S FORCE ; $(compile.s)
 $(locale_OUT)%.dep:
 $(locale_OUT)%.dep:
 
 
 
 
-locale_headers: headers $(top_builddir)include/bits/uClibc_locale_data.h
+locale_headers: $(top_builddir)include/bits/uClibc_locale_data.h
 
 
 # make sure that the host system has locales (this check is ok for uClibc/glibc)
 # make sure that the host system has locales (this check is ok for uClibc/glibc)
 # we do not know though which locales were really enabled for libc at build time
 # we do not know though which locales were really enabled for libc at build time

+ 1 - 1
include/libc-symbols.h

@@ -111,7 +111,7 @@
 /* Indirect stringification.  Doing two levels allows
 /* Indirect stringification.  Doing two levels allows
  * the parameter to be a macro itself.
  * the parameter to be a macro itself.
  */
  */
-#define __stringify_1(x)    #x
+#define __stringify_1(x...)    #x
 #define __stringify(x)      __stringify_1(x)
 #define __stringify(x)      __stringify_1(x)
 
 
 #ifdef __UCLIBC_HAVE_ASM_SET_DIRECTIVE__
 #ifdef __UCLIBC_HAVE_ASM_SET_DIRECTIVE__

+ 2 - 0
ldso/include/ldsodefs.h

@@ -111,7 +111,9 @@ EXTERN size_t _dl_tls_static_used;
 /* Alignment requirement of the static TLS block.  */
 /* Alignment requirement of the static TLS block.  */
 EXTERN size_t _dl_tls_static_align;
 EXTERN size_t _dl_tls_static_align;
 /* Function pointer for catching TLS errors.  */
 /* Function pointer for catching TLS errors.  */
+#if 1 /* def _LIBC_REENTRANT */
 EXTERN void **(*_dl_error_catch_tsd) (void) __attribute__ ((const));
 EXTERN void **(*_dl_error_catch_tsd) (void) __attribute__ ((const));
+#endif
 
 
 /* Number of additional entries in the slotinfo array of each slotinfo
 /* Number of additional entries in the slotinfo array of each slotinfo
    list element.  A large number makes it almost certain take we never
    list element.  A large number makes it almost certain take we never

+ 2 - 10
ldso/ldso/arm/dl-startup.h

@@ -47,11 +47,7 @@ __asm__(
 	"	ldr	r0, .L_FINI_PROC\n"
 	"	ldr	r0, .L_FINI_PROC\n"
 	"	ldr	r0, [sl, r0]\n"
 	"	ldr	r0, [sl, r0]\n"
 	"	@ jump to the user_s entry point\n"
 	"	@ jump to the user_s entry point\n"
-#if defined(__USE_BX__)
-	"	bx	r6\n"
-#else
-	"	mov	pc, r6\n"
-#endif
+	"	" __stringify(BX(r6)) "\n"
 	".L_GET_GOT:\n"
 	".L_GET_GOT:\n"
 	"	.word	_GLOBAL_OFFSET_TABLE_ - .L_GOT_GOT - 4\n"
 	"	.word	_GLOBAL_OFFSET_TABLE_ - .L_GOT_GOT - 4\n"
 	".L_SKIP_ARGS:\n"
 	".L_SKIP_ARGS:\n"
@@ -113,11 +109,7 @@ __asm__(
 	"	ldr	r0, .L_FINI_PROC\n"
 	"	ldr	r0, .L_FINI_PROC\n"
 	"	ldr	r0, [r7, r0]\n"
 	"	ldr	r0, [r7, r0]\n"
 	"	@ jump to the user_s entry point\n"
 	"	@ jump to the user_s entry point\n"
-#if defined(__USE_BX__)
-	"	bx	r6\n"
-#else
-	"	mov	pc, r6\n"
-#endif
+	"	" __stringify(BX(r6)) "\n"
 	"\n\n"
 	"\n\n"
 	".L_GET_GOT:\n"
 	".L_GET_GOT:\n"
 	"	.word	_GLOBAL_OFFSET_TABLE_ - .L_GOT_GOT - 4\n"
 	"	.word	_GLOBAL_OFFSET_TABLE_ - .L_GOT_GOT - 4\n"

+ 6 - 12
ldso/ldso/arm/resolve.S

@@ -90,12 +90,10 @@
  * dl-startup.c).
  * dl-startup.c).
  */
  */
 
 
-#include <sys/syscall.h>
+#include <features.h>
 #include <bits/arm_asm.h>
 #include <bits/arm_asm.h>
 #include <bits/arm_bx.h>
 #include <bits/arm_bx.h>
 
 
-#include <features.h>
-
 #define sl r10
 #define sl r10
 #define fp r11
 #define fp r11
 #define ip r12
 #define ip r12
@@ -114,8 +112,8 @@ _dl_linux_resolve:
          @ function must branch to the real function, and that expects
          @ function must branch to the real function, and that expects
          @ r0-r3 and lr to be as they were before the whole PLT stuff -
          @ r0-r3 and lr to be as they were before the whole PLT stuff -
          @ ip can be trashed.
          @ ip can be trashed.
-	 @ This routine is called after pushing lr, so we must push an odd
-	 @ number of words to keep the stack correctly aligned.
+         @ This routine is called after pushing lr, so we must push an odd
+         @ number of words to keep the stack correctly aligned.
 
 
          stmdb sp!, {r0, r1, r2, r3, r4}
          stmdb sp!, {r0, r1, r2, r3, r4}
          ldr r0, [lr, #-4]       @ r0 :        = [lr-4] (GOT_TABLE[1])
          ldr r0, [lr, #-4]       @ r0 :        = [lr-4] (GOT_TABLE[1])
@@ -124,16 +122,12 @@ _dl_linux_resolve:
                                  @ ~x = -x-1, therefore ~(r1>>2) = (-((lr-ip)>>2)-1)
                                  @ ~x = -x-1, therefore ~(r1>>2) = (-((lr-ip)>>2)-1)
                                  @ = - ((lr-ip)/4) - 1 = (ip - lr - 4)/4, as required
                                  @ = - ((lr-ip)/4) - 1 = (ip - lr - 4)/4, as required
 
 
-	bl _dl_linux_resolver
+        bl _dl_linux_resolver
 
 
-	mov ip, r0
+        mov ip, r0
         ldmia sp!, {r0, r1, r2, r3, r4, lr}
         ldmia sp!, {r0, r1, r2, r3, r4, lr}
 
 
-#if defined(__USE_BX__)
-	bx ip
-#else
-	mov pc,ip
-#endif
+        BX(ip)
 #else
 #else
        @ In the thumb case _dl_linux_resolver is thumb.  If a bl is used
        @ In the thumb case _dl_linux_resolver is thumb.  If a bl is used
        @ from arm code the linker will insert a stub call which, with
        @ from arm code the linker will insert a stub call which, with

+ 7 - 2
ldso/ldso/dl-tls.c

@@ -963,8 +963,13 @@ static bool tls_init_tp_called;
 void ** __attribute__ ((const))
 void ** __attribute__ ((const))
 _dl_initial_error_catch_tsd (void)
 _dl_initial_error_catch_tsd (void)
 {
 {
-	static void *data;
-	return &data;
+	static
+#if 0 /* def ARCH_NEEDS_BOOTSTRAP_RELOCS */
+		/* If we have to do bootstrap relocs anyway we might as well */
+		__thread
+# endif
+		void *__tsd_data;
+	return &__tsd_data;
 }
 }
 
 
 #ifdef SHARED
 #ifdef SHARED

+ 2 - 1
ldso/ldso/ldso.c

@@ -1208,6 +1208,7 @@ of this helper program; chances are you did not intend to run this program.\n\
 	}
 	}
 #endif
 #endif
 #ifdef __UCLIBC_HAS_SSP__
 #ifdef __UCLIBC_HAS_SSP__
+	_dl_debug_early("Setting up SSP guards\n");
 	/* Set up the stack checker's canary.  */
 	/* Set up the stack checker's canary.  */
 	stack_chk_guard = _dl_setup_stack_chk_guard ();
 	stack_chk_guard = _dl_setup_stack_chk_guard ();
 # ifdef THREAD_SET_STACK_GUARD
 # ifdef THREAD_SET_STACK_GUARD
@@ -1280,7 +1281,7 @@ of this helper program; chances are you did not intend to run this program.\n\
 
 
 	}
 	}
 
 
-	_dl_debug_early ("\nprelink checking: %s\n", prelinked ? "ok" : "failed");
+	_dl_debug_early ("prelink checking: %s\n", prelinked ? "ok" : "failed");
 
 
 	if (prelinked) {
 	if (prelinked) {
 		if (_dl_loaded_modules->dynamic_info[DT_GNU_CONFLICT_IDX]) {
 		if (_dl_loaded_modules->dynamic_info[DT_GNU_CONFLICT_IDX]) {

+ 9 - 2
libc/misc/pthread/tsd.c

@@ -1,11 +1,18 @@
+/*
+ * Copyright (C) 2006 by Steven J. Hill <sjhill@realitydiluted.com>
+ *
+ * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball.
+ */
 /* libpthread sets _dl_error_catch_tsd to point to this function.
 /* libpthread sets _dl_error_catch_tsd to point to this function.
    We define it here instead of in libpthread so that it doesn't
    We define it here instead of in libpthread so that it doesn't
    need to have a TLS segment of its own just for this one pointer.  */
    need to have a TLS segment of its own just for this one pointer.  */
 
 
+#include <features.h>
+
 void **__libc_dl_error_tsd(void) __attribute__ ((const));
 void **__libc_dl_error_tsd(void) __attribute__ ((const));
 void ** __attribute__ ((const))
 void ** __attribute__ ((const))
 __libc_dl_error_tsd (void)
 __libc_dl_error_tsd (void)
 {
 {
-  static __thread void *data __attribute__ ((tls_model ("initial-exec")));
-  return &data;
+  static __thread void *__tsd_data attribute_tls_model_ie;
+  return &__tsd_data;
 }
 }

+ 3 - 15
libc/string/arm/_memcpy.S

@@ -111,11 +111,7 @@ _memcpy:
 	bcc	.Lmemcpy_backwards
 	bcc	.Lmemcpy_backwards
 
 
 	IT(t, eq)			/* Quick abort for src=dst */
 	IT(t, eq)			/* Quick abort for src=dst */
-#if defined(__USE_BX__)
-        bxeq    lr
-#else
-        moveq   pc, lr
-#endif
+	BXC(eq, lr)
 	stmdb	sp!, {r0, lr}		/* memcpy() returns dest addr */
 	stmdb	sp!, {r0, lr}		/* memcpy() returns dest addr */
 	subs	r2, r2, #4
 	subs	r2, r2, #4
 	blt	.Lmemcpy_fl4		/* less than 4 bytes */
 	blt	.Lmemcpy_fl4		/* less than 4 bytes */
@@ -455,11 +451,7 @@ _memcpy:
 	/* less than 4 bytes to go */
 	/* less than 4 bytes to go */
 	adds	r2, r2, #4
 	adds	r2, r2, #4
 	IT(t, eq)
 	IT(t, eq)
-#if defined(__USE_BX__)
-        bxeq    lr
-#else
-	moveq	pc, lr			/* done */
-#endif
+	BXC(eq, lr)			/* done */
 	/* copy the crud byte at a time */
 	/* copy the crud byte at a time */
 	cmp	r2, #2
 	cmp	r2, #2
 	ldrb	r3, [r1, #-1]!
 	ldrb	r3, [r1, #-1]!
@@ -477,11 +469,7 @@ _memcpy:
 	ldrgtb	r3, [r1, #-1]!
 	ldrgtb	r3, [r1, #-1]!
 	strgtb	r3, [r0, #-1]!
 	strgtb	r3, [r0, #-1]!
 #endif
 #endif
-#if defined(__USE_BX__)
-        bx      lr
-#else
-	mov	pc, lr
-#endif
+	BX(lr)
 	/* erg - unaligned destination */
 	/* erg - unaligned destination */
 .Lmemcpy_bdestul:
 .Lmemcpy_bdestul:
 	cmp	r12, #2
 	cmp	r12, #2

+ 2 - 10
libc/string/arm/memcmp.S

@@ -67,11 +67,7 @@ memcmp:
 	subs	r2, r2, #1
 	subs	r2, r2, #1
 	IT(tt, mi)
 	IT(tt, mi)
 	movmi	r0, #0
 	movmi	r0, #0
-#if defined(__USE_BX__)
-        bxmi    lr
-#else
-	movmi	pc, lr
-#endif
+	BXC(mi, lr)
 	/* ip == last src address to compare */
 	/* ip == last src address to compare */
 	add	ip, r0, r2
 	add	ip, r0, r2
 1:
 1:
@@ -82,11 +78,7 @@ memcmp:
 	cmpcs	r2, r3
 	cmpcs	r2, r3
 	beq	1b
 	beq	1b
 	sub	r0, r2, r3
 	sub	r0, r2, r3
-#if defined(__USE_BX__)
-        bx      lr
-#else
- 	mov	pc, lr
-#endif
+	BX(lr)
 #endif
 #endif
 
 
 .size memcmp,.-memcmp
 .size memcmp,.-memcmp

+ 2 - 11
libc/string/arm/memset.S

@@ -17,7 +17,6 @@
    <http://www.gnu.org/licenses/>.  */
    <http://www.gnu.org/licenses/>.  */
 
 
 #include <features.h>
 #include <features.h>
-#include <sys/syscall.h>
 #include <bits/arm_asm.h>
 #include <bits/arm_asm.h>
 #include <bits/arm_bx.h>
 #include <bits/arm_bx.h>
 
 
@@ -109,11 +108,7 @@ memset:
 2:
 2:
 	movs	a3, a3		@ anything left?
 	movs	a3, a3		@ anything left?
 	IT(t, eq)
 	IT(t, eq)
-#if defined(__USE_BX__)
-        bxeq    lr
-#else
-        moveq	pc, lr		@ nope
-#endif
+	BXC(eq, lr)			@ nope
 #if defined (__thumb2__)
 #if defined (__thumb2__)
 1:
 1:
 	strb	a2, [a4], #1
 	strb	a2, [a4], #1
@@ -131,11 +126,7 @@ memset:
 	strb	a2, [a4], $1
 	strb	a2, [a4], $1
 	strb	a2, [a4], $1
 	strb	a2, [a4], $1
 	strb	a2, [a4], $1
 	strb	a2, [a4], $1
-#if defined(__USE_BX__)
-        bx      lr
-#else
- 	mov	pc, lr
-#endif
+	BX(lr)
 #endif
 #endif
 #endif
 #endif
 
 

+ 1 - 5
libc/string/arm/strcmp.S

@@ -63,11 +63,7 @@ strcmp:
 	cmpcs	r2, r3
 	cmpcs	r2, r3
 	beq	1b
 	beq	1b
 	sub	r0, r2, r3
 	sub	r0, r2, r3
-#if defined(__USE_BX__)
-        bx      lr
-#else
-  	mov	pc, lr
-#endif
+	BX(lr)
 #endif
 #endif
 
 
 .size strcmp,.-strcmp
 .size strcmp,.-strcmp

+ 1 - 6
libc/string/arm/strlen.S

@@ -18,7 +18,6 @@
 
 
 #include <features.h>
 #include <features.h>
 #include <endian.h>
 #include <endian.h>
-#include <sys/syscall.h>
 #include <bits/arm_asm.h>
 #include <bits/arm_asm.h>
 #include <bits/arm_bx.h>
 #include <bits/arm_bx.h>
 
 
@@ -99,11 +98,7 @@ Llastword:				@ drop through to here once we find a
 	IT(t, ne)
 	IT(t, ne)
 	addne   r0, r0, $1              @  must be zero)
 	addne   r0, r0, $1              @  must be zero)
 #endif
 #endif
-#if defined(__USE_BX__)
-        bx      lr
-#else
-  	mov	pc,lr
-#endif
+	BX(lr)
 #endif
 #endif
 
 
 .size strlen,.-strlen
 .size strlen,.-strlen

+ 1 - 6
libc/sysdeps/linux/arm/__longjmp.S

@@ -98,12 +98,7 @@ __longjmp:
 	ldcl	p1, cr14, [r12], #8
 	ldcl	p1, cr14, [r12], #8
 	ldcl	p1, cr15, [r12], #8
 	ldcl	p1, cr15, [r12], #8
 #endif
 #endif
-
-#if defined(__USE_BX__)
-	bx	lr
-#else
-	mov pc, lr
-#endif
+	BX(lr)
 #endif
 #endif
 
 
 .size __longjmp,.-__longjmp
 .size __longjmp,.-__longjmp

+ 6 - 6
libc/sysdeps/linux/arm/bits/arm_asm.h

@@ -13,12 +13,12 @@
    unified assembly syntax.  */
    unified assembly syntax.  */
 #define IT(t, cond)
 #define IT(t, cond)
 /* Code to return from a thumb function stub.  */
 /* Code to return from a thumb function stub.  */
-#ifdef __ARM_ARCH_4T__
-#define POP_RET pop	{r2, pc}
-#else
-#define POP_RET pop	{r2, r3}; bx	r3
-#endif
-#endif
+# if defined __ARM_ARCH_4T__ && defined __THUMB_INTERWORK__
+#  define POP_RET pop   {r2, r3}; bx    r3
+# else
+#  define POP_RET pop   {r2, pc}
+# endif
+#endif /* __thumb2__ */
 
 
 #if defined(__ARM_ARCH_6M__)
 #if defined(__ARM_ARCH_6M__)
 /* Force arm mode to flush out errors on M profile cores.  */
 /* Force arm mode to flush out errors on M profile cores.  */

+ 9 - 3
libc/sysdeps/linux/arm/bits/arm_bx.h

@@ -24,11 +24,17 @@
 #endif /* features.h not yet included */
 #endif /* features.h not yet included */
 
 
 #if defined(__USE_BX__)
 #if defined(__USE_BX__)
-# if (   defined (__ARM_ARCH_2__)  || defined (__ARM_ARCH_3__) \
-      || defined (__ARM_ARCH_3M__) || defined (__ARM_ARCH_4__) \
-     )
+# if (__ARM_ARCH <= 4 && !defined __ARM_ARCH_4T__)
 #  error Use of BX was requested, but is not available on the target processor.
 #  error Use of BX was requested, but is not available on the target processor.
 # endif /* ARCH level */
 # endif /* ARCH level */
 #endif /* __USE_BX__ */
 #endif /* __USE_BX__ */
 
 
+#if defined(__USE_BX__) && (__ARM_ARCH > 4 || (__ARM_ARCH == 4 && defined __ARM_ARCH_4T__))
+# define BX(reg)	bx reg
+# define BXC(cond, reg)	bx##cond reg
+#else
+# define BX(reg)	mov pc, reg
+# define BXC(cond, reg)	mov##cond pc, reg
+#endif
+
 #endif /* _ARM_BX_H */
 #endif /* _ARM_BX_H */

+ 26 - 0
libc/sysdeps/linux/arm/bits/uClibc_arch_features.h

@@ -48,6 +48,32 @@
 /* only weird assemblers generally need this */
 /* only weird assemblers generally need this */
 #undef __UCLIBC_ASM_LINE_SEP__
 #undef __UCLIBC_ASM_LINE_SEP__
 
 
+
+/* The __ARM_ARCH define is provided by gcc 4.8.  Construct it otherwise.  */
+#ifndef __ARM_ARCH
+# ifdef __ARM_ARCH_2__
+#  define __ARM_ARCH 2
+# elif defined (__ARM_ARCH_3__) || defined (__ARM_ARCH_3M__)
+#  define __ARM_ARCH 3
+# elif defined (__ARM_ARCH_4__) || defined (__ARM_ARCH_4T__)
+#  define __ARM_ARCH 4
+# elif defined (__ARM_ARCH_5__) || defined (__ARM_ARCH_5E__) \
+       || defined(__ARM_ARCH_5T__) || defined(__ARM_ARCH_5TE__) \
+       || defined(__ARM_ARCH_5TEJ__)
+#  define __ARM_ARCH 5
+# elif defined (__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \
+       || defined (__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) \
+       || defined (__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__)
+#  define __ARM_ARCH 6
+# elif defined (__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \
+       || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \
+       || defined(__ARM_ARCH_7EM__)
+#  define __ARM_ARCH 7
+# else
+#  error unknown arm architecture
+# endif
+#endif
+
 #ifdef __GNUC__
 #ifdef __GNUC__
 # define __need_uClibc_config_h
 # define __need_uClibc_config_h
 # include <bits/uClibc_config.h>
 # include <bits/uClibc_config.h>

+ 2 - 5
libc/sysdeps/linux/arm/clone.S

@@ -128,11 +128,8 @@ __clone:
 	beq	1f
 	beq	1f
 	pop	{r4, r7}
 	pop	{r4, r7}
 	blt	__error
 	blt	__error
-#if defined(__USE_BX__)
-	bxne	lr
-#else
-	movne	pc, lr
-#endif
+	IT(t, ne)
+	BXC(ne, lr)
 
 
 	cfi_startproc
 	cfi_startproc
 .fnend
 .fnend

+ 1 - 5
libc/sysdeps/linux/arm/mmap64.S

@@ -92,11 +92,7 @@ mmap64:
 	cmn	r0, $4096
 	cmn	r0, $4096
 	ldmfd	sp!, {r4, r5}
 	ldmfd	sp!, {r4, r5}
 	IT(t, cc)
 	IT(t, cc)
-#if defined(__USE_BX__)
-	bxcc	lr
-#else
-	movcc	pc, lr
-#endif
+	BXC(cc, lr)
 	b	__syscall_error
 	b	__syscall_error
 .Linval:
 .Linval:
 	mov	r0, $-EINVAL
 	mov	r0, $-EINVAL

+ 2 - 6
libc/sysdeps/linux/arm/syscall-eabi.S

@@ -15,7 +15,7 @@
    License along with the GNU C Library; if not, see
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
    <http://www.gnu.org/licenses/>.  */
 
 
-#include <sys/syscall.h>
+#include <features.h>
 #include <bits/arm_asm.h>
 #include <bits/arm_asm.h>
 #include <bits/arm_bx.h>
 #include <bits/arm_bx.h>
 
 
@@ -62,11 +62,7 @@ syscall:
 	ldmfd	sp!, {r4, r5, r6, r7}
 	ldmfd	sp!, {r4, r5, r6, r7}
 	cmn	r0, #4096
 	cmn	r0, #4096
 	IT(t, cc)
 	IT(t, cc)
-#if defined(__USE_BX__)
-	bxcc	lr
-#else
-	movcc	pc, lr
-#endif
+	BXC(cc, lr)
 	b	__syscall_error
 	b	__syscall_error
 #endif
 #endif
 
 

+ 3 - 11
libc/sysdeps/linux/arm/sysdep.h

@@ -21,7 +21,6 @@
 
 
 #include <common/sysdep.h>
 #include <common/sysdep.h>
 #include <bits/arm_bx.h>
 #include <bits/arm_bx.h>
-
 #include <sys/syscall.h>
 #include <sys/syscall.h>
 /* For Linux we can use the system call table in the header file
 /* For Linux we can use the system call table in the header file
 	/usr/include/asm/unistd.h
 	/usr/include/asm/unistd.h
@@ -50,17 +49,10 @@
 #ifdef __APCS_32__
 #ifdef __APCS_32__
 #define LOADREGS(cond, base, reglist...)\
 #define LOADREGS(cond, base, reglist...)\
 	ldm##cond	base,reglist
 	ldm##cond	base,reglist
-#ifdef __USE_BX__
-#define RETINSTR(cond, reg)	\
-	bx##cond	reg
-#define DO_RET(_reg)		\
-	bx _reg
-#else
-#define RETINSTR(cond, reg)	\
-	mov##cond	pc, reg
+#define RETINSTR(cond, reg) \
+	BXC(cond, reg)
 #define DO_RET(_reg)		\
 #define DO_RET(_reg)		\
-	mov pc, _reg
-#endif
+	BX(_reg)
 #else  /* APCS-26 */
 #else  /* APCS-26 */
 #define LOADREGS(cond, base, reglist...)	\
 #define LOADREGS(cond, base, reglist...)	\
 	ldm##cond	base,reglist^
 	ldm##cond	base,reglist^

+ 2 - 10
libc/sysdeps/linux/arm/vfork.S

@@ -74,11 +74,7 @@ __vfork:
 	RESTORE_PID
 	RESTORE_PID
 	cmn	r0, #4096
 	cmn	r0, #4096
 	IT(t, cc)
 	IT(t, cc)
-#if defined(__USE_BX__)
-	bxcc	lr
-#else
-	movcc	pc, lr
-#endif
+	BXC(cc, lr)
 
 
 	/* Check if vfork even exists.  */
 	/* Check if vfork even exists.  */
 	ldr     r1, =-ENOSYS
 	ldr     r1, =-ENOSYS
@@ -92,11 +88,7 @@ __vfork:
 
 
 	/* Syscall worked.  Return to child/parent */
 	/* Syscall worked.  Return to child/parent */
 	IT(t, cc)
 	IT(t, cc)
-#if defined(__USE_BX__)
-	bxcc	lr
-#else
-	movcc   pc, lr
-#endif
+	BXC(cc, lr)
 
 
 __error:
 __error:
 	b	__syscall_error
 	b	__syscall_error