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