fix alpha nptl
Richard Henderson
rth@redhat.com
Sat Mar 13 05:35:00 GMT 2004
I now get 100% pass for nptl.
Thanks to Uli for stepping me through the debugging process to get
over the "the thread just went away" hump.
r~
* sysdeps/unix/sysv/linux/alpha/select.S: Fix unwind. Propagate
oldvalue from CENABLE to CDISABLE.
nptl/
* sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h: Propagate
oldvalue from CENABLE to CDISABLE.
Index: nptl/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h
===================================================================
RCS file: /cvs/glibc/libc/nptl/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h,v
retrieving revision 1.2
diff -c -p -d -u -r1.2 sysdep-cancel.h
--- nptl/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h 13 Jan 2004 09:36:22 -0000 1.2
+++ nptl/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h 13 Mar 2004 05:26:46 -0000
@@ -63,9 +63,14 @@ __LABEL($pseudo_cancel) \
SAVE_ARGS_##args; \
CENABLE; \
LOAD_ARGS_##args; \
+ /* Save the CENABLE return value in RA. That register \
+ is preserved across syscall and the real return \
+ address is saved on the stack. */ \
+ mov v0, ra; \
lda v0, SYS_ify(syscall_name); \
call_pal PAL_callsys; \
stq v0, 8(sp); \
+ mov ra, a0; \
bne a3, $multi_error; \
CDISABLE; \
ldq ra, 0(sp); \
Index: sysdeps/unix/sysv/linux/alpha/select.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/alpha/select.S,v
retrieving revision 1.10
diff -c -p -d -u -r1.10 select.S
--- sysdeps/unix/sysv/linux/alpha/select.S 20 Jun 2003 16:24:36 -0000 1.10
+++ sysdeps/unix/sysv/linux/alpha/select.S 13 Mar 2004 05:26:47 -0000
@@ -53,6 +53,8 @@ LEAF(SELECT, 64)
jsr AT, (AT), _mcount
.set at
#endif
+ stq ra, 40(sp)
+ .mask 0x4000000, 40-64
.prologue 1
#ifdef CENABLE
@@ -131,9 +133,9 @@ $do_cancel:
stq a1, 16(sp)
stq a2, 24(sp)
stq a3, 32(sp)
- stq ra, 40(sp)
CENABLE
+ mov v0, ra
ldl t0, __libc_missing_axp_tv64
bne t0, $do_cancel32
@@ -147,6 +149,8 @@ $do_cancel:
ldi v0, SYS_ify(select)
callsys
+
+ mov ra, a0
bne a3, $cancel_err64
stq v0, 8(sp)
@@ -184,6 +188,8 @@ $do_cancel32:
1: ldi v0, SYS_ify(osf_select)
callsys
+
+ mov ra, a0
bne a3, $cancel_error
/* ... and bounce the remaining timeout back. */
More information about the Libc-alpha
mailing list