Message ID | 20200403203201.7494-15-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | nptl: Fix Race conditions in pthread cancellation [BZ#12683] | expand |
On Apr 03 2020, Adhemerval Zanella via Libc-alpha wrote: > +ENTRY (__syscall_cancel_arch) > +#ifdef __mcoldfire__ > + lea (-16,%sp),%sp > + movem.l #60,(%sp) > +#else > + movem.l #15360,-(%sp) > +#endif Please use register names. > +#ifdef __mcoldfire__ > + movem.l (%sp),#60 > + lea (16,%sp),%sp > +#else > + movem.l (%sp)+,#60 > +#endif Likewise. Andreas.
On 03/04/2020 18:34, Andreas Schwab wrote: > On Apr 03 2020, Adhemerval Zanella via Libc-alpha wrote: > >> +ENTRY (__syscall_cancel_arch) >> +#ifdef __mcoldfire__ >> + lea (-16,%sp),%sp >> + movem.l #60,(%sp) >> +#else >> + movem.l #15360,-(%sp) >> +#endif > > Please use register names. > >> +#ifdef __mcoldfire__ >> + movem.l (%sp),#60 >> + lea (16,%sp),%sp >> +#else >> + movem.l (%sp)+,#60 >> +#endif > > Likewise. > > Andreas. > Ack.
03.04.2020 в 17:31:54 -0300 Adhemerval Zanella написал: > This patch adds the m68k modifications required for the BZ#12683 fix > by adding the arch-specific cancellation syscall bridge. > > Checked on m68k-linux-gnu. > --- > sysdeps/m68k/nptl/tcb-offsets.sym | 3 + > sysdeps/unix/sysv/linux/m68k/syscall_cancel.S | 85 +++++++++++++++++++ > 2 files changed, 88 insertions(+) > create mode 100644 sysdeps/unix/sysv/linux/m68k/syscall_cancel.S > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/m68k/syscall_cancel.S > @@ -0,0 +1,85 @@ > +/* Cancellable syscall wrapper. Linux/m68k version. > + Copyright (C) 2020 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + <http://www.gnu.org/licenses/>. */ > + > +#include <sysdep.h> > + > +/* long int __syscall_cancel_arch (int *cancelhandling, > + __syscall_arg_t nr, > + __syscall_arg_t arg1, > + __syscall_arg_t arg2, > + __syscall_arg_t arg3, > + __syscall_arg_t arg4, > + __syscall_arg_t arg5, > + __syscall_arg_t arg6, > + __syscall_arg_t arg7) */ Is #define for HAVE_CANCELABLE_SYSCALL_WITH_7_ARGS missing? More likely the comment is wrong though. Same issue in the alpha patch. > + > + > +ENTRY (__syscall_cancel_arch) > +#ifdef __mcoldfire__ > + lea (-16,%sp),%sp > + movem.l #60,(%sp) > +#else > + movem.l #15360,-(%sp) > +#endif > + cfi_def_cfa_offset (20) > + cfi_offset (2, -20) > + cfi_offset (3, -16) > + cfi_offset (4, -12) > + cfi_offset (5, -8) > + > + .global __syscall_cancel_arch_start > +__syscall_cancel_arch_start: > + > + move.l 20(%sp),%a0 > + move.l (%a0),%d0 > +#ifdef __mcoldfire__ > + move.w %d0,%ccr > + jeq 1f > +#else > + btst #TCB_CANCELED_BIT,%d0 > + jne 1f > +#endif > + > + move.l 48(%sp),%a0 > + move.l 44(%sp),%d5 > + move.l 40(%sp),%d4 > + move.l 36(%sp),%d3 > + move.l 32(%sp),%d2 > + move.l 28(%sp),%d1 > + move.l 24(%sp),%d0 > + trap #0 > + > + .global __syscall_cancel_arch_end > +__syscall_cancel_arch_end: > + > +#ifdef __mcoldfire__ > + movem.l (%sp),#60 > + lea (16,%sp),%sp > +#else > + movem.l (%sp)+,#60 > +#endif > + rts > + > +1: > +#ifdef PIC > + bsr.l __syscall_do_cancel > +#else > + jsr __syscall_do_cancel > +#endif > +END (__syscall_cancel_arch) > +libc_hidden_def (__syscall_cancel_arch)
On 12/04/2020 12:42, Stepan Golosunov wrote: > 03.04.2020 в 17:31:54 -0300 Adhemerval Zanella написал: >> This patch adds the m68k modifications required for the BZ#12683 fix >> by adding the arch-specific cancellation syscall bridge. >> >> Checked on m68k-linux-gnu. >> --- >> sysdeps/m68k/nptl/tcb-offsets.sym | 3 + >> sysdeps/unix/sysv/linux/m68k/syscall_cancel.S | 85 +++++++++++++++++++ >> 2 files changed, 88 insertions(+) >> create mode 100644 sysdeps/unix/sysv/linux/m68k/syscall_cancel.S > >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/m68k/syscall_cancel.S >> @@ -0,0 +1,85 @@ >> +/* Cancellable syscall wrapper. Linux/m68k version. >> + Copyright (C) 2020 Free Software Foundation, Inc. >> + This file is part of the GNU C Library. >> + >> + The GNU C Library is free software; you can redistribute it and/or >> + modify it under the terms of the GNU Lesser General Public >> + License as published by the Free Software Foundation; either >> + version 2.1 of the License, or (at your option) any later version. >> + >> + The GNU C Library is distributed in the hope that it will be useful, >> + but WITHOUT ANY WARRANTY; without even the implied warranty of >> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >> + Lesser General Public License for more details. >> + >> + You should have received a copy of the GNU Lesser General Public >> + License along with the GNU C Library; if not, see >> + <http://www.gnu.org/licenses/>. */ >> + >> +#include <sysdep.h> >> + >> +/* long int __syscall_cancel_arch (int *cancelhandling, >> + __syscall_arg_t nr, >> + __syscall_arg_t arg1, >> + __syscall_arg_t arg2, >> + __syscall_arg_t arg3, >> + __syscall_arg_t arg4, >> + __syscall_arg_t arg5, >> + __syscall_arg_t arg6, >> + __syscall_arg_t arg7) */ > > Is #define for HAVE_CANCELABLE_SYSCALL_WITH_7_ARGS missing? > More likely the comment is wrong though. > Same issue in the alpha patch. No, on both cases the comment is wrong. I have fixed both. > >> + >> + >> +ENTRY (__syscall_cancel_arch) >> +#ifdef __mcoldfire__ >> + lea (-16,%sp),%sp >> + movem.l #60,(%sp) >> +#else >> + movem.l #15360,-(%sp) >> +#endif >> + cfi_def_cfa_offset (20) >> + cfi_offset (2, -20) >> + cfi_offset (3, -16) >> + cfi_offset (4, -12) >> + cfi_offset (5, -8) >> + >> + .global __syscall_cancel_arch_start >> +__syscall_cancel_arch_start: >> + >> + move.l 20(%sp),%a0 >> + move.l (%a0),%d0 >> +#ifdef __mcoldfire__ >> + move.w %d0,%ccr >> + jeq 1f >> +#else >> + btst #TCB_CANCELED_BIT,%d0 >> + jne 1f >> +#endif >> + >> + move.l 48(%sp),%a0 >> + move.l 44(%sp),%d5 >> + move.l 40(%sp),%d4 >> + move.l 36(%sp),%d3 >> + move.l 32(%sp),%d2 >> + move.l 28(%sp),%d1 >> + move.l 24(%sp),%d0 >> + trap #0 >> + >> + .global __syscall_cancel_arch_end >> +__syscall_cancel_arch_end: >> + >> +#ifdef __mcoldfire__ >> + movem.l (%sp),#60 >> + lea (16,%sp),%sp >> +#else >> + movem.l (%sp)+,#60 >> +#endif >> + rts >> + >> +1: >> +#ifdef PIC >> + bsr.l __syscall_do_cancel >> +#else >> + jsr __syscall_do_cancel >> +#endif >> +END (__syscall_cancel_arch) >> +libc_hidden_def (__syscall_cancel_arch)
diff --git a/sysdeps/m68k/nptl/tcb-offsets.sym b/sysdeps/m68k/nptl/tcb-offsets.sym index 241fb8b47c..59c9f78f8c 100644 --- a/sysdeps/m68k/nptl/tcb-offsets.sym +++ b/sysdeps/m68k/nptl/tcb-offsets.sym @@ -8,3 +8,6 @@ MULTIPLE_THREADS_OFFSET thread_offsetof (header.multiple_threads) TID_OFFSET thread_offsetof (tid) + +-- Not strictly offsets, used on syscall_cancel.S +TCB_CANCELED_BIT CANCELED_BIT diff --git a/sysdeps/unix/sysv/linux/m68k/syscall_cancel.S b/sysdeps/unix/sysv/linux/m68k/syscall_cancel.S new file mode 100644 index 0000000000..59df082a28 --- /dev/null +++ b/sysdeps/unix/sysv/linux/m68k/syscall_cancel.S @@ -0,0 +1,85 @@ +/* Cancellable syscall wrapper. Linux/m68k version. + Copyright (C) 2020 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <sysdep.h> + +/* long int __syscall_cancel_arch (int *cancelhandling, + __syscall_arg_t nr, + __syscall_arg_t arg1, + __syscall_arg_t arg2, + __syscall_arg_t arg3, + __syscall_arg_t arg4, + __syscall_arg_t arg5, + __syscall_arg_t arg6, + __syscall_arg_t arg7) */ + + +ENTRY (__syscall_cancel_arch) +#ifdef __mcoldfire__ + lea (-16,%sp),%sp + movem.l #60,(%sp) +#else + movem.l #15360,-(%sp) +#endif + cfi_def_cfa_offset (20) + cfi_offset (2, -20) + cfi_offset (3, -16) + cfi_offset (4, -12) + cfi_offset (5, -8) + + .global __syscall_cancel_arch_start +__syscall_cancel_arch_start: + + move.l 20(%sp),%a0 + move.l (%a0),%d0 +#ifdef __mcoldfire__ + move.w %d0,%ccr + jeq 1f +#else + btst #TCB_CANCELED_BIT,%d0 + jne 1f +#endif + + move.l 48(%sp),%a0 + move.l 44(%sp),%d5 + move.l 40(%sp),%d4 + move.l 36(%sp),%d3 + move.l 32(%sp),%d2 + move.l 28(%sp),%d1 + move.l 24(%sp),%d0 + trap #0 + + .global __syscall_cancel_arch_end +__syscall_cancel_arch_end: + +#ifdef __mcoldfire__ + movem.l (%sp),#60 + lea (16,%sp),%sp +#else + movem.l (%sp)+,#60 +#endif + rts + +1: +#ifdef PIC + bsr.l __syscall_do_cancel +#else + jsr __syscall_do_cancel +#endif +END (__syscall_cancel_arch) +libc_hidden_def (__syscall_cancel_arch)