From 4f172c25f1c39e86b433075d36f3e6c19e06f136 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Fri, 27 Dec 2002 22:15:56 +0000 Subject: [PATCH] *** empty log message *** 2002-12-27 Andreas Schwab * sysdeps/unix/sysv/linux/m68k/socket.S: Add cancellation support. --- ChangeLog | 4 +++ .../sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h | 1 + sysdeps/unix/sysv/linux/m68k/socket.S | 42 +++++++++++++++++++++- 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index f24dbc3..28503a9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2002-12-27 Andreas Schwab + + * sysdeps/unix/sysv/linux/m68k/socket.S: Add cancellation support. + 2002-12-27 Jakub Jelinek * malloc/arena.c (ptmalloc_init): Don't call next_env_entry if diff --git a/linuxthreads/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h index 1f1f65f..fb6e92c 100644 --- a/linuxthreads/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h +++ b/linuxthreads/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h @@ -37,6 +37,7 @@ .Lpseudo_cancel: \ CENABLE; \ DOCARGS_##args \ + move.l %d0, -(%sp); \ move.l &SYS_ify (syscall_name), %d0; \ trap &0; \ move.l %d0, %d2; \ diff --git a/sysdeps/unix/sysv/linux/m68k/socket.S b/sysdeps/unix/sysv/linux/m68k/socket.S index 3592d2a..1d10f33 100644 --- a/sysdeps/unix/sysv/linux/m68k/socket.S +++ b/sysdeps/unix/sysv/linux/m68k/socket.S @@ -16,7 +16,7 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#include +#include #include #define P(a, b) P2(a, b) @@ -41,6 +41,10 @@ .globl __socket ENTRY (__socket) +#if defined NEED_CANCELLATION && defined CENABLE + SINGLE_THREAD_P + jne 1f +#endif /* Save registers. */ move.l %d2, %a0 @@ -64,6 +68,42 @@ ENTRY (__socket) /* Successful; return the syscall's value. */ rts + +#if defined NEED_CANCELLATION && defined CENABLE +1: /* Enable asynchronous cancellation. */ + CENABLE + + /* Save registers. */ + move.l %d2, -(%sp) + move.l %d0, -(%sp) + + move.l #SYS_ify (socketcall), %d0 /* System call number in %d0. */ + + /* Use ## so `socket' is a separate token that might be #define'd. */ + move.l #P (SOCKOP_,socket), %d1 /* Subcode is first arg to syscall. */ + lea 4+8(%sp), %a1 /* Address of args is 2nd arg. */ + move.l %a1, %d2 + + /* Do the system call trap. */ + trap #0 + + /* Restore cancellation. */ + move.l %d0, %d2 + CDISABLE + addq.l #4, %sp + move.l %d2, %d0 + + /* Restore registers. */ + move.l (%sp)+, %d2 + + /* %d0 is < 0 if there was an error. */ + tst.l %d0 + jmi SYSCALL_ERROR_LABEL + + /* Successful; return the syscall's value. */ + rts +#endif + PSEUDO_END (__socket) #ifndef NO_WEAK_ALIAS -- 2.7.4