yann@1: http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/sh/socket.S.diff?r1=1.5&r2=1.6&cvsroot=glibc yann@1: yann@1: Ankur Sheth said: yann@1: "The problem that I ran into was that multi-threaded apps would crash with a yann@1: seg fault when they invoked some of the socket calls (sendto() in my case. yann@1: This happened only on the sh4. Turns out that a certain register (PR) was yann@1: not being saved and restored properly before and after invoking the system yann@1: call. This patch fixes it. It applies cleanly on glibc 2.3.2. yann@1: [Thanks to Kaz for helping us find this.]" yann@1: yann@1: =================================================================== yann@1: RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/sh/socket.S,v yann@1: retrieving revision 1.5 yann@1: retrieving revision 1.6 yann@1: diff -u -r1.5 -r1.6 yann@1: --- libc/sysdeps/unix/sysv/linux/sh/socket.S 2003/01/05 11:07:44 1.5 yann@1: +++ libc/sysdeps/unix/sysv/linux/sh/socket.S 2003/07/12 01:25:53 1.6 yann@1: @@ -94,7 +94,9 @@ yann@1: #if defined NEED_CANCELLATION && defined CENABLE yann@1: .Lsocket_cancel: yann@1: /* Enable asynchronous cancellation. */ yann@1: + sts.l pr,@-r15 yann@1: CENABLE yann@1: + lds.l @r15+,pr yann@1: yann@1: /* Do the system call trap. */ yann@1: mov #+P(SOCKOP_,socket), r4 yann@1: @@ -102,9 +104,11 @@ yann@1: mov.l .L1,r3 yann@1: trapa #0x12 yann@1: yann@1: + sts.l pr,@-r15 yann@1: mov.l r0,@-r15 yann@1: CDISABLE yann@1: mov.l @r15+,r0 yann@1: + lds.l @r15+,pr yann@1: yann@1: /* Pop args off the stack */ yann@1: P(POPARGS_,NARGS)