Date: Tue, 05 Feb 2002 10:26:21 -0500 From: Dan Eischen <eischen@vigrid.com> Cc: bde@freebsd.org, peter@freebsd.org, arch@freebsd.org Subject: getsetcontext system call Message-ID: <3C5FF99D.87719821@vigrid.com>
next in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3C5FF99D.87719821>