OSDN Git Service

merge from eclair
authorJean-Baptiste Queru <jbq@google.com>
Sun, 15 Nov 2009 20:05:31 +0000 (12:05 -0800)
committerJean-Baptiste Queru <jbq@google.com>
Sun, 15 Nov 2009 20:05:31 +0000 (12:05 -0800)
1  2 
libc/Android.mk
libc/arch-arm/bionic/atomics_arm.S
libc/bionic/pthread.c
libc/private/bionic_tls.h
linker/dlfcn.c
linker/linker.c
linker/linker.h

diff --cc libc/Android.mk
Simple merge
Simple merge
Simple merge
@@@ -87,10 -87,19 +87,20 @@@ extern void __init_tls(void**  tls, voi
  extern int __set_tls(void *ptr);
  
  /* get the TLS */
- /* Linux kernel helpers for its TLS implementation */
  #ifdef __arm__
- typedef void* (__kernel_get_tls_t)(void);
- #define __get_tls (*(__kernel_get_tls_t *)0xffff0fe0)
++/* Linux kernel helpers for its TLS implementation */
+ /* For performance reasons, avoid calling the kernel helper
+  * Note that HAVE_ARM_TLS_REGISTER is build-specific
+  * (it must match your kernel configuration)
+  */
+ #  ifdef HAVE_ARM_TLS_REGISTER
+ #    define __get_tls() \
+     ({ register unsigned int __val asm("r0"); \
+        asm ("mrc p15, 0, r0, c13, c0, 3" : "=r"(__val) ); \
+        (volatile void*)__val; })
+ #  else /* !HAVE_ARM_TLS_REGISTER */
+ #    define __get_tls() ( *((volatile void **) 0xffff0ff0) )
+ #  endif
  #else
  extern void*  __get_tls( void );
  #endif
diff --cc linker/dlfcn.c
Simple merge
diff --cc linker/linker.c
Simple merge
diff --cc linker/linker.h
Simple merge