]>
Commit | Line | Data |
---|---|---|
b168057a | 1 | /* Copyright (C) 1995-2015 Free Software Foundation, Inc. |
cfc91acd RM |
2 | This file is part of the GNU C Library. |
3 | ||
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. | |
8 | ||
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. | |
13 | ||
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, | |
59ba27a6 | 16 | see <http://www.gnu.org/licenses/>. */ |
cfc91acd | 17 | |
c16abc04 | 18 | #include <sysdep-cancel.h> |
cfc91acd RM |
19 | #include <socketcall.h> |
20 | ||
21 | #define P(a, b) P2(a, b) | |
22 | #define P2(a, b) a##b | |
23 | ||
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. | |
29 | ||
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. */ | |
33 | ||
34 | #ifndef NARGS | |
35 | #ifdef socket | |
36 | #error NARGS not defined | |
37 | #endif | |
38 | #define NARGS 3 | |
39 | #endif | |
40 | ||
cfc91acd | 41 | #ifndef __socket |
d11edae6 RM |
42 | # ifndef NO_WEAK_ALIAS |
43 | # define __socket P(__,socket) | |
44 | # else | |
45 | # define __socket socket | |
46 | # endif | |
cfc91acd RM |
47 | #endif |
48 | ||
8b8a692c UW |
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 | |
bebff237 | 56 | |
cfc91acd RM |
57 | .text |
58 | ENTRY(__socket) | |
865d953f | 59 | CALL_MCOUNT NARGS |
bebff237 AM |
60 | stdu r1,-FRAMESIZE(r1) |
61 | cfi_adjust_cfa_offset(FRAMESIZE) | |
cfc91acd RM |
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 | |
aff4519d UD |
89 | |
90 | #if defined NEED_CANCELLATION && defined CENABLE | |
91 | SINGLE_THREAD_P | |
92 | bne- .Lsocket_cancel | |
93 | #endif | |
94 | ||
bebff237 | 95 | li r3,P(SOCKOP_,socket) |
aff4519d UD |
96 | addi r4,r1,stackblock |
97 | DO_CALL(SYS_ify(socketcall)) | |
bebff237 AM |
98 | addi r1,r1,FRAMESIZE |
99 | cfi_adjust_cfa_offset(-FRAMESIZE) | |
aff4519d UD |
100 | PSEUDO_RET |
101 | ||
102 | #if defined NEED_CANCELLATION && defined CENABLE | |
103 | .Lsocket_cancel: | |
bebff237 | 104 | cfi_adjust_cfa_offset(FRAMESIZE) |
aff4519d | 105 | mflr r9 |
8b8a692c UW |
106 | std r9,FRAMESIZE+FRAME_LR_SAVE(r1) |
107 | cfi_offset (lr, FRAME_LR_SAVE) | |
aff4519d | 108 | CENABLE |
8b8a692c | 109 | std r3,FRAME_MIN_SIZE+8(r1) |
bebff237 | 110 | li r3,P(SOCKOP_,socket) |
cfc91acd RM |
111 | addi r4,r1,stackblock |
112 | DO_CALL(SYS_ify(socketcall)) | |
aff4519d | 113 | mfcr r0 |
8b8a692c UW |
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) | |
aff4519d | 118 | CDISABLE |
8b8a692c UW |
119 | ld r4,FRAMESIZE+FRAME_LR_SAVE(r1) |
120 | ld r0,FRAMESIZE+FRAME_CR_SAVE(r1) | |
121 | ld r3,FRAME_MIN_SIZE(r1) | |
aff4519d UD |
122 | mtlr r4 |
123 | mtcr r0 | |
bebff237 AM |
124 | addi r1,r1,FRAMESIZE |
125 | cfi_adjust_cfa_offset(-FRAMESIZE) | |
126 | cfi_restore(lr) | |
127 | cfi_restore(cr) | |
cfc91acd | 128 | PSEUDO_RET |
aff4519d | 129 | #endif |
cfc91acd RM |
130 | PSEUDO_END (__socket) |
131 | ||
d11edae6 | 132 | #ifndef NO_WEAK_ALIAS |
cfc91acd | 133 | weak_alias (__socket, socket) |
d11edae6 | 134 | #endif |