1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
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 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
27/*	  All Rights Reserved	*/
28/*
29 * Copyright (c) 2018, Joyent, Inc.
30 */
31
32
33#ifndef _SYS_USER_H
34#define	_SYS_USER_H
35
36#include <sys/types.h>
37#include <sys/signal.h>
38
39#ifdef	__cplusplus
40extern "C" {
41#endif
42
43/*
44 * struct exdata is visible in and out of the kernel. This is because it
45 * is referenced in <sys/core.h> which doesn't have this kind of magic.
46 */
47struct exdata {
48	struct vnode	*vp;
49	size_t	ux_tsize;	/* text size */
50	size_t	ux_dsize;	/* data size */
51	size_t	ux_bsize;	/* bss size */
52	size_t	ux_lsize;	/* lib size */
53	long	ux_nshlibs;	/* number of shared libs needed */
54	short	ux_mach;	/* machine type */
55	short	ux_mag;		/* magic number MUST be here */
56	off_t	ux_toffset;	/* file offset to raw text */
57	off_t	ux_doffset;	/* file offset to raw data */
58	off_t	ux_loffset;	/* file offset to lib sctn */
59	caddr_t	ux_txtorg;	/* start addr of text in mem */
60	caddr_t	ux_datorg;	/* start addr of data in mem */
61	caddr_t	ux_entloc;	/* entry location */
62};
63
64#ifdef	__cplusplus
65}
66#endif
67
68#if defined(_KERNEL) || defined(_KMEMUSER)
69
70#include <sys/param.h>
71#include <sys/pcb.h>
72#include <sys/siginfo.h>
73#include <sys/resource.h>
74#include <sys/time.h>
75#include <sys/auxv.h>
76#include <sys/errno.h>
77#include <sys/t_lock.h>
78#include <sys/refstr.h>
79
80#ifdef	__cplusplus
81extern "C" {
82#endif
83
84/*
85 * Entry in the per-process list of open files.
86 * Note: only certain fields are copied in flist_grow() and flist_fork().
87 * This is indicated in brackets in the structure member comments.
88 */
89typedef struct uf_entry {
90	kmutex_t	uf_lock;	/* per-fd lock [never copied] */
91	struct file	*uf_file;	/* file pointer [grow, fork] */
92	struct fpollinfo *uf_fpollinfo;	/* poll state [grow] */
93	int		uf_refcnt;	/* LWPs accessing this file [grow] */
94	int		uf_alloc;	/* right subtree allocs [grow, fork] */
95	short		uf_flag;	/* fcntl F_GETFD flags [grow, fork] */
96	short		uf_busy;	/* file is allocated [grow, fork] */
97	kcondvar_t	uf_wanted_cv;	/* waiting for setf() [never copied] */
98	kcondvar_t	uf_closing_cv;	/* waiting for close() [never copied] */
99	struct portfd 	*uf_portfd;	/* associated with port [grow] */
100	/* Avoid false sharing - pad to coherency granularity (64 bytes) */
101	char		uf_pad[64 - sizeof (kmutex_t) - 2 * sizeof (void*) -
102		2 * sizeof (int) - 2 * sizeof (short) -
103		2 * sizeof (kcondvar_t) - sizeof (struct portfd *)];
104} uf_entry_t;
105
106/*
107 * Retired file lists -- see flist_grow() for details.
108 */
109typedef struct uf_rlist {
110	struct uf_rlist	*ur_next;
111	uf_entry_t	*ur_list;
112	int		ur_nfiles;
113} uf_rlist_t;
114
115/*
116 * Per-process file information.
117 */
118typedef struct uf_info {
119	kmutex_t	fi_lock;	/* see below */
120	int		fi_badfd;	/* bad file descriptor # */
121	int		fi_action;	/* action to take on bad fd use */
122	int		fi_nfiles;	/* number of entries in fi_list[] */
123	uf_entry_t *volatile fi_list;	/* current file list */
124	uf_rlist_t	*fi_rlist;	/* retired file lists */
125} uf_info_t;
126
127/*
128 * File list locking.
129 *
130 * Each process has a list of open files, fi_list, indexed by fd.
131 * fi_list is an array of uf_entry_t structures, each with its own lock.
132 * One might think that the correct way to lock a file descriptor would be:
133 *
134 *	ufp = fip->fi_list[fd];
135 *	mutex_enter(&ufp->uf_lock);
136 *
137 * However, that construct is only safe if fi_lock is already held.  If not,
138 * fi_list can change in the window between loading ufp and entering uf_lock.
139 * The UF_ENTER() macro deals with this possibility.  UF_ENTER(ufp, fip, fd)
140 * locks fd and sets ufp to fd's uf_entry.  The locking rules are as follows:
141 *
142 * (1) fi_lock protects fi_list and fi_nfiles.  It also protects the
143 *     uf_alloc and uf_busy fields of every fd's ufp; see fd_find() for
144 *     details on file descriptor allocation.
145 *
146 * (2) UF_ENTER(ufp, fip, fd) locks descriptor fd and sets ufp to point
147 *     to the uf_entry_t for fd.  UF_ENTER() protects all fields in ufp
148 *     except uf_alloc and uf_busy.  UF_ENTER(ufp, fip, fd) also prevents
149 *     ufp->uf_alloc, ufp->uf_busy, fip->fi_list and fip->fi_nfiles from
150 *     changing.
151 *
152 * (3) The lock ordering is (1), (2).
153 *
154 * (4) Note that fip->fi_list and fip->fi_nfiles cannot change while *any*
155 *     file list lock is held.  Thus flist_grow() must acquire all such
156 *     locks -- fi_lock and every fd's uf_lock -- to install a new file list.
157 */
158#define	UF_ENTER(ufp, fip, fd)					\
159	for (;;) {						\
160		uf_entry_t *_flist = (fip)->fi_list;		\
161		ufp = &_flist[fd];				\
162		ASSERT((fd) < (fip)->fi_nfiles);		\
163		mutex_enter(&ufp->uf_lock);			\
164		if (_flist == (fip)->fi_list)			\
165			break;					\
166		mutex_exit(&ufp->uf_lock);			\
167	}
168
169#define	UF_EXIT(ufp)	mutex_exit(&ufp->uf_lock)
170
171#define	PSARGSZ		80	/* Space for exec arguments (used by ps(1)) */
172#define	MAXCOMLEN	16	/* <= MAXNAMLEN, >= sizeof (ac_comm) */
173
174typedef struct {		/* kernel syscall set type */
175	uint_t	word[9];	/* space for syscall numbers [1..288] */
176} k_sysset_t;
177
178/*
179 * __KERN_NAUXV_IMPL is defined as a convenience sizing mechanism
180 * for the portions of the kernel that care about aux vectors.
181 *
182 * Applications that need to know how many aux vectors the kernel
183 * supplies should use the proc(4) interface to read /proc/PID/auxv.
184 *
185 * This value should not be changed in a patch.
186 */
187#if defined(__sparc)
188#define	__KERN_NAUXV_IMPL 20
189#elif defined(__i386) || defined(__amd64)
190#define	__KERN_NAUXV_IMPL 25
191#endif
192
193struct execsw;
194
195/*
196 * The user structure; one allocated per process.  Contains all the
197 * per-process data that doesn't need to be referenced while the
198 * process is swapped.
199 */
200typedef	struct	user {
201	/*
202	 * These fields are initialized at process creation time and never
203	 * modified.  They can be accessed without acquiring locks.
204	 */
205	struct execsw *u_execsw;	/* pointer to exec switch entry */
206	auxv_t  u_auxv[__KERN_NAUXV_IMPL]; /* aux vector from exec */
207	timestruc_t u_start;		/* hrestime at process start */
208	clock_t	u_ticks;		/* lbolt at process start */
209	char	u_comm[MAXCOMLEN + 1];	/* executable file name from exec */
210	char	u_psargs[PSARGSZ];	/* arguments from exec */
211	int	u_argc;			/* value of argc passed to main() */
212	uintptr_t u_argv;		/* value of argv passed to main() */
213	uintptr_t u_envp;		/* value of envp passed to main() */
214	uintptr_t u_commpagep;		/* address of mapped comm page */
215
216	/*
217	 * These fields are protected by p_lock:
218	 */
219	struct vnode *u_cdir;		/* current directory */
220	struct vnode *u_rdir;		/* root directory */
221	uint64_t u_mem;			/* accumulated memory usage */
222	size_t	u_mem_max;		/* peak RSS (K) */
223	mode_t	u_cmask;		/* mask for file creation */
224	char	u_acflag;		/* accounting flag */
225	char	u_systrap;		/* /proc: any syscall mask bits set? */
226	refstr_t *u_cwd;		/* cached string for cwd */
227
228	k_sysset_t u_entrymask;		/* /proc syscall stop-on-entry mask */
229	k_sysset_t u_exitmask;		/* /proc syscall stop-on-exit mask */
230	k_sigset_t u_signodefer;	/* signals defered when caught */
231	k_sigset_t u_sigonstack;	/* signals taken on alternate stack */
232	k_sigset_t u_sigresethand;	/* signals reset when caught */
233	k_sigset_t u_sigrestart;	/* signals that restart system calls */
234	k_sigset_t u_sigmask[MAXSIG];	/* signals held while in catcher */
235	void	(*u_signal[MAXSIG])();	/* Disposition of signals */
236
237	/*
238	 * Resource controls provide the backend for process resource limits,
239	 * the interfaces for which are maintained for compatibility.  To
240	 * preserve the behaviour associated with the RLIM_SAVED_CUR and
241	 * RLIM_SAVED_MAX tokens, we retain the "saved" rlimits.
242	 */
243	struct rlimit64	u_saved_rlimit[RLIM_NSAVED];
244
245	uf_info_t	u_finfo;	/* open file information */
246} user_t;
247
248#include <sys/proc.h>			/* cannot include before user defined */
249
250#ifdef	_KERNEL
251#define	P_FINFO(p)	(&(p)->p_user.u_finfo)
252#endif	/* _KERNEL */
253
254#ifdef	__cplusplus
255}
256#endif
257
258#else	/* defined(_KERNEL) || defined(_KMEMUSER) */
259
260/*
261 * Here, we define a fake version of struct user for programs
262 * (debuggers) that use ptrace() to read and modify the saved
263 * registers directly in the u-area.  ptrace() has been removed
264 * from the operating system and now exists as a library function
265 * in libc, built on the /proc process filesystem.  The ptrace()
266 * library function provides access only to the members of the
267 * fake struct user defined here.
268 *
269 * User-level programs that must know the real contents of struct
270 * user will have to define _KMEMUSER before including <sys/user.h>.
271 * Such programs also become machine specific. Carefully consider
272 * the consequences of your actions.
273 */
274
275#include <sys/regset.h>
276
277#ifdef	__cplusplus
278extern "C" {
279#endif
280
281#define	PSARGSZ		80	/* Space for exec arguments (used by ps(1)) */
282
283typedef	struct	user {
284	gregset_t	u_reg;		/* user's saved registers */
285	greg_t		*u_ar0;		/* address of user's saved R0 */
286	char	u_psargs[PSARGSZ];	/* arguments from exec */
287	void	(*u_signal[MAXSIG])();	/* Disposition of signals */
288	int		u_code;		/* fault code on trap */
289	caddr_t		u_addr;		/* fault PC on trap */
290} user_t;
291
292#ifdef	__cplusplus
293}
294#endif
295
296#endif	/* defined(_KERNEL) || defined(_KMEMUSER) */
297
298#endif	/* _SYS_USER_H */
299