KSE/ia64: NULL thread pointer in _thr_sig_add()
Marcel Moolenaar
marcel at xcllnt.net
Mon Aug 11 08:05:46 PDT 2003
On Mon, Aug 11, 2003 at 10:22:50AM -0400, Daniel Eischen wrote:
> > 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
>
> Right, that's what I was guessing.
>
> > Q: Shouldn't we call _tcb_set() somewhere in the code stream to make
> > sure we have a valid thread pointer?
>
> Once its set, it should always be set, right? The kernel doesn't
> change it, right? I think that's the idea anyways. If you look at
> the beginning of _thr_sched_multi(), we handle first time initialization:
The kernel creates a new context by virtue of the upcall. Since
we established earlier that the thread pointer itself is not part
of the context, you cannot assume that the thread pointer is not
destroyed.
> if ((curkse->k_flags & KF_INITIALIZED) == 0) {
> /* Setup this KSEs specific data. */
> _kcb_set(curkse->k_kcb);
>
> /* Set this before grabbing the context. */
> curkse->k_flags |= KF_INITIALIZED;
> }
>
> That should set it up so that we always have TP set to something
> (in this case, it's the fake tcb). But from then on, we rely
> on the kernel not to touch it. Are you sure the kernel doesn't
> destroy it somehow?
I'm positive that the kernel *does* clear _tp. It's by design.
--
Marcel Moolenaar USPA: A-39004 marcel at xcllnt.net
More information about the freebsd-threads
mailing list