Print this page
15254 %ymm registers not restored after signal handler
15367 x86 getfpregs() summons corrupting %xmm ghosts
15333 want x86 /proc xregs support (libc_db, libproc, mdb, etc.)
15336 want libc functions for extended ucontext_t
15334 want ps_lwphandle-specific reg routines
15328 FPU_CW_INIT mistreats reserved bit
15335 i86pc fpu_subr.c isn't really platform-specific
15332 setcontext(2) isn't actually noreturn
15331 need <sys/stdalign.h>
Change-Id: I7060aa86042dfb989f77fc3323c065ea2eafa9ad
Conflicts:
    usr/src/uts/common/fs/proc/prcontrol.c
    usr/src/uts/intel/os/archdep.c
    usr/src/uts/intel/sys/ucontext.h
    usr/src/uts/intel/syscall/getcontext.c
        
@@ -42,25 +42,32 @@
 .\"
 .\" Copyright 1989 AT&T
 .\" Portions Copyright (c) 1992, X/Open Company Limited.  All Rights Reserved.
 .\" Copyright (c) 2001, Sun Microsystems, Inc.  All Rights Reserved.
 .\" Copyright 2022 OmniOS Community Edition (OmniOSce) Association.
+.\" Copyright 2023 Oxide Computer Company
 .\"
-.Dd November 24, 2022
+.Dd January 24, 2022
 .Dt GETCONTEXT 2
 .Os
 .Sh NAME
 .Nm getcontext ,
+.Nm getcontext_extd ,
 .Nm setcontext
 .Nd get and set current user context
 .Sh SYNOPSIS
 .In ucontext.h
 .Ft int
 .Fo getcontext
 .Fa "ucontext_t *ucp"
 .Fc
 .Ft int
+.Fo getcontext_extd
+.Fa "ucontext_t *ucp"
+.Fa "uint32_t flags"
+.Fc
+.Ft int
 .Fo setcontext
 .Fa "const ucontext_t *ucp"
 .Fc
 .Sh DESCRIPTION
 The
@@ -74,10 +81,64 @@
 .Fa ucp
 points to defines the user context and includes the contents of the calling
 process' machine registers, the signal mask, and the current execution stack.
 .Pp
 The
+.Vt ucontext_t
+structure is a part of the system ABI.
+However, most architectures have added additional register states such as the
+extended vector and floating point registers that are not part of that.
+To facilitate getting that state
+.Pq such as the x86 xsave area
+the
+.Fn getcontext_extd
+function exists.
+Once called, the context will be initialized and is suitable for use in other
+context operations just as though one had called
+.Fn getcontext .
+.Pp
+Unlike the
+.Fn getcontext
+function,
+.Fn getcontext_extd
+assumes that callers have previously initialized
+.Fa ucp
+and thus it treats additional members
+.Po
+such as the
+.Fa uc_xsave
+member on x86
+.Pc
+as potentially valid.
+To allow for all extended states to be copied out,
+.Fa ucp
+must be allocated with
+.Xr ucontext_alloc 3C .
+Otherwise whether it is declared on the stack, as global data, allocated
+dynamically, or part of a structure,
+.Fa ucp
+must be zeroed through a call to
+.Xr bzero 3C
+or
+.Xr memset 3C
+prior to calling
+.Fn getcontext_extd .
+Improper initialization can lead to memory safety bugs, making it critical that
+this is done.
+.Pp
+The
+.Fa flags
+member must be zero and is present to allow for what is copied out to change in
+the future.
+This indicates that the system should attempt to copy out all extended states,
+though if the
+.Vt ucontext_t
+was not allocated with
+.Xr ucontext_alloc 3C ,
+some extended states may not be.
+.Pp
+The
 .Fn setcontext
 function restores the user context pointed to by
 .Fa ucp .
 A successful call to
 .Fn setcontext
@@ -129,14 +190,31 @@
 .Sh RETURN VALUES
 On successful completion,
 .Fn setcontext
 does not return and
 .Fn getcontext
+and
+.Fn getcontext_extd
 returns 0.
 Otherwise, -1 is returned.
 .Sh ERRORS
-No errors are defined.
+No errors are defined for
+.Fn getcontext
+or
+.Fn setcontext .
+.Pp
+The
+.Fn getcontext_extd
+function only sets
+.Va errno
+in some circumstances when it fails.
+The function may fail if:
+.Bl -tag -width Er
+.It Er EINVAL
+.Fa flags
+had invalid values.
+.El
 .Sh USAGE
 When a signal handler is executed, the current user context is saved and a new
 context is created.
 If the thread leaves the signal handler via
 .Xr longjmp 3C ,
@@ -171,8 +249,9 @@
 .Xr sigprocmask 2 ,
 .Xr bsd_signal 3C ,
 .Xr makecontext 3C ,
 .Xr setjmp 3C ,
 .Xr sigsetjmp 3C ,
+.Xr ucontext_alloc 3C ,
 .Xr ucontext.h 3HEAD ,
 .Xr attributes 7 ,
 .Xr standards 7