[4/6] linux: Implement pipe in terms of __NR_pipe2

Message ID 20211122185437.1934590-5-adhemerval.zanella@linaro.org
State Committed
Commit efc6b2dbc47231dee7a7ac39beec808deb4e4d1f
Headers
Series linux: Some syscall refactors |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent

Commit Message

Adhemerval Zanella Nov. 22, 2021, 6:54 p.m. UTC
  It 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.
---
 sysdeps/unix/alpha/pipe.S                    | 30 --------------
 sysdeps/unix/mips/pipe.S                     | 31 ---------------
 sysdeps/unix/sysv/linux/alpha/pipe.S         |  1 -
 sysdeps/unix/sysv/linux/ia64/pipe.S          | 36 -----------------
 sysdeps/unix/sysv/linux/mips/pipe.S          |  1 -
 sysdeps/unix/sysv/linux/{generic => }/pipe.c |  5 ++-
 sysdeps/unix/sysv/linux/sh/pipe.S            | 42 --------------------
 sysdeps/unix/sysv/linux/sparc/sparc32/pipe.S | 38 ------------------
 sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S | 39 ------------------
 sysdeps/unix/sysv/linux/syscalls.list        |  1 -
 10 files changed, 3 insertions(+), 221 deletions(-)
 delete mode 100644 sysdeps/unix/alpha/pipe.S
 delete mode 100644 sysdeps/unix/mips/pipe.S
 delete mode 100644 sysdeps/unix/sysv/linux/alpha/pipe.S
 delete mode 100644 sysdeps/unix/sysv/linux/ia64/pipe.S
 delete mode 100644 sysdeps/unix/sysv/linux/mips/pipe.S
 rename sysdeps/unix/sysv/linux/{generic => }/pipe.c (87%)
 delete mode 100644 sysdeps/unix/sysv/linux/sh/pipe.S
 delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/pipe.S
 delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S
  

Comments

Stafford Horne Nov. 26, 2021, 11:03 p.m. UTC | #1
On Mon, Nov 22, 2021 at 03:54:35PM -0300, Adhemerval Zanella wrote:
> It 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.
> ---
>  sysdeps/unix/alpha/pipe.S                    | 30 --------------
>  sysdeps/unix/mips/pipe.S                     | 31 ---------------
>  sysdeps/unix/sysv/linux/alpha/pipe.S         |  1 -
>  sysdeps/unix/sysv/linux/ia64/pipe.S          | 36 -----------------
>  sysdeps/unix/sysv/linux/mips/pipe.S          |  1 -
>  sysdeps/unix/sysv/linux/{generic => }/pipe.c |  5 ++-
>  sysdeps/unix/sysv/linux/sh/pipe.S            | 42 --------------------
>  sysdeps/unix/sysv/linux/sparc/sparc32/pipe.S | 38 ------------------
>  sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S | 39 ------------------
>  sysdeps/unix/sysv/linux/syscalls.list        |  1 -
>  10 files changed, 3 insertions(+), 221 deletions(-)
>  delete mode 100644 sysdeps/unix/alpha/pipe.S
>  delete mode 100644 sysdeps/unix/mips/pipe.S
>  delete mode 100644 sysdeps/unix/sysv/linux/alpha/pipe.S
>  delete mode 100644 sysdeps/unix/sysv/linux/ia64/pipe.S
>  delete mode 100644 sysdeps/unix/sysv/linux/mips/pipe.S
>  rename sysdeps/unix/sysv/linux/{generic => }/pipe.c (87%)
>  delete mode 100644 sysdeps/unix/sysv/linux/sh/pipe.S
>  delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/pipe.S
>  delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S

This patch all looks good to me.

We might want to mention in the commit message that this is allowed because:

The syscall pipe2 was added in linux 2.6.27 and glibc requires linux 3.2.0.

For reference, these patches set the tree wided minimum required version most
recently.  I dont know what it was before but its fare to say using pipe2 is
safe.

    2016: 5b4ecd3f95 ("Require Linux 3.2 except on x86 / x86_64, 3.2 headers everywhere.").
    2017: 139ace9575 ("Require Linux kernel 3.2 or later on x86 / x86_64.").

-Stafford
  
Adhemerval Zanella Nov. 30, 2021, 2:53 p.m. UTC | #2
On 26/11/2021 20:03, Stafford Horne wrote:
> On Mon, Nov 22, 2021 at 03:54:35PM -0300, Adhemerval Zanella wrote:
>> It 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.
>> ---
>>  sysdeps/unix/alpha/pipe.S                    | 30 --------------
>>  sysdeps/unix/mips/pipe.S                     | 31 ---------------
>>  sysdeps/unix/sysv/linux/alpha/pipe.S         |  1 -
>>  sysdeps/unix/sysv/linux/ia64/pipe.S          | 36 -----------------
>>  sysdeps/unix/sysv/linux/mips/pipe.S          |  1 -
>>  sysdeps/unix/sysv/linux/{generic => }/pipe.c |  5 ++-
>>  sysdeps/unix/sysv/linux/sh/pipe.S            | 42 --------------------
>>  sysdeps/unix/sysv/linux/sparc/sparc32/pipe.S | 38 ------------------
>>  sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S | 39 ------------------
>>  sysdeps/unix/sysv/linux/syscalls.list        |  1 -
>>  10 files changed, 3 insertions(+), 221 deletions(-)
>>  delete mode 100644 sysdeps/unix/alpha/pipe.S
>>  delete mode 100644 sysdeps/unix/mips/pipe.S
>>  delete mode 100644 sysdeps/unix/sysv/linux/alpha/pipe.S
>>  delete mode 100644 sysdeps/unix/sysv/linux/ia64/pipe.S
>>  delete mode 100644 sysdeps/unix/sysv/linux/mips/pipe.S
>>  rename sysdeps/unix/sysv/linux/{generic => }/pipe.c (87%)
>>  delete mode 100644 sysdeps/unix/sysv/linux/sh/pipe.S
>>  delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/pipe.S
>>  delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S
> 
> This patch all looks good to me.
> 
> We might want to mention in the commit message that this is allowed because:
> 
> The syscall pipe2 was added in linux 2.6.27 and glibc requires linux 3.2.0.

Ack.

> 
> For reference, these patches set the tree wided minimum required version most
> recently.  I dont know what it was before but its fare to say using pipe2 is
> safe.
> 
>     2016: 5b4ecd3f95 ("Require Linux 3.2 except on x86 / x86_64, 3.2 headers everywhere.").
>     2017: 139ace9575 ("Require Linux kernel 3.2 or later on x86 / x86_64.").
> 
> -Stafford
>
  

Patch

diff --git a/sysdeps/unix/alpha/pipe.S b/sysdeps/unix/alpha/pipe.S
deleted file mode 100644
index 45944535cd..0000000000
--- a/sysdeps/unix/alpha/pipe.S
+++ /dev/null
@@ -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)
diff --git a/sysdeps/unix/mips/pipe.S b/sysdeps/unix/mips/pipe.S
deleted file mode 100644
index 6fbea01d44..0000000000
--- a/sysdeps/unix/mips/pipe.S
+++ /dev/null
@@ -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)
diff --git a/sysdeps/unix/sysv/linux/alpha/pipe.S b/sysdeps/unix/sysv/linux/alpha/pipe.S
deleted file mode 100644
index 1e7ec1c199..0000000000
--- a/sysdeps/unix/sysv/linux/alpha/pipe.S
+++ /dev/null
@@ -1 +0,0 @@ 
-#include <sysdeps/unix/alpha/pipe.S>
diff --git a/sysdeps/unix/sysv/linux/ia64/pipe.S b/sysdeps/unix/sysv/linux/ia64/pipe.S
deleted file mode 100644
index ffda712920..0000000000
--- a/sysdeps/unix/sysv/linux/ia64/pipe.S
+++ /dev/null
@@ -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)
diff --git a/sysdeps/unix/sysv/linux/mips/pipe.S b/sysdeps/unix/sysv/linux/mips/pipe.S
deleted file mode 100644
index 1708888da4..0000000000
--- a/sysdeps/unix/sysv/linux/mips/pipe.S
+++ /dev/null
@@ -1 +0,0 @@ 
-#include <sysdeps/unix/mips/pipe.S>
diff --git a/sysdeps/unix/sysv/linux/generic/pipe.c b/sysdeps/unix/sysv/linux/pipe.c
similarity index 87%
rename from sysdeps/unix/sysv/linux/generic/pipe.c
rename to sysdeps/unix/sysv/linux/pipe.c
index a73a4e89fc..c873bed11a 100644
--- a/sysdeps/unix/sysv/linux/generic/pipe.c
+++ b/sysdeps/unix/sysv/linux/pipe.c
@@ -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)
diff --git a/sysdeps/unix/sysv/linux/sh/pipe.S b/sysdeps/unix/sysv/linux/sh/pipe.S
deleted file mode 100644
index 0f3eb16588..0000000000
--- a/sysdeps/unix/sysv/linux/sh/pipe.S
+++ /dev/null
@@ -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)
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/pipe.S b/sysdeps/unix/sysv/linux/sparc/sparc32/pipe.S
deleted file mode 100644
index 0fa155fa61..0000000000
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/pipe.S
+++ /dev/null
@@ -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)
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S b/sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S
deleted file mode 100644
index da6ea71729..0000000000
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S
+++ /dev/null
@@ -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)
diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list
index 2acd7551d3..8a32b354a9 100644
--- a/sysdeps/unix/sysv/linux/syscalls.list
+++ b/sysdeps/unix/sysv/linux/syscalls.list
@@ -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