/*
- * Copyright (c) 2000-2007 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2010 Apple Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
*/
#define S_DEFAULT 0x00000000 /* No flags set */
#define S_NOCTTY 0x00000001 /* Do not associate controlling tty */
+#define S_CTTYREF 0x00000010 /* vnode ref taken by cttyopen */
#define S_LIST_TERM 1 /* marked for termination */
#define PROC_NULL (struct proc *)0
+#define PROC_UPDATE_CREDS_ONPROC(p) { \
+ p->p_uid = kauth_cred_getuid(p->p_ucred); \
+ p->p_gid = kauth_cred_getgid(p->p_ucred); \
+ p->p_ruid = kauth_cred_getruid(p->p_ucred); \
+ p->p_rgid = kauth_cred_getrgid(p->p_ucred); \
+ p->p_svuid = kauth_cred_getsvuid(p->p_ucred); \
+ p->p_svgid = kauth_cred_getsvgid(p->p_ucred); \
+ }
/*
* Description of a process.
*
struct proc * p_pptr; /* Pointer to parent process.(LL) */
pid_t p_ppid; /* process's parent pid number */
pid_t p_pgrpid; /* process group id of the process (LL)*/
+ uid_t p_uid;
+ gid_t p_gid;
+ uid_t p_ruid;
+ gid_t p_rgid;
+ uid_t p_svuid;
+ gid_t p_svgid;
+ uint64_t p_uniqueid; /* process unique ID - incremented on fork/spawn/vfork, remains same across exec. */
+ uint64_t p_puniqueid; /* parent's unique ID - set on fork/spawn/vfork, doesn't change if reparented. */
lck_mtx_t p_mlock; /* mutex lock for proc */
lck_mtx_t p_dtrace_sprlock; /* sun proc lock emulation */
int p_dtrace_probes; /* (PL) are there probes for this proc? */
u_int p_dtrace_count; /* (sprlock) number of DTrace tracepoints */
+ uint8_t p_dtrace_stop; /* indicates a DTrace-desired stop */
struct dtrace_ptss_page* p_dtrace_ptss_pages; /* (sprlock) list of user ptss pages */
struct dtrace_ptss_page_entry* p_dtrace_ptss_free_list; /* (atomic) list of individual ptss entries */
struct dtrace_helpers* p_dtrace_helpers; /* (dtrace_lock) DTrace per-proc private */
char p_name[(2*MAXCOMLEN)+1]; /* PL */
struct pgrp *p_pgrp; /* Pointer to process group. (LL) */
- int p_iopol_disk; /* disk I/O policy (PL) */
uint32_t p_csflags; /* flags for codesign (PL) */
uint32_t p_pcaction; /* action for process control on starvation */
uint8_t p_uuid[16]; /* from LC_UUID load command */
+ /*
+ * CPU type and subtype of binary slice executed in
+ * this process. Protected by proc lock.
+ */
+ cpu_type_t p_cputype;
+ cpu_subtype_t p_cpusubtype;
+
/* End area that is copied on creation. */
/* XXXXXXXXXXXXX End of BCOPY'ed on fork (AIOLOCK)XXXXXXXXXXXXXXXX */
#define p_endcopy p_aio_total_count
struct klist p_klist; /* knote list (PL ?)*/
- struct rusage *p_ru; /* Exit information. (PL) */
+ struct rusage_superset *p_ru; /* Exit information. (PL) */
+ int p_sigwaitcnt;
thread_t p_signalholder;
thread_t p_transholder;
/* DEPRECATE following field */
u_short p_acflag; /* Accounting flags. */
+ volatile u_short p_vfs_iopolicy; /* VFS iopolicy flags. (atomic bit ops) */
struct lctx *p_lctx; /* Pointer to login context. */
LIST_ENTRY(proc) p_lclist; /* List of processes in lctx. */
user_addr_t p_threadstart; /* pthread start fn */
user_addr_t p_wqthread; /* pthread workqueue fn */
int p_pthsize; /* pthread size */
+ uint32_t p_pth_tsd_offset; /* offset from pthread_t to TSD for new threads */
user_addr_t p_targconc; /* target concurrency ptr */
+ user_addr_t p_stack_addr_hint; /* stack allocation hint for wq threads */
void * p_wqptr; /* workq ptr */
int p_wqsize; /* allocated size */
boolean_t p_wqiniting; /* semaphore to serialze wq_open */
int p_ractive;
int p_idversion; /* version of process identity */
void * p_pthhash; /* pthread waitqueue hash */
+ volatile uint64_t was_throttled __attribute__((aligned(8))); /* Counter for number of throttled I/Os */
+ volatile uint64_t did_throttle __attribute__((aligned(8))); /* Counter for number of I/Os this proc throttled */
+
#if DIAGNOSTIC
unsigned int p_fdlock_pc[4];
unsigned int p_fdunlock_pc[4];
#endif /* SIGNAL_DEBUG */
#endif /* DIAGNOSTIC */
uint64_t p_dispatchqueue_offset;
+ uint64_t p_dispatchqueue_serialno_offset;
+#if VM_PRESSURE_EVENTS
+ struct timeval vm_pressure_last_notify_tstamp;
+#endif
+
+#if CONFIG_MEMORYSTATUS
+ /* Fields protected by proc list lock */
+ TAILQ_ENTRY(proc) p_memstat_list; /* priority bucket link */
+ uint32_t p_memstat_state; /* state */
+ int32_t p_memstat_effectivepriority; /* priority after transaction state accounted for */
+ int32_t p_memstat_requestedpriority; /* active priority */
+ uint32_t p_memstat_dirty; /* dirty state */
+ uint64_t p_memstat_userdata; /* user state */
+ uint64_t p_memstat_idledeadline; /* time at which process became clean */
+#if CONFIG_JETSAM
+ int32_t p_memstat_memlimit; /* cached memory limit */
+#endif
+#if CONFIG_FREEZE
+ uint32_t p_memstat_suspendedfootprint; /* footprint at time of suspensions */
+#endif /* CONFIG_FREEZE */
+#endif /* CONFIG_MEMORYSTATUS */
};
#define PGRPID_DEAD 0xdeaddead
#define P_LTRANSCOMMIT 0x00000020 /* process is committed to trans */
#define P_LINTRANSIT 0x00000040 /* process in exec or in creation */
#define P_LTRANSWAIT 0x00000080 /* waiting for trans to complete */
-#define P_LVFORK 0x00000100 /* */
-#define P_LINVFORK 0x00000200 /* */
+#define P_LVFORK 0x00000100 /* parent proc of a vfork */
+#define P_LINVFORK 0x00000200 /* child proc of a vfork */
#define P_LTRACED 0x00000400 /* */
#define P_LSIGEXC 0x00000800 /* */
#define P_LNOATTACH 0x00001000 /* */
#define P_LLIMWAIT 0x00040000
#define P_LWAITED 0x00080000
#define P_LINSIGNAL 0x00100000
-#define P_LSIGNALWAIT 0x00200000
+#define P_UNUSED 0x00200000 /* Unused */
#define P_LRAGE_VNODES 0x00400000
#define P_LREGISTER 0x00800000 /* thread start fns registered */
-#define P_LBACKGROUND 0x01000000
+#define P_LVMRSRCOWNER 0x01000000 /* can handle the resource ownership of */
+/* old P_LPTERMINATE 0x02000000 */
+#define P_LTERM_DECRYPTFAIL 0x04000000 /* process terminating due to key failure to decrypt */
+#define P_LTERM_JETSAM 0x08000000 /* process is being jetsam'd */
+#define P_JETSAM_VMPAGESHORTAGE 0x00000000 /* jetsam: lowest jetsam priority proc, killed due to vm page shortage */
+#define P_JETSAM_VMTHRASHING 0x10000000 /* jetsam: lowest jetsam priority proc, killed due to vm thrashing */
+#define P_JETSAM_HIWAT 0x20000000 /* jetsam: high water mark */
+#define P_JETSAM_PID 0x30000000 /* jetsam: pid */
+#define P_JETSAM_IDLEEXIT 0x40000000 /* jetsam: idle exit */
+#define P_JETSAM_VNODE 0x50000000 /* jetsam: vnode kill */
+#define P_JETSAM_FCTHRASHING 0x60000000 /* jetsam: lowest jetsam priority proc, killed due to filecache thrashing */
+#define P_JETSAM_MASK 0x70000000 /* jetsam type mask */
/* Process control state for resource starvation */
#define P_PCTHROTTLE 1
#define PROC_SETACTION_STATE(p) (p->p_pcaction = (PROC_CONTROL_STATE(p) | (PROC_CONTROL_STATE(p) << 16)))
#define PROC_RESETACTION_STATE(p) (p->p_pcaction = PROC_CONTROL_STATE(p))
-/* advisory flags in the proc */
+/* additional process flags */
#define P_LADVLOCK 0x01
+/* p_vfs_iopolicy flags */
+#define P_VFS_IOPOLICY_FORCE_HFS_CASE_SENSITIVITY 0x0001
+
/* defns for proc_iterate */
#define PROC_ALLPROCLIST 1 /* walk the allproc list (procs not exited yet) */
#define PROC_ZOMBPROCLIST 2 /* walk the zombie list */
*/
extern int nprocs, maxproc; /* Current and max number of procs. */
extern int maxprocperuid; /* Current number of procs per uid */
-__private_extern__ int hard_maxproc; /* hard limit */
+extern int hard_maxproc; /* hard limit */
extern unsigned int proc_shutdown_exitcount;
#define PID_MAX 99999
extern lck_mtx_t * proc_klist_mlock;
#define BSD_SIMUL_EXECS 33 /* 32 , allow for rounding */
-#define BSD_PAGABLE_MAP_SIZE (BSD_SIMUL_EXECS * (NCARGS + PAGE_SIZE))
-__private_extern__ int execargs_cache_size;
-__private_extern__ int execargs_free_count;
-__private_extern__ vm_offset_t * execargs_cache;
+#define BSD_PAGEABLE_SIZE_PER_EXEC (NCARGS + PAGE_SIZE + PAGE_SIZE) /* page for apple vars, page for executable header */
+extern int execargs_cache_size;
+extern int execargs_free_count;
+extern vm_offset_t * execargs_cache;
#define SESS_LEADER(p, sessp) ((sessp)->s_leader == (p))
extern u_long sesshash;
extern lck_grp_t * proc_lck_grp;
+#if CONFIG_FINE_LOCK_GROUPS
extern lck_grp_t * proc_mlock_grp;
extern lck_grp_t * proc_fdmlock_grp;
extern lck_grp_t * proc_slock_grp;
+#endif
extern lck_grp_attr_t * proc_lck_grp_attr;
extern lck_attr_t * proc_lck_attr;
extern struct proclist allproc; /* List of all processes. */
extern struct proclist zombproc; /* List of zombie processes. */
extern struct proc *initproc;
-extern void procinit(void) __attribute__((section("__TEXT, initcode")));
+extern void procinit(void);
extern void proc_lock(struct proc *);
extern void proc_unlock(struct proc *);
extern void proc_spinlock(struct proc *);
char *cr_name, size_t cr_name_len);
extern int isinferior(struct proc *, struct proc *);
__private_extern__ struct proc *pzfind(pid_t); /* Find zombie by id. */
+__private_extern__ struct proc *proc_find_zombref(pid_t); /* Find zombie by id. */
+__private_extern__ void proc_drop_zombref(struct proc * p); /* Find zombie by id. */
+
extern struct lctx *lcfind(pid_t); /* Find a login context by id */
extern struct lctx *lccreate(void); /* Create a new login context */
extern int msleep0(void *chan, lck_mtx_t *mtx, int pri, const char *wmesg, int timo, int (*continuation)(int));
extern void vfork_return(struct proc *child, int32_t *retval, int rval);
extern int exit1(struct proc *, int, int *);
-extern int fork1(proc_t, thread_t *, int);
+extern int exit1_internal(struct proc *, int, int *, boolean_t, boolean_t, int);
+extern int fork1(proc_t, thread_t *, int, coalition_t);
extern void vfork_exit_internal(struct proc *p, int rv, int forced);
extern void proc_reparentlocked(struct proc *child, struct proc * newparent, int cansignal, int locked);
extern int pgrp_iterate(struct pgrp * pgrp, int flags, int (*callout)(proc_t , void *), void *arg, int (*filterfn)(proc_t , void *), void *filterarg);
extern int proc_iterate(int flags, int (*callout)(proc_t , void *), void *arg, int (*filterfn)(proc_t , void *), void *filterarg);
extern int proc_rebootscan(int (*callout)(proc_t , void *), void *arg, int (*filterfn)(proc_t , void *), void *filterarg);
extern int proc_childrenwalk(proc_t p, int (*callout)(proc_t , void *), void *arg);
-extern proc_t proc_findinternal(int pid, int funneled);
+extern proc_t proc_findinternal(int pid, int locked);
+extern proc_t proc_findthread(thread_t thread);
extern void proc_refdrain(proc_t);
extern void proc_childdrainlocked(proc_t);
extern void proc_childdrainstart(proc_t);
int itimerdecr(struct proc * p, struct itimerval *itp, int usec);
void proc_signalstart(struct proc *, int locked);
void proc_signalend(struct proc *, int locked);
-int proc_transstart(struct proc *, int locked);
+int proc_transstart(struct proc *, int locked, int non_blocking);
void proc_transcommit(struct proc *, int locked);
void proc_transend(struct proc *, int locked);
int proc_transwait(struct proc *, int locked);
void proc_rele_locked(struct proc * p);
+struct proc *proc_ref_locked(struct proc * p);
void proc_knote(struct proc * p, long hint);
void proc_knote_drain(struct proc *p);
void workqueue_init_lock(proc_t p);
thread_t proc_thread(proc_t);
extern int proc_pendingsignals(proc_t, sigset_t);
int proc_getpcontrol(int pid, int * pcontrolp);
-int proc_dopcontrol(proc_t p, void *unused_arg);
+int proc_dopcontrol(proc_t p);
int proc_resetpcontrol(int pid);
#if PSYNCH
void pth_proc_hashinit(proc_t);
extern lck_mtx_t * pthread_list_mlock;
#endif /* PSYNCH */
struct uthread * current_uthread(void);
+
+/* return 1 if process is forcing case-sensitive HFS+ access, 0 for default */
+extern int proc_is_forcing_hfs_case_sensitivity(proc_t);
+
+pid_t dtrace_proc_selfpid(void);
+pid_t dtrace_proc_selfppid(void);
+uid_t dtrace_proc_selfruid(void);
#endif /* !_SYS_PROC_INTERNAL_H_ */