usr/src/lib/libproc/common/Pcontrol.h
author stevel@tonic-gate
Tue, 14 Jun 2005 00:00:00 -0700
changeset 0 68f95e015346
child 789 b348f31ed315
permissions -rw-r--r--
OpenSolaris Launch
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#ifndef	_PCONTROL_H
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
#define	_PCONTROL_H
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
 * Implemention-specific include file for libproc process management.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
 * This is not to be seen by the clients of libproc.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <gelf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <synch.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <procfs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <rtld_db.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <libproc.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <libctf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#ifdef	__cplusplus
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
extern "C" {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include "Putil.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
 * Definitions of the process control structures, internal to libproc.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
 * These may change without affecting clients of libproc.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
typedef struct {		/* symbol table */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
	Elf_Data *sym_data;	/* start of table */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
	size_t	sym_symn;	/* number of entries */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
	char	*sym_strs;	/* ptr to strings */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
	size_t	sym_strsz;	/* size of string table */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
	GElf_Shdr sym_hdr;	/* symbol table section header */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
	GElf_Shdr sym_strhdr;	/* string table section header */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
	Elf	*sym_elf;	/* faked-up elf handle from core file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
	void	*sym_elfmem;	/* data for faked-up elf handle */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
	uint_t	*sym_byname;	/* symbols sorted by name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
	uint_t	*sym_byaddr;	/* symbols sorted by addr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
	size_t	sym_count;	/* number of symbols in each sorted list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
} sym_tbl_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
typedef struct file_info {	/* symbol information for a mapped file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	list_t	file_list;	/* linked list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
	char	file_pname[PRMAPSZ];	/* name from prmap_t */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
	struct map_info *file_map;	/* primary (text) mapping */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
	int	file_ref;	/* references from map_info_t structures */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
	int	file_fd;	/* file descriptor for the mapped file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
	int	file_init;	/* 0: initialization yet to be performed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
	GElf_Half file_etype;	/* ELF e_type from ehdr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	GElf_Half file_class;	/* ELF e_ident[EI_CLASS] from ehdr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
	rd_loadobj_t *file_lo;	/* load object structure from rtld_db */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
	char	*file_lname;	/* load object name from rtld_db */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
	char	*file_lbase;	/* pointer to basename of file_lname */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
	Elf	*file_elf;	/* elf handle so we can close */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
	void	*file_elfmem;	/* data for faked-up elf handle */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
	sym_tbl_t file_symtab;	/* symbol table */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
	sym_tbl_t file_dynsym;	/* dynamic symbol table */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	uintptr_t file_dyn_base;	/* load address for ET_DYN files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	uintptr_t file_plt_base;	/* base address for PLT */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	size_t	file_plt_size;	/* size of PLT region */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
	uintptr_t file_jmp_rel;	/* base address of PLT relocations */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
	uintptr_t file_ctf_off;	/* offset of CTF data in object file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
	size_t	file_ctf_size;	/* size of CTF data in object file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
	int	file_ctf_dyn;	/* does the CTF data reference the dynsym */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	void	*file_ctf_buf;	/* CTF data for this file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	ctf_file_t *file_ctfp;	/* CTF container for this file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
} file_info_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
typedef struct map_info {	/* description of an address space mapping */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	prmap_t	map_pmap;	/* /proc description of this mapping */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	file_info_t *map_file;	/* pointer into list of mapped files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	off64_t map_offset;	/* offset into core file (if core) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	int map_relocate;	/* associated file_map needs to be relocated */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
} map_info_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
typedef struct lwp_info {	/* per-lwp information from core file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	list_t	lwp_list;	/* linked list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	lwpid_t	lwp_id;		/* lwp identifier */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	lwpsinfo_t lwp_psinfo;	/* /proc/<pid>/lwp/<lwpid>/lwpsinfo data */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	lwpstatus_t lwp_status;	/* /proc/<pid>/lwp/<lwpid>/lwpstatus data */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
#if defined(sparc) || defined(__sparc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	gwindows_t *lwp_gwins;	/* /proc/<pid>/lwp/<lwpid>/gwindows data */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	prxregset_t *lwp_xregs;	/* /proc/<pid>/lwp/<lwpid>/xregs data */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	int64_t *lwp_asrs;	/* /proc/<pid>/lwp/<lwpid>/asrs data */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
} lwp_info_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
typedef struct core_info {	/* information specific to core files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	char core_dmodel;	/* data model for core file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	int core_errno;		/* error during initialization if != 0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
	list_t core_lwp_head;	/* head of list of lwp info */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	lwp_info_t *core_lwp;	/* current lwp information */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	uint_t core_nlwp;	/* number of lwp's in list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	off64_t core_size;	/* size of core file in bytes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	char *core_platform;	/* platform string from core file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	struct utsname *core_uts;	/* uname(2) data from core file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	prcred_t *core_cred;	/* process credential from core file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	core_content_t core_content;	/* content dumped to core file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	prpriv_t *core_priv;	/* process privileges from core file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	size_t core_priv_size;	/* size of the privileges */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
	void *core_privinfo;	/* system privileges info from core file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	priv_impl_info_t *core_ppii;	/* NOTE entry for core_privinfo */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	char *core_zonename;	/* zone name from core file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
#if defined(__i386) || defined(__amd64)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	struct ssd *core_ldt;	/* LDT entries from core file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
	uint_t core_nldt;	/* number of LDT entries in core file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
} core_info_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
typedef struct elf_file {	/* convenience for managing ELF files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	GElf_Ehdr e_hdr;	/* ELF file header information */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	Elf *e_elf;		/* ELF library handle */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	int e_fd;		/* file descriptor */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
} elf_file_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
typedef struct ps_rwops {	/* ops vector for Pread() and Pwrite() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	ssize_t (*p_pread)(struct ps_prochandle *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
	    void *, size_t, uintptr_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	ssize_t (*p_pwrite)(struct ps_prochandle *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	    const void *, size_t, uintptr_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
} ps_rwops_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
#define	HASHSIZE		1024	/* hash table size, power of 2 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
struct ps_prochandle {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
	struct ps_lwphandle **hashtab;	/* hash table for LWPs (Lgrab()) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	mutex_t	proc_lock;	/* protects hash table; serializes Lgrab() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
	pstatus_t orig_status;	/* remembered status on Pgrab() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	pstatus_t status;	/* status when stopped */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	psinfo_t psinfo;	/* psinfo_t from last Ppsinfo() request */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	uintptr_t sysaddr;	/* address of most recent syscall instruction */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	pid_t	pid;		/* process-ID */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	int	state;		/* state of the process, see "libproc.h" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
	uint_t	flags;		/* see defines below */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	uint_t	agentcnt;	/* Pcreate_agent()/Pdestroy_agent() ref count */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	int	asfd;		/* /proc/<pid>/as filedescriptor */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	int	ctlfd;		/* /proc/<pid>/ctl filedescriptor */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	int	statfd;		/* /proc/<pid>/status filedescriptor */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	int	agentctlfd;	/* /proc/<pid>/lwp/agent/ctl */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	int	agentstatfd;	/* /proc/<pid>/lwp/agent/status */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	int	info_valid;	/* if zero, map and file info need updating */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	map_info_t *mappings;	/* cached process mappings */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	size_t	map_count;	/* number of mappings */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
	size_t	map_alloc;	/* number of mappings allocated */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	uint_t	num_files;	/* number of file elements in file_info */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	list_t	file_head;	/* head of mapped files w/ symbol table info */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	char	*execname;	/* name of the executable file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	auxv_t	*auxv;		/* the process's aux vector */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	int	nauxv;		/* number of aux vector entries */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	rd_agent_t *rap;	/* cookie for rtld_db */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	map_info_t *map_exec;	/* the mapping for the executable file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	map_info_t *map_ldso;	/* the mapping for ld.so.1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	const ps_rwops_t *ops;	/* pointer to ops-vector for read and write */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	core_info_t *core;	/* information specific to core (if PS_DEAD) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	uintptr_t *ucaddrs;	/* ucontext-list addresses */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
	uint_t	ucnelems;	/* number of elements in the ucaddrs list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
/* flags */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
#define	CREATED		0x01	/* process was created by Pcreate() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
#define	SETSIG		0x02	/* set signal trace mask before continuing */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
#define	SETFAULT	0x04	/* set fault trace mask before continuing */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
#define	SETENTRY	0x08	/* set sysentry trace mask before continuing */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
#define	SETEXIT		0x10	/* set sysexit trace mask before continuing */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
#define	SETHOLD		0x20	/* set signal hold mask before continuing */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
#define	SETREGS		0x40	/* set registers before continuing */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
struct ps_lwphandle {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	struct ps_prochandle *lwp_proc;	/* process to which this lwp belongs */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	struct ps_lwphandle *lwp_hash;	/* hash table linked list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	lwpstatus_t	lwp_status;	/* status when stopped */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	lwpsinfo_t	lwp_psinfo;	/* lwpsinfo_t from last Lpsinfo() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	lwpid_t		lwp_id;		/* lwp identifier */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	int		lwp_state;	/* state of the lwp, see "libproc.h" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	uint_t		lwp_flags;	/* SETHOLD and/or SETREGS */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	int		lwp_ctlfd;	/* /proc/<pid>/lwp/<lwpid>/lwpctl */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	int		lwp_statfd;	/* /proc/<pid>/lwp/<lwpid>/lwpstatus */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
 * Implementation functions in the process control library.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
 * These are not exported to clients of the library.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
extern	void	prldump(const char *, lwpstatus_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
extern	int	dupfd(int, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
extern	int	set_minfd(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
extern	int	Pscantext(struct ps_prochandle *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
extern	void	Pinitsym(struct ps_prochandle *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
extern	void	Preadauxvec(struct ps_prochandle *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
extern	void	optimize_symtab(sym_tbl_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
extern	void	Pbuild_file_symtab(struct ps_prochandle *, file_info_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
extern	ctf_file_t *Pbuild_file_ctf(struct ps_prochandle *, file_info_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
extern	map_info_t *Paddr2mptr(struct ps_prochandle *, uintptr_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
extern	char 	*Pfindexec(struct ps_prochandle *, const char *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
	int (*)(const char *, void *), void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
extern	int	getlwpstatus(struct ps_prochandle *, lwpid_t, lwpstatus_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
int	Pstopstatus(struct ps_prochandle *, long, uint32_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
extern	int	Padd_mapping(struct ps_prochandle *, off64_t, file_info_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
    prmap_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
extern	void	Psort_mappings(struct ps_prochandle *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
 * Architecture-dependent definition of the breakpoint instruction.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
#if defined(sparc) || defined(__sparc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
#define	BPT	((instr_t)0x91d02001)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
#elif defined(__i386) || defined(__amd64)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
#define	BPT	((instr_t)0xcc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
 * Simple convenience.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
#define	TRUE	1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
#define	FALSE	0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
#ifdef	__cplusplus
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
#endif	/* _PCONTROL_H */