cvs commit: src/sys/kern kern_context.c

Daniel Eischen eischen at pcnet1.pcnet.com
Tue Apr 1 17:00:21 PST 2003


On Tue, 1 Apr 2003, Jake Burkholder wrote:

> Apparently, On Tue, Apr 01, 2003 at 06:42:30PM -0500,
> 	Daniel Eischen said words to the effect of;
> 
> > On Tue, 1 Apr 2003, Jake Burkholder wrote:
> > 
> > > jake        2003/04/01 15:25:18 PST
> > > 
> > >   FreeBSD src repository
> > > 
> > >   Modified files:
> > >     sys/kern             kern_context.c 
> > >   Log:
> > >   - Fix UC_COPY_SIZE.  Adding up the size of structure fields doesn't take
> > >     alignment into account.
> > >   - Return EJUSTRETURN from set_context on success to avoid clobbering the
> > >     first 2 out registers with td_retval on sparc64.
> > 
> > Oh shit.  I forgot I have some local changes lying around
> > to fix being able to set/swapcontext on an interrupted
> > context (not formed by getcontext).  When getcontext()
> > is called, the return value registers need to be cleared
> > so that 0 is returned after a subsequent setcontext():
> > 
> > 	ret = getcontext(&uc);
> > 	...
> > 	setcontext(&uc);
> > 
> > The above should work as well as:
> > 
> > 	void
> > 	sighandler(int sig, siginfo_t *info, ucontext_t *ucp)
> > 	{
> > 		...
> > 		setcontext(ucp);
> > 	}
> > 
> > The latter case doesn't want to return 0 in the syscall;
> > it wants to return EJUSTRETURN.  In the former case, you
> > need to be able to return 0.
> > 
> > I think you need to fix get_mcontext() so that it clears
> > the return values or it breaks the first case.
> > 
> > My changes add a third parameter to
> > get_mcontext(struct thread *td, mcontext_t *mcp, int clear_retval)
> > so that you can tell it to clear the return values.
> > When getcontext() calls get_mcontext() you want to clear
> > the return values in the context, but when get_mcontext()
> > is called by sendsig() or by the KSE system, you don't
> > want to clear the return values.
> > 
> > Is this making any sense?
> 
> Yes, I see what you mean.  The problem on sparc64 is that the arguments
> setup in makecontext get clobbered.  They're passed in the same registers
> as the return value for the system call, so when syscall copies td_retval
> into the registers it clobbers the arguments that were set.  I can hack
> around it by just copying the registers that would be clobbered into
> td_retval if that would work better.  execve has the same problem, we
> use the above hack there.

I think the changes you made are correct; swapcontext() and
setcontext() now return EJUSTRETURN if there were no errors.
But we just need to fix getcontext() so that it clears the
return value registers in the mcontext.  This needs to be
an option, though, because other uses of get_mcontext don't
want that behaviour.

This would still work on sparc64, right?  Unless I am
misunderstanding something.

-- 
Dan Eischen



More information about the cvs-src mailing list