Message ID | 1401046909-25821-3-git-send-email-rth@twiddle.net |
---|---|
State | New |
Headers | show |
On 25 May 2014 20:41, Richard Henderson <rth@twiddle.net> wrote: > From: Richard Henderson <rth@redhat.com> > # 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); \ This hunk simply switches to the use of ENTRY(), which looks OK. > +.Lpseudo_nocancel: \ > DO_CALL (syscall_name, args); \ > +.Lpseudo_finish: \ > cmn x0, 4095; \ > b.cs .Lsyscall_error; \ > - PSEUDO_RET; \ > - cfi_endproc; \ I think there is a 'ret' missing here ? /Marcus
On 05/28/2014 08:21 PM, Marcus Shawcroft wrote: > On 25 May 2014 20:41, Richard Henderson <rth@twiddle.net> wrote: >> From: Richard Henderson <rth@redhat.com> > >> # 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); \ > > This hunk simply switches to the use of ENTRY(), which looks OK. > >> +.Lpseudo_nocancel: \ >> DO_CALL (syscall_name, args); \ >> +.Lpseudo_finish: \ >> cmn x0, 4095; \ >> b.cs .Lsyscall_error; \ >> - PSEUDO_RET; \ >> - cfi_endproc; \ > > I think there is a 'ret' missing here ? That happens in the main assembly file, in the form of PSEUDO(xxx) ret <- here PSEUDO_END(xxx) The .subsection and .previous in that macro let the main body above appear in the middle in the proper place. r~
>>> +.Lpseudo_nocancel: \ >>> DO_CALL (syscall_name, args); \ >>> +.Lpseudo_finish: \ >>> cmn x0, 4095; \ >>> b.cs .Lsyscall_error; \ >>> - PSEUDO_RET; \ >>> - cfi_endproc; \ >> >> I think there is a 'ret' missing here ? > > That happens in the main assembly file, in the form of > > PSEUDO(xxx) > ret <- here > PSEUDO_END(xxx) Understood. OK. /Marcus
diff --git a/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h b/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h index 26d4c0e..41502de 100644 --- a/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h +++ b/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h @@ -27,24 +27,17 @@ # 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]!; \
From: Richard Henderson <rth@redhat.com> Fold nocancel and error handling paths. --- .../unix/sysv/linux/aarch64/nptl/sysdep-cancel.h | 28 +++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-)