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-src
mailing list