Date: Mon, 6 Oct 2003 10:51:41 -0400 (EDT) From: Daniel Eischen <eischen@vigrid.com> To: sparc64@freebsd.org Cc: deischen@freebsd.org Subject: Re: Review for libpthread support Message-ID: <Pine.GSO.4.10.10310061036001.5491-100000@pcnet5.pcnet.com> In-Reply-To: <200310051625.04587.jake@locore.ca>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, 5 Oct 2003, Jake Burkholder wrote: > On Sunday 05 October 2003 13:46, Daniel Eischen wrote: > > What if a thread gets interrupted while using locals? _thr_setcontext() > > is suppose to be able to resume a thread that was interrupted anywhere. > > What if some library function used locals, thread T1 had a page > > fault, and it's context was exported back to libpthread? The > > library may run other threads before resuming T1 again. > > They're part of T1's context. They'll get saved on T1's stack on entry to the > kernel to handle the page fault. One other question. _thr_getcontext() and _thr_setcontext() are similar to setjmp/longjmp in that _thr_getcontext() has to return 0 when it is called normally, and 1 when it returns as a result of a _thr_setcontext() to the saved context. What register holds the return value for a function? Is it %o0? And where is this stored in the context? I don't think that the same method as used for setjmp/longjmp can be used here because _thr_setcontext() has to be able to return to a context that was interrupted, not only a context that was generated by _thr_getcontext() -- so you can't always set the return register in _thr_setcontext(). The other archs store 1 for the return register in the saved context and then clear it before returning. A thr_setcontext() just loads the return register to what has been saved in the context. So far we have: ENTRY(__thr_getcontext) add %o7, 8, %o1 add %o1, 4, %o2 stx %sp, [%o0 + MC_OUT + (6 * 8)] stx %o1, [%o0 + MC_TPC] stx %o2, [%o0 + MC_TNPC] retl clr %o0 /* ??? */ END(__thr_getcontext) .weak CNAME(_thr_setcontext) .set CNAME(_thr_setcontext),CNAME(__thr_setcontext) ENTRY(__thr_setcontext) save %sp, -CCFSZ, %sp flushw mov %i0, %l0 mov %i1, %l1 mov %i2, %l2 ldx [%l0 + MC_GLOBAL + (1 * 8)], %g1 ldx [%l0 + MC_GLOBAL + (2 * 8)], %g2 ldx [%l0 + MC_GLOBAL + (3 * 8)], %g3 ldx [%l0 + MC_GLOBAL + (4 * 8)], %g4 ldx [%l0 + MC_GLOBAL + (5 * 8)], %g5 ldx [%l0 + MC_GLOBAL + (6 * 8)], %g6 ldx [%l0 + MC_GLOBAL + (7 * 8)], %g7 ldx [%l0 + MC_OUT + (0 * 8)], %i0 ldx [%l0 + MC_OUT + (3 * 8)], %i3 ldx [%l0 + MC_OUT + (4 * 8)], %i4 ldx [%l0 + MC_OUT + (5 * 8)], %i5 ldx [%l0 + MC_OUT + (6 * 8)], %i6 ldx [%l0 + MC_OUT + (7 * 8)], %i7 ldx [%l0 + MC_TPC], %l4 ldx [%l0 + MC_TNPC], %l3 brz %l1, 1f nop stx %l1, [%l2] 1: jmpl %l3, %g0 return %l4 END(__thr_setcontext) Thanks, -- Dan Eischen
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.GSO.4.10.10310061036001.5491-100000>