summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2014-05-20 14:40:22 -0400
committerWill Newton <will.newton@linaro.org>2014-07-03 14:49:39 +0100
commit532155509ece28751dcaf0f38d509836edb4ffee (patch)
treed649e69e2ededf0863f3255ba40e8ea4ce3b39c5
parent5d9669e35f4831b315d1989256b9434976fb2230 (diff)
aarch64: Tidy syscall error check
Move the error branch from the PSEUDO_RET macro to the PSEUDO macro. This is in line with other architectures, and will enable further improvments.
-rw-r--r--libc/ports/ChangeLog.aarch64.linaro8
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h5
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h18
3 files changed, 21 insertions, 10 deletions
diff --git a/libc/ports/ChangeLog.aarch64.linaro b/libc/ports/ChangeLog.aarch64.linaro
index ca7831340..c1e60190d 100644
--- a/libc/ports/ChangeLog.aarch64.linaro
+++ b/libc/ports/ChangeLog.aarch64.linaro
@@ -1,5 +1,13 @@
2014-05-21 Richard Henderson <rth@redhat.com>
+ * sysdeps/unix/sysv/linux/aarch64/sysdep.h (PSEUDO_RET): Move
+ branch to syscall error ...
+ (PSEUDO): ... here.
+ [NOT_IN_libc] (SYSCALL_ERROR_HANDLER): Rename the label
+ from __local_syscall_error to .Lsyscall_error.
+ [!NOT_IN_libc] (SYSCALL_ERROR_HANDLER): Branch to __syscall_error.
+ (SYSCALL_ERROR): Update label name.
+
* sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h (PSEUDO):
Do not use DOARGS/UNDOARGS.
* sysdeps/unix/sysv/linux/aarch64/sysdep.h (DO_CALL): Likewise.
diff --git a/libc/ports/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h b/libc/ports/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h
index 957bb9959..2d0ae5b93 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h
+++ b/libc/ports/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h
@@ -33,6 +33,7 @@
cfi_startproc; \
DO_CALL (syscall_name, args); \
cmn x0, 4095; \
+ b.cs .Lsyscall_error; \
PSEUDO_RET; \
cfi_endproc; \
.size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
@@ -41,6 +42,7 @@
bne .Lpseudo_cancel; \
DO_CALL (syscall_name, 0); \
cmn x0, 4095; \
+ b.cs .Lsyscall_error; \
PSEUDO_RET; \
.Lpseudo_cancel: \
DOCARGS_##args; /* save syscall args etc. around CENABLE. */ \
@@ -58,7 +60,8 @@
ldr x30, [sp], 16; \
cfi_adjust_cfa_offset (-16); \
cfi_restore (x30); \
- cmn x0, 4095;
+ cmn x0, 4095; \
+ b.cs .Lsyscall_error;
# define DOCARGS_0 \
str x30, [sp, -16]!; \
diff --git a/libc/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h b/libc/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h
index 6cd219a72..89f4adb98 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h
+++ b/libc/ports/sysdeps/unix/sysv/linux/aarch64/sysdep.h
@@ -58,17 +58,15 @@
.text; \
ENTRY (name); \
DO_CALL (syscall_name, args); \
- cmn x0, #4095;
+ cmn x0, #4095; \
+ b.cs .Lsyscall_error;
/* Notice the use of 'RET' instead of 'ret' the assembler is case
insensitive and eglibc already uses the preprocessor symbol 'ret'
so we use the upper case 'RET' to force through a ret instruction
to the assembler */
# define PSEUDO_RET \
- b.cs 1f; \
- RET; \
- 1: \
- b SYSCALL_ERROR
+ RET;
# undef ret
# define ret PSEUDO_RET
@@ -112,10 +110,10 @@
# define ret_ERRVAL PSEUDO_RET_NOERRNO
# if NOT_IN_libc
-# define SYSCALL_ERROR __local_syscall_error
+# define SYSCALL_ERROR .Lsyscall_error
# if RTLD_PRIVATE_ERRNO
# define SYSCALL_ERROR_HANDLER \
-__local_syscall_error: \
+.Lsyscall_error: \
adrp x1, C_SYMBOL_NAME(rtld_errno); \
neg w0, w0; \
str w0, [x1, :lo12:C_SYMBOL_NAME(rtld_errno)]; \
@@ -124,7 +122,7 @@ __local_syscall_error: \
# else
# define SYSCALL_ERROR_HANDLER \
-__local_syscall_error: \
+.Lsyscall_error: \
stp x29, x30, [sp, -32]!; \
cfi_adjust_cfa_offset (32); \
cfi_rel_offset (x29, 0); \
@@ -143,8 +141,10 @@ __local_syscall_error: \
RET;
# endif
# else
-# define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */
# define SYSCALL_ERROR __syscall_error
+# define SYSCALL_ERROR_HANDLER \
+.Lsyscall_error: \
+ b __syscall_error;
# endif
/* Linux takes system call args in registers: