Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 1 Apr 2003 18:42:30 -0500 (EST)
From:      Daniel Eischen <eischen@pcnet1.pcnet.com>
To:        Jake Burkholder <jake@FreeBSD.org>
Cc:        cvs-all@FreeBSD.org
Subject:   Re: cvs commit: src/sys/kern kern_context.c
Message-ID:  <Pine.GSO.4.10.10304011827200.9020-100000@pcnet1.pcnet.com>
In-Reply-To: <200304012325.h31NPI3p086961@repoman.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.GSO.4.10.10304011827200.9020-100000>