diff options
Diffstat (limited to 'libc/private/bionic_tls.h')
-rw-r--r-- | libc/private/bionic_tls.h | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/libc/private/bionic_tls.h b/libc/private/bionic_tls.h index af19554..9a5146f 100644 --- a/libc/private/bionic_tls.h +++ b/libc/private/bionic_tls.h @@ -111,6 +111,12 @@ extern int __set_tls(void *ptr); * Note that HAVE_ARM_TLS_REGISTER is build-specific * (it must match your kernel configuration) */ +# ifdef HAVE_TEGRA_ERRATA_657451 +# define __munge_tls(_v) ( ((_v)&~((1ul<<20)|1ul)) | (((_v)&0x1)<<20) ) +# else +# define __munge_tls(_v) (_v) +#endif + # ifdef HAVE_ARM_TLS_REGISTER /* We can read the address directly from a coprocessor * register, which avoids touching the data cache @@ -119,6 +125,7 @@ extern int __set_tls(void *ptr); # define __get_tls() \ ({ register unsigned int __val asm("r0"); \ asm ("mrc p15, 0, r0, c13, c0, 3" : "=r"(__val) ); \ + __val = __munge_tls(__val); \ (volatile void*)__val; }) # else /* !HAVE_ARM_TLS_REGISTER */ /* The kernel provides the address of the TLS at a fixed |