Date: Tue, 1 Apr 2003 20:25:53 -0500 From: Jake Burkholder <jake@locore.ca> To: Daniel Eischen <eischen@pcnet1.pcnet.com> Cc: cvs-all@FreeBSD.org Subject: Re: cvs commit: src/sys/kern kern_context.c Message-ID: <20030402012553.GB44206@locore.ca> In-Reply-To: <Pine.GSO.4.10.10304011955570.18787-100000@pcnet1.pcnet.com> References: <20030402004854.GA44206@locore.ca> <Pine.GSO.4.10.10304011955570.18787-100000@pcnet1.pcnet.com>
next in thread | previous in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030402012553.GB44206>