]>
Commit | Line | Data |
---|---|---|
a334319f | 1 | /* Copyright (C) 1995, 1996, 1997, 1999, 2003 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, | |
a334319f UD |
16 | write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
17 | Boston, MA 02111-1307, USA. */ | |
cfc91acd | 18 | |
c16abc04 | 19 | #include <sysdep-cancel.h> |
cfc91acd RM |
20 | #include <socketcall.h> |
21 | ||
22 | #define P(a, b) P2(a, b) | |
23 | #define P2(a, b) a##b | |
24 | ||
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. | |
30 | ||
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. */ | |
34 | ||
35 | #ifndef NARGS | |
36 | #ifdef socket | |
37 | #error NARGS not defined | |
38 | #endif | |
39 | #define NARGS 3 | |
40 | #endif | |
41 | ||
aff4519d | 42 | #define stackblock 80 /* offset to socket parm area. */ |
cfc91acd | 43 | |
a334319f UD |
44 | #ifndef socket |
45 | /* If this is just socket.S leave it alone! */ | |
46 | #else | |
cfc91acd | 47 | #ifndef __socket |
a334319f UD |
48 | #define __socket P(__,socket) |
49 | #endif | |
cfc91acd RM |
50 | #endif |
51 | ||
52 | .text | |
53 | ENTRY(__socket) | |
865d953f | 54 | CALL_MCOUNT NARGS |
a334319f | 55 | cfi_startproc |
aff4519d | 56 | stdu r1,-144(r1) |
9df2c61c | 57 | cfi_adjust_cfa_offset(144) |
cfc91acd RM |
58 | #if NARGS >= 1 |
59 | std r3,stackblock(r1) | |
60 | #endif | |
61 | #if NARGS >= 2 | |
62 | std r4,8+stackblock(r1) | |
63 | #endif | |
64 | #if NARGS >= 3 | |
65 | std r5,16+stackblock(r1) | |
66 | #endif | |
67 | #if NARGS >= 4 | |
68 | std r6,24+stackblock(r1) | |
69 | #endif | |
70 | #if NARGS >= 5 | |
71 | std r7,32+stackblock(r1) | |
72 | #endif | |
73 | #if NARGS >= 6 | |
74 | std r8,40+stackblock(r1) | |
75 | #endif | |
76 | #if NARGS >= 7 | |
77 | std r9,48+stackblock(r1) | |
78 | #endif | |
79 | #if NARGS >= 8 | |
80 | std r10,56+stackblock(r1) | |
81 | #endif | |
82 | #if NARGS >= 9 | |
83 | #error too many arguments! | |
84 | #endif | |
aff4519d UD |
85 | |
86 | #if defined NEED_CANCELLATION && defined CENABLE | |
87 | SINGLE_THREAD_P | |
88 | bne- .Lsocket_cancel | |
89 | #endif | |
90 | ||
91 | li r3,P(SOCKOP_,socket) | |
92 | addi r4,r1,stackblock | |
93 | DO_CALL(SYS_ify(socketcall)) | |
94 | addi r1,r1,144 | |
95 | PSEUDO_RET | |
96 | ||
97 | #if defined NEED_CANCELLATION && defined CENABLE | |
98 | .Lsocket_cancel: | |
99 | mflr r9 | |
100 | std r9,144+16(r1) | |
9df2c61c | 101 | cfi_offset (lr, 16) |
aff4519d UD |
102 | CENABLE |
103 | std r3,72(r1) | |
104 | li r3,P(SOCKOP_,socket) | |
cfc91acd RM |
105 | addi r4,r1,stackblock |
106 | DO_CALL(SYS_ify(socketcall)) | |
aff4519d UD |
107 | mfcr r0 |
108 | std r3,64(r1) | |
109 | std r0,8(r1) | |
110 | ld r3,72(r1) | |
111 | CDISABLE | |
112 | ld r4,144+16(r1) | |
113 | ld r0,8(r1) | |
114 | ld r3,64(r1) | |
115 | mtlr r4 | |
116 | mtcr r0 | |
117 | addi r1,r1,144 | |
cfc91acd | 118 | PSEUDO_RET |
aff4519d | 119 | #endif |
a334319f | 120 | cfi_endproc |
cfc91acd RM |
121 | PSEUDO_END (__socket) |
122 | ||
123 | weak_alias (__socket, socket) |