From owner-cvs-src@FreeBSD.ORG Tue Apr 1 15:42:32 2003 Return-Path: Delivered-To: cvs-src@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id B957337B401; Tue, 1 Apr 2003 15:42:32 -0800 (PST) Received: from mail.pcnet.com (mail.pcnet.com [204.213.232.4]) by mx1.FreeBSD.org (Postfix) with ESMTP id E446943F75; Tue, 1 Apr 2003 15:42:31 -0800 (PST) (envelope-from eischen@pcnet1.pcnet.com) Received: from pcnet1.pcnet.com (localhost [127.0.0.1]) by mail.pcnet.com (8.12.8/8.12.1) with ESMTP id h31NgVBg010876; Tue, 1 Apr 2003 18:42:31 -0500 (EST) Received: from localhost (eischen@localhost)h31NgUoQ010872; Tue, 1 Apr 2003 18:42:30 -0500 (EST) Date: Tue, 1 Apr 2003 18:42:30 -0500 (EST) From: Daniel Eischen To: Jake Burkholder In-Reply-To: <200304012325.h31NPI3p086961@repoman.freebsd.org> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII cc: cvs-src@FreeBSD.org cc: src-committers@FreeBSD.org cc: cvs-all@FreeBSD.org Subject: Re: cvs commit: src/sys/kern kern_context.c X-BeenThere: cvs-src@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: CVS commit messages for the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 01 Apr 2003 23:42:33 -0000 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