aarch64: Share code in syscall-cancel.h
authorRichard Henderson <rth@redhat.com>
Sun, 25 May 2014 18:07:17 +0000 (14:07 -0400)
committerRichard Henderson <rth@redhat.com>
Thu, 29 May 2014 16:31:07 +0000 (12:31 -0400)
Fold nocancel and error handling paths.

ChangeLog
sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h

index 9bc50c3..9f741a4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2014-05-29  Richard Henderson  <rth@twiddle.net>
 
+       * sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h (PSEUDO):
+       Use ENTRY to define the _nocancel entry point.  Share the syscall
+       and syscall error check paths with the cancel path.
+       (PSEUDO_END): New.
+
        * sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h: Adjust
        whitespace; tabs before and after asm mnemonics.
 
index 26d4c0e..41502de 100644 (file)
 # undef PSEUDO
 # define PSEUDO(name, syscall_name, args)                              \
        .section ".text";                                               \
-       .type   __##syscall_name##_nocancel,%function;                  \
-       .globl  __##syscall_name##_nocancel;                            \
-__##syscall_name##_nocancel:                                           \
-       cfi_startproc;                                                  \
+ENTRY (__##syscall_name##_nocancel);                                   \
+.Lpseudo_nocancel:                                                     \
        DO_CALL (syscall_name, args);                                   \
+.Lpseudo_finish:                                                       \
        cmn     x0, 4095;                                               \
        b.cs    .Lsyscall_error;                                        \
-       PSEUDO_RET;                                                     \
-       cfi_endproc;                                                    \
+       .subsection 2;                                                  \
        .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
 ENTRY (name);                                                          \
        SINGLE_THREAD_P;                                                \
-       bne .Lpseudo_cancel;                                            \
-       DO_CALL (syscall_name, 0);                                      \
-       cmn x0, 4095;                                                   \
-       b.cs .Lsyscall_error;                                           \
-       PSEUDO_RET;                                                     \
-.Lpseudo_cancel:                                                       \
+       beq .Lpseudo_nocancel;                                          \
        DOCARGS_##args; /* save syscall args etc. around CENABLE.  */   \
        CENABLE;                                                        \
        mov     x16, x0;        /* put mask in safe place.  */          \
@@ -60,8 +53,15 @@ ENTRY (name);                                                                \
        ldr     x30, [sp], 16;                                          \
        cfi_adjust_cfa_offset (-16);                                    \
        cfi_restore (x30);                                              \
-       cmn     x0, 4095;                                               \
-       b.cs    .Lsyscall_error;
+       b       .Lpseudo_finish;                                        \
+       cfi_endproc;                                                    \
+       .size   name, .-name;                                           \
+       .previous
+
+# undef PSEUDO_END
+# define PSEUDO_END(name)                                              \
+       SYSCALL_ERROR_HANDLER;                                          \
+       cfi_endproc
 
 # define DOCARGS_0                                                     \
        str x30, [sp, -16]!;                                            \