This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH 3/6] aarch64: Tidy syscall error check
- From: Richard Henderson <rth at twiddle dot net>
- To: libc-alpha at sourceware dot org
- Cc: marcus dot shawcroft at gmail dot com, Richard Henderson <rth at redhat dot com>
- Date: Tue, 20 May 2014 13:56:15 -0700
- Subject: [PATCH 3/6] aarch64: Tidy syscall error check
- Authentication-results: sourceware.org; auth=none
- References: <1400619378-7262-1-git-send-email-rth at twiddle dot net>
From: Richard Henderson <rth@redhat.com>
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.
* sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h (PSEUDO):
Branch to .Lsyscall_error on error. Do not call DOARGS/UNDOARGS.
* sysdeps/unix/sysv/linux/aarch64/sysdep.h (PSEUDO): Branch to
.Lsyscall_error on error.
(PSEUDO_RET): Do not check for error.
(SYSCALL_ERROR) [NOT_IN_libc]: Use .Lsyscall_error.
(SYSCALL_ERROR_HANDLER) [!NOT_IN_libc]: Branch to __syscall_error.
---
sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h | 7 ++++---
sysdeps/unix/sysv/linux/aarch64/sysdep.h | 18 +++++++++---------
2 files changed, 13 insertions(+), 12 deletions(-)
diff --git a/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h b/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h
index acaed5d..e3b4b56 100644
--- a/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h
+++ b/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h
@@ -33,16 +33,16 @@
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; \
ENTRY (name); \
SINGLE_THREAD_P; \
- DOARGS_##args; \
bne .Lpseudo_cancel; \
DO_CALL (syscall_name, 0); \
- UNDOARGS_##args; \
cmn x0, 4095; \
+ b.cs .Lsyscall_error; \
PSEUDO_RET; \
.Lpseudo_cancel: \
DOCARGS_##args; /* save syscall args etc. around CENABLE. */ \
@@ -61,7 +61,8 @@
cfi_adjust_cfa_offset (-16); \
cfi_restore (x30); \
UNDOARGS_##args; \
- cmn x0, 4095;
+ cmn x0, 4095; \
+ b.cs .Lsyscall_error;
# define DOCARGS_0 \
str x30, [sp, -16]!; \
diff --git a/sysdeps/unix/sysv/linux/aarch64/sysdep.h b/sysdeps/unix/sysv/linux/aarch64/sysdep.h
index 8397ad3..b32a565 100644
--- a/sysdeps/unix/sysv/linux/aarch64/sysdep.h
+++ b/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:
--
1.9.0