linux: Implement pipe in terms of __NR_pipe2

The syscall pipe2 was added in linux 2.6.27 and glibc requires linux
3.2.0.  The patch removes the arch-specific implementation for alpha,
ia64, mips, sh, and sparc which requires a different kernel ABI
than the usual one.

Checked on x86_64-linux-gnu and with a build for the affected ABIs.
This commit is contained in:
Adhemerval Zanella 2020-06-26 09:29:11 -03:00
parent 5b3e31e312
commit efc6b2dbc4
10 changed files with 3 additions and 221 deletions

View File

@ -1,30 +0,0 @@
/* Copyright (C) 1993-2021 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
<https://www.gnu.org/licenses/>. */
/* __pipe is a special syscall since it returns two values. */
#include <sysdep.h>
PSEUDO (__pipe, pipe, 0)
stl r0, 0(a0)
stl r1, 4(a0)
mov zero, v0
ret
PSEUDO_END(__pipe)
libc_hidden_def (__pipe)
weak_alias (__pipe, pipe)

View File

@ -1,31 +0,0 @@
/* Copyright (C) 1992-2021 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
<https://www.gnu.org/licenses/>. */
#include <sysdep.h>
SYSCALL__ (pipe, 1)
/* Plop in the two descriptors. */
sw v0, 0(a0)
sw v1, 4(a0)
/* Go out with a clean status. */
move v0, zero
j ra
PSEUDO_END(__pipe)
libc_hidden_def (__pipe)
weak_alias (__pipe, pipe)

View File

@ -1 +0,0 @@
#include <sysdeps/unix/alpha/pipe.S>

View File

@ -1,36 +0,0 @@
/* Copyright (C) 1999-2021 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
<https://www.gnu.org/licenses/>. */
/* __pipe is a special syscall since it returns two values. */
#include <sysdep.h>
ENTRY(__pipe)
.regstk 1,0,0,0
DO_CALL (SYS_ify (pipe))
cmp.ne p6,p0=-1,r10
;;
(p6) st4 [in0]=r8,4
(p6) mov ret0=0
;;
(p6) st4 [in0]=r9
(p6) ret
br.cond.spnt.few __syscall_error
PSEUDO_END(__pipe)
libc_hidden_def (__pipe)
weak_alias (__pipe, pipe)

View File

@ -1 +0,0 @@
#include <sysdeps/unix/mips/pipe.S>

View File

@ -1,4 +1,5 @@
/* Copyright (C) 2011-2021 Free Software Foundation, Inc.
/* Create create pipe. Linux generic version.
Copyright (C) 2021 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
@ -25,7 +26,7 @@
int
__pipe (int __pipedes[2])
{
return INLINE_SYSCALL (pipe2, 2, __pipedes, 0);
return INLINE_SYSCALL_CALL (pipe2, (int *) __pipedes, 0);
}
libc_hidden_def (__pipe)
weak_alias (__pipe, pipe)

View File

@ -1,42 +0,0 @@
/* Copyright (C) 1999-2021 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
<https://www.gnu.org/licenses/>. */
#include <sysdep.h>
ENTRY (__libc_pipe)
mov #+__NR_pipe, r3
trapa #0x10
mov r0, r3
mov #-12, r2
shad r2, r3
not r3, r3 // r1=0 means r0 = -1 to -4095
tst r3, r3 // i.e. error in linux
bt 1f
mov.l r0, @r4
mov.l r1, @(4, r4)
rts
mov #0, r0
1:
SYSCALL_ERROR_HANDLER
.Lpseudo_end:
rts
nop
PSEUDO_END (__libc_pipe)
weak_alias (__libc_pipe, __pipe)
libc_hidden_def (__pipe)
weak_alias (__libc_pipe, pipe)

View File

@ -1,38 +0,0 @@
/* Copyright (C) 1997-2021 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
<https://www.gnu.org/licenses/>. */
#include <sysdep.h>
.text
.globl __syscall_error
ENTRY(__libc_pipe)
mov %o0, %o2 /* Save PIPEDES. */
mov SYS_ify(pipe),%g1
ta 0x10
bcc 1f
mov %o7, %g1
call __syscall_error
mov %g1, %o7
1: st %o0, [%o2] /* PIPEDES[0] = %o0; */
st %o1, [%o2 + 4] /* PIPEDES[1] = %o1; */
retl
clr %o0
END(__libc_pipe)
weak_alias (__libc_pipe, __pipe)
libc_hidden_def (__pipe)
weak_alias (__libc_pipe, pipe)

View File

@ -1,39 +0,0 @@
/* Copyright (C) 1997-2021 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
<https://www.gnu.org/licenses/>. */
#include <sysdep.h>
.text
.globl __syscall_error
ENTRY(__libc_pipe)
mov %o0, %o2 /* Save PIPEDES. */
LOADSYSCALL(pipe)
ta 0x6d
bcc,pt %xcc, 1f
mov %o7, %g1
call __syscall_error
mov %g1, %o7
1: st %o0, [%o2] /* PIPEDES[0] = %o0; */
st %o1, [%o2 + 4] /* PIPEDES[1] = %o1; */
retl
clr %o0
END(__libc_pipe)
weak_alias (__libc_pipe, __pipe)
libc_hidden_def (__pipe)
weak_alias (__libc_pipe, pipe)

View File

@ -38,7 +38,6 @@ mount EXTRA mount i:sssUp __mount mount
munlock - munlock i:aU munlock
munlockall - munlockall i: munlockall
nfsservctl EXTRA nfsservctl i:ipp __compat_nfsservctl nfsservctl@GLIBC_2.0:GLIBC_2.28
pipe - pipe i:f __pipe pipe
pipe2 - pipe2 i:fi __pipe2 pipe2
pivot_root EXTRA pivot_root i:ss pivot_root
query_module EXTRA query_module i:sipip __compat_query_module query_module@GLIBC_2.0:GLIBC_2.23