/ duct-tape / xnu / bsd / sys / user.h
user.h
  1  /*
  2   * Copyright (c) 2000-2018 Apple Inc. All rights reserved.
  3   *
  4   * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  5   *
  6   * This file contains Original Code and/or Modifications of Original Code
  7   * as defined in and that are subject to the Apple Public Source License
  8   * Version 2.0 (the 'License'). You may not use this file except in
  9   * compliance with the License. The rights granted to you under the License
 10   * may not be used to create, or enable the creation or redistribution of,
 11   * unlawful or unlicensed copies of an Apple operating system, or to
 12   * circumvent, violate, or enable the circumvention or violation of, any
 13   * terms of an Apple operating system software license agreement.
 14   *
 15   * Please obtain a copy of the License at
 16   * http://www.opensource.apple.com/apsl/ and read it before using this file.
 17   *
 18   * The Original Code and all software distributed under the License are
 19   * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 20   * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 21   * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 22   * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 23   * Please see the License for the specific language governing rights and
 24   * limitations under the License.
 25   *
 26   * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
 27   */
 28  /* Copyright (c) 1995, 1997 Apple Computer, Inc. All Rights Reserved */
 29  /*
 30   * Copyright (c) 1982, 1986, 1989, 1991, 1993
 31   *	The Regents of the University of California.  All rights reserved.
 32   *
 33   * Redistribution and use in source and binary forms, with or without
 34   * modification, are permitted provided that the following conditions
 35   * are met:
 36   * 1. Redistributions of source code must retain the above copyright
 37   *    notice, this list of conditions and the following disclaimer.
 38   * 2. Redistributions in binary form must reproduce the above copyright
 39   *    notice, this list of conditions and the following disclaimer in the
 40   *    documentation and/or other materials provided with the distribution.
 41   * 3. All advertising materials mentioning features or use of this software
 42   *    must display the following acknowledgement:
 43   *	This product includes software developed by the University of
 44   *	California, Berkeley and its contributors.
 45   * 4. Neither the name of the University nor the names of its contributors
 46   *    may be used to endorse or promote products derived from this software
 47   *    without specific prior written permission.
 48   *
 49   * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 50   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 51   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 52   * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 53   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 54   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 55   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 56   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 57   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 58   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 59   * SUCH DAMAGE.
 60   *
 61   *	@(#)user.h	8.2 (Berkeley) 9/23/93
 62   */
 63  
 64  #ifndef _SYS_USER_H_
 65  #define _SYS_USER_H_
 66  
 67  #include <sys/appleapiopts.h>
 68  struct waitq_set;
 69  #ifndef KERNEL
 70  /* stuff that *used* to be included by user.h, or is now needed */
 71  #include <errno.h>
 72  #include <sys/time.h>
 73  #include <sys/resource.h>
 74  #include <sys/ucred.h>
 75  #include <sys/uio.h>
 76  #endif
 77  #ifdef XNU_KERNEL_PRIVATE
 78  #include <sys/resource.h>
 79  #include <sys/resourcevar.h>
 80  #include <sys/signal.h>
 81  #include <sys/signalvar.h>
 82  #endif
 83  #include <sys/vm.h>             /* XXX */
 84  #include <sys/sysctl.h>
 85  
 86  #ifdef KERNEL
 87  #ifdef BSD_KERNEL_PRIVATE
 88  #include <sys/pthread_internal.h> /* for uu_kwe entry */
 89  #include <sys/eventvar.h>
 90  #endif  /* BSD_KERNEL_PRIVATE */
 91  #ifdef __APPLE_API_PRIVATE
 92  #include <sys/eventvar.h>
 93  
 94  #if !defined(__LP64__) || defined(XNU_KERNEL_PRIVATE)
 95  /*
 96   * VFS context structure (part of uthread)
 97   */
 98  struct vfs_context {
 99  	thread_t        vc_thread;              /* pointer to Mach thread */
100  	kauth_cred_t    vc_ucred;               /* per thread credential */
101  };
102  
103  #endif /* !__LP64 || XNU_KERNEL_PRIVATE */
104  
105  #ifdef BSD_KERNEL_PRIVATE
106  /* XXX Deprecated: xnu source compatability */
107  #define uu_ucred        uu_context.vc_ucred
108  
109  struct label;           /* MAC label dummy struct */
110  
111  #define MAXTHREADNAMESIZE 64
112  /*
113   *	Per-thread U area.
114   */
115  
116  struct uthread {
117  	/* syscall parameters, results and catches */
118  	u_int64_t uu_arg[8]; /* arguments to current system call */
119  	int uu_rval[2];
120  	char uu_cursig; /* p_cursig for exc. */
121  	/*
122  	 * uu_workq_pthread_kill_allowed is not modified under a lock and thus
123  	 * relies on single copy atomicity and cannot be changed to a bitfield.
124  	 */
125  	bool uu_workq_pthread_kill_allowed;
126  	uint16_t syscall_code; /* current syscall code */
127  
128  	/* thread exception handling */
129  	int     uu_exception;
130  	mach_exception_code_t uu_code;  /* ``code'' to trap */
131  	mach_exception_subcode_t uu_subcode;
132  
133  	/* support for syscalls which use continuations */
134  	union {
135  		struct _select_data {
136  			u_int64_t abstime;
137  			uint64_t *wqp;
138  			int count;
139  			struct select_nocancel_args *args;  /* original syscall arguments */
140  			int32_t *retval;                    /* place to store return val */
141  		} uus_select_data;
142  
143  		struct kevent_ctx_s uus_kevent;
144  
145  		struct _kevent_register {
146  			struct kevent_qos_s kev;            /* the kevent to maybe copy out */
147  			thread_t handoff_thread;            /* thread we handed off to, has +1 */
148  			struct kqworkloop *kqwl;
149  			int eventout;                       /* number of events output */
150  			user_addr_t ueventlist;             /* the user-address to copyout to */
151  		} uus_kevent_register;                   /* saved for EVFILT_WORKLOOP wait */
152  
153  		struct _kauth {
154  			user_addr_t message;                /* message in progress */
155  		} uus_kauth;
156  
157  		struct ksyn_waitq_element uus_kwe;       /* user for pthread synch */
158  
159  		struct _waitid_data {
160  			struct waitid_nocancel_args *args;  /* original syscall arguments */
161  			int32_t *retval;                    /* place to store return val */
162  		} uus_waitid_data;
163  
164  		struct _wait4_data {
165  			struct wait4_nocancel_args *args;   /* original syscall arguments */
166  			int32_t *retval;                    /* place to store return val */
167  		} uus_wait4_data;
168  
169  		struct _workq_park_data {
170  			uint64_t idle_stamp;
171  			uint64_t workloop_params;
172  			uint32_t fulfilled_snapshot;
173  			uint32_t yields;
174  			void *thread_request;                /* request being fulfilled, for tracing only */
175  			uint32_t upcall_flags;
176  			bool has_stack;
177  			thread_qos_t qos;
178  		} uus_workq_park_data;                   /* saved for parked workq threads */
179  
180  		struct _ulock_wait_data {
181  			struct ull *ull;
182  			thread_t owner_thread;
183  			thread_t old_owner;
184  			int32_t *retval;
185  			uint flags;
186  		} uus_ulock_wait_data;
187  	} uu_save;
188  
189  	/* Persistent memory allocations across system calls */
190  	struct _select {
191  		u_int32_t       *ibits, *obits; /* bits to select on */
192  		uint    nbytes; /* number of bytes in ibits and obits */
193  	} uu_select;                    /* saved state for select() */
194  
195  	struct proc *uu_proc;
196  	thread_t uu_thread;
197  	void * uu_userstate;
198  	struct waitq_set *uu_wqset;             /* waitq state cached across select calls */
199  	size_t uu_wqstate_sz;                   /* ...size of uu_wqset buffer */
200  	int uu_flag;
201  	sigset_t uu_siglist;                            /* signals pending for the thread */
202  	sigset_t uu_sigwait;                            /*  sigwait on this thread*/
203  	sigset_t uu_sigmask;                            /* signal mask for the thread */
204  	sigset_t uu_oldmask;                            /* signal mask saved before sigpause */
205  	sigset_t uu_vforkmask;                          /* saved signal mask during vfork */
206  	struct vfs_context uu_context;                  /* thread + cred */
207  
208  	TAILQ_ENTRY(uthread) uu_list;           /* List of uthreads in proc */
209  
210  	struct kaudit_record    *uu_ar;                 /* audit record */
211  	struct task*    uu_aio_task;                    /* target task for async io */
212  
213  	union {
214  		lck_mtx_t  *uu_mtx;
215  		struct knote_lock_ctx *uu_knlock;
216  	};
217  
218  	lck_spin_t      uu_rethrottle_lock;     /* locks was_rethrottled and is_throttled */
219  	TAILQ_ENTRY(uthread) uu_throttlelist;   /* List of uthreads currently throttled */
220  	void    *       uu_throttle_info;       /* pointer to throttled I/Os info */
221  	int8_t          uu_on_throttlelist;
222  	bool            uu_lowpri_window;
223  	/* These boolean fields are protected by different locks */
224  	bool            uu_was_rethrottled;
225  	bool            uu_is_throttled;
226  	bool            uu_throttle_bc;
227  	bool            uu_defer_reclaims;
228  
229  	/* internal support for continuation framework */
230  	uint16_t uu_pri;                        /* pri | PCATCH | PVFS, ... */
231  	caddr_t uu_wchan;                       /* sleeping thread wait channel */
232  	int (*uu_continuation)(int);
233  	const char *uu_wmesg;                   /* ... wait message */
234  
235  	u_int32_t       uu_network_marks;       /* network control flow marks */
236  
237  	struct kern_sigaltstack uu_sigstk;
238  	vnode_t         uu_vreclaims;
239  	vnode_t         uu_cdir;                /* per thread CWD */
240  	int             uu_dupfd;               /* fd in fdesc_open/dupfdopen */
241  
242  	/*
243  	 * Bound kqueue request. This field is only cleared by the current thread,
244  	 * hence can be dereferenced safely by the current thread without locks.
245  	 */
246  	struct workq_threadreq_s *uu_kqr_bound;
247  	TAILQ_ENTRY(uthread) uu_workq_entry;
248  	vm_offset_t uu_workq_stackaddr;
249  	mach_port_name_t uu_workq_thport;
250  	struct uu_workq_policy {
251  		uint16_t qos_req : 4;         /* requested QoS */
252  		uint16_t qos_max : 4;         /* current acked max qos */
253  		uint16_t qos_override : 4;    /* received async override */
254  		uint16_t qos_bucket : 4;      /* current acked bucket */
255  	} uu_workq_pri;
256  	uint8_t uu_workq_flags;
257  	kq_index_t uu_kqueue_override;
258  
259  #ifdef JOE_DEBUG
260  	int             uu_iocount;
261  	int             uu_vpindex;
262  	void    *uu_vps[32];
263  	void    *uu_pcs[32][10];
264  #endif
265  #if CONFIG_WORKLOOP_DEBUG
266  #define UU_KEVENT_HISTORY_COUNT 32
267  #define UU_KEVENT_HISTORY_WRITE_ENTRY(uth, ...)  ({ \
268  	        struct uthread *__uth = (uth); \
269  	        unsigned int __index = __uth->uu_kevent_index++; \
270  	        __uth->uu_kevent_history[__index % UU_KEVENT_HISTORY_COUNT] = \
271  	                        (struct uu_kevent_history)__VA_ARGS__; \
272  	})
273  	struct uu_kevent_history {
274  		uint64_t uu_kqid;
275  		struct kqueue *uu_kq;
276  		int uu_error, uu_nchanges, uu_nevents;
277  		unsigned int uu_flags;
278  	} uu_kevent_history[UU_KEVENT_HISTORY_COUNT];
279  	unsigned int uu_kevent_index;
280  #endif
281  	int             uu_proc_refcount;
282  #if PROC_REF_DEBUG
283  #define NUM_PROC_REFS_TO_TRACK 32
284  #define PROC_REF_STACK_DEPTH 10
285  	int             uu_pindex;
286  	void    *       uu_proc_ps[NUM_PROC_REFS_TO_TRACK];
287  	uintptr_t       uu_proc_pcs[NUM_PROC_REFS_TO_TRACK][PROC_REF_STACK_DEPTH];
288  #endif
289  
290  #if CONFIG_DTRACE
291  	uint32_t        t_dtrace_errno; /* Most recent errno */
292  	siginfo_t       t_dtrace_siginfo;
293  	uint64_t        t_dtrace_resumepid; /* DTrace's pidresume() pid */
294  	uint8_t         t_dtrace_stop;  /* indicates a DTrace desired stop */
295  	uint8_t         t_dtrace_sig;   /* signal sent via DTrace's raise() */
296  
297  	union __tdu {
298  		struct __tds {
299  			uint8_t _t_dtrace_on;   /* hit a fasttrap tracepoint */
300  			uint8_t _t_dtrace_step; /* about to return to kernel */
301  			uint8_t _t_dtrace_ret;  /* handling a return probe */
302  			uint8_t _t_dtrace_ast;  /* saved ast flag */
303  #if __sol64 || defined(__APPLE__)
304  			uint8_t _t_dtrace_reg;  /* modified register */
305  #endif
306  		} _tds;
307  		u_int32_t _t_dtrace_ft;           /* bitwise or of these flags */
308  	} _tdu;
309  #define t_dtrace_ft     _tdu._t_dtrace_ft
310  #define t_dtrace_on     _tdu._tds._t_dtrace_on
311  #define t_dtrace_step   _tdu._tds._t_dtrace_step
312  #define t_dtrace_ret    _tdu._tds._t_dtrace_ret
313  #define t_dtrace_ast    _tdu._tds._t_dtrace_ast
314  #if __sol64 || defined(__APPLE__)
315  #define t_dtrace_reg    _tdu._tds._t_dtrace_reg
316  #endif
317  
318  	user_addr_t     t_dtrace_pc;    /* DTrace saved pc from fasttrap */
319  	user_addr_t     t_dtrace_npc;   /* DTrace next pc from fasttrap */
320  	user_addr_t     t_dtrace_scrpc; /* DTrace per-thread scratch location */
321  	user_addr_t     t_dtrace_astpc; /* DTrace return sequence location */
322  
323  	struct dtrace_ptss_page_entry*  t_dtrace_scratch; /* scratch space entry */
324  
325  #if __sol64 || defined(__APPLE__)
326  	uint64_t        t_dtrace_regv;  /* DTrace saved reg from fasttrap */
327  #endif
328  	void *t_dtrace_syscall_args;
329  #endif /* CONFIG_DTRACE */
330  	char *pth_name;
331  
332  	/* Document Tracking struct used to track a "tombstone" for a document */
333  	struct doc_tombstone *t_tombstone;
334  
335  	/* Field to be used by filesystems */
336  	uint64_t t_fs_private;
337  
338  	struct os_reason *uu_exit_reason;
339  };
340  
341  typedef struct uthread * uthread_t;
342  
343  /* Definition of uu_flag */
344  #define UT_SAS_OLDMASK  0x00000001      /* need to restore mask before pause */
345  #define UT_NO_SIGMASK   0x00000002      /* exited thread; invalid sigmask */
346  #define UT_NOTCANCELPT  0x00000004             /* not a cancelation point */
347  #define UT_CANCEL       0x00000008             /* thread marked for cancel */
348  #define UT_CANCELED     0x00000010            /* thread cancelled */
349  #define UT_CANCELDISABLE 0x00000020            /* thread cancel disabled */
350  #define UT_ALTSTACK     0x00000040      /* this thread has alt stack for signals */
351  #define UT_THROTTLE_IO  0x00000080      /* this thread issues throttle I/O */
352  #define UT_PASSIVE_IO   0x00000100      /* this thread issues passive I/O */
353  #define UT_PROCEXIT     0x00000200      /* this thread completed the  proc exit */
354  #define UT_RAGE_VNODES  0x00000400      /* rapid age any vnodes created by this thread */
355  #define UT_KERN_RAGE_VNODES        0x00000800 /* rapid age any vnodes created by this thread (kernel set) */
356  #define UT_NSPACE_NODATALESSFAULTS 0x00001000 /* thread does not materialize dataless files */
357  #define UT_ATIME_UPDATE 0x00002000      /* don't update atime for files accessed by this thread */
358  #define UT_NSPACE_FORCEDATALESSFAULTS  0x00004000 /* thread always materializes dataless files */
359  #define UT_VFORK        0x02000000      /* thread has vfork children */
360  #define UT_SETUID       0x04000000      /* thread is settugid() */
361  #define UT_WASSETUID    0x08000000      /* thread was settugid() (in vfork) */
362  #define UT_VFORKING     0x10000000      /* thread in vfork() syscall */
363  
364  #endif /* BSD_KERNEL_PRIVATE */
365  
366  #endif /* __APPLE_API_PRIVATE */
367  
368  #endif  /* KERNEL */
369  
370  /*
371   * Per process structure containing data that isn't needed in core
372   * when the process isn't running (esp. when swapped out).
373   * This structure may or may not be at the same kernel address
374   * in all processes.
375   */
376  
377  struct  user {
378  	/* NOT USED ANYMORE */
379  };
380  
381  #endif  /* !_SYS_USER_H_ */