X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/9bccf70c0258c7cac2dcb80011b2a964d884c552..d1ecb069dfe24481e4a83f44cb5217a2b06746d7:/osfmk/kern/task.h diff --git a/osfmk/kern/task.h b/osfmk/kern/task.h index e59bcbc4a..0e7ea86e2 100644 --- a/osfmk/kern/task.h +++ b/osfmk/kern/task.h @@ -1,23 +1,29 @@ /* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2009 Apple Inc. All rights reserved. * - * @APPLE_LICENSE_HEADER_START@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * - * The contents of this file constitute Original Code as defined in and - * are subject to the Apple Public Source License Version 1.1 (the - * "License"). You may not use this file except in compliance with the - * License. Please obtain a copy of the License at - * http://www.apple.com/publicsource and read it before using this file. + * 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. 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. * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * 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 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. * - * @APPLE_LICENSE_HEADER_END@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /* * @OSF_FREE_COPYRIGHT@ @@ -74,15 +80,20 @@ * 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_ #include #include -#include - -#ifdef __APPLE_API_PRIVATE +#include #ifdef MACH_KERNEL_PRIVATE @@ -93,54 +104,37 @@ #include #include #include -#include #include + +#include #include #include #include -#include -#include -#include -#include -#include -#include - -typedef struct task { +#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 kernel_loaded; /* Created with kernel_task_create() */ + 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 */ - -#if TASK_SWAPPER - /* Task swapper data */ - unsigned short swap_state; /* swap state (e.g. IN/OUT) */ - unsigned short swap_flags; /* swap flags (e.g. MAKE_UNSWAPP) */ - unsigned int swap_stamp; /* when last swapped */ - unsigned long swap_rss; /* size (pages) when last swapped */ - int swap_ast_waiting; /* number of threads that have not */ - /* reached a clean point and halted */ - int swap_nswap; /* number of times this task swapped */ - queue_chain_t swapped_tasks; /* list of non-resident tasks */ -#endif /* TASK_SWAPPER */ - - /* Activations in this task */ - queue_head_t thr_acts; /* list of thread_activations */ - int thr_act_count; - int res_act_count; - int active_act_count; /* have not terminate_self yet */ - - 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 */ + + /* Threads in this task */ + queue_head_t threads; + + processor_set_t pset_hint; + struct affinity_space *affinity_space; + + 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 */ @@ -150,26 +144,29 @@ typedef struct task { integer_t priority; /* base priority for threads */ integer_t max_priority; /* maximum priority for threads */ - /* Task security token */ + /* Task security and audit tokens */ security_token_t sec_token; + audit_token_t audit_token; /* Statistics */ - time_value_t total_user_time; /* user time for dead threads */ - time_value_t total_system_time; /* system time for dead threads */ + 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 */ @@ -181,21 +178,14 @@ typedef struct task { int semaphores_owned; /* number of semaphores owned */ int lock_sets_owned; /* number of lock sets owned */ - /* User space system call emulation support */ - struct eml_dispatch *eml_dispatch; - - /* Ledgers */ + /* Ledgers */ struct ipc_port *wired_ledger_port; struct ipc_port *paged_ledger_port; - -#if NORMA_TASK - long child_node; /* if != -1, node for new children */ -#endif /* NORMA_TASK */ -#if FAST_TAS - vm_offset_t fast_tas_base; - vm_offset_t fast_tas_end; -#endif /* FAST_TAS */ + 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 */ integer_t cow_faults; /* copy on write fault counter */ @@ -203,87 +193,203 @@ typedef 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 - vm_offset_t system_shared_region; - vm_offset_t dynamic_working_set; -} Task; + 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 */ +#define task_has_64BitAddr(task) \ + (((task)->taskFeatures[0] & tf64BitAddr) != 0) +#define task_set_64BitAddr(task) \ + ((task)->taskFeatures[0] |= tf64BitAddr) +#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 -#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) +#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 itk_lock_init(task) mutex_init(&(task)->itk_lock_data, \ - ETAP_THREAD_TASK_ITK) -#define itk_lock(task) mutex_lock(&(task)->itk_lock_data) -#define itk_unlock(task) mutex_unlock(&(task)->itk_lock_data) +}; -#define task_reference_locked(task) ((task)->ref_count++) +#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) -/* - * Internal only routines - */ +#if CONFIG_MACF_MACH +#define maclabel label->lh_label -/* Initialize task module */ -extern void task_init(void); +#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) \ + (void)hw_atomic_add(&(task)->ref_count, 1) + +#define task_deallocate_internal(task) \ + hw_atomic_sub(&(task)->ref_count, 1) -/* task create */ -extern kern_return_t task_create_local( - task_t parent_task, - boolean_t inherit_memory, - boolean_t kernel_loaded, - task_t *child_task); /* OUT */ +#define task_reference(task) \ +MACRO_BEGIN \ + if ((task) != TASK_NULL) \ + task_reference_internal(task); \ +MACRO_END -extern void consider_task_collect(void); +extern kern_return_t kernel_task_create( + task_t task, + vm_offset_t map_base, + vm_size_t map_size, + task_t *child); + +/* Initialize task module */ +extern void task_init(void) __attribute__((section("__TEXT, initcode"))); -#define current_task_fast() (current_act_fast()->task) +#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 + +extern task_t current_task(void); + +extern void task_reference(task_t task); + +__END_DECLS + #endif /* MACH_KERNEL_PRIVATE */ -extern task_t kernel_task; +__BEGIN_DECLS -/* Temporarily hold all threads in a task */ +#ifdef XNU_KERNEL_PRIVATE + +/* Hold all threads in a task */ extern kern_return_t task_hold( - task_t task); + task_t task); -/* Release temporary hold on all threads in a task */ +/* Release hold on all threads in a task */ extern kern_return_t task_release( - task_t task); + task_t task); + +/* Halt all other threads in the current task */ +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( + task_t task); -/* Get a task prepared for major changes */ -extern kern_return_t task_halt( - task_t task); +extern kern_return_t task_create_internal( + task_t parent_task, + boolean_t inherit_memory, + boolean_t is_64bit, + task_t *child_task); /* OUT */ -#if defined(MACH_KERNEL_PRIVATE) || defined(BSD_BUILD) extern kern_return_t task_importance( task_t task, integer_t importance); -#endif + +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); + +extern void task_backing_store_privileged( + 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 *get_bsdtask_info(task_t); extern void set_bsdtask_info(task_t,void *); -extern vm_map_t get_task_map(task_t); -extern vm_map_t swap_task_map(task_t, vm_map_t); +extern vm_map_t get_task_map_reference(task_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 task_reference_try(task_t task); +extern boolean_t is_kerneltask(task_t task); -#endif /* __APPLE_API_PRIVATE */ +extern kern_return_t check_actforsig(task_t task, thread_t thread, int setast); -#if !defined(MACH_KERNEL_PRIVATE) +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 task_t current_task(void); +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 /* MACH_KERNEL_TASK */ -/* Take reference on task (make sure it doesn't go away) */ -extern void task_reference(task_t task); +#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 */ + +extern task_t kernel_task; + +extern void task_deallocate( + task_t task); -/* Remove reference to task */ -extern void task_deallocate(task_t task); +extern void task_name_deallocate( + task_name_t task_name); +__END_DECLS #endif /* _KERN_TASK_H_ */