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 @@
* Portions Copyright 2007 Chad Mynhier
* Copyright 2012 DEY Storage Systems, Inc. All rights reserved.
* Copyright (c) 2013 by Delphix. All rights reserved.
* Copyright 2015, Joyent, Inc.
* Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
- * Copyright 2021 Oxide Computer Company
+ * Copyright 2023 Oxide Computer Company
*/
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
@@ -3153,11 +3153,11 @@
* Find an entry in the process hash table for the specified lwpid.
* The entry will either point to an existing struct ps_lwphandle
* or it will point to an empty slot for a new struct ps_lwphandle.
*/
static struct ps_lwphandle **
-Lfind(struct ps_prochandle *P, lwpid_t lwpid)
+Lfind_slot(struct ps_prochandle *P, lwpid_t lwpid)
{
struct ps_lwphandle **Lp;
struct ps_lwphandle *L;
for (Lp = &P->hashtab[lwpid % (HASHSIZE - 1)];
@@ -3166,10 +3166,24 @@
break;
return (Lp);
}
/*
+ * A wrapper around Lfind_slot() that is suitable for the rest of the internal
+ * consumers who don't care about a slot, merely existence.
+ */
+struct ps_lwphandle *
+Lfind(struct ps_prochandle *P, lwpid_t lwpid)
+{
+ if (P->hashtab == NULL) {
+ return (NULL);
+ }
+
+ return (*Lfind_slot(P, lwpid));
+}
+
+/*
* Grab an LWP contained within the controlled process.
* Return an opaque pointer to its LWP control structure.
* perr: pointer to error return code.
*/
struct ps_lwphandle *
@@ -3188,11 +3202,11 @@
rc = G_NOPROC;
else if (P->hashtab == NULL &&
(P->hashtab = calloc(HASHSIZE, sizeof (struct ps_lwphandle *)))
== NULL)
rc = G_STRANGE;
- else if (*(Lp = Lfind(P, lwpid)) != NULL)
+ else if (*(Lp = Lfind_slot(P, lwpid)) != NULL)
rc = G_BUSY;
else if ((L = malloc(sizeof (struct ps_lwphandle))) == NULL)
rc = G_STRANGE;
if (rc) {
*perr = rc;
@@ -3330,11 +3344,11 @@
}
static void
Lfree_internal(struct ps_prochandle *P, struct ps_lwphandle *L)
{
- *Lfind(P, L->lwp_id) = L->lwp_hash; /* delete from hash table */
+ *Lfind_slot(P, L->lwp_id) = L->lwp_hash; /* delete from hash table */
if (L->lwp_ctlfd >= 0)
(void) close(L->lwp_ctlfd);
if (L->lwp_statfd >= 0)
(void) close(L->lwp_statfd);
@@ -3436,11 +3450,11 @@
/*
* Wait for the specified LWP to stop or terminate.
* Or, just get the current status (PCNULL).
* Or, direct it to stop and get the current status (PCDSTOP).
*/
-static int
+int
Lstopstatus(struct ps_lwphandle *L,
long request, /* PCNULL, PCDSTOP, PCSTOP, PCWSTOP */
uint_t msec) /* if non-zero, timeout in milliseconds */
{
int ctlfd = L->lwp_ctlfd;