diff options
Diffstat (limited to 'usr/src/uts/common')
-rw-r--r-- | usr/src/uts/common/brand/lx/syscall/lx_prctl.c | 6 | ||||
-rw-r--r-- | usr/src/uts/common/disp/thread.c | 29 | ||||
-rw-r--r-- | usr/src/uts/common/dtrace/dtrace.c | 25 | ||||
-rw-r--r-- | usr/src/uts/common/exec/elf/elf_notes.c | 19 | ||||
-rw-r--r-- | usr/src/uts/common/fs/proc/prdata.h | 5 | ||||
-rw-r--r-- | usr/src/uts/common/fs/proc/prvnops.c | 111 | ||||
-rw-r--r-- | usr/src/uts/common/sys/dtrace.h | 7 | ||||
-rw-r--r-- | usr/src/uts/common/sys/elf.h | 19 | ||||
-rw-r--r-- | usr/src/uts/common/sys/procfs.h | 15 | ||||
-rw-r--r-- | usr/src/uts/common/sys/thread.h | 3 |
10 files changed, 202 insertions, 37 deletions
diff --git a/usr/src/uts/common/brand/lx/syscall/lx_prctl.c b/usr/src/uts/common/brand/lx/syscall/lx_prctl.c index 4aecb6e9cc..a8b3c3422c 100644 --- a/usr/src/uts/common/brand/lx/syscall/lx_prctl.c +++ b/usr/src/uts/common/brand/lx/syscall/lx_prctl.c @@ -10,7 +10,7 @@ */ /* - * Copyright (c) 2017, Joyent, Inc. + * Copyright (c) 2018, Joyent, Inc. */ #include <sys/systm.h> @@ -175,7 +175,9 @@ lx_prctl(int opt, uintptr_t data) } name[LX_PR_SET_NAME_NAMELEN - 1] = '\0'; - thread_setname(t, name); + if ((ret = thread_setname(t, name)) != 0) { + return (set_errno(ret)); + } /* * In Linux, PR_SET_NAME sets the name of the thread, not the diff --git a/usr/src/uts/common/disp/thread.c b/usr/src/uts/common/disp/thread.c index aece8faaff..d576738e75 100644 --- a/usr/src/uts/common/disp/thread.c +++ b/usr/src/uts/common/disp/thread.c @@ -74,6 +74,7 @@ #include <sys/waitq.h> #include <sys/cpucaps.h> #include <sys/kiconv.h> +#include <sys/ctype.h> #include <sys/ht.h> #ifndef STACK_GROWTH_DOWN @@ -2334,7 +2335,7 @@ stkinfo_percent(caddr_t t_stk, caddr_t t_stkbase, caddr_t sp) * It is also expected callers on behalf of userland clients have done * any necessary permission checks. */ -void +int thread_setname(kthread_t *t, const char *name) { char *buf = NULL; @@ -2355,6 +2356,11 @@ thread_setname(kthread_t *t, const char *name) * usage in highly constrained situations (e.g. dtrace). */ if (name != NULL && name[0] != '\0') { + for (size_t i = 0; name[i] != '\0'; i++) { + if (!isprint(name[i])) + return (EINVAL); + } + buf = kmem_zalloc(THREAD_NAME_MAX, KM_SLEEP); (void) strlcpy(buf, name, THREAD_NAME_MAX); } @@ -2371,4 +2377,25 @@ thread_setname(kthread_t *t, const char *name) } } mutex_exit(&ttoproc(t)->p_lock); + return (0); +} + +int +thread_vsetname(kthread_t *t, const char *fmt, ...) +{ + char name[THREAD_NAME_MAX]; + va_list va; + int rc; + + va_start(va, fmt); + rc = vsnprintf(name, sizeof (name), fmt, va); + va_end(va); + + if (rc < 0) + return (EINVAL); + + if (rc >= sizeof (name)) + return (ENAMETOOLONG); + + return (thread_setname(t, name)); } diff --git a/usr/src/uts/common/dtrace/dtrace.c b/usr/src/uts/common/dtrace/dtrace.c index 9b53e08b6a..8184bc27b9 100644 --- a/usr/src/uts/common/dtrace/dtrace.c +++ b/usr/src/uts/common/dtrace/dtrace.c @@ -21,7 +21,7 @@ /* * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2017, Joyent, Inc. + * Copyright (c) 2018, Joyent, Inc. * Copyright (c) 2012, 2014 by Delphix. All rights reserved. */ @@ -3539,6 +3539,25 @@ dtrace_dif_variable(dtrace_mstate_t *mstate, dtrace_state_t *state, uint64_t v, return ((uint64_t)lwp->lwp_errno); } + + case DIF_VAR_THREADNAME: + /* + * See comment in DIF_VAR_PID. + */ + if (DTRACE_ANCHORED(mstate->dtms_probe) && CPU_ON_INTR(CPU)) + return (0); + + if (curthread->t_name == NULL) + return (0); + + /* + * Once set, ->t_name itself is never changed: any updates are + * made to the same buffer that we are pointing out. So we are + * safe to dereference it here. + */ + return (dtrace_dif_varstr((uintptr_t)curthread->t_name, + state, mstate)); + default: DTRACE_CPUFLAG_SET(CPU_DTRACE_ILLOP); return (0); @@ -5563,7 +5582,7 @@ next: * Stringify using RFC 1884 convention 2 - 16 bit * hexadecimal values with a zero-run compression. * Lower case hexadecimal digits are used. - * eg, fe80::214:4fff:fe0b:76c8. + * eg, fe80::214:4fff:fe0b:76c8. * The IPv4 embedded form is returned for inet_ntop, * just the IPv4 string is returned for inet_ntoa6. */ @@ -5747,7 +5766,7 @@ dtrace_dif_emulate(dtrace_difo_t *difo, dtrace_mstate_t *mstate, */ mstate->dtms_difo = difo; - regs[DIF_REG_R0] = 0; /* %r0 is fixed at zero */ + regs[DIF_REG_R0] = 0; /* %r0 is fixed at zero */ while (pc < textlen && !(*flags & CPU_DTRACE_FAULT)) { opc = pc; diff --git a/usr/src/uts/common/exec/elf/elf_notes.c b/usr/src/uts/common/exec/elf/elf_notes.c index 7453f6c745..d977d28540 100644 --- a/usr/src/uts/common/exec/elf/elf_notes.c +++ b/usr/src/uts/common/exec/elf/elf_notes.c @@ -26,7 +26,7 @@ /* * Copyright 2012 DEY Storage Systems, Inc. All rights reserved. - * Copyright 2016, Joyent, Inc. + * Copyright 2018, Joyent, Inc. */ #include <sys/types.h> @@ -94,7 +94,7 @@ setup_note_header(Phdr *v, proc_t *p) v[0].p_type = PT_NOTE; v[0].p_flags = PF_R; - v[0].p_filesz = (sizeof (Note) * (10 + 2 * nlwp + nzomb + nfd)) + v[0].p_filesz = (sizeof (Note) * (10 + 3 * nlwp + nzomb + nfd)) + roundup(sizeof (psinfo_t), sizeof (Word)) + roundup(sizeof (pstatus_t), sizeof (Word)) + roundup(prgetprivsize(), sizeof (Word)) @@ -107,6 +107,7 @@ setup_note_header(Phdr *v, proc_t *p) + roundup(sizeof (prsecflags_t), sizeof (Word)) + (nlwp + nzomb) * roundup(sizeof (lwpsinfo_t), sizeof (Word)) + nlwp * roundup(sizeof (lwpstatus_t), sizeof (Word)) + + nlwp * roundup(sizeof (prlwpname_t), sizeof (Word)) + nfd * roundup(sizeof (prfdinfo_t), sizeof (Word)); if (curproc->p_agenttp != NULL) { @@ -458,6 +459,7 @@ write_elfnotes(proc_t *p, int sig, vnode_t *vp, offset_t offset, nzomb = p->p_zombcnt; /* for each entry in the lwp directory ... */ for (ldp = p->p_lwpdir; nlwp + nzomb != 0; ldp++) { + prlwpname_t name = { 0, }; if ((lep = ldp->ld_entry) == NULL) /* empty slot */ continue; @@ -468,6 +470,10 @@ write_elfnotes(proc_t *p, int sig, vnode_t *vp, offset_t offset, lwp = ttolwp(t); mutex_enter(&p->p_lock); prgetlwpsinfo(t, &bigwad->lwpsinfo); + if (t->t_name != NULL) { + (void) strlcpy(name.pr_lwpname, t->t_name, + sizeof (name.pr_lwpname)); + } mutex_exit(&p->p_lock); } else { /* zombie lwp */ ASSERT(nzomb != 0); @@ -478,11 +484,15 @@ write_elfnotes(proc_t *p, int sig, vnode_t *vp, offset_t offset, bigwad->lwpsinfo.pr_sname = 'Z'; bigwad->lwpsinfo.pr_start.tv_sec = lep->le_start; } + + name.pr_lwpid = bigwad->lwpsinfo.pr_lwpid; + error = elfnote(vp, &offset, NT_LWPSINFO, sizeof (bigwad->lwpsinfo), (caddr_t)&bigwad->lwpsinfo, rlimit, credp); if (error) goto done; + if (t == NULL) /* nothing more to do for a zombie */ continue; @@ -516,6 +526,11 @@ write_elfnotes(proc_t *p, int sig, vnode_t *vp, offset_t offset, if (error) goto done; + if ((error = elfnote(vp, &offset, NT_LWPNAME, sizeof (name), + (caddr_t)&name, rlimit, credp)) != 0) + goto done; + + #if defined(__sparc) /* * Unspilled SPARC register windows. diff --git a/usr/src/uts/common/fs/proc/prdata.h b/usr/src/uts/common/fs/proc/prdata.h index 35a76597b2..706e3ad14d 100644 --- a/usr/src/uts/common/fs/proc/prdata.h +++ b/usr/src/uts/common/fs/proc/prdata.h @@ -27,7 +27,7 @@ /* All Rights Reserved */ /* - * Copyright 2016 Joyent, Inc. + * Copyright 2018 Joyent, Inc. */ #ifndef _SYS_PROC_PRDATA_H @@ -137,6 +137,7 @@ typedef enum prnodetype { PR_LWPDIR, /* /proc/<pid>/lwp */ PR_LWPIDDIR, /* /proc/<pid>/lwp/<lwpid> */ PR_LWPCTL, /* /proc/<pid>/lwp/<lwpid>/lwpctl */ + PR_LWPNAME, /* /proc/<pid>/lwp/<lwpid>/lwpname */ PR_LWPSTATUS, /* /proc/<pid>/lwp/<lwpid>/lwpstatus */ PR_LWPSINFO, /* /proc/<pid>/lwp/<lwpid>/lwpsinfo */ PR_LWPUSAGE, /* /proc/<pid>/lwp/<lwpid>/lwpusage */ @@ -363,7 +364,7 @@ extern void prgetaction(proc_t *, user_t *, uint_t, struct sigaction *); extern void prgetusage(kthread_t *, struct prhusage *); extern void praddusage(kthread_t *, struct prhusage *); extern void prcvtusage(struct prhusage *, prusage_t *); -extern void prscaleusage(prhusage_t *); +extern void prscaleusage(prhusage_t *); extern kthread_t *prchoose(proc_t *); extern void allsetrun(proc_t *); extern int setisempty(uint32_t *, uint_t); diff --git a/usr/src/uts/common/fs/proc/prvnops.c b/usr/src/uts/common/fs/proc/prvnops.c index fa5f637f05..57d01c86f0 100644 --- a/usr/src/uts/common/fs/proc/prvnops.c +++ b/usr/src/uts/common/fs/proc/prvnops.c @@ -21,12 +21,12 @@ /* * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2017, Joyent, Inc. + * Copyright (c) 2018, Joyent, Inc. * Copyright (c) 2017 by Delphix. All rights reserved. */ /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ -/* All Rights Reserved */ +/* All Rights Reserved */ #include <sys/types.h> #include <sys/param.h> @@ -64,6 +64,7 @@ #include <sys/contract_impl.h> #include <sys/ctfs.h> #include <sys/avl.h> +#include <sys/ctype.h> #include <fs/fs_subr.h> #include <vm/rm.h> #include <vm/as.h> @@ -190,22 +191,24 @@ static prdirent_t lwpiddir[] = { ".." }, { PR_LWPCTL, 3 * sizeof (prdirent_t), sizeof (prdirent_t), "lwpctl" }, - { PR_LWPSTATUS, 4 * sizeof (prdirent_t), sizeof (prdirent_t), + { PR_LWPNAME, 4 * sizeof (prdirent_t), sizeof (prdirent_t), + "lwpname" }, + { PR_LWPSTATUS, 5 * sizeof (prdirent_t), sizeof (prdirent_t), "lwpstatus" }, - { PR_LWPSINFO, 5 * sizeof (prdirent_t), sizeof (prdirent_t), + { PR_LWPSINFO, 6 * sizeof (prdirent_t), sizeof (prdirent_t), "lwpsinfo" }, - { PR_LWPUSAGE, 6 * sizeof (prdirent_t), sizeof (prdirent_t), + { PR_LWPUSAGE, 7 * sizeof (prdirent_t), sizeof (prdirent_t), "lwpusage" }, - { PR_XREGS, 7 * sizeof (prdirent_t), sizeof (prdirent_t), + { PR_XREGS, 8 * sizeof (prdirent_t), sizeof (prdirent_t), "xregs" }, - { PR_TMPLDIR, 8 * sizeof (prdirent_t), sizeof (prdirent_t), + { PR_TMPLDIR, 9 * sizeof (prdirent_t), sizeof (prdirent_t), "templates" }, - { PR_SPYMASTER, 9 * sizeof (prdirent_t), sizeof (prdirent_t), + { PR_SPYMASTER, 10 * sizeof (prdirent_t), sizeof (prdirent_t), "spymaster" }, #if defined(__sparc) - { PR_GWINDOWS, 10 * sizeof (prdirent_t), sizeof (prdirent_t), + { PR_GWINDOWS, 11 * sizeof (prdirent_t), sizeof (prdirent_t), "gwindows" }, - { PR_ASRS, 11 * sizeof (prdirent_t), sizeof (prdirent_t), + { PR_ASRS, 12 * sizeof (prdirent_t), sizeof (prdirent_t), "asrs" }, #endif }; @@ -595,7 +598,8 @@ static int pr_read_inval(), pr_read_as(), pr_read_status(), pr_read_argv(), pr_read_usage(), pr_read_lusage(), pr_read_pagedata(), pr_read_watch(), pr_read_lwpstatus(), pr_read_lwpsinfo(), - pr_read_lwpusage(), pr_read_xregs(), pr_read_priv(), + pr_read_lwpusage(), pr_read_lwpname(), + pr_read_xregs(), pr_read_priv(), pr_read_spymaster(), pr_read_secflags(), #if defined(__sparc) pr_read_gwindows(), pr_read_asrs(), @@ -635,6 +639,7 @@ static int (*pr_read_function[PR_NFILES])() = { pr_read_inval, /* /proc/<pid>/lwp */ pr_read_inval, /* /proc/<pid>/lwp/<lwpid> */ pr_read_inval, /* /proc/<pid>/lwp/<lwpid>/lwpctl */ + pr_read_lwpname, /* /proc/<pid>/lwp/<lwpid>/lwpname */ pr_read_lwpstatus, /* /proc/<pid>/lwp/<lwpid>/lwpstatus */ pr_read_lwpsinfo, /* /proc/<pid>/lwp/<lwpid>/lwpsinfo */ pr_read_lwpusage, /* /proc/<pid>/lwp/<lwpid>/lwpusage */ @@ -1117,7 +1122,7 @@ pr_read_auxv(prnode_t *pnp, uio_t *uiop) * we have two kinds of LDT structures to export -- one for compatibility * mode, and one for long mode, sigh. * - * For now lets just have a ldt of size 0 for 64-bit processes. + * For now let's just have a ldt of size 0 for 64-bit processes. */ static int pr_read_ldt(prnode_t *pnp, uio_t *uiop) @@ -1582,6 +1587,33 @@ out: return (error); } +static int +pr_read_lwpname(prnode_t *pnp, uio_t *uiop) +{ + char lwpname[THREAD_NAME_MAX]; + kthread_t *t; + int error; + + ASSERT(pnp->pr_type == PR_LWPNAME); + + if (uiop->uio_offset >= THREAD_NAME_MAX) + return (0); + + if ((error = prlock(pnp, ZNO)) != 0) + return (error); + + bzero(lwpname, sizeof (lwpname)); + + t = pnp->pr_common->prc_thread; + + if (t->t_name != NULL) + (void) strlcpy(lwpname, t->t_name, sizeof (lwpname)); + + prunlock(pnp); + + return (pr_uioread(lwpname, sizeof (lwpname), uiop)); +} + /* ARGSUSED */ static int pr_read_xregs(prnode_t *pnp, uio_t *uiop) @@ -1853,6 +1885,7 @@ static int (*pr_read_function_32[PR_NFILES])() = { pr_read_inval, /* /proc/<pid>/lwp */ pr_read_inval, /* /proc/<pid>/lwp/<lwpid> */ pr_read_inval, /* /proc/<pid>/lwp/<lwpid>/lwpctl */ + pr_read_lwpname, /* /proc/<pid>/lwp/<lwpid>/lwpname */ pr_read_lwpstatus_32, /* /proc/<pid>/lwp/<lwpid>/lwpstatus */ pr_read_lwpsinfo_32, /* /proc/<pid>/lwp/<lwpid>/lwpsinfo */ pr_read_lwpusage_32, /* /proc/<pid>/lwp/<lwpid>/lwpusage */ @@ -2862,6 +2895,54 @@ pr_write_psinfo(prnode_t *pnp, uio_t *uiop) } +/* Note we intentionally don't handle partial writes/updates. */ +static int +pr_write_lwpname(prnode_t *pnp, uio_t *uiop) +{ + kthread_t *t = NULL; + char *lwpname; + int error; + + lwpname = kmem_zalloc(THREAD_NAME_MAX, KM_SLEEP); + + if ((error = uiomove(lwpname, THREAD_NAME_MAX, UIO_WRITE, uiop)) != 0) { + kmem_free(lwpname, THREAD_NAME_MAX); + return (error); + } + + /* Somebody tried to write too long a thread name... */ + if (lwpname[THREAD_NAME_MAX - 1] != '\0' || uiop->uio_resid > 0) { + kmem_free(lwpname, THREAD_NAME_MAX); + return (EIO); + } + + VERIFY3U(lwpname[THREAD_NAME_MAX - 1], ==, '\0'); + + for (size_t i = 0; lwpname[i] != '\0'; i++) { + if (!isprint(lwpname[i])) { + kmem_free(lwpname, THREAD_NAME_MAX); + return (EINVAL); + } + } + + /* Equivalent of thread_setname(), but with the ZNO magic. */ + if ((error = prlock(pnp, ZNO)) != 0) { + kmem_free(lwpname, THREAD_NAME_MAX); + return (error); + } + + t = pnp->pr_common->prc_thread; + if (t->t_name == NULL) { + t->t_name = lwpname; + } else { + (void) strlcpy(t->t_name, lwpname, THREAD_NAME_MAX); + kmem_free(lwpname, THREAD_NAME_MAX); + } + + prunlock(pnp); + return (0); +} + /* ARGSUSED */ static int prwrite(vnode_t *vp, uio_t *uiop, int ioflag, cred_t *cr, caller_context_t *ct) @@ -2943,6 +3024,9 @@ prwrite(vnode_t *vp, uio_t *uiop, int ioflag, cred_t *cr, caller_context_t *ct) case PR_PSINFO: return (pr_write_psinfo(pnp, uiop)); + case PR_LWPNAME: + return (pr_write_lwpname(pnp, uiop)); + default: return ((vp->v_type == VDIR)? EISDIR : EBADF); } @@ -3512,6 +3596,7 @@ static vnode_t *(*pr_lookup_function[PR_NFILES])() = { pr_lookup_lwpdir, /* /proc/<pid>/lwp */ pr_lookup_lwpiddir, /* /proc/<pid>/lwp/<lwpid> */ pr_lookup_notdir, /* /proc/<pid>/lwp/<lwpid>/lwpctl */ + pr_lookup_notdir, /* /proc/<pid>/lwp/<lwpid>/lwpname */ pr_lookup_notdir, /* /proc/<pid>/lwp/<lwpid>/lwpstatus */ pr_lookup_notdir, /* /proc/<pid>/lwp/<lwpid>/lwpsinfo */ pr_lookup_notdir, /* /proc/<pid>/lwp/<lwpid>/lwpusage */ @@ -4776,6 +4861,7 @@ prgetnode(vnode_t *dp, prnodetype_t type) break; case PR_PSINFO: + case PR_LWPNAME: pnp->pr_mode = 0644; /* readable by all + owner can write */ break; @@ -4904,6 +4990,7 @@ static int (*pr_readdir_function[PR_NFILES])() = { pr_readdir_lwpdir, /* /proc/<pid>/lwp */ pr_readdir_lwpiddir, /* /proc/<pid>/lwp/<lwpid> */ pr_readdir_notdir, /* /proc/<pid>/lwp/<lwpid>/lwpctl */ + pr_readdir_notdir, /* /proc/<pid>/lwp/<lwpid>/lwpname */ pr_readdir_notdir, /* /proc/<pid>/lwp/<lwpid>/lwpstatus */ pr_readdir_notdir, /* /proc/<pid>/lwp/<lwpid>/lwpsinfo */ pr_readdir_notdir, /* /proc/<pid>/lwp/<lwpid>/lwpusage */ diff --git a/usr/src/uts/common/sys/dtrace.h b/usr/src/uts/common/sys/dtrace.h index 44ca7d8ae7..ab6d4c4445 100644 --- a/usr/src/uts/common/sys/dtrace.h +++ b/usr/src/uts/common/sys/dtrace.h @@ -25,7 +25,7 @@ */ /* - * Copyright 2017 Joyent, Inc. + * Copyright 2018 Joyent, Inc. * Copyright (c) 2013 by Delphix. All rights reserved. */ @@ -242,6 +242,7 @@ typedef enum dtrace_probespec { #define DIF_VAR_UID 0x011e /* process user ID */ #define DIF_VAR_GID 0x011f /* process group ID */ #define DIF_VAR_ERRNO 0x0120 /* thread errno */ +#define DIF_VAR_THREADNAME 0x0121 /* thread name */ #define DIF_SUBR_RAND 0 #define DIF_SUBR_MUTEX_OWNED 1 @@ -2212,8 +2213,8 @@ extern void dtrace_probe(dtrace_id_t, uintptr_t arg0, uintptr_t arg1, */ typedef struct dtrace_helper_probedesc { char *dthpb_mod; /* probe module */ - char *dthpb_func; /* probe function */ - char *dthpb_name; /* probe name */ + char *dthpb_func; /* probe function */ + char *dthpb_name; /* probe name */ uint64_t dthpb_base; /* base address */ uint32_t *dthpb_offs; /* offsets array */ uint32_t *dthpb_enoffs; /* is-enabled offsets array */ diff --git a/usr/src/uts/common/sys/elf.h b/usr/src/uts/common/sys/elf.h index 0dd4f2d17e..1a2ca397ef 100644 --- a/usr/src/uts/common/sys/elf.h +++ b/usr/src/uts/common/sys/elf.h @@ -429,10 +429,10 @@ typedef struct { #define ELFOSABI_OPENVMS 13 /* Open VMS */ #define ELFOSABI_NSK 14 /* Hewlett-Packard Non-Stop Kernel */ #define ELFOSABI_AROS 15 /* Amiga Research OS */ -#define ELFOSABI_FENIXOS 16 /* The FenixOS highly scalable */ +#define ELFOSABI_FENIXOS 16 /* The FenixOS highly scalable */ /* multi-core OS */ -#define ELFOSABI_CLOUDABI 17 /* Nuxi CloudABI */ -#define ELFOSABI_OPENVOS 18 /* Stratus Technologies OpenVOS */ +#define ELFOSABI_CLOUDABI 17 /* Nuxi CloudABI */ +#define ELFOSABI_OPENVOS 18 /* Stratus Technologies OpenVOS */ #define ELFOSABI_ARM 97 /* ARM */ #define ELFOSABI_STANDALONE 255 /* standalone (embedded) application */ @@ -820,7 +820,7 @@ typedef struct { #define ELF32_R_INFO(sym, type) (((sym)<<8)+(unsigned char)(type)) #define ELF64_R_SYM(info) ((info)>>32) -#define ELF64_R_TYPE(info) ((Elf64_Word)(info)) +#define ELF64_R_TYPE(info) ((Elf64_Word)(info)) #define ELF64_R_INFO(sym, type) (((Elf64_Xword)(sym)<<32)+(Elf64_Xword)(type)) @@ -867,7 +867,7 @@ typedef struct { #if defined(_LP64) || defined(_LONGLONG_TYPE) typedef struct { Elf32_Lword m_value; /* symbol value */ - Elf32_Word m_info; /* size + index */ + Elf32_Word m_info; /* size + index */ Elf32_Word m_poffset; /* symbol offset */ Elf32_Half m_repeat; /* repeat count */ Elf32_Half m_stride; /* stride info */ @@ -886,7 +886,7 @@ typedef struct { typedef struct { Elf64_Lword m_value; /* symbol value */ - Elf64_Xword m_info; /* size + index */ + Elf64_Xword m_info; /* size + index */ Elf64_Xword m_poffset; /* symbol offset */ Elf64_Half m_repeat; /* repeat count */ Elf64_Half m_stride; /* stride info */ @@ -945,7 +945,7 @@ typedef Elf64_Word Elf64_Capchain; * info = ELF64_C_INFO(sym, grp) */ #define ELF64_C_SYM(info) ((info)>>32) -#define ELF64_C_GROUP(info) ((Elf64_Word)(info)) +#define ELF64_C_GROUP(info) ((Elf64_Word)(info)) #define ELF64_C_INFO(sym, grp) (((Elf64_Xword)(sym)<<32)+(Elf64_Xword)(grp)) #endif /* defined(_LP64) || defined(_LONGLONG_TYPE) */ @@ -1014,10 +1014,11 @@ typedef Elf64_Word Elf64_Capchain; #define NT_PRPRIVINFO 19 /* priv_impl_info_t <sys/priv.h> */ #define NT_CONTENT 20 /* core_content_t <sys/corectl.h> */ #define NT_ZONENAME 21 /* string from getzonenamebyid(3C) */ -#define NT_FDINFO 22 /* open fd info */ +#define NT_FDINFO 22 /* open fd info */ #define NT_SPYMASTER 23 /* psinfo_t for agent LWP spymaster */ #define NT_SECFLAGS 24 /* process security-flags */ -#define NT_NUM 24 +#define NT_LWPNAME 25 /* prlwpname_t */ +#define NT_NUM 25 #ifdef _KERNEL diff --git a/usr/src/uts/common/sys/procfs.h b/usr/src/uts/common/sys/procfs.h index 427d682d68..38c006f8f0 100644 --- a/usr/src/uts/common/sys/procfs.h +++ b/usr/src/uts/common/sys/procfs.h @@ -25,7 +25,7 @@ */ /* * Copyright 2012 DEY Storage Systems, Inc. All rights reserved. - * Copyright 2015, Joyent, Inc. + * Copyright 2018, Joyent, Inc. */ #ifndef _SYS_PROCFS_H @@ -66,6 +66,7 @@ extern "C" { #include <sys/stat.h> #include <sys/param.h> #include <sys/secflags.h> +#include <sys/thread.h> /* * System call interfaces for /proc. @@ -346,7 +347,7 @@ typedef struct prxmap { int pr_shmid; /* SysV shmid, -1 if not SysV shared memory */ dev_t pr_dev; /* st_dev from stat64() of mapped object, or PRNODEV */ uint64_t pr_ino; /* st_ino from stat64() of mapped object, if any */ - size_t pr_rss; /* pages of resident memory */ + size_t pr_rss; /* pages of resident memory */ size_t pr_anon; /* pages of resident anonymous memory */ size_t pr_locked; /* pages of locked memory */ size_t pr_pad; /* currently unused */ @@ -537,6 +538,16 @@ typedef struct prfdinfo { } prfdinfo_t; /* + * Representation of LWP name in core files. In /proc, we use a simple char + * array, but in core files we need to make it easy to correlate the note back + * to the right LWP. For simplicity, we'll use 32/64 consistent types. + */ +typedef struct prlwpname { + uint64_t pr_lwpid; + char pr_lwpname[THREAD_NAME_MAX]; +} prlwpname_t; + +/* * Header for /proc/<pid>/lstatus /proc/<pid>/lpsinfo /proc/<pid>/lusage */ typedef struct prheader { diff --git a/usr/src/uts/common/sys/thread.h b/usr/src/uts/common/sys/thread.h index 678d356564..6cc474f864 100644 --- a/usr/src/uts/common/sys/thread.h +++ b/usr/src/uts/common/sys/thread.h @@ -607,7 +607,8 @@ extern disp_lock_t stop_lock; /* lock protecting stopped threads */ caddr_t thread_stk_init(caddr_t); /* init thread stack */ -void thread_setname(kthread_t *, const char *); +int thread_setname(kthread_t *, const char *); +int thread_vsetname(kthread_t *, const char *, ...); extern int default_binding_mode; extern int default_stksize; |