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

*** 41,130 **** .\" .\" .\" Copyright 1989 AT&T .\" Portions Copyright (c) 1992, X/Open Company Limited. All Rights Reserved. .\" Copyright (c) 2004, Sun Microsystems, Inc. All Rights Reserved. .\" ! .TH MAKECONTEXT 3C "February 17, 2023" ! .SH NAME ! makecontext, swapcontext \- manipulate user contexts ! .SH SYNOPSIS ! .nf ! #include <ucontext.h> ! ! \fBvoid\fR \fBmakecontext\fR(\fBucontext_t *\fR\fIucp\fR, \fBvoid (*\fR\fIfunc\fR)(), \fBint\fR \fIargc\fR...); ! .fi ! ! .LP ! .nf ! \fBint\fR \fBswapcontext\fR(\fBucontext_t *restrict\fR \fIoucp\fR, ! \fBconst ucontext_t *restrict\fR \fIucp\fR); ! .fi ! ! .SH DESCRIPTION ! The \fBmakecontext()\fR function modifies the context specified by \fIucp\fR, ! which has been initialized using \fBgetcontext\fR(2). When this context is ! resumed using \fBswapcontext()\fR or \fBsetcontext\fR(2), execution continues ! by calling the function \fIfunc\fR, passing it the arguments that follow ! \fIargc\fR in the \fBmakecontext()\fR call. The value of \fIargc\fR must match ! the number of pointer-sized integer arguments passed to \fIfunc\fR, otherwise ! the behavior is undefined. ! .sp ! .LP ! Before a call is made to \fBmakecontext()\fR, the context being modified should ! have a stack allocated for it. The stack is assigned to the context by ! initializing the \fBuc_stack\fR member. ! .sp ! .LP ! The \fBuc_link\fR member is used to determine the context that will be resumed ! when the context being modified by \fBmakecontext()\fR returns. The ! \fBuc_link\fR member should be initialized prior to the call to ! \fBmakecontext()\fR. If the \fBuc_link\fR member is initialized to \fINULL\fR, ! the thread executing \fIfunc\fR will exit when \fIfunc\fR returns. See ! \fBpthread_exit\fR(3C). ! .sp ! .LP ! The \fBswapcontext()\fR function saves the current context in the context ! structure pointed to by \fIoucp\fR and sets the context to the context ! structure pointed to by \fIucp\fR. ! .sp ! .LP ! If the \fIucp\fR or \fIoucp\fR argument points to an invalid address, the ! behavior is undefined and \fBerrno\fR may be set to \fBEFAULT\fR. ! .SH RETURN VALUES ! On successful completion, \fBswapcontext()\fR returns \fB0\fR. Otherwise, ! \fB\(mi1\fR is returned and \fBerrno\fR is set to indicate the error. ! .SH ERRORS ! The \fBswapcontext()\fR function will fail if: ! .sp ! .ne 2 ! .na ! \fB\fBENOMEM\fR\fR ! .ad ! .RS 10n ! The \fIucp\fR argument does not have enough stack left to complete the ! operation. ! .RE ! ! .sp ! .LP ! The \fBswapcontext()\fR function may fail if: ! .sp ! .ne 2 ! .na ! \fB\fBEFAULT\fR\fR ! .ad ! .RS 10n ! The \fIucp\fR or \fIoucp\fR argument points to an invalid address. ! .RE ! ! .SH EXAMPLES ! \fBExample 1 \fRAlternate execution context on a stack whose memory was ! allocated using \fBmmap()\fR. ! .sp ! .in +2 ! .nf #include <stdio.h> #include <ucontext.h> #include <sys/mman.h> void --- 41,188 ---- .\" .\" .\" Copyright 1989 AT&T .\" Portions Copyright (c) 1992, X/Open Company Limited. All Rights Reserved. .\" Copyright (c) 2004, Sun Microsystems, Inc. All Rights Reserved. + .\" Copyright 2023 Oxide Computer Company .\" ! .Dd March 20, 2023 ! .Dt MAKECONTEXT 3C ! .Os ! .Sh NAME ! .Nm makecontext , ! .Nm swapcontext , ! .Nm swapcontext_extd ! .Nd manipulate user contexts ! .Sh SYNOPSIS ! .In ucontext.h ! .Ft void ! .Fo makecontext ! .Fa "ucontext_t *ucp" ! .Fa "void (*ifunc)()" ! .Fa "int argc" ! .Fa "..." ! .Fc ! .Ft int ! .Fo swapcontext ! .Fa "ucontext_t *restrict oucp" ! .Fa "const ucontext_t *restrict ucp" ! .Fc ! .Ft int ! .Fo swapcontext_extd ! .Fa "ucontext_t *restrict oucp" ! .Fa "uint32_t flags" ! .Fa "const ucontext_t *restrict ucp" ! .Fc ! .Sh DESCRIPTION ! The ! .Fn makecontext ! function modifies the context specified by ! .Fa ucp , ! which has been initialized using ! .Xr getcontext 2 or ! .Xr getcontext_extd 2 . ! When this context is resumed using ! .Fn swapcontext , ! .Fn swapcontext_extd , ! or ! .Xr setcontext 2 , ! execution continues by calling the function ! .Fa func , ! passing it the arguments that follow ! .Fa argc ! in the ! .Fn makecontext ! call. ! The value of ! .Fa argc ! must match the number of pointer-sized integer arguments passed to ! .Fa func , ! otherwise the behavior is undefined. ! .Pp ! Before a call is made to ! .Fn makecontext , ! the context being modified should have a stack allocated for it. ! The stack is assigned to the context by initializing the ! .Fa uc_stack ! member. ! .Pp ! The ! .Fa uc_link ! member is used to determine the context that will be resumed when the context ! being modified by ! .Fn makecontext ! returns. ! The ! .Fa uc_link ! member should be initialized prior to the call to ! .Fn makecontext . ! If the ! .Fa uc_link ! member is initialized to ! .Dv NULL , ! the thread executing ! .Fa func ! will exit when ! .Fa func returns. ! See ! .Xr pthread_exit 3C . ! .Pp ! The ! .Fn swapcontext ! function saves the current context in the context structure pointed to by ! .Fa oucp ! and sets the context to the context structure pointed to by ! .Fa ucp . ! .Pp ! If the ! .Fa ucp ! or ! .Fa oucp ! argument points to an invalid address, the behavior is undefined and ! .Va errno ! may be set to ! .Er EFAULT . ! .Pp ! The ! .Fn swapcontext_extd ! function is similar to ! .Fn swapcontext ! except that it performs a call to ! .Xr getcontext_extd 2 ! to get and save the current context, passing the ! .Fa flags ! argument to ! .Xr getcontext_extd 2 . ! Note, the same constraints around the initialization of the ! .Vt ucontext_t ! that are discussed in ! .Xr getcontext_extd 2 ! still apply. ! Mainly, the context must either have originally come from ! .Xr ucontext_alloc 3C ! or prior to its first use been zeroed. ! See ! .Xr getcontext_extd 2 ! for more information. ! .Sh RETURN VALUES ! On successful completion, ! .Fn swapcontext ! and ! .Fn swapcontext_extd ! return ! .Sy 0 . ! Otherwise, ! .Sy -1 ! is returned and ! .Va errno ! is set to indicate the error. ! .Sh EXAMPLES ! .Sy Example 1 ! Alternate execution context on a stack whose memory was allocated using ! .Fn mmap . ! .Bd -literal -offset 2 #include <stdio.h> #include <ucontext.h> #include <sys/mman.h> void
*** 155,219 **** printf("done %d\en", value); return (0); } ! .fi ! .in -2 ! ! .SH USAGE These functions are useful for implementing user-level context switching ! between multiple threads of control within a process (co-processing). More ! effective multiple threads of control can be obtained by using native support ! for multithreading. See \fBthreads\fR(7). ! .SH ATTRIBUTES ! See \fBattributes\fR(7) for descriptions of the following attributes: ! .sp ! ! .sp ! .TS ! box; ! c | c ! l | l . ! ATTRIBUTE TYPE ATTRIBUTE VALUE ! _ ! Interface Stability Standard ! _ ! MT-Level MT-Safe ! .TE ! ! .SH SEE ALSO ! .BR getcontext (2), ! .BR mmap (2), ! .BR sigaction (2), ! .BR sigprocmask (2), ! .BR pthread_exit (3C), ! .BR ucontext.h (3HEAD), ! .BR attributes (7), ! .BR standards (7), ! .BR threads (7) ! .SH NOTES ! The semantics of the \fBuc_stack\fR member of the \fBucontext_t\fR structure ! have changed as they apply to inputs to \fBmakecontext()\fR. Prior to Solaris ! 10, the \fBss_sp\fR member of the \fBuc_stack\fR structure represented the high ! memory address of the area reserved for the stack. The \fBss_sp\fR member now ! represents the base (low memory address), in keeping with other uses of ! \fBss_sp\fR. ! .sp ! .LP ! This change in the meaning of \fBss_sp\fR is now the default behavior. The ! \fB-D__MAKECONTEXT_V2_SOURCE\fR compilation flag used in Solaris 9 update ! releases to access this behavior is obsolete. ! .sp ! .LP Binary compatibility has been preserved with releases prior to Solaris 10. ! Before recompiling, applications that use \fBmakecontext()\fR must be updated ! to reflect this behavior change. The example below demonstrates a typical change ! that must be applied: ! .sp ! .in +2 ! .nf --- example1_s9.c Thu Oct 3 11:58:17 2002 +++ example1.c Thu Jun 27 13:28:16 2002 @@ -27,12 +27,9 @@ uc.uc_stack.ss_sp = mmap(0, sz, PROT_READ | PROT_WRITE | PROT_EXEC, --- 213,311 ---- printf("done %d\en", value); return (0); } ! .Ed ! .Sh ERRORS ! The ! .Fn swapcontext ! and ! .Fn swapcontext_extd ! function will fail if: ! .Bl -tag -width Er ! .It Er ENOMEM ! The ! .Fa ucp ! argument does not have enough stack left to complete the operation. ! .El ! .Pp ! The ! .Fn swapcontext ! and ! .Fn swapcontext_extd ! functions may fail if: ! .Bl -tag -width Er ! .It Er EFAULT ! The ! .Fa ucp ! or ! .Fa oucp ! argument points to an invalid address. ! .El ! .Pp ! The ! .Fn swapcontext_extd ! function may additionally fail if: ! .Bl -tag -width Er ! .It Er EINVAL ! The ! .Fa flags ! argument contains invalid values. ! .El ! .Sh USAGE These functions are useful for implementing user-level context switching ! between multiple threads of control within a process ! .Pq co-processing . ! More effective multiple threads of control can be obtained by using native ! support for multithreading. ! See ! .Xr threads 7 . ! .Sh INTERFACE STABILITY ! .Sy Committed ! .Sh MT-LEVEL ! .Sy MT-Safe ! .Sh SEE ALSO ! .Xr getcontext 2 , ! .Xr getcontext_extd 2 , ! .Xr mmap 2 , ! .Xr sigaction 2 , ! .Xr sigprocmask 2 , ! .Xr pthread_exit 3C , ! .Xr ucontext_alloc 3C , ! .Xr ucontext.h 3HEAD , ! .Xr attributes 7 , ! .Xr standards 7 , ! .Xr threads 7 ! .Sh NOTES ! The semantics of the ! .Fa uc_stack ! member of the ! .Fa ucontext_t ! structure have changed as they apply to inputs to ! .Fn makecontext . ! Prior to Solaris 10, the ! .Fa ss_sp ! member of the ! .Fa uc_stack ! tructure represented the high memory address of the area reserved for the stack. ! The ! .Fa ss_sp ! member now represents the base ! .Pq low memory address , ! in keeping with other uses of ! .Fa ss_sp . ! This change in the meaning of ! .Fa ss_sp ! is the default behavior. ! .Pp Binary compatibility has been preserved with releases prior to Solaris 10. ! Before recompiling, applications that use ! .Fn makecontext ! must be updated to reflect this behavior change. ! The example below demonstrates a typical change that must be applied: ! .Bd -literal -offset 2 --- example1_s9.c Thu Oct 3 11:58:17 2002 +++ example1.c Thu Jun 27 13:28:16 2002 @@ -27,12 +27,9 @@ uc.uc_stack.ss_sp = mmap(0, sz, PROT_READ | PROT_WRITE | PROT_EXEC,
*** 224,230 **** uc.uc_link = &back makecontext(&uc, assign, 2, 100L, &value); .fi ! .in -2 ! --- 316,321 ---- uc.uc_link = &back makecontext(&uc, assign, 2, 100L, &value); .fi ! .Ed