diff options
author | Roland McGrath <roland@hack.frob.com> | 2012-08-09 16:17:14 -0700 |
---|---|---|
committer | Roland McGrath <roland@hack.frob.com> | 2012-08-09 16:37:50 -0700 |
commit | 2aa5b9c146ae9a3efabd430b12cddb635bc29164 (patch) | |
tree | f5f4b220d3426044daf25e74283f94c1091c1824 | |
parent | 7f540252876b853889c9482c9086ac1c55fe6e3c (diff) | |
download | glibc-2aa5b9c146ae9a3efabd430b12cddb635bc29164.tar.gz glibc-2aa5b9c146ae9a3efabd430b12cddb635bc29164.tar.xz glibc-2aa5b9c146ae9a3efabd430b12cddb635bc29164.zip |
Make ARM setjmp/longjmp respect ARM_ASSUME_NO_IWMMXT macro.
-rw-r--r-- | ports/ChangeLog.arm | 7 | ||||
-rw-r--r-- | ports/sysdeps/arm/__longjmp.S | 31 | ||||
-rw-r--r-- | ports/sysdeps/arm/arm-features.h | 5 | ||||
-rw-r--r-- | ports/sysdeps/arm/setjmp.S | 31 |
4 files changed, 54 insertions, 20 deletions
diff --git a/ports/ChangeLog.arm b/ports/ChangeLog.arm index 1375922fb4..34d606da46 100644 --- a/ports/ChangeLog.arm +++ b/ports/ChangeLog.arm @@ -1,5 +1,12 @@ 2012-08-09 Roland McGrath <roland@hack.frob.com> + * sysdeps/arm/arm-features.h: Document ARM_ASSUME_NO_IWMMXT. + * sysdeps/arm/setjmp.S: Include <arm-features.h>. + [!ARM_ASSUME_NO_IWMMXT || __SOFTFP__]: Conditionalize hwcap + fetching bits on this. + [!ARM_ASSUME_NO_IWMMXT]: Conditionalize iWMMXt register use on this. + * sysdeps/arm/__longjmp.S: Likewise. + * sysdeps/arm/__longjmp.S: Use .Lxxx rather than Lxxx for local labels. [__SOFTFP__]: Conditionalize HWCAP_ARM_VFP check on this. * sysdeps/arm/setjmp.S: Likewise. diff --git a/ports/sysdeps/arm/__longjmp.S b/ports/sysdeps/arm/__longjmp.S index aa5cf74ad0..b3c286083c 100644 --- a/ports/sysdeps/arm/__longjmp.S +++ b/ports/sysdeps/arm/__longjmp.S @@ -21,6 +21,7 @@ #define _ASM #include <bits/setjmp.h> #include <rtld-global-offsets.h> +#include <arm-features.h> /* __longjmp(jmpbuf, val) */ @@ -46,23 +47,29 @@ ENTRY (__longjmp) cfi_restore (sp) cfi_restore (lr) -#ifdef IS_IN_rtld +#if !defined ARM_ASSUME_NO_IWMMXT || defined __SOFTFP__ +# define NEED_HWCAP 1 +#endif + +#ifdef NEED_HWCAP +# ifdef IS_IN_rtld ldr a2, 1f ldr a3, .Lrtld_local_ro 0: add a2, pc, a2 add a2, a2, a3 ldr a2, [a2, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET] -#else -#ifdef PIC +# else +# ifdef PIC ldr a2, 1f ldr a3, .Lrtld_global_ro 0: add a2, pc, a2 ldr a2, [a2, a3] ldr a2, [a2, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET] -#else +# else ldr a2, .Lhwcap ldr a2, [a2, #0] -#endif +# endif +# endif #endif #ifdef __SOFTFP__ @@ -79,6 +86,7 @@ ENTRY (__longjmp) mcr p10, 7, a3, cr1, cr0, 0 .Lno_vfp: +#ifndef ARM_ASSUME_NO_IWMMXT tst a2, #HWCAP_ARM_IWMMXT beq .Lno_iwmmxt @@ -91,22 +99,25 @@ ENTRY (__longjmp) ldcl p1, cr14, [r12], #8 ldcl p1, cr15, [r12], #8 .Lno_iwmmxt: +#endif DO_RET(lr) -#ifdef IS_IN_rtld +#ifdef NEED_HWCAP +# ifdef IS_IN_rtld 1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 .Lrtld_local_ro: .long C_SYMBOL_NAME(_rtld_local_ro)(GOTOFF) -#else -#ifdef PIC +# else +# ifdef PIC 1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 .Lrtld_global_ro: .long C_SYMBOL_NAME(_rtld_global_ro)(GOT) -#else +# else .Lhwcap: .long C_SYMBOL_NAME(_dl_hwcap) -#endif +# endif +# endif #endif END (__longjmp) diff --git a/ports/sysdeps/arm/arm-features.h b/ports/sysdeps/arm/arm-features.h index 0f99b3ab81..41befb57f5 100644 --- a/ports/sysdeps/arm/arm-features.h +++ b/ports/sysdeps/arm/arm-features.h @@ -31,4 +31,9 @@ # define ARM_HAVE_VFP 1 #endif +/* An OS-specific arm-features.h file may define ARM_ASSUME_NO_IWMMXT + to indicate at compile time that iWMMXt hardware is never present + at runtime (or that we never care about its state) and so need not + be checked for. */ + #endif /* arm-features.h */ diff --git a/ports/sysdeps/arm/setjmp.S b/ports/sysdeps/arm/setjmp.S index 9bfacc1ab4..dbd59dd7cf 100644 --- a/ports/sysdeps/arm/setjmp.S +++ b/ports/sysdeps/arm/setjmp.S @@ -21,6 +21,7 @@ #define _ASM #include <bits/setjmp.h> #include <rtld-global-offsets.h> +#include <arm-features.h> ENTRY (__sigsetjmp) mov ip, r0 @@ -28,24 +29,30 @@ ENTRY (__sigsetjmp) /* Save registers */ stmia ip!, {v1-v6, sl, fp, sp, lr} +#if !defined ARM_ASSUME_NO_IWMMXT || defined __SOFTFP__ +# define NEED_HWCAP 1 +#endif + +#ifdef NEED_HWCAP /* Check if we have a VFP unit. */ -#ifdef IS_IN_rtld +# ifdef IS_IN_rtld ldr a3, 1f ldr a4, .Lrtld_local_ro 0: add a3, pc, a3 add a3, a3, a4 ldr a3, [a3, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET] -#else -#ifdef PIC +# else +# ifdef PIC ldr a3, 1f ldr a4, .Lrtld_global_ro 0: add a3, pc, a3 ldr a3, [a3, a4] ldr a3, [a3, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET] -#else +# else ldr a3, .Lhwcap ldr a3, [a3, #0] -#endif +# endif +# endif #endif #ifdef __SOFTFP__ @@ -64,6 +71,7 @@ ENTRY (__sigsetjmp) str a4, [ip], #4 .Lno_vfp: +#ifndef ARM_ASSUME_NO_IWMMXT tst a3, #HWCAP_ARM_IWMMXT beq .Lno_iwmmxt @@ -76,23 +84,26 @@ ENTRY (__sigsetjmp) stcl p1, cr14, [r12], #8 stcl p1, cr15, [r12], #8 .Lno_iwmmxt: +#endif /* Make a tail call to __sigjmp_save; it takes the same args. */ B PLTJMP(C_SYMBOL_NAME(__sigjmp_save)) -#ifdef IS_IN_rtld +#ifdef NEED_HWCAP +# ifdef IS_IN_rtld 1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 .Lrtld_local_ro: .long C_SYMBOL_NAME(_rtld_local_ro)(GOTOFF) -#else -#ifdef PIC +# else +# ifdef PIC 1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 .Lrtld_global_ro: .long C_SYMBOL_NAME(_rtld_global_ro)(GOT) -#else +# else .Lhwcap: .long C_SYMBOL_NAME(_dl_hwcap) -#endif +# endif +# endif #endif END (__sigsetjmp) |