cvs commit: src/sys/kern kern_context.c

Jake Burkholder jake at locore.ca
Tue Apr 1 17:19:19 PST 2003


Apparently, On Tue, Apr 01, 2003 at 08:00:18PM -0500,
	Daniel Eischen said words to the effect of;

> 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.

I see.  Yes that would work fine.

Jake


More information about the cvs-all mailing list