Update copyright notices with scripts/update-copyrights
[glibc.git] / sysdeps / unix / sysv / linux / s390 / s390-64 / socket.S
blob788599a1060ccadfb1ed5f2df6216ec8af204fed
1 /* Copyright (C) 2001-2014 Free Software Foundation, Inc.
2    Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
3    This file is part of the GNU C Library.
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
19 #include <sysdep-cancel.h>
20 #include <socketcall.h>
22 /* &%/$&!! preprocessor */
23 #define P(a, b) P2(a, b)
24 #define P2(a, b) a##b
26         .text
27 /* The socket-oriented system calls are handled unusally in Linux.
28    They are all gated through the single `socketcall' system call number.
29    `socketcall' takes two arguments: the first is the subcode, specifying
30    which socket function is being called; and the second is a pointer to
31    the arguments to the specific function.
33    The .S files for the other calls just #define socket and #include this.  */
35 #ifndef __socket
36 #ifndef NO_WEAK_ALIAS
37 #define __socket P(__,socket)
38 #else
39 #define __socket socket
40 #endif
41 #endif
43 #ifndef NARGS      /* The socket.o object is compiled directly ... */
44 #define NARGS 3
45 #endif
47 .globl __socket
48 ENTRY(__socket)
49         /* Save registers and setup stack.  */
50         stmg    %r6,%r15,48(%r15)       /* Save registers.  */
51         cfi_offset (%r15,-40)
52         cfi_offset (%r14,-48)
53         cfi_offset (%r13,-56)
54         cfi_offset (%r12,-64)
55         cfi_offset (%r11,-72)
56         cfi_offset (%r10,-80)
57         cfi_offset (%r9,-88)
58         cfi_offset (%r8,-96)
59         cfi_offset (%r7,-104)
60         cfi_offset (%r6,-112)
61         lgr     %r1,%r15
62         lg      %r0,8(%r15)             /* Load eos.  */
63         aghi     %r15,-208              /* Buy stack space.  */
64         cfi_adjust_cfa_offset (208)
65         stg     %r1,0(%r15)             /* Store back chain.  */
66         stg     %r0,8(%r15)             /* Store eos.  */
68         /* Reorder arguments.  */
69 #if (NARGS >= 6)
70         mvc     200(8,%r15),368(%r15)   /* Move between parameter lists.  */
71 #endif
72 #if (NARGS >= 5)
73         stg     %r6,192(%r15)           /* Store into parameter list.  */
74 #endif
75 #if (NARGS >= 4)
76         stg     %r5,184(%r15)            /* Store into parameter list.  */
77 #endif
78 #if (NARGS >= 3)
79         stg     %r4,176(%r15)            /* Store into parameter list.  */
80 #endif
81 #if (NARGS >= 2)
82         stg     %r3,168(%r15)           /* Store into parameter list.  */
83         stg     %r2,160(%r15)
84 #endif
86 #if defined NEED_CANCELLATION && defined CENABLE
87         SINGLE_THREAD_P
88         jne     L(socket_cancel)
89 #endif
91         /* Load subcode for socket syscall.  */
92         lghi    %r2,P(SOCKOP_,socket)
93         la      %r3,160(%r15)           /* Load address of parameter list.  */
95         /* Do the system call trap.  */
96         svc     SYS_ify(socketcall)
99         lg      %r15,0(%r15)            /* Load back chain.  */
100         lmg     %r6,15,48(%r15)         /* Load registers.  */
102         /* gpr2 is < 0 if there was an error.  */
103         lghi    %r0,-125
104         clgr    %r2,%r0
105         jgnl    SYSCALL_ERROR_LABEL
107         /* Successful; return the syscall's value.  */
108         br      %r14
110 #if defined NEED_CANCELLATION && defined CENABLE
111 L(socket_cancel):
112         brasl   %r14,CENABLE
113         lr      %r0,%r2
115         /* Load subcode for socket syscall.  */
116         lghi    %r2,P(SOCKOP_,socket)
117         la      %r3,160(%r15)           /* Load address of parameter list.  */
119         /* Do the system call trap.  */
120         svc     SYS_ify(socketcall)
122         lgr     %r12,%r2
123         lr      %r2,%r0
124         brasl   %r14,CDISABLE
126         lgr     %r2,%r12
127         j       4b
128 #endif
130         SYSCALL_ERROR_HANDLER
131 END (__socket)
133 #ifndef NO_WEAK_ALIAS
134 weak_alias (__socket, socket)
135 #endif