X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/ff6e181ae92fc6f1e89841290f461d1f2f9badd9..c18c124eaa464aaaa5549e99e5a70fc9cbb50944:/bsd/sys/user.h

diff --git a/bsd/sys/user.h b/bsd/sys/user.h
index 5ba1c79c2..8fc6c578a 100644
--- a/bsd/sys/user.h
+++ b/bsd/sys/user.h
@@ -1,14 +1,19 @@
 /*
- * Copyright (c) 2000-2002 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2012 Apple Inc. All rights reserved.
  *
- * @APPLE_LICENSE_HEADER_START@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
  * This file contains Original Code and/or Modifications of Original Code
  * as defined in and that are subject to the Apple Public Source License
  * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
+ * 
+ * Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this file.
  * 
  * The Original Code and all software distributed under the License are
  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
@@ -18,7 +23,7 @@
  * Please see the License for the specific language governing rights and
  * limitations under the License.
  * 
- * @APPLE_LICENSE_HEADER_END@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 /* Copyright (c) 1995, 1997 Apple Computer, Inc. All Rights Reserved */
 /*
@@ -68,96 +73,214 @@
 #include <sys/ucred.h>
 #include <sys/uio.h>
 #endif
+#ifdef XNU_KERNEL_PRIVATE
 #include <sys/resourcevar.h>
-#ifdef KERNEL_PRIVATE
 #include <sys/signalvar.h>
 #endif
 #include <sys/vm.h>		/* XXX */
 #include <sys/sysctl.h>
- 
+
 #ifdef KERNEL
+#ifdef BSD_KERNEL_PRIVATE
+#include <sys/pthread_internal.h> /* for uu_kwe entry */
+#endif  /* BSD_KERNEL_PRIVATE */
 #ifdef __APPLE_API_PRIVATE
 #include <sys/eventvar.h>
 
+#if !defined(__LP64__) || defined(XNU_KERNEL_PRIVATE)
+/*
+ * VFS context structure (part of uthread)
+ */
+struct vfs_context {
+	thread_t	vc_thread;		/* pointer to Mach thread */
+	kauth_cred_t	vc_ucred;		/* per thread credential */
+};
+
+/*
+ * struct representing a document "tombstone" that's recorded
+ * when a thread manipulates files marked with a document-id.
+ * if the thread recreates the same item, this tombstone is
+ * used to preserve the document_id on the new file.
+ *
+ * It is a separate structure because of its size - we want to
+ * allocate it on demand instead of just stuffing it into the
+ * uthread structure.
+ */
+struct doc_tombstone {
+	struct vnode	 *t_lastop_parent;
+	struct vnode	 *t_lastop_item;
+	uint32_t 	  t_lastop_parent_vid;
+	uint32_t 	  t_lastop_item_vid;
+	uint64_t          t_lastop_fileid;
+	uint64_t          t_lastop_document_id;
+	unsigned char     t_lastop_filename[NAME_MAX+1];
+};
+
+#endif /* !__LP64 || XNU_KERNEL_PRIVATE */
+
+#ifdef BSD_KERNEL_PRIVATE
+/* XXX Deprecated: xnu source compatability */
+#define uu_ucred	uu_context.vc_ucred
+
+struct label;		/* MAC label dummy struct */
+
+#define MAXTHREADNAMESIZE 64
 /*
  *	Per-thread U area.
  */
+ 
 struct uthread {
-	int	*uu_ar0;		/* address of users saved R0 */
-
 	/* syscall parameters, results and catches */
 	u_int64_t uu_arg[8]; /* arguments to current system call */
-	int	*uu_ap;			/* pointer to arglist */
     int uu_rval[2];
+	unsigned int syscall_code; /* current syscall code */
 
 	/* thread exception handling */
-	int	uu_code;			/* ``code'' to trap */
+	mach_exception_code_t uu_code;	/* ``code'' to trap */
+	mach_exception_subcode_t uu_subcode;
+	int	uu_exception;
 	char uu_cursig;			/* p_cursig for exc. */
-	/* support for select - across system calls */
-	struct _select {
-		u_int32_t	*ibits, *obits; /* bits to select on */
-		uint	nbytes;	/* number of bytes in ibits and obits */
-		wait_queue_set_t wqset;	 /* cached across select calls */
-		size_t allocsize;		 /* ...size of select cache */
-		u_int64_t abstime;
-		int poll;
-		int error;
-		int count;
-		char * wql;
-	} uu_select;			/* saved state for select() */
-	/* to support continuations */
+	/* support for syscalls which use continuations */
 	union {
-		int uu_nfs_myiod;    /* saved state for nfsd */
-		struct _kevent_scan {
+		struct _select_data {
+			u_int64_t abstime;
+			char * wql;
+			int count;
+			struct select_nocancel_args *args;	/* original syscall arguments */
+			int32_t *retval;					/* place to store return val */
+		} ss_select_data;
+		struct _kqueue_scan {
 			kevent_callback_t call; /* per-event callback */
-			kevent_continue_t cont; /* whole call continuation */
+			kqueue_continue_t cont; /* whole call continuation */
 			uint64_t deadline;	/* computed deadline for operation */
 			void *data;		/* caller's private data */
-		} ss_kevent_scan;		/* saved state for kevent_scan() */
+		} ss_kqueue_scan;		/* saved state for kevent_scan() */
 		struct _kevent {
-			struct _kevent_scan scan;/* space for the generic data */
+			struct _kqueue_scan scan;/* space for the generic data */
 			struct fileproc *fp;	 /* fileproc we hold iocount on */
 			int fd;			 /* filedescriptor for kq */
-			register_t *retval;	 /* place to store return val */
+			int32_t *retval;	 /* place to store return val */
 			user_addr_t eventlist;	 /* user-level event list address */
+			size_t eventsize;	/* kevent or kevent64_s */
 			int eventcount;	 	/* user-level event count */
 			int eventout;		 /* number of events output */
 		} ss_kevent;			 /* saved state for kevent() */
-	} uu_state;
+
+		struct _kauth {
+			user_addr_t message;	/* message in progress */
+		} uu_kauth;
+
+		struct ksyn_waitq_element  uu_kwe;		/* user for pthread synch */
+
+		struct _waitid_data {
+			struct waitid_nocancel_args *args;	/* original syscall arguments */
+			int32_t *retval;			/* place to store return val */
+		} uu_waitid_data;
+
+		struct _wait4_data {
+			struct wait4_nocancel_args *args;	/* original syscall arguments */
+			int32_t *retval;			/* place to store return val */
+		} uu_wait4_data;
+	} uu_kevent;
+
+	/* Persistent memory allocations across system calls */
+	struct _select {
+			u_int32_t	*ibits, *obits; /* bits to select on */
+			uint	nbytes;	/* number of bytes in ibits and obits */
+	} uu_select;			/* saved state for select() */
+
   /* internal support for continuation framework */
     int (*uu_continuation)(int);
     int uu_pri;
     int uu_timo;
-	int uu_flag;
+	caddr_t uu_wchan;			/* sleeping thread wait channel */
+	const char *uu_wmesg;			/* ... wait message */
 	struct proc * uu_proc;
+	thread_t uu_thread;
 	void * uu_userstate;
+	wait_queue_set_t uu_wqset;			/* cached across select calls */
+	size_t uu_allocsize;				/* ...size of select cache */
+	int uu_flag;
 	sigset_t uu_siglist;				/* signals pending for the thread */
 	sigset_t  uu_sigwait;				/*  sigwait on this thread*/
 	sigset_t  uu_sigmask;				/* signal mask for the thread */
 	sigset_t  uu_oldmask;				/* signal mask saved before sigpause */
-	thread_t uu_act;
 	sigset_t  uu_vforkmask;				/* saved signal mask during vfork */
+	struct vfs_context uu_context;			/* thread + cred */
 
 	TAILQ_ENTRY(uthread) uu_list;		/* List of uthreads in proc */
 
-	struct kaudit_record 		*uu_ar;		/* audit record */
+	struct kaudit_record 	*uu_ar;			/* audit record */
 	struct task*	uu_aio_task;			/* target task for async io */
-
-  /* network support for dlil layer locking */
-	u_int32_t	dlil_incremented_read;
+    
 	lck_mtx_t	*uu_mtx;
 
-        int		uu_lowpri_delay;
+	TAILQ_ENTRY(uthread) uu_throttlelist;	/* List of uthreads currently throttled */
+	void	*	uu_throttle_info; 	/* pointer to throttled I/Os info */
+	int		uu_on_throttlelist;
+	int		uu_lowpri_window;
+	boolean_t	uu_throttle_bc;
 
-	struct ucred	*uu_ucred;		/* per thread credential */
-        int		uu_defer_reclaims;
+	u_int32_t	uu_network_marks;	/* network control flow marks */
+
+	struct kern_sigaltstack uu_sigstk;
         vnode_t		uu_vreclaims;
+	vnode_t		uu_cdir;		/* per thread CWD */
+	int		uu_dupfd;		/* fd in fdesc_open/dupfdopen */
+        int		uu_defer_reclaims;
 
 #ifdef JOE_DEBUG
         int		uu_iocount;
         int		uu_vpindex;
         void 	*	uu_vps[32];
+        void    *       uu_pcs[32][10];
+#endif
+#if CONFIG_DTRACE
+	uint32_t	t_dtrace_errno; /* Most recent errno */
+	siginfo_t	t_dtrace_siginfo;
+        uint64_t        t_dtrace_resumepid; /* DTrace's pidresume() pid */
+        uint8_t         t_dtrace_stop;  /* indicates a DTrace desired stop */
+        uint8_t         t_dtrace_sig;   /* signal sent via DTrace's raise() */
+			     
+        union __tdu {
+                struct __tds {
+                        uint8_t _t_dtrace_on;   /* hit a fasttrap tracepoint */
+                        uint8_t _t_dtrace_step; /* about to return to kernel */
+                        uint8_t _t_dtrace_ret;  /* handling a return probe */
+                        uint8_t _t_dtrace_ast;  /* saved ast flag */
+#if __sol64 || defined(__APPLE__)
+                        uint8_t _t_dtrace_reg;  /* modified register */
+#endif
+                } _tds;
+                u_int32_t _t_dtrace_ft;           /* bitwise or of these flags */
+        } _tdu;
+#define t_dtrace_ft     _tdu._t_dtrace_ft
+#define t_dtrace_on     _tdu._tds._t_dtrace_on
+#define t_dtrace_step   _tdu._tds._t_dtrace_step
+#define t_dtrace_ret    _tdu._tds._t_dtrace_ret
+#define t_dtrace_ast    _tdu._tds._t_dtrace_ast
+#if __sol64 || defined(__APPLE__)
+#define t_dtrace_reg    _tdu._tds._t_dtrace_reg
+#endif
+
+        user_addr_t	t_dtrace_pc;    /* DTrace saved pc from fasttrap */
+        user_addr_t	t_dtrace_npc;   /* DTrace next pc from fasttrap */
+        user_addr_t	t_dtrace_scrpc; /* DTrace per-thread scratch location */
+        user_addr_t	t_dtrace_astpc; /* DTrace return sequence location */
+
+	struct dtrace_ptss_page_entry*	t_dtrace_scratch; /* scratch space entry */
+
+#if __sol64 || defined(__APPLE__)
+        uint64_t        t_dtrace_regv;  /* DTrace saved reg from fasttrap */
 #endif
+	void *		t_dtrace_syscall_args;
+#endif /* CONFIG_DTRACE */
+	void *		uu_threadlist;
+	char *		pth_name;
+	struct label *	uu_label;	/* MAC label */
+
+	/* Document Tracking struct used to track a "tombstone" for a document */
+	struct doc_tombstone *t_tombstone;
 };
 
 typedef struct uthread * uthread_t;
@@ -169,10 +292,20 @@ typedef struct uthread * uthread_t;
 #define UT_CANCEL	0x00000008             /* thread marked for cancel */
 #define UT_CANCELED	0x00000010            /* thread cancelled */
 #define UT_CANCELDISABLE 0x00000020            /* thread cancel disabled */
+#define	UT_ALTSTACK	0x00000040	/* this thread has alt stack for signals */
+#define UT_THROTTLE_IO	0x00000080	/* this thread issues throttle I/O */
+#define UT_PASSIVE_IO	0x00000100	/* this thread issues passive I/O */
+#define UT_PROCEXIT	0x00000200	/* this thread completed the  proc exit */
+#define UT_RAGE_VNODES	0x00000400	/* rapid age any vnodes created by this thread */	
+/* 0x00000800 unused, used to be UT_BACKGROUND */
+/* 0x00001000 unused, used to be UT_BACKGROUND_TRAFFIC_MGT */
 
 #define	UT_VFORK	0x02000000	/* thread has vfork children */
 #define	UT_SETUID	0x04000000	/* thread is settugid() */
 #define UT_WASSETUID	0x08000000	/* thread was settugid() (in vfork) */
+#define	UT_VFORKING	0x10000000	/* thread in vfork() syscall */
+
+#endif /* BSD_KERNEL_PRIVATE */
 
 #endif /* __APPLE_API_PRIVATE */