diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2015-05-22 08:36:08 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2015-05-22 17:38:06 -0300 |
commit | 60dce8b9044155bb04eb310fb0fc5e9607b7d2e6 (patch) | |
tree | ec738d9f4b5f573b77f9af4eca3d2cf4c6cdca44 /sysdeps | |
parent | dc6b5aed1b406a53c4512d355376b4e12c7da971 (diff) | |
download | glibc-60dce8b9044155bb04eb310fb0fc5e9607b7d2e6.tar.gz glibc-60dce8b9044155bb04eb310fb0fc5e9607b7d2e6.tar.xz glibc-60dce8b9044155bb04eb310fb0fc5e9607b7d2e6.zip |
Remove socket.S implementation
This patch removes the socket.S implementation for all ports and replace it by a C implementation using socketcall. For ports that implement the syscall directly, there is no change. The patch idea is to simplify the socket function implementation that uses the socketcall to be based on C implemetation instead of a pseudo assembly implementation with arch specific parts. The patch then remove the assembly implementatation for the ports which uses socketcall (i386, microblaze, mips, powerpc, sparc, m68k, s390 and sh). I have cross-build GLIBC for afore-mentioned ports and tested on both i386 and ppc32 without regressions.
Diffstat (limited to 'sysdeps')
61 files changed, 609 insertions, 1718 deletions
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index c26a12fa11..bfbabd4b4b 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -11,10 +11,6 @@ ifeq ($(subdir),malloc) CFLAGS-malloc.c += -DMORECORE_CLEARS=2 endif -ifeq ($(subdir),socket) -sysdep_routines += internal_accept4 internal_recvmmsg internal_sendmmsg -endif - ifeq ($(subdir),misc) include $(firstword $(wildcard $(sysdirs:=/sysctl.mk))) diff --git a/sysdeps/unix/sysv/linux/accept.S b/sysdeps/unix/sysv/linux/accept.S deleted file mode 100644 index 491ebe2ab2..0000000000 --- a/sysdeps/unix/sysv/linux/accept.S +++ /dev/null @@ -1,6 +0,0 @@ -#define socket accept -#define __socket __libc_accept -#define NARGS 3 -#define NEED_CANCELLATION -#include <socket.S> -libc_hidden_def (accept) diff --git a/sysdeps/unix/sysv/linux/accept.c b/sysdeps/unix/sysv/linux/accept.c new file mode 100644 index 0000000000..72d42a7d85 --- /dev/null +++ b/sysdeps/unix/sysv/linux/accept.c @@ -0,0 +1,31 @@ +/* Copyright (C) 2015 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 <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <sysdep-cancel.h> +#include <socketcall.h> + +int +__libc_accept (int fd, __SOCKADDR_ARG addr, socklen_t *len) +{ + return SOCKETCALL_CANCEL (accept, fd, addr.__sockaddr__, len); +} +weak_alias (__libc_accept, accept) +libc_hidden_def (accept) diff --git a/sysdeps/unix/sysv/linux/accept4.c b/sysdeps/unix/sysv/linux/accept4.c index 5dbcef3ef0..ec6b4c236d 100644 --- a/sysdeps/unix/sysv/linux/accept4.c +++ b/sysdeps/unix/sysv/linux/accept4.c @@ -50,11 +50,14 @@ accept4 (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags) return result; } #elif defined __NR_socketcall -# ifndef __ASSUME_ACCEPT4_SOCKETCALL -extern int __internal_accept4 (int fd, __SOCKADDR_ARG addr, - socklen_t *addr_len, int flags) - attribute_hidden; - +# include <socketcall.h> +# ifdef __ASSUME_ACCEPT4_SOCKETCALL +int +accept4 (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags) +{ + return SOCKETCALL_CANCEL (accept4, fd, addr.__sockaddr__, addr_len, flags); +} +# else static int have_accept4; int @@ -62,7 +65,8 @@ accept4 (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags) { if (__glibc_likely (have_accept4 >= 0)) { - int ret = __internal_accept4 (fd, addr, addr_len, flags); + int ret = SOCKETCALL_CANCEL (accept4, fd, addr.__sockaddr__, addr_len, + flags); /* The kernel returns -EINVAL for unknown socket operations. We need to convert that error to an ENOSYS error. */ if (__builtin_expect (ret < 0, 0) @@ -72,7 +76,7 @@ accept4 (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags) /* Try another call, this time with the FLAGS parameter cleared and an invalid file descriptor. This call will not cause any harm and it will return immediately. */ - ret = __internal_accept4 (-1, addr, addr_len, 0); + ret = SOCKETCALL_CANCEL (invalid, -1); if (errno == EINVAL) { have_accept4 = -1; @@ -90,11 +94,8 @@ accept4 (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags) __set_errno (ENOSYS); return -1; } -# else -/* When __ASSUME_ACCEPT4_SOCKETCALL accept4 is defined in - internal_accept4.S. */ -# endif -#else +# endif /* __ASSUME_ACCEPT4_SOCKETCALL */ +#else /* __NR_socketcall */ int accept4 (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags) { diff --git a/sysdeps/unix/sysv/linux/arm/internal_accept4.S b/sysdeps/unix/sysv/linux/arm/internal_accept4.S deleted file mode 100644 index eeb5f50a26..0000000000 --- a/sysdeps/unix/sysv/linux/arm/internal_accept4.S +++ /dev/null @@ -1,6 +0,0 @@ -/* Tag_ABI_align8_preserved: This code preserves 8-byte - alignment in any callee. */ - .eabi_attribute 25, 1 -/* Tag_ABI_align8_needed: This code may require 8-byte alignment from - the caller. */ - .eabi_attribute 24, 1 diff --git a/sysdeps/unix/sysv/linux/arm/internal_recvmmsg.S b/sysdeps/unix/sysv/linux/arm/internal_recvmmsg.S deleted file mode 100644 index eeb5f50a26..0000000000 --- a/sysdeps/unix/sysv/linux/arm/internal_recvmmsg.S +++ /dev/null @@ -1,6 +0,0 @@ -/* Tag_ABI_align8_preserved: This code preserves 8-byte - alignment in any callee. */ - .eabi_attribute 25, 1 -/* Tag_ABI_align8_needed: This code may require 8-byte alignment from - the caller. */ - .eabi_attribute 24, 1 diff --git a/sysdeps/unix/sysv/linux/arm/internal_sendmmsg.S b/sysdeps/unix/sysv/linux/arm/internal_sendmmsg.S deleted file mode 100644 index eeb5f50a26..0000000000 --- a/sysdeps/unix/sysv/linux/arm/internal_sendmmsg.S +++ /dev/null @@ -1,6 +0,0 @@ -/* Tag_ABI_align8_preserved: This code preserves 8-byte - alignment in any callee. */ - .eabi_attribute 25, 1 -/* Tag_ABI_align8_needed: This code may require 8-byte alignment from - the caller. */ - .eabi_attribute 24, 1 diff --git a/sysdeps/unix/sysv/linux/bind.S b/sysdeps/unix/sysv/linux/bind.S deleted file mode 100644 index 61fb5ebff8..0000000000 --- a/sysdeps/unix/sysv/linux/bind.S +++ /dev/null @@ -1,3 +0,0 @@ -#define socket bind -#define NARGS 3 -#include <socket.S> diff --git a/sysdeps/unix/sysv/linux/bind.c b/sysdeps/unix/sysv/linux/bind.c new file mode 100644 index 0000000000..db72df6c77 --- /dev/null +++ b/sysdeps/unix/sysv/linux/bind.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2015 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 <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <socketcall.h> + +int +__bind (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) +{ + return SOCKETCALL (bind, fd, addr.__sockaddr__, len, 0, 0, 0); +} +weak_alias (__bind, bind) diff --git a/sysdeps/unix/sysv/linux/connect.S b/sysdeps/unix/sysv/linux/connect.S deleted file mode 100644 index 21fc4a64c9..0000000000 --- a/sysdeps/unix/sysv/linux/connect.S +++ /dev/null @@ -1,7 +0,0 @@ -#define socket connect -#define __socket __libc_connect -#define NARGS 3 -#define NEED_CANCELLATION -#include <socket.S> -weak_alias (__libc_connect, __connect) -libc_hidden_weak (__connect) diff --git a/sysdeps/unix/sysv/linux/connect.c b/sysdeps/unix/sysv/linux/connect.c new file mode 100644 index 0000000000..dd17e8ca97 --- /dev/null +++ b/sysdeps/unix/sysv/linux/connect.c @@ -0,0 +1,32 @@ +/* Copyright (C) 2015 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 <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <sysdep-cancel.h> +#include <socketcall.h> + +int +__libc_connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) +{ + return SOCKETCALL_CANCEL (connect, fd, addr.__sockaddr__, len); +} +weak_alias (__libc_connect, connect) +weak_alias (__libc_connect, __connect) +libc_hidden_weak (__connect) diff --git a/sysdeps/unix/sysv/linux/getpeername.S b/sysdeps/unix/sysv/linux/getpeername.S deleted file mode 100644 index a6d8e86d4e..0000000000 --- a/sysdeps/unix/sysv/linux/getpeername.S +++ /dev/null @@ -1,3 +0,0 @@ -#define socket getpeername -#define NARGS 3 -#include <socket.S> diff --git a/sysdeps/unix/sysv/linux/getpeername.c b/sysdeps/unix/sysv/linux/getpeername.c new file mode 100644 index 0000000000..05fd2e8e31 --- /dev/null +++ b/sysdeps/unix/sysv/linux/getpeername.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2015 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 <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <socketcall.h> + +int +__getpeername (int fd, __SOCKADDR_ARG addr, socklen_t *len) +{ + return SOCKETCALL (getpeername, fd, addr.__sockaddr__, len); +} +weak_alias (__getpeername, getpeername) diff --git a/sysdeps/unix/sysv/linux/getsockname.S b/sysdeps/unix/sysv/linux/getsockname.S deleted file mode 100644 index c138be9da5..0000000000 --- a/sysdeps/unix/sysv/linux/getsockname.S +++ /dev/null @@ -1,3 +0,0 @@ -#define socket getsockname -#define NARGS 3 -#include <socket.S> diff --git a/sysdeps/unix/sysv/linux/getsockname.c b/sysdeps/unix/sysv/linux/getsockname.c new file mode 100644 index 0000000000..6c84acec25 --- /dev/null +++ b/sysdeps/unix/sysv/linux/getsockname.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2015 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 <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <socketcall.h> + +int +__getsockname (int fd, __SOCKADDR_ARG addr, socklen_t *len) +{ + return SOCKETCALL (getsockname, fd, addr.__sockaddr__, len); +} +weak_alias (__getsockname, getsockname) diff --git a/sysdeps/unix/sysv/linux/getsockopt.S b/sysdeps/unix/sysv/linux/getsockopt.S deleted file mode 100644 index 6f982082ae..0000000000 --- a/sysdeps/unix/sysv/linux/getsockopt.S +++ /dev/null @@ -1,3 +0,0 @@ -#define socket getsockopt -#define NARGS 5 -#include <socket.S> diff --git a/sysdeps/unix/sysv/linux/getsockopt.c b/sysdeps/unix/sysv/linux/getsockopt.c new file mode 100644 index 0000000000..ba5681b410 --- /dev/null +++ b/sysdeps/unix/sysv/linux/getsockopt.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2015 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 <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <socketcall.h> + +int +__getsockopt (int fd, int level, int optname, void *optval, socklen_t *len) +{ + return SOCKETCALL (getsockopt, fd, level, optname, optval, len); +} +weak_alias (__getsockopt, getsockopt) diff --git a/sysdeps/unix/sysv/linux/hppa/socket.S b/sysdeps/unix/sysv/linux/hppa/socket.S deleted file mode 100644 index dfbb721a82..0000000000 --- a/sysdeps/unix/sysv/linux/hppa/socket.S +++ /dev/null @@ -1,10 +0,0 @@ -#include <sysdep.h> - - .globl __socket -PSEUDO(__socket, socket, 3) - -PSEUDO_END(__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif diff --git a/sysdeps/unix/sysv/linux/i386/accept4.S b/sysdeps/unix/sysv/linux/i386/accept4.S deleted file mode 100644 index 6ed8395d09..0000000000 --- a/sysdeps/unix/sysv/linux/i386/accept4.S +++ /dev/null @@ -1,177 +0,0 @@ -/* Copyright (C) 1995-2015 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-cancel.h> -#include <socketcall.h> -#include <tls.h> -#include <kernel-features.h> - -#define EINVAL 22 -#define ENOSYS 38 - -#ifdef __ASSUME_ACCEPT4_SOCKETCALL -# define errlabel SYSCALL_ERROR_LABEL -#else -# define errlabel .Lerr - .data -have_accept4: - .long 0 -#endif - - .text -/* The socket-oriented system calls are handled unusally in Linux/i386. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. */ - -.globl __libc_accept4 -ENTRY (__libc_accept4) -#ifdef CENABLE - SINGLE_THREAD_P - jne 1f -#endif - - /* Save registers. */ - movl %ebx, %edx - cfi_register (3, 2) - - movl $SYS_ify(socketcall), %eax /* System call number in %eax. */ - - movl $SOCKOP_accept4, %ebx /* Subcode is first arg to syscall. */ - lea 4(%esp), %ecx /* Address of args is 2nd arg. */ - - /* Do the system call trap. */ - ENTER_KERNEL - - /* Restore registers. */ - movl %edx, %ebx - cfi_restore (3) - - /* %eax is < 0 if there was an error. */ - cmpl $-125, %eax - jae errlabel - - /* Successful; return the syscall's value. */ - ret - - -#ifdef CENABLE - /* We need one more register. */ -1: pushl %esi - cfi_adjust_cfa_offset(4) - - /* Enable asynchronous cancellation. */ - CENABLE - movl %eax, %esi - cfi_offset(6, -8) /* %esi */ - - /* Save registers. */ - movl %ebx, %edx - cfi_register (3, 2) - - movl $SYS_ify(socketcall), %eax /* System call number in %eax. */ - - movl $SOCKOP_accept4, %ebx /* Subcode is first arg to syscall. */ - lea 8(%esp), %ecx /* Address of args is 2nd arg. */ - - /* Do the system call trap. */ - ENTER_KERNEL - - /* Restore registers. */ - movl %edx, %ebx - cfi_restore (3) - - /* Restore the cancellation. */ - xchgl %esi, %eax - CDISABLE - - /* Restore registers. */ - movl %esi, %eax - popl %esi - cfi_restore (6) - cfi_adjust_cfa_offset(-4) - - /* %eax is < 0 if there was an error. */ - cmpl $-125, %eax - jae errlabel - - /* Successful; return the syscall's value. */ - ret -#endif - -#ifndef __ASSUME_ACCEPT4_SOCKETCALL - /* The kernel returns -EINVAL for unknown socket operations. - We need to convert that error to an ENOSYS error. */ -.Lerr: cmpl $-EINVAL, %eax - jne SYSCALL_ERROR_LABEL - - /* Save registers. */ - pushl %ebx - cfi_adjust_cfa_offset(4) - cfi_offset(ebx, -8) - -# ifdef PIC - SETUP_PIC_REG (dx) - addl $_GLOBAL_OFFSET_TABLE_, %edx - movl have_accept4@GOTOFF(%edx), %eax -# else - movl have_accept4, %eax -# endif - testl %eax, %eax - jne 1f - - /* Try another call, this time with the FLAGS parameter - cleared and an invalid file descriptor. This call will not - cause any harm and it will return immediately. */ - movl $-1, 8(%esp) - movl $0, 20(%esp) - - movl $SYS_ify(socketcall), %eax /* System call number in %eax. */ - - movl $SOCKOP_accept4, %ebx /* Subcode is first arg to syscall. */ - lea 8(%esp), %ecx /* Address of args is 2nd arg. */ - - /* Do the system call trap. */ - ENTER_KERNEL - - cmpl $-EINVAL, %eax - movl $-1, %eax - je 3f - movl $1, %eax -3: -# ifdef PIC - movl %eax, have_accept4@GOTOFF(%edx) -# else - movl %eax, have_accept4 -# endif - - testl %eax, %eax - -1: movl $-EINVAL, %eax - jns 2f - movl $-ENOSYS, %eax - - /* Restore registers. */ -2: popl %ebx - cfi_restore (ebx) - - jmp SYSCALL_ERROR_LABEL -#endif -PSEUDO_END (__libc_accept4) - -weak_alias (__libc_accept4, accept4) diff --git a/sysdeps/unix/sysv/linux/i386/internal_accept4.S b/sysdeps/unix/sysv/linux/i386/internal_accept4.S deleted file mode 100644 index c3f1630494..0000000000 --- a/sysdeps/unix/sysv/linux/i386/internal_accept4.S +++ /dev/null @@ -1 +0,0 @@ -/* Not needed, accept4.S has everything. */ diff --git a/sysdeps/unix/sysv/linux/i386/socket.S b/sysdeps/unix/sysv/linux/i386/socket.S deleted file mode 100644 index d87390c662..0000000000 --- a/sysdeps/unix/sysv/linux/i386/socket.S +++ /dev/null @@ -1,122 +0,0 @@ -/* Copyright (C) 1995-2015 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-cancel.h> -#include <socketcall.h> -#include <tls.h> - -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - - .text -/* The socket-oriented system calls are handled unusally in Linux/i386. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. */ - -#ifndef __socket -# ifndef NO_WEAK_ALIAS -# define __socket P(__,socket) -# else -# define __socket socket -# endif -#endif - -.globl __socket -ENTRY (__socket) -#if defined NEED_CANCELLATION && defined CENABLE - SINGLE_THREAD_P - jne 1f -#endif - - /* Save registers. */ - movl %ebx, %edx - cfi_register (3, 2) - - movl $SYS_ify(socketcall), %eax /* System call number in %eax. */ - - /* Use ## so `socket' is a separate token that might be #define'd. */ - movl $P(SOCKOP_,socket), %ebx /* Subcode is first arg to syscall. */ - lea 4(%esp), %ecx /* Address of args is 2nd arg. */ - - /* Do the system call trap. */ - ENTER_KERNEL - - /* Restore registers. */ - movl %edx, %ebx - cfi_restore (3) - - /* %eax is < 0 if there was an error. */ - cmpl $-125, %eax - jae SYSCALL_ERROR_LABEL - - /* Successful; return the syscall's value. */ - ret - - -#if defined NEED_CANCELLATION && defined CENABLE - /* We need one more register. */ -1: pushl %esi - cfi_adjust_cfa_offset(4) - - /* Enable asynchronous cancellation. */ - CENABLE - movl %eax, %esi - cfi_offset(6, -8) /* %esi */ - - /* Save registers. */ - movl %ebx, %edx - cfi_register (3, 2) - - movl $SYS_ify(socketcall), %eax /* System call number in %eax. */ - - /* Use ## so `socket' is a separate token that might be #define'd. */ - movl $P(SOCKOP_,socket), %ebx /* Subcode is first arg to syscall. */ - lea 8(%esp), %ecx /* Address of args is 2nd arg. */ - - /* Do the system call trap. */ - ENTER_KERNEL - - /* Restore registers. */ - movl %edx, %ebx - cfi_restore (3) - - /* Restore the cancellation. */ - xchgl %esi, %eax - CDISABLE - - /* Restore registers. */ - movl %esi, %eax - popl %esi - cfi_restore (6) - cfi_adjust_cfa_offset(-4) - - /* %eax is < 0 if there was an error. */ - cmpl $-125, %eax - jae SYSCALL_ERROR_LABEL - - /* Successful; return the syscall's value. */ - ret -#endif -PSEUDO_END (__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif diff --git a/sysdeps/unix/sysv/linux/internal_accept4.S b/sysdeps/unix/sysv/linux/internal_accept4.S deleted file mode 100644 index f0c61b55b1..0000000000 --- a/sysdeps/unix/sysv/linux/internal_accept4.S +++ /dev/null @@ -1,24 +0,0 @@ -#include <kernel-features.h> -#include <sys/syscall.h> - -/* Do not use the accept4 syscall on socketcall architectures unless - it was added at the same time as the socketcall support or can be - assumed to be present. */ -#if defined __ASSUME_SOCKETCALL \ - && !defined __ASSUME_ACCEPT4_SYSCALL_WITH_SOCKETCALL \ - && !defined __ASSUME_ACCEPT4_SYSCALL -# undef __NR_accept4 -#endif - -#if !defined __NR_accept4 && defined __NR_socketcall -# define socket accept4 -# ifdef __ASSUME_ACCEPT4_SOCKETCALL -# define __socket accept4 -# else -# define __socket __internal_accept4 -# endif -# define NARGS 4 -# define NEED_CANCELLATION -# define NO_WEAK_ALIAS -# include <socket.S> -#endif diff --git a/sysdeps/unix/sysv/linux/internal_recvmmsg.S b/sysdeps/unix/sysv/linux/internal_recvmmsg.S deleted file mode 100644 index 6b776b9d6a..0000000000 --- a/sysdeps/unix/sysv/linux/internal_recvmmsg.S +++ /dev/null @@ -1,24 +0,0 @@ -#include <kernel-features.h> -#include <sys/syscall.h> - -/* Do not use the recvmmsg syscall on socketcall architectures unless - it was added at the same time as the socketcall support or can be - assumed to be present. */ -#if defined __ASSUME_SOCKETCALL \ - && !defined __ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL \ - && !defined __ASSUME_RECVMMSG_SYSCALL -# undef __NR_recvmmsg -#endif - -#if !defined __NR_recvmmsg && defined __NR_socketcall -# define socket recvmmsg -# ifdef __ASSUME_RECVMMSG_SOCKETCALL -# define __socket recvmmsg -# else -# define __socket __internal_recvmmsg -# endif -# define NARGS 5 -# define NEED_CANCELLATION -# define NO_WEAK_ALIAS -# include <socket.S> -#endif diff --git a/sysdeps/unix/sysv/linux/internal_sendmmsg.S b/sysdeps/unix/sysv/linux/internal_sendmmsg.S deleted file mode 100644 index 4d903ea729..0000000000 --- a/sysdeps/unix/sysv/linux/internal_sendmmsg.S +++ /dev/null @@ -1,25 +0,0 @@ -#include <kernel-features.h> -#include <sys/syscall.h> - -/* Do not use the sendmmsg syscall on socketcall architectures unless - it was added at the same time as the socketcall support or can be - assumed to be present. */ -#if defined __ASSUME_SOCKETCALL \ - && !defined __ASSUME_SENDMMSG_SYSCALL_WITH_SOCKETCALL \ - && !defined __ASSUME_SENDMMSG_SYSCALL -# undef __NR_sendmmsg -#endif - -#if !defined __NR_sendmmsg && defined __NR_socketcall -# define socket sendmmsg -# ifndef __ASSUME_SENDMMSG_SOCKETCALL -# define __socket __internal_sendmmsg -# define NO_WEAK_ALIAS -# endif -# define NARGS 4 -# define NEED_CANCELLATION -# include <socket.S> -# ifdef __ASSUME_SENDMMSG_SOCKETCALL -libc_hidden_def (__sendmmsg) -# endif -#endif diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h index 2ca6f101ec..8f09459b1c 100644 --- a/sysdeps/unix/sysv/linux/kernel-features.h +++ b/sysdeps/unix/sysv/linux/kernel-features.h @@ -41,9 +41,8 @@ #define __ASSUME_SENDFILE 1 /* Some architectures use the socketcall multiplexer for some or all - socket-related operations, via a socket.S file in glibc, instead of - separate syscalls. __ASSUME_SOCKETCALL is defined for such - architectures. */ + socket-related operations instead of separate syscalls. + __ASSUME_SOCKETCALL is defined for such architectures. */ /* Linux 2.3.39 introduced IPC64. Except for powerpc. Linux 2.4.0 on PPC introduced a correct IPC64. But PowerPC64 does not support a diff --git a/sysdeps/unix/sysv/linux/listen.S b/sysdeps/unix/sysv/linux/listen.S deleted file mode 100644 index bed6a05f25..0000000000 --- a/sysdeps/unix/sysv/linux/listen.S +++ /dev/null @@ -1,5 +0,0 @@ -#define socket listen -#define NARGS 2 -#define NO_WEAK_ALIAS 1 -#include <socket.S> -weak_alias (listen, __listen) diff --git a/sysdeps/unix/sysv/linux/listen.c b/sysdeps/unix/sysv/linux/listen.c new file mode 100644 index 0000000000..2e387a492c --- /dev/null +++ b/sysdeps/unix/sysv/linux/listen.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2015 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 <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <socketcall.h> + +int +listen (int fd, int backlog) +{ + return SOCKETCALL (listen, fd, backlog); +} +weak_alias (listen, __listen); diff --git a/sysdeps/unix/sysv/linux/m68k/socket.S b/sysdeps/unix/sysv/linux/m68k/socket.S deleted file mode 100644 index c1dc14c2fd..0000000000 --- a/sysdeps/unix/sysv/linux/m68k/socket.S +++ /dev/null @@ -1,122 +0,0 @@ -/* Copyright (C) 1996-2015 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-cancel.h> -#include <socketcall.h> - -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - - .text -/* The socket-oriented system calls are handled unusally in Linux. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. */ - -#ifndef __socket -#ifndef NO_WEAK_ALIAS -#define __socket P(__,socket) -#else -#define __socket socket -#endif -#endif - -.globl __socket -ENTRY (__socket) -#ifdef NEED_CANCELLATION -# if !defined CENABLE || !defined CDISABLE -# error CENABLE and/or CDISABLE is not defined -# endif - SINGLE_THREAD_P - jne 1f -#endif - - /* Save registers. */ - move.l %d2, %a0 - cfi_register (%d2, %a0) - - move.l #SYS_ify (socketcall), %d0 /* System call number in %d0. */ - - /* Use ## so `socket' is a separate token that might be #define'd. */ - move.l #P (SOCKOP_,socket), %d1 /* Subcode is first arg to syscall. */ - lea 4(%sp), %a1 /* Address of args is 2nd arg. */ - move.l %a1, %d2 - - /* Do the system call trap. */ - trap #0 - - /* Restore registers. */ - move.l %a0, %d2 - cfi_restore (%d2) - - /* %d0 is < 0 if there was an error. */ - tst.l %d0 - jmi SYSCALL_ERROR_LABEL - - /* Successful; return the syscall's value. */ - rts - -#ifdef NEED_CANCELLATION -1: /* Enable asynchronous cancellation. */ - CENABLE - - /* Save D2. */ - move.l %d2, -(%sp) - cfi_adjust_cfa_offset (4) - cfi_rel_offset (%d2, 0) - - /* Save the result of CENABLE. */ - move.l %d0, -(%sp) - cfi_adjust_cfa_offset (4) - - /* Use ## so `socket' is a separate token that might be #define'd. */ - move.l #P (SOCKOP_,socket), %d1 /* Subcode is first arg to syscall. */ - lea 4+8(%sp), %a1 /* Address of args is 2nd arg. */ - move.l %a1, %d2 - - move.l #SYS_ify (socketcall), %d0 /* System call number in %d0. */ - /* Do the system call trap. */ - trap #0 - - /* Restore cancellation. */ - move.l %d0, %d2 - CDISABLE - addq.l #4, %sp - cfi_adjust_cfa_offset (-4) - move.l %d2, %d0 - - /* Restore registers. */ - move.l (%sp)+, %d2 - cfi_adjust_cfa_offset (-4) - cfi_restore (%d2) - - /* %d0 is < 0 if there was an error. */ - tst.l %d0 - jmi SYSCALL_ERROR_LABEL - - /* Successful; return the syscall's value. */ - rts -#endif - -PSEUDO_END (__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif diff --git a/sysdeps/unix/sysv/linux/microblaze/socket.S b/sysdeps/unix/sysv/linux/microblaze/socket.S deleted file mode 100644 index a3b40484fd..0000000000 --- a/sysdeps/unix/sysv/linux/microblaze/socket.S +++ /dev/null @@ -1,126 +0,0 @@ -/* Copyright (C) 2009-2015 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-cancel.h> -#include <socketcall.h> - -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - -/* The socket-oriented system calls are handled unusally in Linux. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. - They also #define a 'number-of-arguments' word in NARGS, which - defaults to 3. */ - -#ifndef NARGS -# ifdef socket -# error NARGS not defined -# endif -# define NARGS 3 -#endif - -/* Stack usage: - 0 - r15 (return address) - 4 - 12 args to syscall - 16 - scratch for cancellation state - 20 - scratch for return value -*/ -#define stackadjust 24 - -#ifndef __socket -# ifndef NO_WEAK_ALIAS -# define __socket P(__,socket) -# else -# define __socket socket -# endif -#endif - - .text -ENTRY(__socket) - addik r1,r1,-stackadjust - swi r15,r1,0 -#if NARGS >= 1 - swi r5,r1,stackadjust+4 -#endif -#if NARGS >= 2 - swi r6,r1,stackadjust+8 -#endif -#if NARGS >= 3 - swi r7,r1,stackadjust+12 -#endif -#if NARGS >= 4 - swi r8,r1,stackadjust+16 -#endif -#if NARGS >= 5 - swi r9,r1,stackadjust+20 -#endif -#if NARGS >= 6 - swi r10,r1,stackadjust+24 -#endif -/* The rest of the args (if any) are on the caller's stack already. */ - -#if defined NEED_CANCELLATION && defined CENABLE - SINGLE_THREAD_P(r12) - bnei r12,L(socket_cancel) -#endif - - addik r12,r0,SYS_ify(socketcall) - addik r5,r0,P(SOCKOP_,socket) - addik r6,r1,stackadjust+4 - brki r14,8 - addk r0,r0,r0 - lwi r15,r1,0 - addik r1,r1,stackadjust - addik r4,r0,-4095 - cmpu r4,r4,r3 - bgei r4,SYSCALL_ERROR_LABEL - rtsd r15,8 - addk r0,r0,r0 - -#if defined NEED_CANCELLATION && defined CENABLE -L(socket_cancel): - CENABLE - swi r3,r1,16 - addik r12,r0,SYS_ify(socketcall) - addik r5,r0,P(SOCKOP_,socket) - addik r6,r1,stackadjust+4 - brki r14,8 - addk r0,r0,r0 - swi r3,r1,20 - lwi r5,r1,16 - CDISABLE - lwi r3,r1,20 - lwi r15,r1,0 - addik r1,r1,stackadjust - addik r4,r0,-4095 - cmpu r4,r4,r3 - bgei r4,SYSCALL_ERROR_LABEL - rtsd r15,8 - addk r0,r0,r0 -#endif - -PSEUDO_END (__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif diff --git a/sysdeps/unix/sysv/linux/mips/mips32/internal_accept4.S b/sysdeps/unix/sysv/linux/mips/mips32/internal_accept4.S deleted file mode 100644 index 30434d7334..0000000000 --- a/sysdeps/unix/sysv/linux/mips/mips32/internal_accept4.S +++ /dev/null @@ -1,2 +0,0 @@ -/* MIPS does not have socket.S and the socketcall syscall should - generally be avoided, though it exists. */ diff --git a/sysdeps/unix/sysv/linux/mips/mips32/internal_recvmmsg.S b/sysdeps/unix/sysv/linux/mips/mips32/internal_recvmmsg.S deleted file mode 100644 index 30434d7334..0000000000 --- a/sysdeps/unix/sysv/linux/mips/mips32/internal_recvmmsg.S +++ /dev/null @@ -1,2 +0,0 @@ -/* MIPS does not have socket.S and the socketcall syscall should - generally be avoided, though it exists. */ diff --git a/sysdeps/unix/sysv/linux/mips/mips32/internal_sendmmsg.S b/sysdeps/unix/sysv/linux/mips/mips32/internal_sendmmsg.S deleted file mode 100644 index 30434d7334..0000000000 --- a/sysdeps/unix/sysv/linux/mips/mips32/internal_sendmmsg.S +++ /dev/null @@ -1,2 +0,0 @@ -/* MIPS does not have socket.S and the socketcall syscall should - generally be avoided, though it exists. */ diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/socket.S b/sysdeps/unix/sysv/linux/powerpc/powerpc32/socket.S deleted file mode 100644 index 7dc59b470f..0000000000 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/socket.S +++ /dev/null @@ -1,118 +0,0 @@ -/* Copyright (C) 1995-2015 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-cancel.h> -#include <socketcall.h> - -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - -/* The socket-oriented system calls are handled unusally in Linux. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. - They also #define a 'number-of-arguments' word in NARGS, which - defaults to 3. */ - -#ifndef NARGS -#ifdef socket -#error NARGS not defined -#endif -#define NARGS 3 -#endif - -/* 0(r1) and 4(r1) are reserved by the ABI, 8(r1), 12(r1), 16(r1) are used - for temp saves. 44(r1) is used to save r30. */ -#define stackblock 20 - -#ifndef __socket -# ifndef NO_WEAK_ALIAS -# define __socket P(__,socket) -# else -# define __socket socket -# endif -#endif - - .text -ENTRY(__socket) - stwu r1,-48(r1) - cfi_adjust_cfa_offset(48) -#if NARGS >= 1 - stw r3,stackblock(r1) -#endif -#if NARGS >= 2 - stw r4,4+stackblock(r1) -#endif -#if NARGS >= 3 - stw r5,8+stackblock(r1) -#endif -#if NARGS >= 4 - stw r6,12+stackblock(r1) -#endif -#if NARGS >= 5 - stw r7,16+stackblock(r1) -#endif -#if NARGS >= 6 - stw r8,20+stackblock(r1) -#endif -#if NARGS >= 7 -#error too many arguments! -#endif - -#if defined NEED_CANCELLATION && defined CENABLE - SINGLE_THREAD_P - bne- .Lsocket_cancel -#endif - - li r3,P(SOCKOP_,socket) - addi r4,r1,stackblock - DO_CALL(SYS_ify(socketcall)) - addi r1,r1,48 - PSEUDO_RET - -#if defined NEED_CANCELLATION && defined CENABLE -.Lsocket_cancel: - mflr r9 - stw r9,52(r1) - cfi_offset (lr, 4) - CENABLE - stw r3,16(r1) - li r3,P(SOCKOP_,socket) - addi r4,r1,stackblock - DO_CALL(SYS_ify(socketcall)) - mfcr r0 - stw r3,8(r1) - stw r0,12(r1) - lwz r3,16(r1) - CDISABLE - lwz r4,52(r1) - lwz r0,12(r1) - lwz r3,8(r1) - mtlr r4 - mtcr r0 - addi r1,r1,48 - PSEUDO_RET -#endif - -PSEUDO_END (__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/socket.S b/sysdeps/unix/sysv/linux/powerpc/powerpc64/socket.S deleted file mode 100644 index 102844416c..0000000000 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/socket.S +++ /dev/null @@ -1,134 +0,0 @@ -/* Copyright (C) 1995-2015 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 Library General Public License as - published by the Free Software Foundation; either version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - see <http://www.gnu.org/licenses/>. */ - -#include <sysdep-cancel.h> -#include <socketcall.h> - -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - -/* The socket-oriented system calls are handled unusally in Linux. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. - They also #define a 'number-of-arguments' word in NARGS, which - defaults to 3. */ - -#ifndef NARGS -#ifdef socket -#error NARGS not defined -#endif -#define NARGS 3 -#endif - -#ifndef __socket -# ifndef NO_WEAK_ALIAS -# define __socket P(__,socket) -# else -# define __socket socket -# endif -#endif - -#if _CALL_ELF == 2 -#define FRAMESIZE (FRAME_MIN_SIZE+16+64) -#define stackblock (FRAME_MIN_SIZE+16) -#else -#define FRAMESIZE (FRAME_MIN_SIZE+16) -#define stackblock (FRAMESIZE+FRAME_PARM_SAVE) /* offset to parm save area. */ -#endif - - .text -ENTRY(__socket) - CALL_MCOUNT NARGS - stdu r1,-FRAMESIZE(r1) - cfi_adjust_cfa_offset(FRAMESIZE) -#if NARGS >= 1 - std r3,stackblock(r1) -#endif -#if NARGS >= 2 - std r4,8+stackblock(r1) -#endif -#if NARGS >= 3 - std r5,16+stackblock(r1) -#endif -#if NARGS >= 4 - std r6,24+stackblock(r1) -#endif -#if NARGS >= 5 - std r7,32+stackblock(r1) -#endif -#if NARGS >= 6 - std r8,40+stackblock(r1) -#endif -#if NARGS >= 7 - std r9,48+stackblock(r1) -#endif -#if NARGS >= 8 - std r10,56+stackblock(r1) -#endif -#if NARGS >= 9 -#error too many arguments! -#endif - -#if defined NEED_CANCELLATION && defined CENABLE - SINGLE_THREAD_P - bne- .Lsocket_cancel -#endif - - li r3,P(SOCKOP_,socket) - addi r4,r1,stackblock - DO_CALL(SYS_ify(socketcall)) - addi r1,r1,FRAMESIZE - cfi_adjust_cfa_offset(-FRAMESIZE) - PSEUDO_RET - -#if defined NEED_CANCELLATION && defined CENABLE -.Lsocket_cancel: - cfi_adjust_cfa_offset(FRAMESIZE) - mflr r9 - std r9,FRAMESIZE+FRAME_LR_SAVE(r1) - cfi_offset (lr, FRAME_LR_SAVE) - CENABLE - std r3,FRAME_MIN_SIZE+8(r1) - li r3,P(SOCKOP_,socket) - addi r4,r1,stackblock - DO_CALL(SYS_ify(socketcall)) - mfcr r0 - std r3,FRAME_MIN_SIZE(r1) - std r0,FRAMESIZE+FRAME_CR_SAVE(r1) - cfi_offset (cr, FRAME_CR_SAVE) - ld r3,FRAME_MIN_SIZE+8(r1) - CDISABLE - ld r4,FRAMESIZE+FRAME_LR_SAVE(r1) - ld r0,FRAMESIZE+FRAME_CR_SAVE(r1) - ld r3,FRAME_MIN_SIZE(r1) - mtlr r4 - mtcr r0 - addi r1,r1,FRAMESIZE - cfi_adjust_cfa_offset(-FRAMESIZE) - cfi_restore(lr) - cfi_restore(cr) - PSEUDO_RET -#endif -PSEUDO_END (__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif diff --git a/sysdeps/unix/sysv/linux/recv.S b/sysdeps/unix/sysv/linux/recv.S deleted file mode 100644 index 331844abc1..0000000000 --- a/sysdeps/unix/sysv/linux/recv.S +++ /dev/null @@ -1,6 +0,0 @@ -#define socket recv -#define __socket __libc_recv -#define NARGS 4 -#define NEED_CANCELLATION -#include <socket.S> -weak_alias (__libc_recv, __recv) diff --git a/sysdeps/unix/sysv/linux/recv.c b/sysdeps/unix/sysv/linux/recv.c new file mode 100644 index 0000000000..d2e80d5a80 --- /dev/null +++ b/sysdeps/unix/sysv/linux/recv.c @@ -0,0 +1,31 @@ +/* Copyright (C) 2015 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 <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <sysdep-cancel.h> +#include <socketcall.h> + +ssize_t +__libc_recv (int fd, void *buf, size_t len, int flags) +{ + return SOCKETCALL_CANCEL (recv, fd, buf, len, flags); +} +weak_alias (__libc_recv, recv) +weak_alias (__libc_recv, __recv) diff --git a/sysdeps/unix/sysv/linux/recvfrom.S b/sysdeps/unix/sysv/linux/recvfrom.S deleted file mode 100644 index ccbb0a75da..0000000000 --- a/sysdeps/unix/sysv/linux/recvfrom.S +++ /dev/null @@ -1,6 +0,0 @@ -#define socket recvfrom -#define __socket __libc_recvfrom -#define NARGS 6 -#define NEED_CANCELLATION -#include <socket.S> -weak_alias (__libc_recvfrom, __recvfrom) diff --git a/sysdeps/unix/sysv/linux/recvfrom.c b/sysdeps/unix/sysv/linux/recvfrom.c new file mode 100644 index 0000000000..90eb40d603 --- /dev/null +++ b/sysdeps/unix/sysv/linux/recvfrom.c @@ -0,0 +1,33 @@ +/* Copyright (C) 2015 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 <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <sysdep-cancel.h> +#include <socketcall.h> + +ssize_t +__libc_recvfrom (int fd, void *buf, size_t len, int flags, + __SOCKADDR_ARG addr, socklen_t *addrlen) +{ + return SOCKETCALL_CANCEL (recvfrom, fd, buf, len, flags, addr.__sockaddr__, + addrlen); +} +weak_alias (__libc_recvfrom, recvfrom) +weak_alias (__libc_recvfrom, __recvfrom) diff --git a/sysdeps/unix/sysv/linux/recvmmsg.c b/sysdeps/unix/sysv/linux/recvmmsg.c index c3a4874447..1f9f04d360 100644 --- a/sysdeps/unix/sysv/linux/recvmmsg.c +++ b/sysdeps/unix/sysv/linux/recvmmsg.c @@ -49,12 +49,15 @@ recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags, return result; } #elif defined __NR_socketcall -# ifndef __ASSUME_RECVMMSG_SOCKETCALL -extern int __internal_recvmmsg (int fd, struct mmsghdr *vmessages, - unsigned int vlen, int flags, - struct timespec *tmo) - attribute_hidden; - +# include <socketcall.h> +# ifdef __ASSUME_RECVMMSG_SOCKETCALL +int +recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags, + struct timespec *tmo) +{ + return SOCKETCALL_CANCEL (recvmmsg, fd, vmessages, vlen, flags, tmo); +} +# else static int have_recvmmsg; int @@ -63,7 +66,8 @@ recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags, { if (__glibc_likely (have_recvmmsg >= 0)) { - int ret = __internal_recvmmsg (fd, vmessages, vlen, flags, tmo); + int ret = SOCKETCALL_CANCEL (recvmmsg, fd, vmessages, vlen, flags, + tmo); /* The kernel returns -EINVAL for unknown socket operations. We need to convert that error to an ENOSYS error. */ if (__builtin_expect (ret < 0, 0) @@ -74,7 +78,7 @@ recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags, descriptor and all other parameters cleared. This call will not cause any harm and it will return immediately. */ - ret = __internal_recvmmsg (-1, 0, 0, 0, 0); + ret = SOCKETCALL_CANCEL (invalid, -1); if (errno == EINVAL) { have_recvmmsg = -1; @@ -92,10 +96,7 @@ recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags, __set_errno (ENOSYS); return -1; } -# else -/* When __ASSUME_RECVMMSG_SOCKETCALL recvmmsg is defined in - internal_recvmmsg.S. */ -# endif +# endif /* __ASSUME_RECVMMSG_SOCKETCALL */ #else # include <socket/recvmmsg.c> #endif diff --git a/sysdeps/unix/sysv/linux/recvmsg.S b/sysdeps/unix/sysv/linux/recvmsg.S deleted file mode 100644 index d44bc39f92..0000000000 --- a/sysdeps/unix/sysv/linux/recvmsg.S +++ /dev/null @@ -1,6 +0,0 @@ -#define socket recvmsg -#define __socket __libc_recvmsg -#define NARGS 3 -#define NEED_CANCELLATION -#include <socket.S> -weak_alias (__libc_recvmsg, __recvmsg) diff --git a/sysdeps/unix/sysv/linux/recvmsg.c b/sysdeps/unix/sysv/linux/recvmsg.c new file mode 100644 index 0000000000..cd7c9ca581 --- /dev/null +++ b/sysdeps/unix/sysv/linux/recvmsg.c @@ -0,0 +1,31 @@ +/* Copyright (C) 2015 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 <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <sysdep-cancel.h> +#include <socketcall.h> + +ssize_t +__libc_recvmsg (int fd, struct msghdr *msg, int flags) +{ + return SOCKETCALL_CANCEL (recvmsg, fd, msg, flags); +} +weak_alias (__libc_recvmsg, recvmsg) +weak_alias (__libc_recvmsg, __recvmsg) diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/socket.S b/sysdeps/unix/sysv/linux/s390/s390-32/socket.S deleted file mode 100644 index 4611e52f24..0000000000 --- a/sysdeps/unix/sysv/linux/s390/s390-32/socket.S +++ /dev/null @@ -1,142 +0,0 @@ -/* Copyright (C) 2000-2015 Free Software Foundation, Inc. - Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). - 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-cancel.h> -#include <socketcall.h> - -/* &%/$&!! preprocessor */ -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - - .text -/* The socket-oriented system calls are handled unusally in Linux. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. */ - -#ifndef __socket -#ifndef NO_WEAK_ALIAS -#define __socket P(__,socket) -#else -#define __socket socket -#endif -#endif - -#ifndef NARGS /* the socket.o object is compiled directly ... */ -#define NARGS 3 -#endif - -.globl __socket -ENTRY(__socket) - /* Save registers and setup stack. */ - stm %r6,%r15,24(%r15) /* save registers */ - cfi_offset (%r15, -36) - cfi_offset (%r14, -40) - cfi_offset (%r13, -44) - cfi_offset (%r12, -48) - cfi_offset (%r11, -52) - cfi_offset (%r10, -56) - cfi_offset (%r9, -60) - cfi_offset (%r8, -64) - cfi_offset (%r7, -68) - cfi_offset (%r6, -72) - lr %r1,%r15 - l %r0,4(0,%r15) /* load eos */ - ahi %r15,-120 /* buy stack space */ - cfi_adjust_cfa_offset (120) - st %r1,0(0,%r15) /* store back chain */ - st %r0,4(0,%r15) /* store eos */ - - /* Reorder arguments */ -#if (NARGS >= 6) - mvc 0x74(4,%r15),216(%r15) /* move between parameter lists */ -#endif -#if (NARGS >= 5) - st %r6,0x70(0,%r15) /* store into parameter list */ -#endif -#if (NARGS >= 4) - st %r5,0x6C(0,%r15) /* store into parameter list */ -#endif -#if (NARGS >= 3) - st %r4,0x68(0,%r15) /* store into parameter list */ -#endif -#if (NARGS >= 2) - st %r3,0x64(0,%r15) /* store into parameter list */ - st %r2,0x60(0,%r15) -#endif - -#if defined NEED_CANCELLATION && defined CENABLE - SINGLE_THREAD_P (%r4) - jne L(socket_cancel) -#endif - - /* load subcode for socket syscall */ - lhi %r2,P(SOCKOP_,socket) - la %r3,0x60(0,%r15) /* load address of parameter list */ - - /* Do the system call trap. */ - svc SYS_ify(socketcall) - -4: - l %r15,0(0,%r15) /* load back chain */ - lm %r6,15,24(%r15) /* load registers */ - - /* gpr2 is < 0 if there was an error. */ - lhi %r0,-125 - clr %r2,%r0 - jnl SYSCALL_ERROR_LABEL - - /* Successful; return the syscall's value. */ - br %r14 - -#if defined NEED_CANCELLATION && defined CENABLE -L(socket_cancel): - basr %r13,0 -1: l %r1,2f-1b(%r13) - /* call CENABLE. */ - bas %r14,0(%r13,%r1) - lr %r0,%r2 - - /* load subcode for socket syscall */ - lhi %r2,P(SOCKOP_,socket) - la %r3,0x60(0,%r15) /* load address of parameter list */ - - /* Do the system call trap. */ - svc SYS_ify(socketcall) - - l %r3,3f-1b(%r13) - lr %r12,%r2 - lr %r2,%r0 - /* call CDISABLE. */ - bas %r14,0(%r13,%r3) - lr %r2,%r12 - j 4b - -2: .long CENABLE-1b -3: .long CDISABLE-1b -#endif - - SYSCALL_ERROR_HANDLER -END (__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/socket.S b/sysdeps/unix/sysv/linux/s390/s390-64/socket.S deleted file mode 100644 index 26b39f9611..0000000000 --- a/sysdeps/unix/sysv/linux/s390/s390-64/socket.S +++ /dev/null @@ -1,136 +0,0 @@ -/* Copyright (C) 2001-2015 Free Software Foundation, Inc. - Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). - 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-cancel.h> -#include <socketcall.h> - -/* &%/$&!! preprocessor */ -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - - .text -/* The socket-oriented system calls are handled unusally in Linux. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. */ - -#ifndef __socket -#ifndef NO_WEAK_ALIAS -#define __socket P(__,socket) -#else -#define __socket socket -#endif -#endif - -#ifndef NARGS /* The socket.o object is compiled directly ... */ -#define NARGS 3 -#endif - -.globl __socket -ENTRY(__socket) - /* Save registers and setup stack. */ - stmg %r6,%r15,48(%r15) /* Save registers. */ - cfi_offset (%r15,-40) - cfi_offset (%r14,-48) - cfi_offset (%r13,-56) - cfi_offset (%r12,-64) - cfi_offset (%r11,-72) - cfi_offset (%r10,-80) - cfi_offset (%r9,-88) - cfi_offset (%r8,-96) - cfi_offset (%r7,-104) - cfi_offset (%r6,-112) - lgr %r1,%r15 - lg %r0,8(%r15) /* Load eos. */ - aghi %r15,-208 /* Buy stack space. */ - cfi_adjust_cfa_offset (208) - stg %r1,0(%r15) /* Store back chain. */ - stg %r0,8(%r15) /* Store eos. */ - - /* Reorder arguments. */ -#if (NARGS >= 6) - mvc 200(8,%r15),368(%r15) /* Move between parameter lists. */ -#endif -#if (NARGS >= 5) - stg %r6,192(%r15) /* Store into parameter list. */ -#endif -#if (NARGS >= 4) - stg %r5,184(%r15) /* Store into parameter list. */ -#endif -#if (NARGS >= 3) - stg %r4,176(%r15) /* Store into parameter list. */ -#endif -#if (NARGS >= 2) - stg %r3,168(%r15) /* Store into parameter list. */ - stg %r2,160(%r15) -#endif - -#if defined NEED_CANCELLATION && defined CENABLE - SINGLE_THREAD_P - jne L(socket_cancel) -#endif - - /* Load subcode for socket syscall. */ - lghi %r2,P(SOCKOP_,socket) - la %r3,160(%r15) /* Load address of parameter list. */ - - /* Do the system call trap. */ - svc SYS_ify(socketcall) - -4: - lg %r15,0(%r15) /* Load back chain. */ - lmg %r6,15,48(%r15) /* Load registers. */ - - /* gpr2 is < 0 if there was an error. */ - lghi %r0,-125 - clgr %r2,%r0 - jgnl SYSCALL_ERROR_LABEL - - /* Successful; return the syscall's value. */ - br %r14 - -#if defined NEED_CANCELLATION && defined CENABLE -L(socket_cancel): - brasl %r14,CENABLE - lr %r0,%r2 - - /* Load subcode for socket syscall. */ - lghi %r2,P(SOCKOP_,socket) - la %r3,160(%r15) /* Load address of parameter list. */ - - /* Do the system call trap. */ - svc SYS_ify(socketcall) - - lgr %r12,%r2 - lr %r2,%r0 - brasl %r14,CDISABLE - - lgr %r2,%r12 - j 4b -#endif - - SYSCALL_ERROR_HANDLER -END (__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif - diff --git a/sysdeps/unix/sysv/linux/send.S b/sysdeps/unix/sysv/linux/send.S deleted file mode 100644 index 259748f44c..0000000000 --- a/sysdeps/unix/sysv/linux/send.S +++ /dev/null @@ -1,7 +0,0 @@ -#define socket send -#define __socket __libc_send -#define NARGS 4 -#define NEED_CANCELLATION -#include <socket.S> -weak_alias (__libc_send, __send) -libc_hidden_def (__send) diff --git a/sysdeps/unix/sysv/linux/send.c b/sysdeps/unix/sysv/linux/send.c new file mode 100644 index 0000000000..f87ea86672 --- /dev/null +++ b/sysdeps/unix/sysv/linux/send.c @@ -0,0 +1,32 @@ +/* Copyright (C) 2015 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 <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <sysdep-cancel.h> +#include <socketcall.h> + +ssize_t +__libc_send (int fd, const void *buf, size_t len, int flags) +{ + return SOCKETCALL_CANCEL (send, fd, buf, len, flags); +} +weak_alias (__libc_send, send) +weak_alias (__libc_send, __send) +libc_hidden_def (__send) diff --git a/sysdeps/unix/sysv/linux/sendmmsg.c b/sysdeps/unix/sysv/linux/sendmmsg.c index a95aff19ef..e535cc0207 100644 --- a/sysdeps/unix/sysv/linux/sendmmsg.c +++ b/sysdeps/unix/sysv/linux/sendmmsg.c @@ -50,11 +50,14 @@ __sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags) libc_hidden_def (__sendmmsg) weak_alias (__sendmmsg, sendmmsg) #elif defined __NR_socketcall -# ifndef __ASSUME_SENDMMSG_SOCKETCALL -extern int __internal_sendmmsg (int fd, struct mmsghdr *vmessages, - unsigned int vlen, int flags) - attribute_hidden; - +# include <socketcall.h> +# ifdef __ASSUME_SENDMMSG_SOCKETCALL +int +__sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags) +{ + return SOCKETCALL_CANCEL (sendmmsg, fd, vmessages, vlen, flags); +} +# else static int have_sendmmsg; int @@ -62,7 +65,7 @@ __sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags) { if (__glibc_likely (have_sendmmsg >= 0)) { - int ret = __internal_sendmmsg (fd, vmessages, vlen, flags); + int ret = SOCKETCALL_CANCEL (sendmmsg, fd, vmessages, vlen, flags); /* The kernel returns -EINVAL for unknown socket operations. We need to convert that error to an ENOSYS error. */ if (__builtin_expect (ret < 0, 0) @@ -73,7 +76,7 @@ __sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags) descriptor and all other parameters cleared. This call will not cause any harm and it will return immediately. */ - ret = __internal_sendmmsg (-1, 0, 0, 0); + ret = SOCKETCALL_CANCEL (invalid, -1); if (errno == EINVAL) { have_sendmmsg = -1; @@ -91,12 +94,9 @@ __sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags) __set_errno (ENOSYS); return -1; } +# endif /* __ASSUME_SENDMMSG_SOCKETCALL */ libc_hidden_def (__sendmmsg) weak_alias (__sendmmsg, sendmmsg) -# else -/* When __ASSUME_SENDMMSG_SOCKETCALL sendmmsg is defined in - internal_sendmmsg.S. */ -# endif #else # include <socket/sendmmsg.c> #endif diff --git a/sysdeps/unix/sysv/linux/sendmsg.S b/sysdeps/unix/sysv/linux/sendmsg.S deleted file mode 100644 index a220894cc6..0000000000 --- a/sysdeps/unix/sysv/linux/sendmsg.S +++ /dev/null @@ -1,6 +0,0 @@ -#define socket sendmsg -#define __socket __libc_sendmsg -#define NARGS 3 -#define NEED_CANCELLATION -#include <socket.S> -weak_alias (__libc_sendmsg, __sendmsg) diff --git a/sysdeps/unix/sysv/linux/sendmsg.c b/sysdeps/unix/sysv/linux/sendmsg.c new file mode 100644 index 0000000000..e69ac3e1b7 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sendmsg.c @@ -0,0 +1,31 @@ +/* Copyright (C) 2015 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 <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <sysdep-cancel.h> +#include <socketcall.h> + +ssize_t +__libc_sendmsg (int fd, const struct msghdr *msg, int flags) +{ + return SOCKETCALL_CANCEL (sendmsg, fd, msg, flags); +} +weak_alias (__libc_sendmsg, sendmsg) +weak_alias (__libc_sendmsg, __sendmsg) diff --git a/sysdeps/unix/sysv/linux/sendto.S b/sysdeps/unix/sysv/linux/sendto.S deleted file mode 100644 index a65e44fb61..0000000000 --- a/sysdeps/unix/sysv/linux/sendto.S +++ /dev/null @@ -1,6 +0,0 @@ -#define socket sendto -#define __socket __libc_sendto -#define NARGS 6 -#define NEED_CANCELLATION -#include <socket.S> -weak_alias (__libc_sendto, __sendto) diff --git a/sysdeps/unix/sysv/linux/sendto.c b/sysdeps/unix/sysv/linux/sendto.c new file mode 100644 index 0000000000..d2896a60ec --- /dev/null +++ b/sysdeps/unix/sysv/linux/sendto.c @@ -0,0 +1,33 @@ +/* Copyright (C) 2015 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 <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <sysdep-cancel.h> +#include <socketcall.h> + +ssize_t +__libc_sendto (int fd, const void *buf, size_t len, int flags, + __CONST_SOCKADDR_ARG addr, socklen_t addrlen) +{ + return SOCKETCALL_CANCEL (sendto, fd, buf, len, flags, addr.__sockaddr__, + addrlen); +} +weak_alias (__libc_sendto, sendto) +weak_alias (__libc_sendto, __sendto) diff --git a/sysdeps/unix/sysv/linux/setsockopt.S b/sysdeps/unix/sysv/linux/setsockopt.S deleted file mode 100644 index 4e40ccba57..0000000000 --- a/sysdeps/unix/sysv/linux/setsockopt.S +++ /dev/null @@ -1,5 +0,0 @@ -#define socket setsockopt -#define NARGS 5 -#define NO_WEAK_ALIAS 1 -#include <socket.S> -weak_alias (setsockopt, __setsockopt) diff --git a/sysdeps/unix/sysv/linux/setsockopt.c b/sysdeps/unix/sysv/linux/setsockopt.c new file mode 100644 index 0000000000..626c55b5a5 --- /dev/null +++ b/sysdeps/unix/sysv/linux/setsockopt.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2015 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 <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <socketcall.h> + +int +setsockopt (int fd, int level, int optname, const void *optval, socklen_t len) +{ + return SOCKETCALL (setsockopt, fd, level, optname, optval, len); +} +weak_alias (setsockopt, __setsockopt) diff --git a/sysdeps/unix/sysv/linux/sh/socket.S b/sysdeps/unix/sysv/linux/sh/socket.S deleted file mode 100644 index ee99e840c1..0000000000 --- a/sysdeps/unix/sysv/linux/sh/socket.S +++ /dev/null @@ -1,179 +0,0 @@ -/* Copyright (C) 1999-2015 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-cancel.h> -#include <socketcall.h> -#include <tls.h> - -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - - .text -/* The socket-oriented system calls are handled unusally in Linux. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. */ - -#ifndef __socket -#ifndef NO_WEAK_ALIAS -#define __socket P(__,socket) -#else -#define __socket socket -#endif -#endif - -#define PUSHARGS_1 mov.l r4,@-r15; \ - cfi_adjust_cfa_offset (4); \ - cfi_rel_offset (r4, 0) -#define PUSHARGS_2 mov.l r5,@-r15; \ - cfi_adjust_cfa_offset (4); \ - cfi_rel_offset (r5, 0); \ - PUSHARGS_1 -#define PUSHARGS_3 mov.l r6,@-r15; \ - cfi_adjust_cfa_offset (4); \ - cfi_rel_offset (r6, 0); \ - PUSHARGS_2 -#define PUSHARGS_4 mov.l r7,@-r15; \ - cfi_adjust_cfa_offset (4); \ - cfi_rel_offset (r7, 0); \ - PUSHARGS_3 -#define PUSHARGS_5 PUSHARGS_4 /* Caller has already pushed arg 5 */ -#define PUSHARGS_6 PUSHARGS_4 /* Caller has already pushed arg 5,6 */ - -#define POPARGS_1 add #4,r15; cfi_adjust_cfa_offset (-4) -#define POPARGS_2 add #8,r15; cfi_adjust_cfa_offset (-8) -#define POPARGS_3 add #12,r15; cfi_adjust_cfa_offset (-12) -#define POPARGS_4 add #16,r15; cfi_adjust_cfa_offset (-16) -#define POPARGS_5 POPARGS_4 -#define POPARGS_6 POPARGS_4 - -#define ADJUSTCFI_1 cfi_adjust_cfa_offset (4); \ - cfi_offset (r4, -4) -#define ADJUSTCFI_2 cfi_adjust_cfa_offset (8); \ - cfi_offset (r4, -4); \ - cfi_offset (r5, -8) -#define ADJUSTCFI_3 cfi_adjust_cfa_offset (12); \ - cfi_offset (r4, -4); \ - cfi_offset (r5, -8); \ - cfi_offset (r6, -12) -#define ADJUSTCFI_4 cfi_adjust_cfa_offset (16); \ - cfi_offset (r4, -4); \ - cfi_offset (r5, -8); \ - cfi_offset (r6, -12); \ - cfi_offset (r7, -16) -#define ADJUSTCFI_5 ADJUSTCFI_4 -#define ADJUSTCFI_6 ADJUSTCFI_4 - -#ifndef NARGS -/* If we were called with no wrapper, this is really socket(). */ -#define NARGS 3 -#endif - -.globl __socket -ENTRY (__socket) - /* This will not work in the case of a socket call being interrupted - by a signal. If the signal handler uses any stack the arguments - to socket will be trashed. The results of a restart of any - socket call are then unpredictable. */ - - /* Push args onto the stack. */ - P(PUSHARGS_,NARGS) - -#if defined NEED_CANCELLATION && defined CENABLE - SINGLE_THREAD_P - bf .Lsocket_cancel -#endif - - /* Do the system call trap. */ - mov #+P(SOCKOP_,socket), r4 - mov r15, r5 - mov.l .L1,r3 - trapa #0x12 - - /* Pop args off the stack */ - P(POPARGS_,NARGS) - - mov r0, r1 - mov #-12, r2 - shad r2, r1 - not r1, r1 // r1=0 means r0 = -1 to -4095 - tst r1, r1 // i.e. error in linux - bf .Lpseudo_end -.Lsyscall_error: - SYSCALL_ERROR_HANDLER -.Lpseudo_end: - /* Successful; return the syscall's value. */ - rts - nop - -#if defined NEED_CANCELLATION && defined CENABLE -.Lsocket_cancel: - /* Enable asynchronous cancellation. */ - P(ADJUSTCFI_,NARGS) - sts.l pr,@-r15 - cfi_adjust_cfa_offset (4) - cfi_rel_offset (pr, 0) - CENABLE - lds.l @r15+,pr - cfi_adjust_cfa_offset (-4) - cfi_restore (pr) - - /* Do the system call trap. */ - mov #+P(SOCKOP_,socket), r4 - mov r15, r5 - mov.l .L1,r3 - trapa #0x12 - - sts.l pr,@-r15 - cfi_adjust_cfa_offset (4) - cfi_rel_offset (pr, 0) - mov.l r0,@-r15 - cfi_adjust_cfa_offset (4) - cfi_rel_offset (r0, 0) - CDISABLE - mov.l @r15+,r0 - cfi_adjust_cfa_offset (-4) - cfi_restore (r0) - lds.l @r15+,pr - cfi_adjust_cfa_offset (-4) - cfi_restore (pr) - - /* Pop args off the stack */ - P(POPARGS_,NARGS) - - mov r0, r1 - mov #-12, r2 - shad r2, r1 - not r1, r1 // r1=0 means r0 = -1 to -4095 - tst r1, r1 // i.e. error in linux - bf .Lpseudo_end - bra .Lsyscall_error - nop -#endif - - .align 2 -.L1: - .long SYS_ify(socketcall) - -PSEUDO_END (__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif diff --git a/sysdeps/unix/sysv/linux/shutdown.S b/sysdeps/unix/sysv/linux/shutdown.S deleted file mode 100644 index e2462d0eca..0000000000 --- a/sysdeps/unix/sysv/linux/shutdown.S +++ /dev/null @@ -1,3 +0,0 @@ -#define socket shutdown -#define NARGS 2 -#include <socket.S> diff --git a/sysdeps/unix/sysv/linux/shutdown.c b/sysdeps/unix/sysv/linux/shutdown.c new file mode 100644 index 0000000000..8b3a3d87f5 --- /dev/null +++ b/sysdeps/unix/sysv/linux/shutdown.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2015 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 <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <socketcall.h> + +int +__shutdown (int fd, int how) +{ + return SOCKETCALL (shutdown, fd, how); +} +weak_alias (__shutdown, shutdown) diff --git a/sysdeps/unix/sysv/linux/socket.c b/sysdeps/unix/sysv/linux/socket.c new file mode 100644 index 0000000000..fcb4775c6b --- /dev/null +++ b/sysdeps/unix/sysv/linux/socket.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2015 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 <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <socketcall.h> + +int +__socket (int fd, int type, int domain) +{ + return SOCKETCALL (socket, fd, type, domain); +} +weak_alias (__socket, socket) diff --git a/sysdeps/unix/sysv/linux/socketcall.h b/sysdeps/unix/sysv/linux/socketcall.h index e59067d34c..f652239ef3 100644 --- a/sysdeps/unix/sysv/linux/socketcall.h +++ b/sysdeps/unix/sysv/linux/socketcall.h @@ -25,6 +25,7 @@ We cannot use an enum here because the values are used in assembler code. */ +#define SOCKOP_invalid -1 #define SOCKOP_socket 1 #define SOCKOP_bind 2 #define SOCKOP_connect 3 @@ -46,4 +47,58 @@ #define SOCKOP_recvmmsg 19 #define SOCKOP_sendmmsg 20 +#define __SOCKETCALL1(name, a1) \ + INLINE_SYSCALL (socketcall, 2, name, \ + ((long int [1]) { (long int) (a1) })) +#define __SOCKETCALL2(name, a1, a2) \ + INLINE_SYSCALL (socketcall, 2, name, \ + ((long int [2]) { (long int) (a1), (long int) (a2) })) +#define __SOCKETCALL3(name, a1, a2, a3) \ + INLINE_SYSCALL (socketcall, 2, name, \ + ((long int [3]) { (long int) (a1), (long int) (a2), (long int) (a3) })) +#define __SOCKETCALL4(name, a1, a2, a3, a4) \ + INLINE_SYSCALL (socketcall, 2, name, \ + ((long int [4]) { (long int) (a1), (long int) (a2), (long int) (a3), \ + (long int) (a4) })) +#define __SOCKETCALL5(name, a1, a2, a3, a4, a5) \ + INLINE_SYSCALL (socketcall, 2, name, \ + ((long int [5]) { (long int) (a1), (long int) (a2), (long int) (a3), \ + (long int) (a4), (long int) (a5) })) +#define __SOCKETCALL6(name, a1, a2, a3, a4, a5, a6) \ + INLINE_SYSCALL (socketcall, 2, name, \ + ((long int [6]) { (long int) (a1), (long int) (a2), (long int) (a3), \ + (long int) (a4), (long int) (a5), (long int) (a6) })) + +#define __SOCKETCALL_NARGS_X(a,b,c,d,e,f,g,h,n,...) n +#define __SOCKETCALL_NARGS(...) \ + __SOCKETCALL_NARGS_X (__VA_ARGS__,7,6,5,4,3,2,1,0,) +#define __SOCKETCALL_CONCAT_X(a,b) a##b +#define __SOCKETCALL_CONCAT(a,b) __SOCKETCALL_CONCAT_X (a, b) +#define __SOCKETCALL_DISP(b,...) \ + __SOCKETCALL_CONCAT (b,__SOCKETCALL_NARGS(__VA_ARGS__))(__VA_ARGS__) + +#define __SOCKETCALL(...) __SOCKETCALL_DISP (__SOCKETCALL, __VA_ARGS__) + + +#define SOCKETCALL(name, args...) \ + ({ \ + long int sc_ret = __SOCKETCALL (SOCKOP_##name, args); \ + sc_ret; \ + }) + + +#if IS_IN (libc) +# define __pthread_enable_asynccancel __libc_enable_asynccancel +# define __pthread_disable_asynccancel __libc_disable_asynccancel +#endif + +#define SOCKETCALL_CANCEL(name, args...) \ + ({ \ + int oldtype = LIBC_CANCEL_ASYNC (); \ + long int sc_ret = __SOCKETCALL (SOCKOP_##name, args); \ + LIBC_CANCEL_RESET (oldtype); \ + sc_ret; \ + }) + + #endif /* sys/socketcall.h */ diff --git a/sysdeps/unix/sysv/linux/socketpair.S b/sysdeps/unix/sysv/linux/socketpair.S deleted file mode 100644 index c954ad1a4b..0000000000 --- a/sysdeps/unix/sysv/linux/socketpair.S +++ /dev/null @@ -1,3 +0,0 @@ -#define socket socketpair -#define NARGS 4 -#include <socket.S> diff --git a/sysdeps/unix/sysv/linux/socketpair.c b/sysdeps/unix/sysv/linux/socketpair.c new file mode 100644 index 0000000000..cb70bcf1f0 --- /dev/null +++ b/sysdeps/unix/sysv/linux/socketpair.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2015 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 <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <socketcall.h> + +int +__socketpair (int domain, int type, int protocol, int sv[2]) +{ + return SOCKETCALL (socketpair, domain, type, protocol, sv); +} +weak_alias (__socketpair, socketpair) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S b/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S deleted file mode 100644 index 59c81649ec..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S +++ /dev/null @@ -1,116 +0,0 @@ -/* Copyright (C) 1997-2015 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, 1997. - - 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-cancel.h> -#include <socketcall.h> - -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - -#ifndef NARGS -#ifdef socket -#error NARGS not defined -#endif -#define NARGS 3 -#endif - - .text -/* The socket-oriented system calls are handled unusually in Linux. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. */ - -#ifndef __socket -# ifndef NO_WEAK_ALIAS -# define __socket P(__,socket) -# else -# define __socket socket -# endif -#endif - - .globl __syscall_error -ENTRY (__socket) - - /* Drop up to 6 arguments (recvfrom) into the memory allocated by - the caller for varargs, since that's really what we have. */ - st %o0, [%sp + 68 + 0] - st %o1, [%sp + 68 + 4] -#if NARGS > 2 - st %o2, [%sp + 68 + 8] -#if NARGS > 3 - st %o3, [%sp + 68 + 12] -#if NARGS > 4 - st %o4, [%sp + 68 + 16] -#if NARGS > 5 - st %o5, [%sp + 68 + 20] -#endif -#endif -#endif -#endif - -#if defined NEED_CANCELLATION && defined CENABLE - SINGLE_THREAD_P - cmp %g1, 0 - bne .Lsocket_cancel -#endif - mov P(SOCKOP_,socket), %o0 /* arg 1: socket subfunction */ - add %sp, 68, %o1 /* arg 2: parameter block */ - LOADSYSCALL(socketcall) - t 0x10 - bcc 1f - mov %o7, %g1 - call __syscall_error - mov %g1, %o7 -1: jmpl %o7 + 8, %g0 - nop - -#if defined NEED_CANCELLATION && defined CENABLE -.Lsocket_cancel: - save %sp, -96, %sp - cfi_def_cfa_register(%fp) - cfi_window_save - cfi_register(%o7, %i7) - CENABLE - nop - mov %o0, %l0 - add %sp, 68 + 96, %o1 - mov P(SOCKOP_,socket), %o0 - LOADSYSCALL(socketcall) - t 0x10 - bcc 1f - mov %o0, %l1 - CDISABLE; - mov %l0, %o0; - call __syscall_error; - mov %l1, %o0; - b 1f - mov -1, %l1; -1: CDISABLE - mov %l0, %o0 -2: jmpl %i7 + 8, %g0 - restore %g0, %l1, %o0 -#endif - -END (__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/socket.S b/sysdeps/unix/sysv/linux/sparc/sparc64/socket.S deleted file mode 100644 index b680165653..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/socket.S +++ /dev/null @@ -1,118 +0,0 @@ -/* Copyright (C) 1997-2015 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, 1997. - - 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-cancel.h> -#include <socketcall.h> - -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - -#ifndef NARGS -#ifdef socket -#error NARGS not defined -#endif -#define NARGS 3 -#endif - - .text -/* The socket-oriented system calls are handled unusually in Linux. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. */ - -#ifndef __socket -# ifndef NO_WEAK_ALIAS -# define __socket P(__,socket) -# else -# define __socket socket -# endif -#endif - - .globl __syscall_error -ENTRY(__socket) - - /* Drop up to 6 arguments (recvfrom) into the memory allocated by - the caller for varargs, since that's really what we have. */ - stx %o0, [%sp + STACK_BIAS + 128 + 0] - stx %o1, [%sp + STACK_BIAS + 128 + 8] -#if NARGS > 2 - stx %o2, [%sp + STACK_BIAS + 128 + 16] -#if NARGS > 3 - stx %o3, [%sp + STACK_BIAS + 128 + 24] -#if NARGS > 4 - stx %o4, [%sp + STACK_BIAS + 128 + 32] -#if NARGS > 5 - stx %o5, [%sp + STACK_BIAS + 128 + 40] -#endif -#endif -#endif -#endif - -#if defined NEED_CANCELLATION && defined CENABLE - SINGLE_THREAD_P - cmp %g1, 0 - bne .Lsocket_cancel -#endif - mov P(SOCKOP_,socket), %o0 /* arg 1: socket subfunction */ - add %sp, STACK_BIAS + 128, %o1 /* arg 2: parameter block */ - LOADSYSCALL(socketcall) - ta 0x6d - - bcc,pt %xcc, 1f - mov %o7, %g1 - call __syscall_error - mov %g1, %o7 -1: retl - nop - -#if defined NEED_CANCELLATION && defined CENABLE -.Lsocket_cancel: - save %sp, -160, %sp - cfi_def_cfa_register (%fp) - cfi_window_save - cfi_register (%o7, %i7) - CENABLE - nop - mov %o0, %l0 - add %sp, 160 + STACK_BIAS + 128, %o1 - mov P(SOCKOP_,socket), %o0 - LOADSYSCALL(socketcall) - ta 0x6d - - bcc,pt %xcc, 1f - mov %o0, %l1 - CDISABLE; - mov %l0, %o0; - call __syscall_error; - mov %l1, %o0; - ba,pt %xcc, 2f - mov -1, %l1; -1: CDISABLE - mov %l0, %o0 -2: jmpl %i7 + 8, %g0 - restore %g0, %l1, %o0 -#endif - -END(__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif |