X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/21362eb3e66fd2c787aee132bce100a44d71a99c..d1ecb069dfe24481e4a83f44cb5217a2b06746d7:/osfmk/kern/task.h diff --git a/osfmk/kern/task.h b/osfmk/kern/task.h index 15ee4ff39..0e7ea86e2 100644 --- a/osfmk/kern/task.h +++ b/osfmk/kern/task.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2009 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * @@ -80,6 +80,13 @@ * improvements that they make and grant CSL redistribution rights. * */ +/* + * NOTICE: This file was modified by McAfee Research in 2004 to introduce + * support for mandatory and extensible security protections. This notice + * is included in support of clause 2.2 (b) of the Apple Public License, + * Version 2.0. + * Copyright (c) 2005 SPARTA, Inc. + */ #ifndef _KERN_TASK_H_ #define _KERN_TASK_H_ @@ -97,38 +104,37 @@ #include #include #include +#include #include #include #include #include #include - -#include -#include +#include +#include struct task { /* Synchronization/destruction information */ - decl_mutex_data(,lock) /* Task's lock */ - int ref_count; /* Number of references to me */ + decl_lck_mtx_data(,lock) /* Task's lock */ + uint32_t ref_count; /* Number of references to me */ boolean_t active; /* Task has not been terminated */ + boolean_t halting; /* Task is being halted */ /* Miscellaneous */ vm_map_t map; /* Address space description */ - queue_chain_t pset_tasks; /* list of tasks assigned to pset */ + queue_chain_t tasks; /* global list of tasks */ void *user_data; /* Arbitrary data settable via IPC */ - int suspend_count; /* Internal scheduling only */ /* Threads in this task */ - queue_head_t threads; - int thread_count; - int active_thread_count; + queue_head_t threads; + + processor_set_t pset_hint; + struct affinity_space *affinity_space; - processor_set_t processor_set; /* processor set for new threads */ -#if MACH_HOST - boolean_t may_assign; /* can assigned pset be changed? */ - boolean_t assign_active; /* waiting for may_assign */ -#endif /* MACH_HOST */ + int thread_count; + uint32_t active_thread_count; + int suspend_count; /* Internal scheduling only */ /* User-visible scheduling information */ integer_t user_stop_count; /* outstanding stops */ @@ -146,19 +152,21 @@ struct task { uint64_t total_user_time; /* terminated threads only */ uint64_t total_system_time; -#if MACH_PROF - boolean_t task_profiled; /* is task being profiled ? */ - struct prof_data *profil_buffer;/* profile struct if so */ -#endif /* MACH_PROF */ + /* Virtual timers */ + uint32_t vtimers; /* IPC structures */ - decl_mutex_data(,itk_lock_data) + decl_lck_mtx_data(,itk_lock_data) struct ipc_port *itk_self; /* not a right, doesn't hold ref */ + struct ipc_port *itk_nself; /* not a right, doesn't hold ref */ struct ipc_port *itk_sself; /* a send right */ struct exception_action exc_actions[EXC_TYPES_COUNT]; /* a send right each valid element */ struct ipc_port *itk_host; /* a send right */ struct ipc_port *itk_bootstrap; /* a send right */ + struct ipc_port *itk_seatbelt; /* a send right */ + struct ipc_port *itk_gssd; /* yet another send right */ + struct ipc_port *itk_task_access; /* and another send right */ struct ipc_port *itk_registered[TASK_PORT_REGISTER_MAX]; /* all send rights */ @@ -175,6 +183,8 @@ struct task { struct ipc_port *paged_ledger_port; unsigned int priv_flags; /* privilege resource flags */ #define VM_BACKING_STORE_PRIV 0x1 + + MACHINE_TASK integer_t faults; /* faults counter */ integer_t pageins; /* pageins counter */ @@ -183,12 +193,13 @@ struct task { integer_t messages_received; /* messages received counter */ integer_t syscalls_mach; /* mach system call counter */ integer_t syscalls_unix; /* unix system call counter */ - integer_t csw; /* context switch counter */ + uint32_t c_switch; /* total context switches */ + uint32_t p_switch; /* total processor switches */ + uint32_t ps_switch; /* total pset switches */ #ifdef MACH_BSD void *bsd_info; #endif - struct shared_region_mapping *system_shared_region; - struct tws_hash *dynamic_working_set; + struct vm_shared_region *shared_region; uint32_t taskFeatures[2]; /* Special feature for this task */ #define tf64BitAddr 0x80000000 /* Task has 64-bit addressing */ #define tf64BitData 0x40000000 /* Task has 64-bit data registers */ @@ -199,18 +210,40 @@ struct task { #define task_clear_64BitAddr(task) \ ((task)->taskFeatures[0] &= ~tf64BitAddr) + mach_vm_address_t all_image_info_addr; /* dyld __all_image_info */ + mach_vm_size_t all_image_info_size; /* section location and size */ +#if CONFIG_MACF_MACH + ipc_labelh_t label; +#endif + +#if CONFIG_COUNTERS +#define TASK_PMC_FLAG 0x1 /* Bit in "t_chud" signifying PMC interest */ + uint32_t t_chud; /* CHUD flags, used for Shark */ +#endif + }; -#define task_lock(task) mutex_lock(&(task)->lock) -#define task_lock_try(task) mutex_try(&(task)->lock) -#define task_unlock(task) mutex_unlock(&(task)->lock) +#define task_lock(task) lck_mtx_lock(&(task)->lock) +#define task_lock_try(task) lck_mtx_try_lock(&(task)->lock) +#define task_unlock(task) lck_mtx_unlock(&(task)->lock) -#define itk_lock_init(task) mutex_init(&(task)->itk_lock_data, 0) -#define itk_lock(task) mutex_lock(&(task)->itk_lock_data) -#define itk_unlock(task) mutex_unlock(&(task)->itk_lock_data) +#if CONFIG_MACF_MACH +#define maclabel label->lh_label + +#define tasklabel_lock(task) lh_lock((task)->label) +#define tasklabel_unlock(task) lh_unlock((task)->label) + +extern void tasklabel_lock2(task_t a, task_t b); +extern void tasklabel_unlock2(task_t a, task_t b); +#endif /* MAC_MACH */ + +#define itk_lock_init(task) lck_mtx_init(&(task)->itk_lock_data, &ipc_lck_grp, &ipc_lck_attr) +#define itk_lock_destroy(task) lck_mtx_destroy(&(task)->itk_lock_data, &ipc_lck_grp) +#define itk_lock(task) lck_mtx_lock(&(task)->itk_lock_data) +#define itk_unlock(task) lck_mtx_unlock(&(task)->itk_lock_data) #define task_reference_internal(task) \ - hw_atomic_add(&(task)->ref_count, 1) + (void)hw_atomic_add(&(task)->ref_count, 1) #define task_deallocate_internal(task) \ hw_atomic_sub(&(task)->ref_count, 1) @@ -228,11 +261,14 @@ extern kern_return_t kernel_task_create( task_t *child); /* Initialize task module */ -extern void task_init(void); +extern void task_init(void) __attribute__((section("__TEXT, initcode"))); #define current_task_fast() (current_thread()->task) #define current_task() current_task_fast() +extern lck_attr_t task_lck_attr; +extern lck_grp_t task_lck_grp; + #else /* MACH_KERNEL_PRIVATE */ __BEGIN_DECLS @@ -258,7 +294,11 @@ extern kern_return_t task_release( task_t task); /* Halt all other threads in the current task */ -extern kern_return_t task_halt( +extern kern_return_t task_start_halt( + task_t task); + +/* Wait for other threads to halt and free halting task resources */ +extern void task_complete_halt( task_t task); extern kern_return_t task_terminate_internal( @@ -267,12 +307,30 @@ extern kern_return_t task_terminate_internal( extern kern_return_t task_create_internal( task_t parent_task, boolean_t inherit_memory, + boolean_t is_64bit, task_t *child_task); /* OUT */ extern kern_return_t task_importance( task_t task, integer_t importance); +extern void task_vtimer_set( + task_t task, + integer_t which); + +extern void task_vtimer_clear( + task_t task, + integer_t which); + +extern void task_vtimer_update( + task_t task, + integer_t which, + uint32_t *microsecs); + +#define TASK_VTIMER_USER 0x01 +#define TASK_VTIMER_PROF 0x02 +#define TASK_VTIMER_RLIM 0x04 + extern void task_set_64bit( task_t task, boolean_t is64bit); @@ -280,27 +338,47 @@ extern void task_set_64bit( extern void task_backing_store_privileged( task_t task); -extern void task_working_set_disable( - task_t task); +extern void task_set_dyld_info( + task_t task, + mach_vm_address_t addr, + mach_vm_size_t size); /* Get number of activations in a task */ extern int get_task_numacts( task_t task); +extern int get_task_numactivethreads(task_t task); /* JMM - should just be temporary (implementation in bsd_kern still) */ extern void set_bsdtask_info(task_t,void *); extern vm_map_t get_task_map_reference(task_t); -extern vm_map_t swap_task_map(task_t, vm_map_t); +extern vm_map_t swap_task_map(task_t, thread_t, vm_map_t); extern pmap_t get_task_pmap(task_t); +extern uint64_t get_task_resident_size(task_t); extern boolean_t is_kerneltask(task_t task); +extern kern_return_t check_actforsig(task_t task, thread_t thread, int setast); + +extern kern_return_t machine_task_get_state( + task_t task, + int flavor, + thread_state_t state, + mach_msg_type_number_t *state_count); + +extern kern_return_t machine_task_set_state( + task_t task, + int flavor, + thread_state_t state, + mach_msg_type_number_t state_count); + + #endif /* XNU_KERNEL_PRIVATE */ #ifdef KERNEL_PRIVATE extern void *get_bsdtask_info(task_t); +extern void *get_bsdthreadtask_info(thread_t); extern vm_map_t get_task_map(task_t); #endif /* KERNEL_PRIVATE */ @@ -310,6 +388,8 @@ extern task_t kernel_task; extern void task_deallocate( task_t task); +extern void task_name_deallocate( + task_name_t task_name); __END_DECLS #endif /* _KERN_TASK_H_ */