From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from e23smtp04.au.ibm.com (e23smtp04.au.ibm.com [202.81.31.146]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "e23smtp04.au.ibm.com", Issuer "GeoTrust SSL CA" (verified OK)) by ozlabs.org (Postfix) with ESMTPS id 08380B70DB for ; Thu, 26 Aug 2010 15:56:12 +1000 (EST) Received: from d23relay05.au.ibm.com (d23relay05.au.ibm.com [202.81.31.247]) by e23smtp04.au.ibm.com (8.14.4/8.13.1) with ESMTP id o7Q5pcZL026737 for ; Thu, 26 Aug 2010 15:51:38 +1000 Received: from d23av04.au.ibm.com (d23av04.au.ibm.com [9.190.235.139]) by d23relay05.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o7Q5uA4N1982486 for ; Thu, 26 Aug 2010 15:56:11 +1000 Received: from d23av04.au.ibm.com (loopback [127.0.0.1]) by d23av04.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id o7Q5u9nA010176 for ; Thu, 26 Aug 2010 15:56:10 +1000 Content-Type: text/plain; charset=UTF-8 Subject: Re: [PATCH] powerpc: Wire up direct socket system calls From: Ian Munsie To: linux-kernel , Benjamin Herrenschmidt , Paul Mackerras , Andrew Morton , Andreas Schwab , Christoph Hellwig , Arjan van de Ven , Jesper Nilsson , linuxppc-dev In-reply-to: <1282798228-340-1-git-send-email-imunsie@au1.ibm.com> References: <1282798228-340-1-git-send-email-imunsie@au1.ibm.com> Date: Thu, 26 Aug 2010 15:56:07 +1000 Message-Id: <1282801975-sup-2217@au1.ibm.com> List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Excerpts from Ian Munsie's message of Thu Aug 26 14:50:28 +1000 2010: > This patch wires up the various socket system calls on PowerPC so that > userspace can call them directly, rather than by going through the > multiplexed socketcall system call. I should have mentioned that the base is ppc/next Also, I've included a simple library below suitable for use with LD_PRELOAD to allow this to be tested on existing programs. Cheers, -Ian #include #include #include #include #include #include #include #include /* PPC syscall numbers from /arch/powerpc/include/asm/unistd.h */ #define __NR_socket 326 #define __NR_bind 327 #define __NR_connect 328 #define __NR_listen 329 #define __NR_accept 330 #define __NR_getsockname 331 #define __NR_getpeername 332 #define __NR_socketpair 333 #define __NR_send 334 #define __NR_sendto 335 #define __NR_recv 336 #define __NR_recvfrom 337 #define __NR_shutdown 338 #define __NR_setsockopt 339 #define __NR_getsockopt 340 #define __NR_sendmsg 341 #define __NR_recvmsg 342 #define __NR_recvmmsg 343 #define __NR_accept4 344 #define DEBUG 0 #if DEBUG #define DEBUGsyscall(name, ...) \ int __ret; \ __ret = syscall(__NR_##name, __VA_ARGS__); \ fprintf(stderr, "--"#name": %i", __ret); \ if (__ret == -1) { \ fprintf(stderr, ", %s (%i)", strerror(errno), errno); \ } \ fprintf(stderr, "--\n"); \ return __ret; #else #define DEBUGsyscall(name, ...) \ return syscall(__NR_##name, __VA_ARGS__); #endif int socket(int domain, int type, int protocol) { DEBUGsyscall(socket, domain, type, protocol); } int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) { DEBUGsyscall(bind, sockfd, addr, addrlen); } int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) { DEBUGsyscall(connect, sockfd, addr, addrlen); } int listen(int sockfd, int backlog) { DEBUGsyscall(listen, sockfd, backlog); } int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) { DEBUGsyscall(accept, sockfd, addr, addrlen); } int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen) { DEBUGsyscall(getsockname, sockfd, addr, addrlen); } int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen) { DEBUGsyscall(getpeername, sockfd, addr, addrlen); } int socketpair(int domain, int type, int protocol, int sv[2]) { DEBUGsyscall(socketpair, domain, type, protocol, sv); } int send(int sockfd, const void *buf, size_t len, int flags) { DEBUGsyscall(send, sockfd, buf, len, flags); } int sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen) { DEBUGsyscall(sendto, sockfd, buf, len, flags, dest_addr, addrlen); } int recv(int sockfd, void *buf, size_t len, int flags) { DEBUGsyscall(recv, sockfd, buf, len, flags); } int recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen) { DEBUGsyscall(recvfrom, sockfd, buf, len, flags, src_addr, addrlen); } int shutdown(int sockfd, int how) { DEBUGsyscall(shutdown, sockfd, how); } int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen) { DEBUGsyscall(setsockopt, sockfd, level, optname, optval, optlen); } int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen) { DEBUGsyscall(getsockopt, sockfd, level, optname, optval, optlen); } int sendmsg(int sockfd, const struct msghdr *msg, int flags) { DEBUGsyscall(sendmsg, sockfd, msg, flags); } int recvmsg(int sockfd, struct msghdr *msg, int flags) { DEBUGsyscall(recvmsg, sockfd, msg, flags); } /* Debian squeeze libc doesn't support recvmmsg yet, not much point intercepting it */ int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags) { DEBUGsyscall(accept4, sockfd, addr, addrlen, flags); }