/* Copyright (C) 2009-2013 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 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