Message ID | 20200403203201.7494-9-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | nptl: Fix Race conditions in pthread cancellation [BZ#12683] | expand |
03.04.2020 в 17:31:48 -0300 Adhemerval Zanella написал: > This patch adds the aarch64 modifications required for the BZ#12683 fix > by adding the arch-specific cancellation syscall bridge. > > Checked on aarch64-linux-gnu. > --- > sysdeps/aarch64/nptl/tcb-offsets.sym | 3 + > .../unix/sysv/linux/aarch64/syscall_cancel.S | 59 +++++++++++++++++++ > 2 files changed, 62 insertions(+) > create mode 100644 sysdeps/unix/sysv/linux/aarch64/syscall_cancel.S > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/aarch64/syscall_cancel.S > @@ -0,0 +1,59 @@ > +/* Cancellable syscall wrapper. Linux/AArch64 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 [r0] __syscall_cancel_arch (int *cancelhandling [r0], > + long int nr [r1], > + long int arg1 [r2], > + long int arg2 [r3], > + long int arg3 [SP], > + long int arg4 [SP+4], > + long int arg5 [SP+8], > + long int arg6 [SP+12]) */ Looks like this comment was copypasted from 32-bit arm. Texts in square brackets obviously do not correspond to reality. Starting from the fact that they imply that sizeof (long int) == 4. > + > +ENTRY (__syscall_cancel_arch) > + > + .globl __syscall_cancel_arch_start > +__syscall_cancel_arch_start: > + > + /* if (*cancelhandling & CANCELED_BITMASK) > + __syscall_do_cancel() */ > + ldr w0, [x0] > + tbnz w0, TCB_CANCELED_BIT, 1f > + > + /* Issue a 6 argument syscall, the nr [x1] being the syscall > + number. */ > + mov x8, x1 > + mov x0, x2 > + mov x1, x3 > + mov x2, x4 > + mov x3, x5 > + mov x4, x6 > + mov x5, x7 > + svc 0x0 > + > + .globl __syscall_cancel_arch_end > +__syscall_cancel_arch_end: > + ret > + > +1: > + b __syscall_do_cancel > + > +END (__syscall_cancel_arch) > +libc_hidden_def (__syscall_cancel_arch) > -- > 2.17.1 >
On 12/04/2020 12:29, Stepan Golosunov wrote: > 03.04.2020 в 17:31:48 -0300 Adhemerval Zanella написал: >> This patch adds the aarch64 modifications required for the BZ#12683 fix >> by adding the arch-specific cancellation syscall bridge. >> >> Checked on aarch64-linux-gnu. >> --- >> sysdeps/aarch64/nptl/tcb-offsets.sym | 3 + >> .../unix/sysv/linux/aarch64/syscall_cancel.S | 59 +++++++++++++++++++ >> 2 files changed, 62 insertions(+) >> create mode 100644 sysdeps/unix/sysv/linux/aarch64/syscall_cancel.S > >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/aarch64/syscall_cancel.S >> @@ -0,0 +1,59 @@ >> +/* Cancellable syscall wrapper. Linux/AArch64 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 [r0] __syscall_cancel_arch (int *cancelhandling [r0], >> + long int nr [r1], >> + long int arg1 [r2], >> + long int arg2 [r3], >> + long int arg3 [SP], >> + long int arg4 [SP+4], >> + long int arg5 [SP+8], >> + long int arg6 [SP+12]) */ > > Looks like this comment was copypasted from 32-bit arm. Texts in > square brackets obviously do not correspond to reality. Starting > from the fact that they imply that sizeof (long int) == 4. Ack, I have fixed the comment to the expected aarch64 ABI. Thanks for spotting it. > >> + >> +ENTRY (__syscall_cancel_arch) >> + >> + .globl __syscall_cancel_arch_start >> +__syscall_cancel_arch_start: >> + >> + /* if (*cancelhandling & CANCELED_BITMASK) >> + __syscall_do_cancel() */ >> + ldr w0, [x0] >> + tbnz w0, TCB_CANCELED_BIT, 1f >> + >> + /* Issue a 6 argument syscall, the nr [x1] being the syscall >> + number. */ >> + mov x8, x1 >> + mov x0, x2 >> + mov x1, x3 >> + mov x2, x4 >> + mov x3, x5 >> + mov x4, x6 >> + mov x5, x7 >> + svc 0x0 >> + >> + .globl __syscall_cancel_arch_end >> +__syscall_cancel_arch_end: >> + ret >> + >> +1: >> + b __syscall_do_cancel >> + >> +END (__syscall_cancel_arch) >> +libc_hidden_def (__syscall_cancel_arch) >> -- >> 2.17.1 >>
diff --git a/sysdeps/aarch64/nptl/tcb-offsets.sym b/sysdeps/aarch64/nptl/tcb-offsets.sym index 238647dd47..614ea23034 100644 --- a/sysdeps/aarch64/nptl/tcb-offsets.sym +++ b/sysdeps/aarch64/nptl/tcb-offsets.sym @@ -4,3 +4,6 @@ PTHREAD_MULTIPLE_THREADS_OFFSET offsetof (struct pthread, header.multiple_threads) PTHREAD_TID_OFFSET offsetof (struct pthread, tid) PTHREAD_SIZEOF sizeof (struct pthread) + +-- Not strictly offsets, used on syscall_cancel.S +TCB_CANCELED_BIT CANCELED_BIT diff --git a/sysdeps/unix/sysv/linux/aarch64/syscall_cancel.S b/sysdeps/unix/sysv/linux/aarch64/syscall_cancel.S new file mode 100644 index 0000000000..fcb7cf66bf --- /dev/null +++ b/sysdeps/unix/sysv/linux/aarch64/syscall_cancel.S @@ -0,0 +1,59 @@ +/* Cancellable syscall wrapper. Linux/AArch64 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 [r0] __syscall_cancel_arch (int *cancelhandling [r0], + long int nr [r1], + long int arg1 [r2], + long int arg2 [r3], + long int arg3 [SP], + long int arg4 [SP+4], + long int arg5 [SP+8], + long int arg6 [SP+12]) */ + +ENTRY (__syscall_cancel_arch) + + .globl __syscall_cancel_arch_start +__syscall_cancel_arch_start: + + /* if (*cancelhandling & CANCELED_BITMASK) + __syscall_do_cancel() */ + ldr w0, [x0] + tbnz w0, TCB_CANCELED_BIT, 1f + + /* Issue a 6 argument syscall, the nr [x1] being the syscall + number. */ + mov x8, x1 + mov x0, x2 + mov x1, x3 + mov x2, x4 + mov x3, x5 + mov x4, x6 + mov x5, x7 + svc 0x0 + + .globl __syscall_cancel_arch_end +__syscall_cancel_arch_end: + ret + +1: + b __syscall_do_cancel + +END (__syscall_cancel_arch) +libc_hidden_def (__syscall_cancel_arch)