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
        
@@ -1,69 +1,61 @@
 MAKECONTEXT(3C)          Standard C Library Functions          MAKECONTEXT(3C)
 
 NAME
-       makecontext, swapcontext - manipulate user contexts
+     makecontext, swapcontext, swapcontext_extd - manipulate user contexts
 
 SYNOPSIS
        #include <ucontext.h>
 
-       void makecontext(ucontext_t *ucp, void (*func)(), int argc...);
+     void
+     makecontext(ucontext_t *ucp, void (*ifunc)(), int argc, ...);
 
+     int
+     swapcontext(ucontext_t *restrict oucp, const ucontext_t *restrict ucp);
 
-       int swapcontext(ucontext_t *restrict oucp,
+     int
+     swapcontext_extd(ucontext_t *restrict oucp, uint32_t flags,
             const ucontext_t *restrict ucp);
 
-
 DESCRIPTION
        The makecontext() function modifies the context specified by ucp, which
-       has been initialized using getcontext(2). When this context is resumed
-       using swapcontext() or setcontext(2), execution continues by calling
-       the function func, passing it the arguments that follow argc in the
-       makecontext() call. The value of argc must match the number of pointer-
-       sized integer arguments passed to func, otherwise the behavior is
-       undefined.
+     has been initialized using getcontext(2) or getcontext_extd(2).  When
+     this context is resumed using swapcontext(), swapcontext_extd(), or
+     setcontext(2), execution continues by calling the function func, passing
+     it the arguments that follow argc in the makecontext() call.  The value
+     of argc must match the number of pointer-sized integer arguments passed
+     to func, otherwise the behavior is undefined.
 
+     Before a call is made to makecontext(), the context being modified should
+     have a stack allocated for it.  The stack is assigned to the context by
+     initializing the uc_stack member.
 
-       Before a call is made to makecontext(), the context being modified
-       should have a stack allocated for it. The stack is assigned to the
-       context by initializing the uc_stack member.
+     The uc_link member is used to determine the context that will be resumed
+     when the context being modified by makecontext() returns.  The uc_link
+     member should be initialized prior to the call to makecontext().  If the
+     uc_link member is initialized to NULL, the thread executing func will
+     exit when func returns. See pthread_exit(3C).
 
-
-       The uc_link member is used to determine the context that will be
-       resumed when the context being modified by makecontext() returns.  The
-       uc_link member should be initialized prior to the call to
-       makecontext(). If the uc_link member is initialized to NULL, the thread
-       executing func will exit when func returns. See pthread_exit(3C).
-
-
        The swapcontext() function saves the current context in the context
        structure pointed to by oucp and sets the context to the context
        structure pointed to by ucp.
 
+     If the ucp or oucp argument points to an invalid address, the behavior is
+     undefined and errno may be set to EFAULT.
 
-       If the ucp or oucp argument points to an invalid address, the behavior
-       is undefined and errno may be set to EFAULT.
+     The swapcontext_extd() function is similar to swapcontext() except that
+     it performs a call to getcontext_extd(2) to get and save the current
+     context, passing the flags argument to getcontext_extd(2).  Note, the
+     same constraints around the initialization of the ucontext_t that are
+     discussed in getcontext_extd(2) still apply.  Mainly, the context must
+     either have originally come from ucontext_alloc(3C) or prior to its first
+     use been zeroed.  See getcontext_extd(2) for more information.
 
 RETURN VALUES
-       On successful completion, swapcontext() returns 0. Otherwise, -1 is
-       returned and errno is set to indicate the error.
+     On successful completion, swapcontext() and swapcontext_extd() return 0.
+     Otherwise, -1 is returned and errno is set to indicate the error.
 
-ERRORS
-       The swapcontext() function will fail if:
-
-       ENOMEM
-                 The ucp argument does not have enough stack left to complete
-                 the operation.
-
-
-
-       The swapcontext() function may fail if:
-
-       EFAULT
-                 The ucp or oucp argument points to an invalid address.
-
-
 EXAMPLES
        Example 1 Alternate execution context on a stack whose memory was
        allocated using mmap().
 
          #include <stdio.h>
@@ -99,49 +91,49 @@
                  printf("done %d\n", value);
 
                  return (0);
          }
 
+ERRORS
+     The swapcontext() and swapcontext_extd() function will fail if:
 
-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 threads(7).
+     ENOMEM             The ucp argument does not have enough stack left to
+                        complete the operation.
 
-ATTRIBUTES
-       See attributes(7) for descriptions of the following attributes:
+     The swapcontext() and swapcontext_extd() functions may fail if:
 
+     EFAULT             The ucp or oucp argument points to an invalid address.
 
+     The swapcontext_extd() function may additionally fail if:
 
+     EINVAL             The flags argument contains invalid values.
 
-       +--------------------+-----------------+
-       |  ATTRIBUTE TYPE    | ATTRIBUTE VALUE |
-       +--------------------+-----------------+
-       |Interface Stability | Standard        |
-       +--------------------+-----------------+
-       |MT-Level            | MT-Safe         |
-       +--------------------+-----------------+
+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 threads(7).
 
+INTERFACE STABILITY
+     Committed
+
+MT-LEVEL
+     MT-Safe
+
 SEE ALSO
-       getcontext(2), mmap(2), sigaction(2), sigprocmask(2), pthread_exit(3C),
-       ucontext.h(3HEAD), attributes(7), standards(7), threads(7)
+     getcontext(2), getcontext_extd(2), mmap(2), sigaction(2), sigprocmask(2),
+     pthread_exit(3C), ucontext_alloc(3C), ucontext.h(3HEAD), attributes(7),
+     standards(7), threads(7)
 
 NOTES
        The semantics of the uc_stack member of the ucontext_t structure have
        changed as they apply to inputs to makecontext(). Prior to Solaris 10,
-       the ss_sp member of the uc_stack structure represented the high memory
+     the ss_sp member of the uc_stack tructure represented the high memory
        address of the area reserved for the stack. The ss_sp member now
        represents the base (low memory address), in keeping with other uses of
-       ss_sp.
+     ss_sp.  This change in the meaning of ss_sp is the default behavior.
 
-
-       This change in the meaning of ss_sp is now the default behavior. The
-       -D__MAKECONTEXT_V2_SOURCE compilation flag used in Solaris 9 update
-       releases to access this behavior is obsolete.
-
-
        Binary compatibility has been preserved with releases prior to Solaris
        10.  Before recompiling, applications that use makecontext() must be
        updated to reflect this behavior change. The example below demonstrates
        a typical change that must be applied:
 
@@ -157,7 +149,6 @@
 
                  uc.uc_link = &back
 
                  makecontext(&uc, assign, 2, 100L, &value);
 
-
-                               February 17, 2023               MAKECONTEXT(3C)
+illumos                         March 20, 2023                         illumos