From patchwork Wed May 20 14:19:49 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 48806 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-wi0-f199.google.com (mail-wi0-f199.google.com [209.85.212.199]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id CD2B52121F for ; Wed, 20 May 2015 14:20:37 +0000 (UTC) Received: by wizk4 with SMTP id k4sf20805513wiz.2 for ; Wed, 20 May 2015 07:20:37 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:mailing-list:precedence:list-id :list-unsubscribe:list-subscribe:list-archive:list-post:list-help :sender:delivered-to:message-id:date:from:user-agent:mime-version:to :subject:content-type:content-transfer-encoding:x-original-sender :x-original-authentication-results; bh=PHyML9egEy6bKFQErLGkRDOLI8dU9wJ8PS32gEe4bZ4=; b=kePIUHBF4/4vYvoxKDa1m7AVu/YWSl3WdGib7hnmQr4B9Xj+GXnMTy6z+aHuPGPC06 1tJ2TxexyIKrviiyKt4JZp0F2k69kuzREgqE8Oe7A188Tph8GCfdO8C33diYQMyVLMO5 mZ27YkCCF4dl2US3D8FwxEH7dH/6Nj+YW067jFFX9F/WP0a1M7v+4UbKR6i9FQ4LbsLE Ub2BfwSd1tIrRADRhTg9rYoTXgLZh6sbvzkf/GxqP/Uo4+/kXi1hzNDMk9WLOp/htyEf jluDfny1iUSbfwdn+KsIh2b50st77YMKdPchT+k1WH+0jyWk4dl5vvy/ZYOba4IAJfkN Otzg== X-Gm-Message-State: ALoCoQkaeApt3U3AUmUYpgwLnLm8yLQplL3o/AAjYvd7rHlpmJ48m763OvEtfztbiqY/1k8vZvwh X-Received: by 10.180.35.164 with SMTP id i4mr2065407wij.0.1432131637104; Wed, 20 May 2015 07:20:37 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.4.104 with SMTP id j8ls174048laj.106.gmail; Wed, 20 May 2015 07:20:36 -0700 (PDT) X-Received: by 10.112.118.49 with SMTP id kj17mr14602025lbb.62.1432131636925; Wed, 20 May 2015 07:20:36 -0700 (PDT) Received: from mail-la0-x232.google.com (mail-la0-x232.google.com. [2a00:1450:4010:c03::232]) by mx.google.com with ESMTPS id cb12si11252690lad.108.2015.05.20.07.20.36 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 May 2015 07:20:36 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 2a00:1450:4010:c03::232 as permitted sender) client-ip=2a00:1450:4010:c03::232; Received: by labbd9 with SMTP id bd9so76809213lab.2 for ; Wed, 20 May 2015 07:20:36 -0700 (PDT) X-Received: by 10.112.204.104 with SMTP id kx8mr25627212lbc.72.1432131636745; Wed, 20 May 2015 07:20:36 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.108.230 with SMTP id hn6csp1565879lbb; Wed, 20 May 2015 07:20:33 -0700 (PDT) X-Received: by 10.66.179.81 with SMTP id de17mr64323448pac.59.1432131632678; Wed, 20 May 2015 07:20:32 -0700 (PDT) Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id b3si26672970pat.229.2015.05.20.07.20.31 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 May 2015 07:20:32 -0700 (PDT) Received-SPF: pass (google.com: domain of libc-alpha-return-59076-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Received: (qmail 84139 invoked by alias); 20 May 2015 14:20:14 -0000 Mailing-List: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org Precedence: list List-Id: List-Unsubscribe: , List-Subscribe: List-Archive: List-Post: , List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 84035 invoked by uid 89); 20 May 2015 14:20:13 -0000 X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.3 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-qk0-f180.google.com X-Received: by 10.140.29.161 with SMTP id b30mr21677201qgb.3.1432131592949; Wed, 20 May 2015 07:19:52 -0700 (PDT) Message-ID: <555C9805.1010100@linaro.org> Date: Wed, 20 May 2015 11:19:49 -0300 From: Adhemerval Zanella User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: GNU C Library Subject: [PATCH] Remove socket.S implementation X-Original-Sender: adhemerval.zanella@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 2a00:1450:4010:c03::232 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org; dkim=pass header.i=@sourceware.org X-Google-Group-Id: 836684582541 Hi This patch is another of the required adjustments for the fix for bz12683 (Race conditions in pthread cancellation) and the idea is to get rid of assembly implementation for socket function for ports which uses socketcall. This patch removes the socket.S implementation for all ports and replace it by a C implementation using socketcall where it is required. 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. All the affect architectures (i386, microblaze, mips, powerpc, and sparc) have support for 6 argument syscalls. I have cross-build GLIBC for afore-mentioned ports and tested on i386, x86_64, powerpc64le, arm, and aarch64. --- * nptl/Makefile (CFLAGS-accept.c): Add -fexceptions and -fasynchronous-unwind-tables. (CFLAGS-sendto.c): Likewise. (CFLAGS-sendmsg.c): Likewise. (CFLAGS-connect.c): Likewise. (CFLAGS-recvmsg.c): Likewise. (CFLAGS-recvfrom.c): Likewise. * sysdeps/unix/sysv/linux/socketcall.h (SOCKOP_invalid): Define. (SOCKETCALL): New macro: non-cancellable socketcall. (SOCKETCALL_CANCEL): New macro: cancellable socketcall. * sysdeps/unix/sysv/linux/Makefile [$(subdir) = socket]: Remove internal_accept4, internal_recvmmsg, and internal_sendmmsg rules. * sysdeps/unix/sysv/linux/accept.c: New file. * sysdeps/unix/sysv/linux/bind.c: Likewise. * sysdeps/unix/sysv/linux/connect.c: Likewise. * sysdeps/unix/sysv/linux/getpeername.c: Likewise. * sysdeps/unix/sysv/linux/getsockname.c: Likewise. * sysdeps/unix/sysv/linux/getsockopt.c: Likewise. * sysdeps/unix/sysv/linux/listen.c: Likewise. * sysdeps/unix/sysv/linux/recv.c: Likewise. * sysdeps/unix/sysv/linux/recvfrom.c: Likewise. * sysdeps/unix/sysv/linux/recvmsg.c: Likewise. * sysdeps/unix/sysv/linux/send.c: Likewise. * sysdeps/unix/sysv/linux/sendmsg.c: Likewise. * sysdeps/unix/sysv/linux/sendto.c: Likewise. * sysdeps/unix/sysv/linux/setsockopt.c: Likewise. * sysdeps/unix/sysv/linux/shutdown.c: Likewise. * sysdeps/unix/sysv/linux/socket.c: Likewise. * sysdeps/unix/sysv/linux/socketpair.c: Likewise. * sysdeps/unix/sysv/linux/recvmmsg.c (__internal_recvmmsg): Remove prototype. (recvmmsg) [__ASSUME_RECVMMSG_SOCKETCALL]: Add C based implementation. (recvmmsg) [!__ASSUME_RECVMMSG_SOCKETCALL]: Use SOCKETCALL_CANCEL macro instead of __internal_xxx function. * sysdeps/unix/sysv/linux/accept4.c (__internal_accept4): Remove prototype. (accept4) [__ASSUME_ACCEPT4_SOCKETCALL]: Add C based implementation. (accept4) [!__ASSUME_ACCEPT4_SOCKETCALL]: Use SOCKETCALL_CANCEL macro instead of __internal_xxx function. * sysdeps/unix/sysv/linux/sendmmsg.c (__internal_sendmmsg): Remove prototype. (sendmmsg) [__ASSUME_SENDMMSG_SOCKETCALL]: Add C based implementation. (sendmmsg) [!__ASSUME_SENDMMSG_SOCKETCALL]: Use SOCKETCALL_CANCEL macro instead of __internal_xxx function. * sysdeps/unix/sysv/linux/accept.S: Remove file. * sysdeps/unix/sysv/linux/bind.S: Likewise. * sysdeps/unix/sysv/linux/connect.S: Likewise. * sysdeps/unix/sysv/linux/getpeername.S: Likewise. * sysdeps/unix/sysv/linux/getsockname.S: Likewise. * sysdeps/unix/sysv/linux/getsockopt.S: Likewise. * sysdeps/unix/sysv/linux/i386/accept4.S: Likewise. * sysdeps/unix/sysv/linux/i386/internal_accept4.S: Likewise. * sysdeps/unix/sysv/linux/i386/socket.S: Likewise. * sysdeps/unix/sysv/linux/internal_accept4.S: Likewise. * sysdeps/unix/sysv/linux/internal_recvmmsg.S: Likewise. * sysdeps/unix/sysv/linux/internal_sendmmsg.S: Likewise. * sysdeps/unix/sysv/linux/listen.S: Likewise. * sysdeps/unix/sysv/linux/microblaze/socket.S: Likewise. * sysdeps/unix/sysv/linux/mips/mips32/internal_accept4.S: Likewise. * sysdeps/sysv/linux/mips/mips32/internal_recvmmsg.S: Likewise. * sysdeps/sysv/linux/mips/mips32/internal_sendmmsg.S: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc32/socket.S: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc64/socket.S: Likewise. * sysdeps/unix/sysv/linux/recv.S: Likewise. * sysdeps/unix/sysv/linux/recvfrom.S: Likewise. * sysdeps/unix/sysv/linux/recvmsg.S: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/socket.S: Likewise. * sysdeps/unix/sysv/linux/s390/s390-64/socket.S: Likewise. * sysdeps/unix/sysv/linux/send.S: Likewise. * sysdeps/unix/sysv/linux/sendmsg.S: Likewise. * sysdeps/unix/sysv/linux/sendto.S: Likewise. * sysdeps/unix/sysv/linux/setsockopt.S: Likewise. * sysdeps/unix/sysv/linux/sh/socket.S: Likewise. * sysdeps/unix/sysv/linux/shutdown.S: Likewise. * sysdeps/unix/sysv/linux/socketpair.S: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc32/socket.S: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/socket.S: Likewise. * sysdeps/unix/sysv/linux/kernel-features.h: Adjust comment on how socketcall is implemented in GLIBC. * sysdeps/unix/sysv/linux/malloc-sysdep.h (check_may_shrink_heap): Initialize val variable. --- diff --git a/nptl/Makefile b/nptl/Makefile index fe1ba05..8e99452 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -200,6 +200,12 @@ CFLAGS-open64.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-pause.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-recv.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-send.c = -fexceptions -fasynchronous-unwind-tables +CFLAGS-accept.c = -fexceptions -fasynchronous-unwind-tables +CFLAGS-sendto.c = -fexceptions -fasynchronous-unwind-tables +CFLAGS-sendmsg.c = -fexceptions -fasynchronous-unwind-tables +CFLAGS-connect.c = -fexceptions -fasynchronous-unwind-tables +CFLAGS-recvmsg.c = -fexceptions -fasynchronous-unwind-tables +CFLAGS-recvfrom.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-pt-system.c = -fexceptions diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index c26a12f..bfbabd4 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 491ebe2..0000000 --- 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 -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 0000000..ddf2065 --- /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 + . */ + +#include +#include +#include + +#include +#include + +int +__libc_accept (int fd, __SOCKADDR_ARG addr, socklen_t *len) +{ + return SOCKETCALL_CANCEL (accept, fd, addr.__sockaddr__, len, 0, 0, 0); +} +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 5dbcef3..8e70b81 100644 --- a/sysdeps/unix/sysv/linux/accept4.c +++ b/sysdeps/unix/sysv/linux/accept4.c @@ -50,11 +50,15 @@ 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 +# 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, + 0, 0); +} +# else static int have_accept4; int @@ -62,7 +66,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, 0, 0); /* 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 +77,8 @@ 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, addr.__sockaddr__, addr_len, 0, + 0, 0, 0); if (errno == EINVAL) { have_accept4 = -1; @@ -90,11 +96,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/bind.S b/sysdeps/unix/sysv/linux/bind.S deleted file mode 100644 index 61fb5eb..0000000 --- a/sysdeps/unix/sysv/linux/bind.S +++ /dev/null @@ -1,3 +0,0 @@ -#define socket bind -#define NARGS 3 -#include diff --git a/sysdeps/unix/sysv/linux/bind.c b/sysdeps/unix/sysv/linux/bind.c new file mode 100644 index 0000000..db72df6 --- /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 + . */ + +#include +#include +#include + +#include + +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 21fc4a6..0000000 --- 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 -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 0000000..8ed0963 --- /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 + . */ + +#include +#include +#include + +#include +#include + +int +__libc_connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) +{ + return SOCKETCALL_CANCEL (connect, fd, addr.__sockaddr__, len, 0, 0, 0); +} +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 a6d8e86..0000000 --- a/sysdeps/unix/sysv/linux/getpeername.S +++ /dev/null @@ -1,3 +0,0 @@ -#define socket getpeername -#define NARGS 3 -#include diff --git a/sysdeps/unix/sysv/linux/getpeername.c b/sysdeps/unix/sysv/linux/getpeername.c new file mode 100644 index 0000000..adee2ba --- /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 + . */ + +#include +#include +#include + +#include + +int +__getpeername (int fd, __SOCKADDR_ARG addr, socklen_t *len) +{ + return SOCKETCALL (getpeername, fd, addr.__sockaddr__, len, 0, 0, 0); +} +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 c138be9..0000000 --- a/sysdeps/unix/sysv/linux/getsockname.S +++ /dev/null @@ -1,3 +0,0 @@ -#define socket getsockname -#define NARGS 3 -#include diff --git a/sysdeps/unix/sysv/linux/getsockname.c b/sysdeps/unix/sysv/linux/getsockname.c new file mode 100644 index 0000000..564afac --- /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 + . */ + +#include +#include +#include + +#include + +int +__getsockname (int fd, __SOCKADDR_ARG addr, socklen_t *len) +{ + return SOCKETCALL (getsockname, fd, addr.__sockaddr__, len, 0, 0, 0); +} +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 6f98208..0000000 --- a/sysdeps/unix/sysv/linux/getsockopt.S +++ /dev/null @@ -1,3 +0,0 @@ -#define socket getsockopt -#define NARGS 5 -#include diff --git a/sysdeps/unix/sysv/linux/getsockopt.c b/sysdeps/unix/sysv/linux/getsockopt.c new file mode 100644 index 0000000..10d14c8 --- /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 + . */ + +#include +#include +#include + +#include + +int +__getsockopt (int fd, int level, int optname, void *optval, socklen_t *len) +{ + return SOCKETCALL (getsockopt, fd, level, optname, optval, len, 0); +} +weak_alias (__getsockopt, getsockopt) diff --git a/sysdeps/unix/sysv/linux/i386/accept4.S b/sysdeps/unix/sysv/linux/i386/accept4.S deleted file mode 100644 index 6ed8395..0000000 --- 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 - . */ - -#include -#include -#include -#include - -#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 c3f1630..0000000 --- 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 d87390c..0000000 --- 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 - . */ - -#include -#include -#include - -#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 f0c61b5..0000000 --- a/sysdeps/unix/sysv/linux/internal_accept4.S +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include - -/* 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 -#endif diff --git a/sysdeps/unix/sysv/linux/internal_recvmmsg.S b/sysdeps/unix/sysv/linux/internal_recvmmsg.S deleted file mode 100644 index 6b776b9..0000000 --- a/sysdeps/unix/sysv/linux/internal_recvmmsg.S +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include - -/* 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 -#endif diff --git a/sysdeps/unix/sysv/linux/internal_sendmmsg.S b/sysdeps/unix/sysv/linux/internal_sendmmsg.S deleted file mode 100644 index 4d903ea..0000000 --- a/sysdeps/unix/sysv/linux/internal_sendmmsg.S +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include - -/* 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 -# 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 2ca6f10..48c0b00 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 bed6a05..0000000 --- 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 -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 0000000..48d94a2 --- /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 + . */ + +#include +#include +#include + +#include + +int +listen (int fd, int backlog) +{ + return SOCKETCALL (listen, fd, backlog, 0, 0, 0, 0); +} +weak_alias (listen, __listen); diff --git a/sysdeps/unix/sysv/linux/malloc-sysdep.h b/sysdeps/unix/sysv/linux/malloc-sysdep.h index cd6255f..6af1107 100644 --- a/sysdeps/unix/sysv/linux/malloc-sysdep.h +++ b/sysdeps/unix/sysv/linux/malloc-sysdep.h @@ -46,7 +46,7 @@ check_may_shrink_heap (void) O_RDONLY | O_CLOEXEC); if (fd >= 0) { - char val; + char val = 0; ssize_t n = read_not_cancel (fd, &val, 1); may_shrink_heap = n > 0 && val == '2'; close_not_cancel_no_status (fd); diff --git a/sysdeps/unix/sysv/linux/microblaze/socket.S b/sysdeps/unix/sysv/linux/microblaze/socket.S deleted file mode 100644 index a3b4048..0000000 --- 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 - . */ - -#include -#include - -#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 30434d7..0000000 --- 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 30434d7..0000000 --- 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 30434d7..0000000 --- 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 7dc59b4..0000000 --- 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 - . */ - -#include -#include - -#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 1028444..0000000 --- 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 . */ - -#include -#include - -#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 331844a..0000000 --- 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 -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 0000000..1ecc0eb --- /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 + . */ + +#include +#include +#include + +#include +#include + +ssize_t +__libc_recv (int fd, void *buf, size_t len, int flags) +{ + return SOCKETCALL_CANCEL (recv, fd, buf, len, flags, 0, 0); +} +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 ccbb0a7..0000000 --- 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 -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 0000000..90eb40d --- /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 + . */ + +#include +#include +#include + +#include +#include + +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 c3a4874..73b3ee0 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 +# 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, 0, 0); +} +# 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, 0); /* 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, 0, 0, 0, 0, 0, 0); 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 #endif diff --git a/sysdeps/unix/sysv/linux/recvmsg.S b/sysdeps/unix/sysv/linux/recvmsg.S deleted file mode 100644 index d44bc39..0000000 --- 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 -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 0000000..1d68a71 --- /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 + . */ + +#include +#include +#include + +#include +#include + +ssize_t +__libc_recvmsg (int fd, struct msghdr *msg, int flags) +{ + return SOCKETCALL_CANCEL (recvmsg, fd, msg, flags, 0, 0, 0); +} +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 4611e52..0000000 --- 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 - . */ - -#include -#include - -/* &%/$&!! 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 26b39f9..0000000 --- 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 - . */ - -#include -#include - -/* &%/$&!! 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 259748f..0000000 --- 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 -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 0000000..25333d0 --- /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 + . */ + +#include +#include +#include + +#include +#include + +ssize_t +__libc_send (int fd, const void *buf, size_t len, int flags) +{ + return SOCKETCALL_CANCEL (send, fd, buf, len, flags, 0, 0); +} +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 a95aff1..7bad328 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 +# ifdef __ASSUME_SENDMMSG_SOCKETCALL +int +__sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags) +{ + return SOCKETCALL_CANCEL (sendmmsg, fd, vmessages, vlen, flags, 0, 0); +} +# 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, 0, 0); /* 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, 0, 0, 0, 0, 0, 0); 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 #endif diff --git a/sysdeps/unix/sysv/linux/sendmsg.S b/sysdeps/unix/sysv/linux/sendmsg.S deleted file mode 100644 index a220894..0000000 --- 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 -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 0000000..67f4317 --- /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 + . */ + +#include +#include +#include + +#include +#include + +ssize_t +__libc_sendmsg (int fd, const struct msghdr *msg, int flags) +{ + return SOCKETCALL_CANCEL (sendmsg, fd, msg, flags, 0, 0, 0); +} +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 a65e44f..0000000 --- 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 -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 0000000..d2896a6 --- /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 + . */ + +#include +#include +#include + +#include +#include + +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 4e40ccb..0000000 --- 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 -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 0000000..5f66f73 --- /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 + . */ + +#include +#include +#include + +#include + +int +setsockopt (int fd, int level, int optname, const void *optval, socklen_t len) +{ + return SOCKETCALL (setsockopt, fd, level, optname, optval, len, 0); +} +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 ee99e84..0000000 --- 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 - . */ - -#include -#include -#include - -#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 e2462d0..0000000 --- a/sysdeps/unix/sysv/linux/shutdown.S +++ /dev/null @@ -1,3 +0,0 @@ -#define socket shutdown -#define NARGS 2 -#include diff --git a/sysdeps/unix/sysv/linux/shutdown.c b/sysdeps/unix/sysv/linux/shutdown.c new file mode 100644 index 0000000..a4c9eb6 --- /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 + . */ + +#include +#include +#include + +#include + +int +__shutdown (int fd, int how) +{ + return SOCKETCALL (shutdown, fd, how, 0, 0, 0, 0); +} +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 0000000..8e9d868 --- /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 + . */ + +#include +#include +#include + +#include + +int +__socket (int fd, int type, int domain) +{ + return SOCKETCALL (socket, fd, type, domain, 0, 0, 0); +} +weak_alias (__socket, socket) diff --git a/sysdeps/unix/sysv/linux/socketcall.h b/sysdeps/unix/sysv/linux/socketcall.h index e59067d..6ddb09d 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,38 @@ #define SOCKOP_recvmmsg 19 #define SOCKOP_sendmmsg 20 +#define SOCKETCALL(name, __a1, __a2, __a3, __a4, __a5, __a6) \ + ({ \ + long int __args[6] = { (long int) __a1, \ + (long int) __a2, \ + (long int) __a3, \ + (long int) __a4, \ + (long int) __a5, \ + (long int) __a6 }; \ + long int sc_ret = INLINE_SYSCALL (socketcall, 2, 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, __a1, __a2, __a3, __a4, __a5, __a6) \ + ({ \ + long int __args[6] = { (long int) __a1, \ + (long int) __a2, \ + (long int) __a3, \ + (long int) __a4, \ + (long int) __a5, \ + (long int) __a6 }; \ + int oldtype = LIBC_CANCEL_ASYNC (); \ + long int sc_ret = INLINE_SYSCALL (socketcall, 2, 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 c954ad1..0000000 --- a/sysdeps/unix/sysv/linux/socketpair.S +++ /dev/null @@ -1,3 +0,0 @@ -#define socket socketpair -#define NARGS 4 -#include diff --git a/sysdeps/unix/sysv/linux/socketpair.c b/sysdeps/unix/sysv/linux/socketpair.c new file mode 100644 index 0000000..10ca7c0 --- /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 + . */ + +#include +#include +#include + +#include + +int +__socketpair (int domain, int type, int protocol, int sv[2]) +{ + return SOCKETCALL (socketpair, domain, type, protocol, sv, 0, 0); +} +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 59c8164..0000000 --- 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 , 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 - . */ - -#include -#include - -#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 b680165..0000000 --- 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 , 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 - . */ - -#include -#include - -#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