2  * Copyright (c) 2000-2012 Apple Inc. All rights reserved. 
   4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 
   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. 
  15  * Please obtain a copy of the License at 
  16  * http://www.opensource.apple.com/apsl/ and read it before using this file. 
  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. 
  26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 
  28 /* Copyright (c) 1995, 1997 Apple Computer, Inc. All Rights Reserved */ 
  30  * Copyright (c) 1982, 1986, 1989, 1991, 1993 
  31  *      The Regents of the University of California.  All rights reserved. 
  33  * Redistribution and use in source and binary forms, with or without 
  34  * modification, are permitted provided that the following conditions 
  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. 
  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 
  61  *      @(#)user.h      8.2 (Berkeley) 9/23/93 
  67 #include <sys/appleapiopts.h> 
  70 /* stuff that *used* to be included by user.h, or is now needed */ 
  73 #include <sys/resource.h> 
  74 #include <sys/ucred.h> 
  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> 
  83 #include <sys/vm.h>             /* XXX */ 
  84 #include <sys/sysctl.h> 
  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> 
  94 #if !defined(__LP64__) || defined(XNU_KERNEL_PRIVATE) 
  96  * VFS context structure (part of uthread) 
  99         thread_t        vc_thread
;              /* pointer to Mach thread */ 
 100         kauth_cred_t    vc_ucred
;               /* per thread credential */ 
 103 #endif /* !__LP64 || XNU_KERNEL_PRIVATE */ 
 105 #ifdef BSD_KERNEL_PRIVATE 
 106 /* XXX Deprecated: xnu source compatability */ 
 107 #define uu_ucred        uu_context.vc_ucred 
 109 struct label
;           /* MAC label dummy struct */ 
 111 #define MAXTHREADNAMESIZE 64 
 117         /* syscall parameters, results and catches */ 
 118         u_int64_t uu_arg
[8]; /* arguments to current system call */ 
 120         unsigned int syscall_code
; /* current syscall code */ 
 122         /* thread exception handling */ 
 123         mach_exception_code_t uu_code
;  /* ``code'' to trap */ 
 124         mach_exception_subcode_t uu_subcode
; 
 126         char uu_cursig
;                 /* p_cursig for exc. */ 
 127         /* support for syscalls which use continuations */ 
 129                 struct _select_data 
{ 
 133                         struct select_nocancel_args 
*args
;  /* original syscall arguments */ 
 134                         int32_t *retval
;                    /* place to store return val */ 
 136                 struct _kqueue_scan 
{ 
 137                         kevent_callback_t call
;             /* per-event callback */ 
 138                         kqueue_continue_t cont
;             /* whole call continuation */ 
 139                         filt_process_data_t process_data
;   /* needed for filter processing */ 
 140                         uint64_t deadline
;                  /* computed deadline for operation */ 
 141                         void *data
;                         /* caller's private data */ 
 142                 } ss_kqueue_scan
;                           /* saved state for kevent_scan() */ 
 144                         struct _kqueue_scan scan
;           /* space for the generic data */ 
 145                         struct fileproc 
*fp
;                /* fileproc we hold iocount on */ 
 146                         int fd
;                             /* fd for fileproc (if held) */ 
 147                         int eventcount
;                     /* user-level event count */ 
 148                         int eventout
;                       /* number of events output */ 
 149                         struct filt_process_s process_data
; /* space for process data fed thru */ 
 150                         int32_t *retval
;                    /* place to store return val */ 
 151                         user_addr_t eventlist
;              /* user-level event list address */ 
 152                         uint64_t data_available
;            /* [user/kernel] addr of in/out size */ 
 153                 } ss_kevent
;                     /* saved state for kevent() */ 
 156                         user_addr_t message
;    /* message in progress */ 
 159                 struct ksyn_waitq_element  uu_kwe
;              /* user for pthread synch */ 
 161                 struct _waitid_data 
{ 
 162                         struct waitid_nocancel_args 
*args
;      /* original syscall arguments */ 
 163                         int32_t *retval
;                        /* place to store return val */ 
 167                         struct wait4_nocancel_args 
*args
;       /* original syscall arguments */ 
 168                         int32_t *retval
;                        /* place to store return val */ 
 172         /* Persistent memory allocations across system calls */ 
 174                         u_int32_t       
*ibits
, *obits
; /* bits to select on */ 
 175                         uint    nbytes
; /* number of bytes in ibits and obits */ 
 176         } uu_select
;                    /* saved state for select() */ 
 178   /* internal support for continuation framework */ 
 179     int (*uu_continuation
)(int); 
 182         caddr_t uu_wchan
;                       /* sleeping thread wait channel */ 
 183         const char *uu_wmesg
;                   /* ... wait message */ 
 184         struct proc 
* uu_proc
; 
 187         struct waitq_set 
*uu_wqset
;             /* waitq state cached across select calls */ 
 188         size_t uu_wqstate_sz
;                   /* ...size of uu_wqset buffer */ 
 190         sigset_t uu_siglist
;                            /* signals pending for the thread */ 
 191         sigset_t  uu_sigwait
;                           /*  sigwait on this thread*/ 
 192         sigset_t  uu_sigmask
;                           /* signal mask for the thread */ 
 193         sigset_t  uu_oldmask
;                           /* signal mask saved before sigpause */ 
 194         sigset_t  uu_vforkmask
;                         /* saved signal mask during vfork */ 
 195         struct vfs_context uu_context
;                  /* thread + cred */ 
 197         TAILQ_ENTRY(uthread
) uu_list
;           /* List of uthreads in proc */ 
 199         struct kaudit_record    
*uu_ar
;                 /* audit record */ 
 200         struct task
*    uu_aio_task
;                    /* target task for async io */ 
 204         lck_spin_t      uu_rethrottle_lock
;     /* locks was_rethrottled and is_throttled */ 
 205         TAILQ_ENTRY(uthread
) uu_throttlelist
;   /* List of uthreads currently throttled */ 
 206         void    *       uu_throttle_info
;       /* pointer to throttled I/Os info */ 
 207         int             uu_on_throttlelist
; 
 208         int             uu_lowpri_window
; 
 209         boolean_t       uu_was_rethrottled
; 
 210         boolean_t       uu_is_throttled
; 
 211         boolean_t       uu_throttle_bc
; 
 213         u_int32_t       uu_network_marks
;       /* network control flow marks */ 
 215         struct kern_sigaltstack uu_sigstk
; 
 216         vnode_t         uu_vreclaims
; 
 217         vnode_t         uu_cdir
;                /* per thread CWD */ 
 218         int             uu_dupfd
;               /* fd in fdesc_open/dupfdopen */ 
 219         int             uu_defer_reclaims
; 
 221         struct kqueue 
*uu_kqueue_bound
;           /* kqueue we are bound to service */ 
 222         unsigned int uu_kqueue_qos_index
;         /* qos index we are bound to service */ 
 223         unsigned int uu_kqueue_flags
;             /* the flags we are using */ 
 224         boolean_t uu_kqueue_override_is_sync
;     /* sync qos override applied to servicer */ 
 230         void    *       uu_pcs
[32][10]; 
 232         int             uu_proc_refcount
; 
 234 #define NUM_PROC_REFS_TO_TRACK 32 
 235 #define PROC_REF_STACK_DEPTH 10 
 237         void    *       uu_proc_ps
[NUM_PROC_REFS_TO_TRACK
]; 
 238         uintptr_t       uu_proc_pcs
[NUM_PROC_REFS_TO_TRACK
][PROC_REF_STACK_DEPTH
]; 
 242         uint32_t        t_dtrace_errno
; /* Most recent errno */ 
 243         siginfo_t       t_dtrace_siginfo
; 
 244         uint64_t        t_dtrace_resumepid
; /* DTrace's pidresume() pid */ 
 245         uint8_t         t_dtrace_stop
;  /* indicates a DTrace desired stop */ 
 246         uint8_t         t_dtrace_sig
;   /* signal sent via DTrace's raise() */ 
 250                         uint8_t _t_dtrace_on
;   /* hit a fasttrap tracepoint */ 
 251                         uint8_t _t_dtrace_step
; /* about to return to kernel */ 
 252                         uint8_t _t_dtrace_ret
;  /* handling a return probe */ 
 253                         uint8_t _t_dtrace_ast
;  /* saved ast flag */ 
 254 #if __sol64 || defined(__APPLE__) 
 255                         uint8_t _t_dtrace_reg
;  /* modified register */ 
 258                 u_int32_t _t_dtrace_ft
;           /* bitwise or of these flags */ 
 260 #define t_dtrace_ft     _tdu._t_dtrace_ft 
 261 #define t_dtrace_on     _tdu._tds._t_dtrace_on 
 262 #define t_dtrace_step   _tdu._tds._t_dtrace_step 
 263 #define t_dtrace_ret    _tdu._tds._t_dtrace_ret 
 264 #define t_dtrace_ast    _tdu._tds._t_dtrace_ast 
 265 #if __sol64 || defined(__APPLE__) 
 266 #define t_dtrace_reg    _tdu._tds._t_dtrace_reg 
 269         user_addr_t     t_dtrace_pc
;    /* DTrace saved pc from fasttrap */ 
 270         user_addr_t     t_dtrace_npc
;   /* DTrace next pc from fasttrap */ 
 271         user_addr_t     t_dtrace_scrpc
; /* DTrace per-thread scratch location */ 
 272         user_addr_t     t_dtrace_astpc
; /* DTrace return sequence location */ 
 274         struct dtrace_ptss_page_entry
*  t_dtrace_scratch
; /* scratch space entry */ 
 276 #if __sol64 || defined(__APPLE__) 
 277         uint64_t        t_dtrace_regv
;  /* DTrace saved reg from fasttrap */ 
 279         void *          t_dtrace_syscall_args
; 
 280 #endif /* CONFIG_DTRACE */ 
 281         void *          uu_threadlist
; 
 284         /* Document Tracking struct used to track a "tombstone" for a document */ 
 285         struct doc_tombstone 
*t_tombstone
; 
 287         struct os_reason 
*uu_exit_reason
; 
 290 typedef struct uthread 
* uthread_t
; 
 292 /* Definition of uu_flag */ 
 293 #define UT_SAS_OLDMASK  0x00000001      /* need to restore mask before pause */ 
 294 #define UT_NO_SIGMASK   0x00000002      /* exited thread; invalid sigmask */ 
 295 #define UT_NOTCANCELPT  0x00000004             /* not a cancelation point */ 
 296 #define UT_CANCEL       0x00000008             /* thread marked for cancel */ 
 297 #define UT_CANCELED     0x00000010            /* thread cancelled */ 
 298 #define UT_CANCELDISABLE 0x00000020            /* thread cancel disabled */ 
 299 #define UT_ALTSTACK     0x00000040      /* this thread has alt stack for signals */ 
 300 #define UT_THROTTLE_IO  0x00000080      /* this thread issues throttle I/O */ 
 301 #define UT_PASSIVE_IO   0x00000100      /* this thread issues passive I/O */ 
 302 #define UT_PROCEXIT     0x00000200      /* this thread completed the  proc exit */ 
 303 #define UT_RAGE_VNODES  0x00000400      /* rapid age any vnodes created by this thread */        
 304 /* 0x00000800 unused, used to be UT_BACKGROUND */ 
 305 /* 0x00001000 unused, used to be UT_BACKGROUND_TRAFFIC_MGT */ 
 307 #define UT_VFORK        0x02000000      /* thread has vfork children */ 
 308 #define UT_SETUID       0x04000000      /* thread is settugid() */ 
 309 #define UT_WASSETUID    0x08000000      /* thread was settugid() (in vfork) */ 
 310 #define UT_VFORKING     0x10000000      /* thread in vfork() syscall */ 
 312 #endif /* BSD_KERNEL_PRIVATE */ 
 314 #endif /* __APPLE_API_PRIVATE */ 
 319  * Per process structure containing data that isn't needed in core 
 320  * when the process isn't running (esp. when swapped out). 
 321  * This structure may or may not be at the same kernel address 
 326   /* NOT USED ANYMORE */ 
 329 #endif  /* !_SYS_USER_H_ */