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