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
        
*** 22,31 ****
--- 22,35 ----
  /*
   * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
   * Use is subject to license terms.
   */
  
+ /*
+  * Copyright 2023 Oxide Computer Company
+  */
+ 
          .file   "getcontext.s"
  
  #include <sys/asm_linkage.h>
  
          ANSI_PRAGMA_WEAK(getcontext,function)
*** 40,52 ****
   *
   * As swapcontext() is actually equivalent to getcontext() + setcontext(),
   * swapcontext() shares the most code with getcontext().
   */
  
! #define GETCONTEXT_IMPL(offset)                                         \
          pushq   %rdi;           /* preserve the ucontext_t pointer */   \
!         call    __getcontext;                                           \
                                  /* call getcontext: syscall */          \
          popq    %rdx;                                                   \
          andl    %eax, %eax;     /* if (error_return_from_syscall) */    \
          je      1f;                                                     \
          addq    $offset, %rsp;                                          \
--- 44,56 ----
   *
   * As swapcontext() is actually equivalent to getcontext() + setcontext(),
   * swapcontext() shares the most code with getcontext().
   */
  
! #define GETCONTEXT_IMPL(offset, func)                                           \
          pushq   %rdi;           /* preserve the ucontext_t pointer */   \
!         call    func;                                           \
                                  /* call getcontext: syscall */          \
          popq    %rdx;                                                   \
          andl    %eax, %eax;     /* if (error_return_from_syscall) */    \
          je      1f;                                                     \
          addq    $offset, %rsp;                                          \
*** 68,94 ****
          xorq    %rax, %rax;     /* return 0 */                          \
          movq    %rax, RAX_OFF (%rdx);                                   \
                                  /* getcontext returns 0 after setcontext */
  
  /*      
!  * getcontext(ucontext_t *ucp)
   */
  
          ENTRY(getcontext)
!         GETCONTEXT_IMPL(0)
          ret
          SET_SIZE(getcontext)
  
  /*
!  * swapcontext(ucontext_t *oucp, const ucontext_t *ucp)
   */
  
          ENTRY(swapcontext)
          pushq   %rsi                    /* preserve the 2nd argument */
          
!         GETCONTEXT_IMPL(8)
  
          /* call setcontext */
          popq    %rdi
          call    setcontext
          ret
          SET_SIZE(swapcontext)
--- 72,131 ----
          xorq    %rax, %rax;     /* return 0 */                          \
          movq    %rax, RAX_OFF (%rdx);                                   \
                                  /* getcontext returns 0 after setcontext */
  
  /*
!  * int getcontext(ucontext_t *ucp)
   */
  
          ENTRY(getcontext)
!         GETCONTEXT_IMPL(0, __getcontext)
          ret
          SET_SIZE(getcontext)
  
  /*
!  * int swapcontext(ucontext_t *oucp, const ucontext_t *ucp)
   */
  
          ENTRY(swapcontext)
          pushq   %rsi                    /* preserve the 2nd argument */
  
!         GETCONTEXT_IMPL(8, __getcontext)
  
          /* call setcontext */
          popq    %rdi
          call    setcontext
          ret
          SET_SIZE(swapcontext)
+ 
+ /*
+  * int getcontext_extd(ucontext_t * ctx, uint32_t flags)
+  */
+         ENTRY(getcontext_extd)
+         cmpl    $0, %esi
+         jne     2f
+         GETCONTEXT_IMPL(0, __getcontext_extd)
+         ret
+ 2:
+         movl    $EINVAL, %eax           /* errno = EINVAL */
+         jmp     __cerror                /* return (-1) */
+         SET_SIZE(getcontext_extd)
+ 
+ /*
+  * int swapcontext_extd(ucontext_t *oucp, uint32_t flags, const ucontext_t *ucp)
+  */
+ 
+         ENTRY(swapcontext_extd)
+         cmpl    $0, %esi
+         jne     2f
+         pushq   %rdx                    /* preserve the 3rd argument */
+ 
+         GETCONTEXT_IMPL(8, __getcontext_extd)
+ 
+         /* call setcontext */
+         popq    %rdi
+         call    setcontext
+         ret
+ 2:
+         movl    $EINVAL, %eax           /* errno = EINVAL */
+         jmp     __cerror                /* return (-1) */
+         SET_SIZE(swapcontext_extd)