Date: Tue, 5 Feb 2002 13:51:04 -0800 (PST) From: Matthew Dillon <dillon@apollo.backplane.com> To: Dan Eischen <eischen@vigrid.com> Cc: bde@FreeBSD.ORG, peter@FreeBSD.ORG, arch@FreeBSD.ORG Subject: Re: getsetcontext system call Message-ID: <200202052151.g15Lp4S30546@apollo.backplane.com> References: <3C5FF99D.87719821@vigrid.com>
next in thread | previous in thread | raw e-mail | index | archive | help
I thought we were trying to avoid having to make any system calls on
a userland thread context switch.
-Matt
Matthew Dillon
<dillon@backplane.com>
:I've turned {get,set,swap}context into a system call after peter's
:suggestion and it now looks similar to Solaris' getsetcontext. Ours is:
:
: int getsetcontext(ucontext_t *oucp, const ucontext_t *ucp);
:
:It's similar to sigprocmask. If oucp is null, then it behaves as
:getcontext. If ucp is null, it behaves as setcontext. And if
:both args are non-null, then it behaves as swapcontext. It returns
:0 upon success, 1 if the context was swapped (like longjmp), otherwise
:returns with errno set accordingly. Some glue is needed in libc
:to call this appropriately for {get,set,swap}context.
:
:Diffs are at:
:
: http://people.freebsd.org/~deischen/ucontext/uc-sys.diffs
: http://people.freebsd.org/~deischen/ucontext/uc-libc.diffs
:
:Compiled and tested on i386, just compiled on alpha.
:
:Regarding the floating point state. I didn't change the lazy
:FP switching, but I did tag each mcontext as to the FP format
:(in the case of i386), and from where the FPU state came. The
:FPU state, if present, can come from either the PCB or directly
:dumped from the FPU. If it came from the PCB, the process
:owned the FPU in the past but didn't own it at the time the
:context was retrieved. If it came from the FPU, the process
:did own the FPU. When restoring FPU state ({set,swap}context),
:we attempt to leave the FPU state in the same state it was in
:when the context was originally retrieved:
:
: o FPU state from PCB:
: If the process currently owns the FPU, the FPU state is
: loaded into the FPU. Otherwise it is copied to the PCB
: and the next FPU not enabled trap will load it.
:
: o FPU state from FPU:
: If the process doesn't own the FPU, the current FPU owner
: (if there is one) is dropped and its state saved. The
: calling process becomes the new owner of the FPU and the
: FPU state is loaded.
:
:I use "process" above, but in reality it is "thread".
:
:I also changed the alpha a bit. When delivering signals, it
:dropped the FPU if it was currently owned. This wasn't done
:on i386, and I didn't see a reason why it would need to be done
:for alpha. For i386, signal deliver now includes the FPU
:context.
:
:To Unsubscribe: send mail to majordomo@FreeBSD.org
:with "unsubscribe freebsd-arch" in the body of the message
:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200202052151.g15Lp4S30546>
