Skip to content

Commit

Permalink
aarch64: Tidy syscall error check
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Richard Henderson committed May 25, 2014
1 parent 6e6c2d0 commit ca3cfa4
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 10 deletions.
8 changes: 8 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
2014-05-25 Richard Henderson <rth@twiddle.net>

* 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.
Expand Down
5 changes: 4 additions & 1 deletion sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h
Original file line number Diff line number Diff line change
Expand Up @@ -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; \
Expand All @@ -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. */ \
Expand All @@ -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]!; \
Expand Down
18 changes: 9 additions & 9 deletions sysdeps/unix/sysv/linux/aarch64/sysdep.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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)]; \
Expand All @@ -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); \
Expand All @@ -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:
Expand Down

0 comments on commit ca3cfa4

Please sign in to comment.