Update copyright dates with scripts/update-copyrights.
[glibc.git] / sysdeps / unix / sysv / linux / powerpc / powerpc64 / socket.S
blob102844416ce5c0eb76dc2f97de35fcbff9678524
1 /* Copyright (C) 1995-2015 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 #if _CALL_ELF == 2
50 #define FRAMESIZE (FRAME_MIN_SIZE+16+64)
51 #define stackblock (FRAME_MIN_SIZE+16)
52 #else
53 #define FRAMESIZE (FRAME_MIN_SIZE+16)
54 #define stackblock (FRAMESIZE+FRAME_PARM_SAVE) /* offset to parm save area.  */
55 #endif
57         .text
58 ENTRY(__socket)
59         CALL_MCOUNT NARGS
60         stdu r1,-FRAMESIZE(r1)
61         cfi_adjust_cfa_offset(FRAMESIZE)
62 #if NARGS >= 1
63         std  r3,stackblock(r1)
64 #endif
65 #if NARGS >= 2
66         std  r4,8+stackblock(r1)
67 #endif
68 #if NARGS >= 3
69         std  r5,16+stackblock(r1)
70 #endif
71 #if NARGS >= 4
72         std  r6,24+stackblock(r1)
73 #endif
74 #if NARGS >= 5
75         std  r7,32+stackblock(r1)
76 #endif
77 #if NARGS >= 6
78         std  r8,40+stackblock(r1)
79 #endif
80 #if NARGS >= 7
81         std  r9,48+stackblock(r1)
82 #endif
83 #if NARGS >= 8
84         std  r10,56+stackblock(r1)
85 #endif
86 #if NARGS >= 9
87 #error too many arguments!
88 #endif
90 #if defined NEED_CANCELLATION && defined CENABLE
91         SINGLE_THREAD_P
92         bne-    .Lsocket_cancel
93 #endif
95         li      r3,P(SOCKOP_,socket)
96         addi    r4,r1,stackblock
97         DO_CALL(SYS_ify(socketcall))
98         addi    r1,r1,FRAMESIZE
99         cfi_adjust_cfa_offset(-FRAMESIZE)
100         PSEUDO_RET
102 #if defined NEED_CANCELLATION && defined CENABLE
103 .Lsocket_cancel:
104         cfi_adjust_cfa_offset(FRAMESIZE)
105         mflr    r9
106         std     r9,FRAMESIZE+FRAME_LR_SAVE(r1)
107         cfi_offset (lr, FRAME_LR_SAVE)
108         CENABLE
109         std     r3,FRAME_MIN_SIZE+8(r1)
110         li      r3,P(SOCKOP_,socket)
111         addi    r4,r1,stackblock
112         DO_CALL(SYS_ify(socketcall))
113         mfcr    r0
114         std     r3,FRAME_MIN_SIZE(r1)
115         std     r0,FRAMESIZE+FRAME_CR_SAVE(r1)
116         cfi_offset (cr, FRAME_CR_SAVE)
117         ld      r3,FRAME_MIN_SIZE+8(r1)
118         CDISABLE
119         ld      r4,FRAMESIZE+FRAME_LR_SAVE(r1)
120         ld      r0,FRAMESIZE+FRAME_CR_SAVE(r1)
121         ld      r3,FRAME_MIN_SIZE(r1)
122         mtlr    r4
123         mtcr    r0
124         addi    r1,r1,FRAMESIZE
125         cfi_adjust_cfa_offset(-FRAMESIZE)
126         cfi_restore(lr)
127         cfi_restore(cr)
128         PSEUDO_RET
129 #endif
130 PSEUDO_END (__socket)
132 #ifndef NO_WEAK_ALIAS
133 weak_alias (__socket, socket)
134 #endif