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 ----