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


  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  *
  26  * Portions Copyright 2007 Chad Mynhier
  27  * Copyright 2012 DEY Storage Systems, Inc.  All rights reserved.
  28  * Copyright 2019 Joyent, Inc.
  29  * Copyright (c) 2013 by Delphix. All rights reserved.
  30  * Copyright 2019, Carlos Neira <cneirabustos@gmail.com>
  31  * Copyright 2020 OmniOS Community Edition (OmniOSce) Association.

  32  */
  33 
  34 /*
  35  * Interfaces available from the process control library, libproc.
  36  */
  37 
  38 #ifndef _LIBPROC_H
  39 #define _LIBPROC_H
  40 
  41 #include <stdlib.h>
  42 #include <unistd.h>
  43 #include <fcntl.h>
  44 #include <nlist.h>
  45 #include <door.h>
  46 #include <gelf.h>
  47 #include <proc_service.h>
  48 #include <rtld_db.h>
  49 #include <procfs.h>
  50 #include <ucred.h>
  51 #include <rctl.h>


 316 extern  int     Lctlfd(struct ps_lwphandle *);
 317 extern  int     Lwait(struct ps_lwphandle *, uint_t);
 318 extern  int     Lstop(struct ps_lwphandle *, uint_t);
 319 extern  int     Ldstop(struct ps_lwphandle *);
 320 extern  int     Lstate(struct ps_lwphandle *);
 321 extern  const lwpsinfo_t *Lpsinfo(struct ps_lwphandle *);
 322 extern  const lwpstatus_t *Lstatus(struct ps_lwphandle *);
 323 extern  int     Lgetareg(struct ps_lwphandle *, int, prgreg_t *);
 324 extern  int     Lputareg(struct ps_lwphandle *, int, prgreg_t);
 325 extern  int     Lsetrun(struct ps_lwphandle *, int, int);
 326 extern  int     Lclearsig(struct ps_lwphandle *);
 327 extern  int     Lclearfault(struct ps_lwphandle *);
 328 extern  int     Lxecbkpt(struct ps_lwphandle *, ulong_t);
 329 extern  int     Lxecwapt(struct ps_lwphandle *, const prwatch_t *);
 330 extern  void    Lsync(struct ps_lwphandle *);
 331 
 332 extern  int     Lstack(struct ps_lwphandle *, stack_t *);
 333 extern  int     Lmain_stack(struct ps_lwphandle *, stack_t *);
 334 extern  int     Lalt_stack(struct ps_lwphandle *, stack_t *);
 335 







 336 /*
 337  * Function prototypes for system calls forced on the victim process.
 338  */
 339 extern  int     pr_open(struct ps_prochandle *, const char *, int, mode_t);
 340 extern  int     pr_creat(struct ps_prochandle *, const char *, mode_t);
 341 extern  int     pr_close(struct ps_prochandle *, int);
 342 extern  int     pr_access(struct ps_prochandle *, const char *, int);
 343 extern  int     pr_door_info(struct ps_prochandle *, int, struct door_info *);
 344 extern  void    *pr_mmap(struct ps_prochandle *,
 345                         void *, size_t, int, int, int, off_t);
 346 extern  void    *pr_zmap(struct ps_prochandle *,
 347                         void *, size_t, int, int);
 348 extern  int     pr_munmap(struct ps_prochandle *, void *, size_t);
 349 extern  int     pr_memcntl(struct ps_prochandle *,
 350                         caddr_t, size_t, int, caddr_t, int, int);
 351 extern  int     pr_meminfo(struct ps_prochandle *, const uint64_t *addrs,
 352                         int addr_count, const uint_t *info, int info_count,
 353                         uint64_t *outdata, uint_t *validity);
 354 extern  int     pr_sigaction(struct ps_prochandle *,
 355                         int, const struct sigaction *, struct sigaction *);


 402 extern  int     pr_getpeerucred(struct ps_prochandle *, int, ucred_t **);
 403 extern  int     pr_getpeername(struct ps_prochandle *,
 404                         int, struct sockaddr *, socklen_t *);
 405 extern  int     pr_getsockname(struct ps_prochandle *,
 406                         int, struct sockaddr *, socklen_t *);
 407 extern  int     pr_getsockopt(struct ps_prochandle *,
 408                         int, int, int, void *, int *);
 409 extern  int     pr_processor_bind(struct ps_prochandle *,
 410                         idtype_t, id_t, int, int *);
 411 
 412 /*
 413  * Function prototypes for accessing per-LWP register information.
 414  */
 415 extern int Plwp_getregs(struct ps_prochandle *, lwpid_t, prgregset_t);
 416 extern int Plwp_setregs(struct ps_prochandle *, lwpid_t, const prgregset_t);
 417 
 418 extern int Plwp_getfpregs(struct ps_prochandle *, lwpid_t, prfpregset_t *);
 419 extern int Plwp_setfpregs(struct ps_prochandle *, lwpid_t,
 420     const prfpregset_t *);
 421 
 422 #if defined(__sparc)




 423 
 424 extern int Plwp_getxregs(struct ps_prochandle *, lwpid_t, prxregset_t *);
 425 extern int Plwp_setxregs(struct ps_prochandle *, lwpid_t, const prxregset_t *);
 426 
 427 extern int Plwp_getgwindows(struct ps_prochandle *, lwpid_t, gwindows_t *);
 428 
 429 #if defined(__sparcv9)
 430 extern int Plwp_getasrs(struct ps_prochandle *, lwpid_t, asrset_t);
 431 extern int Plwp_setasrs(struct ps_prochandle *, lwpid_t, const asrset_t);
 432 #endif  /* __sparcv9 */
 433 
 434 #endif  /* __sparc */
 435 
 436 #if defined(__i386) || defined(__amd64)
 437 extern  int     Pldt(struct ps_prochandle *, struct ssd *, int);
 438 extern  int     proc_get_ldt(pid_t, struct ssd *, int);
 439 #endif  /* __i386 || __amd64 */
 440 
 441 extern int Plwp_getname(struct ps_prochandle *, lwpid_t, char *, size_t);
 442 extern int Plwp_getpsinfo(struct ps_prochandle *, lwpid_t, lwpsinfo_t *);
 443 extern int Plwp_getspymaster(struct ps_prochandle *, lwpid_t, psinfo_t *);
 444 
 445 extern int Plwp_stack(struct ps_prochandle *, lwpid_t, stack_t *);
 446 extern int Plwp_main_stack(struct ps_prochandle *, lwpid_t, stack_t *);




  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  *
  26  * Portions Copyright 2007 Chad Mynhier
  27  * Copyright 2012 DEY Storage Systems, Inc.  All rights reserved.
  28  * Copyright 2019 Joyent, Inc.
  29  * Copyright (c) 2013 by Delphix. All rights reserved.
  30  * Copyright 2019, Carlos Neira <cneirabustos@gmail.com>
  31  * Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
  32  * Copyright 2023 Oxide Computer Company
  33  */
  34 
  35 /*
  36  * Interfaces available from the process control library, libproc.
  37  */
  38 
  39 #ifndef _LIBPROC_H
  40 #define _LIBPROC_H
  41 
  42 #include <stdlib.h>
  43 #include <unistd.h>
  44 #include <fcntl.h>
  45 #include <nlist.h>
  46 #include <door.h>
  47 #include <gelf.h>
  48 #include <proc_service.h>
  49 #include <rtld_db.h>
  50 #include <procfs.h>
  51 #include <ucred.h>
  52 #include <rctl.h>


 317 extern  int     Lctlfd(struct ps_lwphandle *);
 318 extern  int     Lwait(struct ps_lwphandle *, uint_t);
 319 extern  int     Lstop(struct ps_lwphandle *, uint_t);
 320 extern  int     Ldstop(struct ps_lwphandle *);
 321 extern  int     Lstate(struct ps_lwphandle *);
 322 extern  const lwpsinfo_t *Lpsinfo(struct ps_lwphandle *);
 323 extern  const lwpstatus_t *Lstatus(struct ps_lwphandle *);
 324 extern  int     Lgetareg(struct ps_lwphandle *, int, prgreg_t *);
 325 extern  int     Lputareg(struct ps_lwphandle *, int, prgreg_t);
 326 extern  int     Lsetrun(struct ps_lwphandle *, int, int);
 327 extern  int     Lclearsig(struct ps_lwphandle *);
 328 extern  int     Lclearfault(struct ps_lwphandle *);
 329 extern  int     Lxecbkpt(struct ps_lwphandle *, ulong_t);
 330 extern  int     Lxecwapt(struct ps_lwphandle *, const prwatch_t *);
 331 extern  void    Lsync(struct ps_lwphandle *);
 332 
 333 extern  int     Lstack(struct ps_lwphandle *, stack_t *);
 334 extern  int     Lmain_stack(struct ps_lwphandle *, stack_t *);
 335 extern  int     Lalt_stack(struct ps_lwphandle *, stack_t *);
 336 
 337 extern int      Lgetregs(struct ps_lwphandle *, prgregset_t *);
 338 extern int      Lsetregs(struct ps_lwphandle *, const prgregset_t *);
 339 extern int      Lgetfpregs(struct ps_lwphandle *, prfpregset_t *);
 340 extern int      Lsetfpregs(struct ps_lwphandle *, const prfpregset_t *);
 341 extern int      Lgetxregs(struct ps_lwphandle *, prxregset_t **, size_t *);
 342 extern int      Lsetxregs(struct ps_lwphandle *, const prxregset_t *, size_t);
 343 
 344 /*
 345  * Function prototypes for system calls forced on the victim process.
 346  */
 347 extern  int     pr_open(struct ps_prochandle *, const char *, int, mode_t);
 348 extern  int     pr_creat(struct ps_prochandle *, const char *, mode_t);
 349 extern  int     pr_close(struct ps_prochandle *, int);
 350 extern  int     pr_access(struct ps_prochandle *, const char *, int);
 351 extern  int     pr_door_info(struct ps_prochandle *, int, struct door_info *);
 352 extern  void    *pr_mmap(struct ps_prochandle *,
 353                         void *, size_t, int, int, int, off_t);
 354 extern  void    *pr_zmap(struct ps_prochandle *,
 355                         void *, size_t, int, int);
 356 extern  int     pr_munmap(struct ps_prochandle *, void *, size_t);
 357 extern  int     pr_memcntl(struct ps_prochandle *,
 358                         caddr_t, size_t, int, caddr_t, int, int);
 359 extern  int     pr_meminfo(struct ps_prochandle *, const uint64_t *addrs,
 360                         int addr_count, const uint_t *info, int info_count,
 361                         uint64_t *outdata, uint_t *validity);
 362 extern  int     pr_sigaction(struct ps_prochandle *,
 363                         int, const struct sigaction *, struct sigaction *);


 410 extern  int     pr_getpeerucred(struct ps_prochandle *, int, ucred_t **);
 411 extern  int     pr_getpeername(struct ps_prochandle *,
 412                         int, struct sockaddr *, socklen_t *);
 413 extern  int     pr_getsockname(struct ps_prochandle *,
 414                         int, struct sockaddr *, socklen_t *);
 415 extern  int     pr_getsockopt(struct ps_prochandle *,
 416                         int, int, int, void *, int *);
 417 extern  int     pr_processor_bind(struct ps_prochandle *,
 418                         idtype_t, id_t, int, int *);
 419 
 420 /*
 421  * Function prototypes for accessing per-LWP register information.
 422  */
 423 extern int Plwp_getregs(struct ps_prochandle *, lwpid_t, prgregset_t);
 424 extern int Plwp_setregs(struct ps_prochandle *, lwpid_t, const prgregset_t);
 425 
 426 extern int Plwp_getfpregs(struct ps_prochandle *, lwpid_t, prfpregset_t *);
 427 extern int Plwp_setfpregs(struct ps_prochandle *, lwpid_t,
 428     const prfpregset_t *);
 429 
 430 extern int Plwp_getxregs(struct ps_prochandle *, lwpid_t, prxregset_t **,
 431     size_t *);
 432 extern void Plwp_freexregs(struct ps_prochandle *, prxregset_t *, size_t);
 433 extern int Plwp_setxregs(struct ps_prochandle *, lwpid_t, const prxregset_t *,
 434     size_t);
 435 
 436 #if defined(__sparc)


 437 extern int Plwp_getgwindows(struct ps_prochandle *, lwpid_t, gwindows_t *);
 438 
 439 #if defined(__sparcv9)
 440 extern int Plwp_getasrs(struct ps_prochandle *, lwpid_t, asrset_t);
 441 extern int Plwp_setasrs(struct ps_prochandle *, lwpid_t, const asrset_t);
 442 #endif  /* __sparcv9 */
 443 
 444 #endif  /* __sparc */
 445 
 446 #if defined(__i386) || defined(__amd64)
 447 extern  int     Pldt(struct ps_prochandle *, struct ssd *, int);
 448 extern  int     proc_get_ldt(pid_t, struct ssd *, int);
 449 #endif  /* __i386 || __amd64 */
 450 
 451 extern int Plwp_getname(struct ps_prochandle *, lwpid_t, char *, size_t);
 452 extern int Plwp_getpsinfo(struct ps_prochandle *, lwpid_t, lwpsinfo_t *);
 453 extern int Plwp_getspymaster(struct ps_prochandle *, lwpid_t, psinfo_t *);
 454 
 455 extern int Plwp_stack(struct ps_prochandle *, lwpid_t, stack_t *);
 456 extern int Plwp_main_stack(struct ps_prochandle *, lwpid_t, stack_t *);