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

*** 23,33 **** * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright 2019 Joyent, Inc. * Copyright (c) 2017 by Delphix. All rights reserved. * Copyright 2020 OmniOS Community Edition (OmniOSce) Association. * Copyright 2022 MNX Cloud, Inc. ! * Copyright 2022 Oxide Computer Company */ /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ /* All Rights Reserved */ --- 23,33 ---- * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright 2019 Joyent, Inc. * Copyright (c) 2017 by Delphix. All rights reserved. * Copyright 2020 OmniOS Community Edition (OmniOSce) Association. * Copyright 2022 MNX Cloud, Inc. ! * Copyright 2023 Oxide Computer Company */ /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ /* All Rights Reserved */
*** 1735,1762 **** /* ARGSUSED */ static int pr_read_xregs(prnode_t *pnp, uio_t *uiop, cred_t *cr) { - #if defined(__sparc) proc_t *p; kthread_t *t; int error; ! char *xreg; size_t size; ASSERT(pnp->pr_type == PR_XREGS); - xreg = kmem_zalloc(sizeof (prxregset_t), KM_SLEEP); - if ((error = prlock(pnp, ZNO)) != 0) ! goto out; p = pnp->pr_common->prc_proc; t = pnp->pr_common->prc_thread; ! size = prhasx(p)? prgetprxregsize(p) : 0; if (uiop->uio_offset >= size) { prunlock(pnp); goto out; } --- 1735,1782 ---- /* ARGSUSED */ static int pr_read_xregs(prnode_t *pnp, uio_t *uiop, cred_t *cr) { proc_t *p; kthread_t *t; int error; ! void *xreg; size_t size; ASSERT(pnp->pr_type == PR_XREGS); if ((error = prlock(pnp, ZNO)) != 0) ! return (error); p = pnp->pr_common->prc_proc; t = pnp->pr_common->prc_thread; ! /* ! * While we would prefer to do the allocation with holding the process ! * this way, we can only determine this size while holding the process ! * as the hold guarantees us: ! * ! * o That the process in question actualy exists. ! * o That the process in question cannot change the set of FPU features ! * it has enabled. ! * ! * We will drop p_lock across the allocation call itself. This should be ! * safe as the enabled feature set should not change while the process ! * is locked (e.g. enabling extending FPU state like AMX on x86 should ! * require the process to be locked). ! */ ! size = prhasx(p) ? prgetprxregsize(p) : 0; ! if (size == 0) { ! prunlock(pnp); ! return (0); ! } ! mutex_exit(&p->p_lock); ! xreg = kmem_zalloc(size, KM_SLEEP); ! mutex_enter(&p->p_lock); ! ASSERT3U(size, ==, prgetprxregsize(p)); ! if (uiop->uio_offset >= size) { prunlock(pnp); goto out; }
*** 1766,1780 **** mutex_enter(&p->p_lock); prunlock(pnp); error = pr_uioread(xreg, size, uiop); out: ! kmem_free(xreg, sizeof (prxregset_t)); return (error); - #else - return (0); - #endif } static int pr_read_spymaster(prnode_t *pnp, uio_t *uiop, cred_t *cr) { --- 1786,1797 ---- mutex_enter(&p->p_lock); prunlock(pnp); error = pr_uioread(xreg, size, uiop); out: ! kmem_free(xreg, size); return (error); } static int pr_read_spymaster(prnode_t *pnp, uio_t *uiop, cred_t *cr) {