From owner-freebsd-arch Mon Jan 7 11:22:13 2002 Delivered-To: freebsd-arch@freebsd.org Received: from ns.yogotech.com (ns.yogotech.com [206.127.123.66]) by hub.freebsd.org (Postfix) with ESMTP id B6CED37B405 for ; Mon, 7 Jan 2002 11:22:08 -0800 (PST) Received: from caddis.yogotech.com (caddis.yogotech.com [206.127.123.130]) by ns.yogotech.com (8.9.3/8.9.3) with ESMTP id MAA12507; Mon, 7 Jan 2002 12:22:00 -0700 (MST) (envelope-from nate@yogotech.com) Received: (from nate@localhost) by caddis.yogotech.com (8.11.6/8.11.6) id g07JLxN98431; Mon, 7 Jan 2002 12:21:59 -0700 (MST) (envelope-from nate) From: Nate Williams MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <15417.62807.556838.947343@caddis.yogotech.com> Date: Mon, 7 Jan 2002 12:21:59 -0700 To: Daniel Eischen Cc: Nate Williams , Dan Eischen , Peter Wemm , Archie Cobbs , Alfred Perlstein , arch@FreeBSD.ORG Subject: Re: Request for review: getcontext, setcontext, etc In-Reply-To: References: <15417.59947.662052.836634@caddis.yogotech.com> X-Mailer: VM 6.96 under 21.1 (patch 14) "Cuyahoga Valley" XEmacs Lucid Reply-To: nate@yogotech.com (Nate Williams) Sender: owner-freebsd-arch@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG > > > > Also, I noticed that the i386 patch doesn't save FP state (!) which is > > > > one of the primary reasons for get/setcontext(). I'm not sure if this > > > > can be efficiently done since this user-level function will not know if > > > > the current context has touched the FPU yet.. > > > > > > Neither does the kernel, does it? I thought I saw comments in the > > > kernel (was it alpha?) about it being too bad that we couldn't tell > > > if the FPU was used. In libc_r, we currently only save and restore the > > > FP state when the context is generated from a signal handler (or perhaps > > > in the case of KSEs, when the thread was preempted). > > > > Hmm, IIRC, Java's green threads saves the FP context everytime it does a > > thread switch, since it has no way of knowing if the thread was doing FP > > context. Is there a way to force get/setcontext to always/conditionally > > save the FP context, for applications that either know they need to have > > it saved? > > Sure, you can always save the FP context, but you can't really > conditionally save it without changing the interface for these > functions or adding another set of functions that save the FP > context. The reason for conditionally saving it is because it would allow the most flexibility in the future. > The FP context is what I'm most unsure about. Forget about > contexts generated by signals for the moment. If you have > code that does something like: > > f1 = 1.245 * f2; > f3 = f1 * (float)getcontext(&uc) * 2.5; > f5 = f3 * 3.14159; > > which disassembles to something like: > > push %ebp > mov %esp,%ebp > sub $0x68,%esp > flds 0x804fde0 > fstps 0xfffffff0(%ebp) > flds 0xfffffff0(%ebp) > fldl 0x804fde8 > fmulp %st,%st(1) > fstps 0xfffffffc(%ebp) > add $0xfffffff4,%esp > lea 0xffffffc0(%ebp),%eax > push %eax > call 80482fc > add $0x10,%esp > mov %eax,%eax > mov %eax,0xffffffac(%ebp) > fildl 0xffffffac(%ebp) > fmuls 0xfffffffc(%ebp) > fldl 0x804fdf0 > fmulp %st,%st(1) > fstps 0xfffffff8(%ebp) > [...] > > This is a perverse example of how one would use getcontext. > I'm not familiar with the FPU, but is there any state that > needs to be saved across the getcontext call? Nope, but you need to be able to get the FPU context saved in setcontext. Nate To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-arch" in the body of the message