2.9
[glibc/nacl-glibc.git] / sysdeps / unix / sysv / linux / powerpc / powerpc64 / socket.S
blob15d8e84c1f0faa8218edeebb7d71f7c35b994ea0
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 Library General Public License as
6    published by the Free Software Foundation; either version 2 of the
7    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    Library General Public License for more details.
14    You should have received a copy of the GNU Library General Public
15    License along with the GNU C Library; see the file COPYING.LIB.  If not,
16    write to the Free Software Foundation, Inc., 51 Franklin Street, 
17    Fifth Floor, Boston MA 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 #define stackblock 80 /* offset to socket parm area.  */
44 #ifndef __socket
45 # ifndef NO_WEAK_ALIAS
46 #  define __socket P(__,socket)
47 # else
48 #  define __socket socket
49 # endif
50 #endif
52         .text
53 ENTRY(__socket)
54         CALL_MCOUNT NARGS
55         stdu r1,-144(r1)
56         cfi_adjust_cfa_offset(144)
57 #if NARGS >= 1
58         std  r3,stackblock(r1)
59 #endif
60 #if NARGS >= 2
61         std  r4,8+stackblock(r1)
62 #endif
63 #if NARGS >= 3
64         std  r5,16+stackblock(r1)
65 #endif
66 #if NARGS >= 4
67         std  r6,24+stackblock(r1)
68 #endif
69 #if NARGS >= 5
70         std  r7,32+stackblock(r1)
71 #endif
72 #if NARGS >= 6
73         std  r8,40+stackblock(r1)
74 #endif
75 #if NARGS >= 7
76         std  r9,48+stackblock(r1)
77 #endif
78 #if NARGS >= 8
79         std  r10,56+stackblock(r1)
80 #endif
81 #if NARGS >= 9
82 #error too many arguments!
83 #endif
85 #if defined NEED_CANCELLATION && defined CENABLE
86         SINGLE_THREAD_P
87         bne-    .Lsocket_cancel
88 #endif
90         li    r3,P(SOCKOP_,socket)
91         addi    r4,r1,stackblock
92         DO_CALL(SYS_ify(socketcall))
93         addi    r1,r1,144
94         PSEUDO_RET
96 #if defined NEED_CANCELLATION && defined CENABLE
97 .Lsocket_cancel:
98         mflr    r9
99         std   r9,144+16(r1)
100         cfi_offset (lr, 16)
101         CENABLE
102         std     r3,72(r1)
103         li        r3,P(SOCKOP_,socket)
104         addi    r4,r1,stackblock
105         DO_CALL(SYS_ify(socketcall))
106         mfcr    r0
107         std   r3,64(r1)
108         std   r0,8(r1)
109         ld      r3,72(r1)
110         CDISABLE
111         ld    r4,144+16(r1)
112         ld    r0,8(r1)
113         ld    r3,64(r1)
114         mtlr    r4
115         mtcr    r0
116         addi    r1,r1,144
117         PSEUDO_RET
118 #endif
119 PSEUDO_END (__socket)
121 #ifndef NO_WEAK_ALIAS
122 weak_alias (__socket, socket)
123 #endif