summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/sparc/sparc64/socket.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/sparc/sparc64/socket.S')
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/socket.S39
1 files changed, 24 insertions, 15 deletions
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/socket.S b/sysdeps/unix/sysv/linux/sparc/sparc64/socket.S
index 575416ff3f..353705b4ac 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/socket.S
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/socket.S
@@ -40,11 +40,15 @@
The .S files for the other calls just #define socket and #include this. */
#ifndef __socket
-#define __socket P(__,socket)
+# ifndef NO_WEAK_ALIAS
+# define __socket P(__,socket)
+# else
+# define __socket socket
+# endif
#endif
-.globl __socket
-ENTRY (__socket)
+ .globl __syscall_error
+ENTRY(__socket)
/* Drop up to 6 arguments (recvfrom) into the memory allocated by
the caller for varargs, since that's really what we have. */
@@ -73,14 +77,15 @@ ENTRY (__socket)
LOADSYSCALL(socketcall)
ta 0x6d
- bcs,pn %xcc, __syscall_error_handler
- nop
- retl
+ bcc,pt %xcc, 1f
+ mov %o7, %g1
+ call __syscall_error
+ mov %g1, %o7
+1: retl
nop
#if defined NEED_CANCELLATION && defined CENABLE
.Lsocket_cancel:
- cfi_startproc
save %sp, -160, %sp
cfi_def_cfa_register (%fp)
cfi_window_save
@@ -93,18 +98,22 @@ ENTRY (__socket)
LOADSYSCALL(socketcall)
ta 0x6d
- bcs,pn %xcc, __syscall_error_handler2
+ bcc,pt %xcc, 1f
mov %o0, %l1
- CDISABLE
+ CDISABLE;
+ mov %l0, %o0;
+ call __syscall_error;
+ mov %l1, %o0;
+ ba,pt %xcc, 2f
+ mov -1, %l1;
+1: CDISABLE
mov %l0, %o0
- jmpl %i7 + 8, %g0
+2: jmpl %i7 + 8, %g0
restore %g0, %l1, %o0
- cfi_endproc
- SYSCALL_ERROR_HANDLER2
#endif
- SYSCALL_ERROR_HANDLER
-
-END (__socket)
+END(__socket)
+#ifndef NO_WEAK_ALIAS
weak_alias (__socket, socket)
+#endif