Update copyright notices with scripts/update-copyrights.
[glibc.git] / sysdeps / unix / sysv / linux / powerpc / powerpc64 / socket.S
blob018e55c9971d5218c44c030d269811af0c9641ce
1 /* Copyright (C) 1995-2013 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    see <http://www.gnu.org/licenses/>.  */
18 #include <sysdep-cancel.h>
19 #include <socketcall.h>
21 #define P(a, b) P2(a, b)
22 #define P2(a, b) a##b
24 /* The socket-oriented system calls are handled unusally in Linux.
25    They are all gated through the single `socketcall' system call number.
26    `socketcall' takes two arguments: the first is the subcode, specifying
27    which socket function is being called; and the second is a pointer to
28    the arguments to the specific function.
30    The .S files for the other calls just #define socket and #include this.
31    They also #define a 'number-of-arguments' word in NARGS, which
32    defaults to 3.  */
34 #ifndef NARGS
35 #ifdef socket
36 #error NARGS not defined
37 #endif
38 #define NARGS 3
39 #endif
41 #ifndef __socket
42 # ifndef NO_WEAK_ALIAS
43 #  define __socket P(__,socket)
44 # else
45 #  define __socket socket
46 # endif
47 #endif
49 #define FRAMESIZE 128
50 #define stackblock FRAMESIZE+48 /* offset to parm save area.  */
52         .text
53 ENTRY(__socket)
54         CALL_MCOUNT NARGS
55         stdu r1,-FRAMESIZE(r1)
56         cfi_adjust_cfa_offset(FRAMESIZE)
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,FRAMESIZE
94         cfi_adjust_cfa_offset(-FRAMESIZE)
95         PSEUDO_RET
97 #if defined NEED_CANCELLATION && defined CENABLE
98 .Lsocket_cancel:
99         cfi_adjust_cfa_offset(FRAMESIZE)
100         mflr    r9
101         std     r9,FRAMESIZE+16(r1)
102         cfi_offset (lr, 16)
103         CENABLE
104         std     r3,120(r1)
105         li      r3,P(SOCKOP_,socket)
106         addi    r4,r1,stackblock
107         DO_CALL(SYS_ify(socketcall))
108         mfcr    r0
109         std     r3,112(r1)
110         std     r0,FRAMESIZE+8(r1)
111         cfi_offset (cr, 8)
112         ld      r3,120(r1)
113         CDISABLE
114         ld      r4,FRAMESIZE+16(r1)
115         ld      r0,FRAMESIZE+8(r1)
116         ld      r3,112(r1)
117         mtlr    r4
118         mtcr    r0
119         addi    r1,r1,FRAMESIZE
120         cfi_adjust_cfa_offset(-FRAMESIZE)
121         cfi_restore(lr)
122         cfi_restore(cr)
123         PSEUDO_RET
124 #endif
125 PSEUDO_END (__socket)
127 #ifndef NO_WEAK_ALIAS
128 weak_alias (__socket, socket)
129 #endif