KSE/ia64: NULL thread pointer in _thr_sig_add()
David Xu
davidxu at viatech.com.cn
Sun Aug 10 23:30:26 PDT 2003
----- Original Message -----
From: "Marcel Moolenaar" <marcel at xcllnt.net>
To: <threads at FreeBSD.org>
Sent: Monday, August 11, 2003 8:10 AM
Subject: KSE/ia64: NULL thread pointer in _thr_sig_add()
> Gang,
>
> There seems to be a bug in libkse where we dereference the thread
> pointer in situations where it's NULL. I suspect this bug is
> specific to platforms that have per-thread thread pointers. I
> have some rough gdb(1) support to help out with the analysis:
>
> itanium% /nfs/gnu/obj/gdb/gdb kse kse.core
> GNU gdb 5.3
> Copyright 2002 Free Software Foundation, Inc.
> GDB is free software, covered by the GNU General Public License, and you are
> welcome to change it and/or distribute copies of it under certain conditions.
> Type "show copying" to see the conditions.
> There is absolutely no warranty for GDB. Type "show warranty" for details.
> This GDB was configured as "ia64-unknown-freebsd5.1"...
> Core was generated by `kse'.
> Program terminated with signal 4, Illegal instruction.
> #0 _thr_sig_add (pthread=0x600000000010e000, sig=11, info=0x6000000000112a40)
> at /nfs/freebsd/5.x/src/lib/libpthread/arch/ia64/include/pthread_md.h:189
> 189 return (_tcb->tcb_thread);
> (gdb) l
> 184 }
> 185
> 186 static __inline struct pthread *
> 187 _get_curthread(void)
> 188 {
> 189 return (_tcb->tcb_thread);
> 190 }
> 191
> 192 /*
> 193 * Get the current kse.
> (gdb) bt
> #0 _thr_sig_add (pthread=0x6000000000172000, sig=11, info=0x6000000000176a40)
> at /nfs/freebsd/5.x/src/lib/libpthread/arch/ia64/include/pthread_md.h:189
> #1 0x40000000000099e0 in kse_check_completed (kse=0x600000000001a000)
> at /nfs/freebsd/5.x/src/lib/libpthread/thread/thr_kern.c:1556
> #2 0x40000000000063c0 in kse_sched_multi (kmbx=0x600000000001a000)
> at /nfs/freebsd/5.x/src/lib/libpthread/thread/thr_kern.c:1001
> #3 0x0000000000000000 in ?? ()
>
> The illegal instruction fault is caused by a NULL thread pointer:
>
> Dump of assembler code for function _thr_sig_add:
> 0x400000000001eac0 <_thr_sig_add>: [MII] alloc r40=ar.pfs,13,10,0
> 0x400000000001eac1 <_thr_sig_add+1>: adds r12=-80,r12
> 0x400000000001eac2 <_thr_sig_add+2>: mov r41=r1
> 0x400000000001ead0 <_thr_sig_add+16>: [MII] nop.m 0x0
> 0x400000000001ead1 <_thr_sig_add+17>: mov r39=b0
> 0x400000000001ead2 <_thr_sig_add+18>: mov r38=r0
> 0x400000000001eae0 <_thr_sig_add+32>: [MMI] adds r14=-32,r13;;
> 0x400000000001eae1 <_thr_sig_add+33>: ld8 r16=[r14]
>
> The fault is given on the last instruction if the disassembly
> given above (the thread pointer is r13):
>
> (gdb) info register r13
> r13 0x0 0
> (gdb) info register r14
> r14 0xffffffffffffffe0 -32
>
> Q: Shouldn't we call _tcb_set() somewhere in the code stream to make
> sure we have a valid thread pointer?
>
I have a patch trying to fix the problem, I haven't tested it,
http://people.freebsd.org/~davidxu/kse/thr_kern.c.diff
I think some calls of kse_set_curthread is bogus, Dan might need to
rethink it.
> --
> Marcel Moolenaar USPA: A-39004 marcel at xcllnt.net
> _______________________________________________
> freebsd-threads at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-threads
> To unsubscribe, send any mail to "freebsd-threads-unsubscribe at freebsd.org"
More information about the freebsd-threads
mailing list