diff options
author | Andreas Schwab <schwab@suse.de> | 2002-12-27 22:15:56 +0000 |
---|---|---|
committer | Andreas Schwab <schwab@suse.de> | 2002-12-27 22:15:56 +0000 |
commit | 4f172c25f1c39e86b433075d36f3e6c19e06f136 (patch) | |
tree | 9d325e034d5c7125028d6da3fceae77fb1caf6df /sysdeps/unix/sysv/linux/m68k | |
parent | 9f2567656cc8feb171bf241c06f378d57dc1cd1f (diff) | |
download | glibc-4f172c25f1c39e86b433075d36f3e6c19e06f136.tar.gz glibc-4f172c25f1c39e86b433075d36f3e6c19e06f136.tar.xz glibc-4f172c25f1c39e86b433075d36f3e6c19e06f136.zip |
*** empty log message ***
2002-12-27 Andreas Schwab <schwab@suse.de> * sysdeps/unix/sysv/linux/m68k/socket.S: Add cancellation support.
Diffstat (limited to 'sysdeps/unix/sysv/linux/m68k')
-rw-r--r-- | sysdeps/unix/sysv/linux/m68k/socket.S | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/sysdeps/unix/sysv/linux/m68k/socket.S b/sysdeps/unix/sysv/linux/m68k/socket.S index 3592d2a580..1d10f33e17 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 <sysdep.h> +#include <sysdep-cancel.h> #include <socketcall.h> #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 |