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,11 +26,11 @@
/*
* 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
+ * Copyright 2023 Oxide Computer Company
*/
#define _STRUCTURED_PROC 1
#include <assert.h>
@@ -441,20 +441,10 @@
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)
@@ -493,44 +483,29 @@
sizeof (lwpstatus32_t), pgc->pgc_doff) != 0)
return (1);
#endif /* _LP64 */
}
-#ifdef sparc
{
- prxregset_t xregs;
- gwindows_t gwins;
+ prxregset_t *xregs;
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,
+ /*
+ * 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);
}
-#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,