aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2014-05-20 16:34:59 -0400
committerRichard Henderson <rth@redhat.com>2014-05-29 12:41:08 -0400
commit11a28aee60fae347aa7db306965297c24443ff88 (patch)
tree47e27662b09025dece927fe803fc82562f3c3adf
parenta17e5ffb80a17449add001ff7901e317afa6f632 (diff)
downloadglibc-11a28aee60fae347aa7db306965297c24443ff88.tar
glibc-11a28aee60fae347aa7db306965297c24443ff88.tar.gz
glibc-11a28aee60fae347aa7db306965297c24443ff88.tar.bz2
glibc-11a28aee60fae347aa7db306965297c24443ff88.zip
aarch64: Use tpidr_el0 rather than __errno_location in librt
-rw-r--r--ChangeLog8
-rw-r--r--sysdeps/unix/sysv/linux/aarch64/nptl/localplt.data1
-rw-r--r--sysdeps/unix/sysv/linux/aarch64/sysdep.h19
3 files changed, 12 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index 5b9b820b45..8ea6ef9a2d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,13 @@
2014-05-29 Richard Henderson <rth@twiddle.net>
+ * sysdeps/unix/sysv/linux/aarch64/sysdep.h [NOT_IN_libc]
+ (SYSCALL_ERROR_HANDLER): Use tpidr_el0 instead of a call
+ to __errno_location.
+ * sysdeps/unix/sysv/linux/aarch64/nptl/localplt.data (libpthread.so):
+ Remove the expected plt for __errno_location.
+
* sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h
- [!NOT_IN_libc] (SINGLE_THREAD_P): Use tpidr_el0 instead of a
+ [NOT_IN_libc] (SINGLE_THREAD_P): Use tpidr_el0 instead of a
call to __read_tp.
* sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h (PSEUDO):
diff --git a/sysdeps/unix/sysv/linux/aarch64/nptl/localplt.data b/sysdeps/unix/sysv/linux/aarch64/nptl/localplt.data
index 84af95dc36..dfca9a7ac7 100644
--- a/sysdeps/unix/sysv/linux/aarch64/nptl/localplt.data
+++ b/sysdeps/unix/sysv/linux/aarch64/nptl/localplt.data
@@ -12,4 +12,3 @@ libm.so: matherr
libm.so: __signbit
libm.so: __signbitf
libm.so: __signbitl
-libpthread.so: __errno_location
diff --git a/sysdeps/unix/sysv/linux/aarch64/sysdep.h b/sysdeps/unix/sysv/linux/aarch64/sysdep.h
index 0e91f83c88..8cce986b00 100644
--- a/sysdeps/unix/sysv/linux/aarch64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/aarch64/sysdep.h
@@ -123,21 +123,12 @@
# define SYSCALL_ERROR_HANDLER \
.Lsyscall_error: \
- stp x29, x30, [sp, -32]!; \
- cfi_adjust_cfa_offset (32); \
- cfi_rel_offset (x29, 0); \
- cfi_rel_offset (x30, 8); \
- add x29, sp, 0; \
- str x19, [sp,16]; \
- neg x19, x0; \
- bl C_SYMBOL_NAME(__errno_location); \
- str w19, [x0]; \
+ adrp x1, :gottprel:errno; \
+ neg w2, w0; \
+ ldr x1, [x1, :gottprel_lo12:errno]; \
+ mrs x3, tpidr_el0; \
mov x0, -1; \
- ldr x19, [sp,16]; \
- ldp x29, x30, [sp], 32; \
- cfi_adjust_cfa_offset (-32); \
- cfi_restore (x29); \
- cfi_restore (x30); \
+ str w2, [x1, x3]; \
RET;
# endif
# else