Update copyright notices with scripts/update-copyrights
[glibc.git] / sysdeps / unix / sysv / linux / i386 / socket.S
blobddce975aec0e02275348d51d3c99e5e62cc14cb6
1 /* Copyright (C) 1995-2014 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, see
16    <http://www.gnu.org/licenses/>.  */
18 #include <sysdep-cancel.h>
19 #include <socketcall.h>
20 #include <tls.h>
22 #define P(a, b) P2(a, b)
23 #define P2(a, b) a##b
25         .text
26 /* The socket-oriented system calls are handled unusally in Linux/i386.
27    They are all gated through the single `socketcall' system call number.
28    `socketcall' takes two arguments: the first is the subcode, specifying
29    which socket function is being called; and the second is a pointer to
30    the arguments to the specific function.
32    The .S files for the other calls just #define socket and #include this.  */
34 #ifndef __socket
35 # ifndef NO_WEAK_ALIAS
36 #  define __socket P(__,socket)
37 # else
38 #  define __socket socket
39 # endif
40 #endif
42 .globl __socket
43 ENTRY (__socket)
44 #if defined NEED_CANCELLATION && defined CENABLE
45         SINGLE_THREAD_P
46         jne 1f
47 #endif
49         /* Save registers.  */
50         movl %ebx, %edx
51         cfi_register (3, 2)
53         movl $SYS_ify(socketcall), %eax /* System call number in %eax.  */
55         /* Use ## so `socket' is a separate token that might be #define'd.  */
56         movl $P(SOCKOP_,socket), %ebx   /* Subcode is first arg to syscall.  */
57         lea 4(%esp), %ecx               /* Address of args is 2nd arg.  */
59         /* Do the system call trap.  */
60         ENTER_KERNEL
62         /* Restore registers.  */
63         movl %edx, %ebx
64         cfi_restore (3)
66         /* %eax is < 0 if there was an error.  */
67         cmpl $-125, %eax
68         jae SYSCALL_ERROR_LABEL
70         /* Successful; return the syscall's value.  */
71         ret
74 #if defined NEED_CANCELLATION && defined CENABLE
75         /* We need one more register.  */
76 1:      pushl %esi
77         cfi_adjust_cfa_offset(4)
79         /* Enable asynchronous cancellation.  */
80         CENABLE
81         movl %eax, %esi
82         cfi_offset(6, -8)               /* %esi */
84         /* Save registers.  */
85         movl %ebx, %edx
86         cfi_register (3, 2)
88         movl $SYS_ify(socketcall), %eax /* System call number in %eax.  */
90         /* Use ## so `socket' is a separate token that might be #define'd.  */
91         movl $P(SOCKOP_,socket), %ebx   /* Subcode is first arg to syscall.  */
92         lea 8(%esp), %ecx               /* Address of args is 2nd arg.  */
94         /* Do the system call trap.  */
95         ENTER_KERNEL
97         /* Restore registers.  */
98         movl %edx, %ebx
99         cfi_restore (3)
101         /* Restore the cancellation.  */
102         xchgl %esi, %eax
103         CDISABLE
105         /* Restore registers.  */
106         movl %esi, %eax
107         popl %esi
108         cfi_restore (6)
109         cfi_adjust_cfa_offset(-4)
111         /* %eax is < 0 if there was an error.  */
112         cmpl $-125, %eax
113         jae SYSCALL_ERROR_LABEL
115         /* Successful; return the syscall's value.  */
116         ret
117 #endif
118 PSEUDO_END (__socket)
120 #ifndef NO_WEAK_ALIAS
121 weak_alias (__socket, socket)
122 #endif