(CFLAGS-tst-align.c): Add -mpreferred-stack-boundary=4.
[glibc.git] / sysdeps / unix / sysv / linux / powerpc / powerpc32 / socket.S
blobc52ad9babff48cec7edbf6df29739a4725a442e9
1 /* Copyright (C) 1995, 1996, 1997, 1999, 2003 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 Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the 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    Lesser General Public License for more details.
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 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 20
44 #ifndef __socket
45 #define __socket P(__,socket)
46 #endif
48         .text
49 ENTRY(__socket)
50         cfi_startproc
51         stwu r1,-48(r1)
52         cfi_adjust_cfa_offset(48)
53 #if NARGS >= 1
54         stw  r3,stackblock(r1)
55 #endif
56 #if NARGS >= 2
57         stw  r4,4+stackblock(r1)
58 #endif
59 #if NARGS >= 3
60         stw  r5,8+stackblock(r1)
61 #endif
62 #if NARGS >= 4
63         stw  r6,12+stackblock(r1)
64 #endif
65 #if NARGS >= 5
66         stw  r7,16+stackblock(r1)
67 #endif
68 #if NARGS >= 6
69         stw  r8,20+stackblock(r1)
70 #endif
71 #if NARGS >= 7
72         stw  r9,24+stackblock(r1)
73 #endif
74 #if NARGS >= 8
75         stw  r10,28+stackblock(r1)
76 #endif
77 #if NARGS >= 9
78 #error too many arguments!
79 #endif
81 #if defined NEED_CANCELLATION && defined CENABLE
82         SINGLE_THREAD_P
83         bne-    .Lsocket_cancel
84 #endif
86         li      r3,P(SOCKOP_,socket)
87         addi    r4,r1,stackblock
88         DO_CALL(SYS_ify(socketcall))
89         addi    r1,r1,48
90         PSEUDO_RET
92 #if defined NEED_CANCELLATION && defined CENABLE
93 .Lsocket_cancel:
94         mflr    r9
95         stw     r9,52(r1)
96         cfi_offset (lr, 4)
97         CENABLE
98         stw     r3,16(r1)
99         li      r3,P(SOCKOP_,socket)
100         addi    r4,r1,stackblock
101         DO_CALL(SYS_ify(socketcall))
102         mfcr    r0
103         stw     r3,8(r1)
104         stw     r0,12(r1)
105         lwz     r3,16(r1)
106         CDISABLE
107         lwz     r4,52(r1)
108         lwz     r0,12(r1)
109         lwz     r3,8(r1)
110         mtlr    r4
111         mtcr    r0
112         addi    r1,r1,48
113         PSEUDO_RET
114 #endif
115         cfi_endproc
117 PSEUDO_END (__socket)
119 weak_alias (__socket, socket)