cvs commit: src/sys/kern kern_context.c

Jake Burkholder jake at locore.ca
Tue Apr 1 16:42:21 PST 2003


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.

Jake


More information about the cvs-src mailing list