cvs commit: src/sys/kern kern_context.c

Daniel Eischen eischen at pcnet1.pcnet.com
Tue Apr 1 15:42:33 PST 2003


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?

-- 
Dan Eischen



More information about the cvs-src mailing list