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
        
*** 55,102 ****
  #include "elf_impl.h"
  
  extern void oprgetstatus(kthread_t *, prstatus_t *, zone_t *);
  extern void oprgetpsinfo(proc_t *, prpsinfo_t *, kthread_t *);
  
  void
  setup_old_note_header(Phdr *v, proc_t *p)
  {
          int nlwp = p->p_lwpcnt;
-         size_t size;
  
          v[0].p_type = PT_NOTE;
          v[0].p_flags = PF_R;
          v[0].p_filesz = (sizeof (Note) * (3 + nlwp))
              + roundup(sizeof (prpsinfo_t), sizeof (Word))
              + roundup(strlen(platform) + 1, sizeof (Word))
              + roundup(__KERN_NAUXV_IMPL * sizeof (aux_entry_t),
              sizeof (Word))
              + nlwp * roundup(sizeof (prstatus_t), sizeof (Word));
!         if (prhasfp())
!                 v[0].p_filesz += nlwp * sizeof (Note)
!                     + nlwp*roundup(sizeof (prfpregset_t), sizeof (Word));
!         if ((size = prhasx(p)? prgetprxregsize(p) : 0) != 0)
!                 v[0].p_filesz += nlwp * sizeof (Note)
!                     + nlwp * roundup(size, sizeof (Word));
! 
! #if defined(__sparc)
!         /*
!          * Figure out the number and sizes of register windows.
!          */
!         {
!                 kthread_t *t = p->p_tlist;
!                 do {
!                         if ((size = prnwindows(ttolwp(t))) != 0) {
!                                 size = sizeof (gwindows_t) -
!                                     (SPARC_MAXREGWINDOW - size) *
!                                     sizeof (struct rwindow);
!                                 v[0].p_filesz += sizeof (Note) +
!                                     roundup(size, sizeof (Word));
                          }
-                 } while ((t = t->t_forw) != p->p_tlist);
-         }
- #endif /* __sparc */
  }
  
  int
  write_old_elfnotes(proc_t *p, int sig, vnode_t *vp, offset_t offset,
      rlim64_t rlimit, cred_t *credp)
--- 55,87 ----
  #include "elf_impl.h"
  
  extern void oprgetstatus(kthread_t *, prstatus_t *, zone_t *);
  extern void oprgetpsinfo(proc_t *, prpsinfo_t *, kthread_t *);
  
+ /*
+  * Historically the system dumped the xreg note when on SPARC. Because we no
+  * longer support SPARC we do not dump the old note form of the xregs for any
+  * additional platforms. Please do not add this back unless it's for SPARC's
+  * future resurrection.
+  */
  void
  setup_old_note_header(Phdr *v, proc_t *p)
  {
          int nlwp = p->p_lwpcnt;
  
          v[0].p_type = PT_NOTE;
          v[0].p_flags = PF_R;
          v[0].p_filesz = (sizeof (Note) * (3 + nlwp))
              + roundup(sizeof (prpsinfo_t), sizeof (Word))
              + roundup(strlen(platform) + 1, sizeof (Word))
              + roundup(__KERN_NAUXV_IMPL * sizeof (aux_entry_t),
              sizeof (Word))
              + nlwp * roundup(sizeof (prstatus_t), sizeof (Word));
!         if (prhasfp()) {
!                 v[0].p_filesz += nlwp * sizeof (Note) +
!                     nlwp * roundup(sizeof (prfpregset_t), sizeof (Word));
          }
  }
  
  int
  write_old_elfnotes(proc_t *p, int sig, vnode_t *vp, offset_t offset,
      rlim64_t rlimit, cred_t *credp)
*** 103,120 ****
  {
          union {
                  prpsinfo_t      psinfo;
                  prstatus_t      prstat;
                  prfpregset_t    fpregs;
- #if defined(__sparc)
-                 gwindows_t      gwindows;
- #endif /* __sparc */
-                 char            xregs[1];
                  aux_entry_t     auxv[__KERN_NAUXV_IMPL];
          } *bigwad;
!         int xregsize = prhasx(p)? prgetprxregsize(p) : 0;
!         size_t bigsize = MAX(sizeof (*bigwad), (size_t)xregsize);
          kthread_t *t;
          klwp_t *lwp;
          user_t *up;
          int i;
          int nlwp;
--- 88,100 ----
  {
          union {
                  prpsinfo_t      psinfo;
                  prstatus_t      prstat;
                  prfpregset_t    fpregs;
                  aux_entry_t     auxv[__KERN_NAUXV_IMPL];
          } *bigwad;
!         size_t bigsize = sizeof (*bigwad);
          kthread_t *t;
          klwp_t *lwp;
          user_t *up;
          int i;
          int nlwp;
*** 197,235 ****
                          error = elfnote(vp, &offset, NT_PRFPREG,
                              sizeof (bigwad->fpregs), (caddr_t)&bigwad->fpregs,
                              rlimit, credp);
                          if (error)
                                  goto done;
-                 }
- 
- #if defined(__sparc)
-                 /*
-                  * Unspilled SPARC register windows.
-                  */
-                 {
-                         size_t size = prnwindows(lwp);
- 
-                         if (size != 0) {
-                                 size = sizeof (gwindows_t) -
-                                     (SPARC_MAXREGWINDOW - size) *
-                                     sizeof (struct rwindow);
-                                 prgetwindows(lwp, &bigwad->gwindows);
-                                 error = elfnote(vp, &offset, NT_GWINDOWS,
-                                     size, (caddr_t)&bigwad->gwindows,
-                                     rlimit, credp);
-                                 if (error)
-                                         goto done;
-                         }
-                 }
- #endif /* __sparc */
- 
-                 if (xregsize) {
-                         prgetprxregs(lwp, bigwad->xregs);
-                         error = elfnote(vp, &offset, NT_PRXREG,
-                             xregsize, bigwad->xregs, rlimit, credp);
-                         if (error)
-                                 goto done;
                  }
          } while ((t = t->t_forw) != curthread);
          ASSERT(nlwp == 0);
  
  done:
--- 177,186 ----