2.5-18.1
[glibc.git] / sysdeps / unix / sysv / linux / powerpc / powerpc32 / socket.S
blob0bb5bef78b783b4629d3b0a59d7595ac67e61f11
1 /* Copyright (C) 1995,96,97,99, 2003, 2006 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, write to the Free
16    Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA
17    02110-1301 USA.  */
19 #include <sysdep-cancel.h>
20 #include <socketcall.h>
22 #define P(a, b) P2(a, b)
23 #define P2(a, b) a##b
25 /* The socket-oriented system calls are handled unusally in Linux.
26    They are all gated through the single `socketcall' system call number.
27    `socketcall' takes two arguments: the first is the subcode, specifying
28    which socket function is being called; and the second is a pointer to
29    the arguments to the specific function.
31    The .S files for the other calls just #define socket and #include this.
32    They also #define a 'number-of-arguments' word in NARGS, which
33    defaults to 3.  */
35 #ifndef NARGS
36 #ifdef socket
37 #error NARGS not defined
38 #endif
39 #define NARGS 3
40 #endif
42 /* 0(r1) and 4(r1) are reserved by the ABI, 8(r1), 12(r1), 16(r1) are used
43    for temp saves.  44(r1) is used to save r30.  */
44 #define stackblock 20
46 #ifndef __socket
47 # ifndef NO_WEAK_ALIAS
48 #  define __socket P(__,socket)
49 # else
50 #  define __socket socket
51 # endif
52 #endif
54         .text
55 ENTRY(__socket)
56         stwu r1,-48(r1)
57         cfi_adjust_cfa_offset(48)
58 #if NARGS >= 1
59         stw  r3,stackblock(r1)
60 #endif
61 #if NARGS >= 2
62         stw  r4,4+stackblock(r1)
63 #endif
64 #if NARGS >= 3
65         stw  r5,8+stackblock(r1)
66 #endif
67 #if NARGS >= 4
68         stw  r6,12+stackblock(r1)
69 #endif
70 #if NARGS >= 5
71         stw  r7,16+stackblock(r1)
72 #endif
73 #if NARGS >= 6
74         stw  r8,20+stackblock(r1)
75 #endif
76 #if NARGS >= 7
77 #error too many arguments!
78 #endif
80 #if defined NEED_CANCELLATION && defined CENABLE
81         SINGLE_THREAD_P
82         bne-    .Lsocket_cancel
83 #endif
85         li      r3,P(SOCKOP_,socket)
86         addi    r4,r1,stackblock
87         DO_CALL(SYS_ify(socketcall))
88         addi    r1,r1,48
89         PSEUDO_RET
91 #if defined NEED_CANCELLATION && defined CENABLE
92 .Lsocket_cancel:
93         mflr    r9
94         stw     r9,52(r1)
95         cfi_offset (lr, 4)
96         CGOTSETUP
97         CENABLE
98         stw     r3,16(r1)
99         li      r3,P(SOCKOP_,socket)
100         addi    r4,r1,stackblock
101         DO_CALL(SYS_ify(socketcall))
102         mfcr    r0
103         stw     r3,8(r1)
104         stw     r0,12(r1)
105         lwz     r3,16(r1)
106         CDISABLE
107         lwz     r4,52(r1)
108         lwz     r0,12(r1)
109         lwz     r3,8(r1)
110         CGOTRESTORE
111         mtlr    r4
112         mtcr    r0
113         addi    r1,r1,48
114         PSEUDO_RET
115 #endif
117 PSEUDO_END (__socket)
119 #ifndef NO_WEAK_ALIAS
120 weak_alias (__socket, socket)
121 #endif