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

*** 26,36 **** /* * Copyright 2012 DEY Storage Systems, Inc. All rights reserved. * Copyright 2018 Joyent, Inc. * Copyright (c) 2013 by Delphix. All rights reserved. * Copyright 2020 OmniOS Community Edition (OmniOSce) Association. ! * Copyright 2021 Oxide Computer Company */ #define _STRUCTURED_PROC 1 #include <assert.h> --- 26,36 ---- /* * Copyright 2012 DEY Storage Systems, Inc. All rights reserved. * Copyright 2018 Joyent, Inc. * Copyright (c) 2013 by Delphix. All rights reserved. * Copyright 2020 OmniOS Community Edition (OmniOSce) Association. ! * Copyright 2023 Oxide Computer Company */ #define _STRUCTURED_PROC 1 #include <assert.h>
*** 441,460 **** sizeof (prfpregset32_t), pgc->pgc_doff) != 0) return (1); #endif /* _LP64 */ } - #ifdef sparc - { - prxregset_t xregs; - if (Plwp_getxregs(P, lsp->pr_lwpid, &xregs) == 0 && - write_note(pgc->pgc_fd, NT_PRXREG, &xregs, - sizeof (prxregset_t), pgc->pgc_doff) != 0) - return (1); - } - #endif /* sparc */ - return (0); } static int new_per_lwp(void *data, const lwpstatus_t *lsp, const lwpsinfo_t *lip) --- 441,450 ----
*** 493,536 **** sizeof (lwpstatus32_t), pgc->pgc_doff) != 0) return (1); #endif /* _LP64 */ } - #ifdef sparc { ! prxregset_t xregs; ! gwindows_t gwins; size_t size; ! if (Plwp_getxregs(P, lsp->pr_lwpid, &xregs) == 0) { ! if (write_note(pgc->pgc_fd, NT_PRXREG, &xregs, ! sizeof (prxregset_t), pgc->pgc_doff) != 0) ! return (1); ! } ! ! if (Plwp_getgwindows(P, lsp->pr_lwpid, &gwins) == 0 && ! gwins.wbcnt > 0) { ! size = sizeof (gwins) - sizeof (gwins.wbuf) + ! gwins.wbcnt * sizeof (gwins.wbuf[0]); ! ! if (write_note(pgc->pgc_fd, NT_GWINDOWS, &gwins, size, pgc->pgc_doff) != 0) return (1); - } } - #ifdef __sparcv9 - if (P->status.pr_dmodel == PR_MODEL_LP64) { - asrset_t asrs; - if (Plwp_getasrs(P, lsp->pr_lwpid, asrs) == 0) { - if (write_note(pgc->pgc_fd, NT_ASRS, &asrs, - sizeof (asrset_t), pgc->pgc_doff) != 0) - return (1); } - } - #endif /* __sparcv9 */ - #endif /* sparc */ if (Plwp_getname(P, lsp->pr_lwpid, name.pr_lwpname, sizeof (name.pr_lwpname)) == 0) { name.pr_lwpid = lsp->pr_lwpid; if (write_note(pgc->pgc_fd, NT_LWPNAME, &name, --- 483,511 ---- sizeof (lwpstatus32_t), pgc->pgc_doff) != 0) return (1); #endif /* _LP64 */ } { ! prxregset_t *xregs; size_t size; ! /* ! * While historically this function was only present on some ! * architectures (despite the presence of the empty file ! * elsewhere), if we call this on a platform without support ! * it'll now fail and thus is no longer subject to ! * platform-specific ifdefs. ! */ ! if (Plwp_getxregs(P, lsp->pr_lwpid, &xregs, &size) == 0) { ! if (write_note(pgc->pgc_fd, NT_PRXREG, xregs, size, pgc->pgc_doff) != 0) return (1); + Plwp_freexregs(P, xregs, size); } } if (Plwp_getname(P, lsp->pr_lwpid, name.pr_lwpname, sizeof (name.pr_lwpname)) == 0) { name.pr_lwpid = lsp->pr_lwpid; if (write_note(pgc->pgc_fd, NT_LWPNAME, &name,