2  * Copyright (c) 2000-2010 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@ 
  29  * @OSF_FREE_COPYRIGHT@ 
  32  * Mach Operating System 
  33  * Copyright (c) 1991,1990,1989,1988 Carnegie Mellon University 
  34  * All Rights Reserved. 
  36  * Permission to use, copy, modify and distribute this software and its 
  37  * documentation is hereby granted, provided that both the copyright 
  38  * notice and this permission notice appear in all copies of the 
  39  * software, derivative works or modified versions, and any portions 
  40  * thereof, and that both notices appear in supporting documentation. 
  42  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 
  43  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 
  44  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 
  46  * Carnegie Mellon requests users of this software to return to 
  48  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU 
  49  *  School of Computer Science 
  50  *  Carnegie Mellon University 
  51  *  Pittsburgh PA 15213-3890 
  53  * any improvements or extensions that they make and grant Carnegie Mellon 
  54  * the rights to redistribute these changes. 
  60  *      Author: Avadis Tevanian, Jr. 
  62  *      This file contains the structure definitions for tasks. 
  66  * Copyright (c) 1993 The University of Utah and 
  67  * the Computer Systems Laboratory (CSL).  All rights reserved. 
  69  * Permission to use, copy, modify and distribute this software and its 
  70  * documentation is hereby granted, provided that both the copyright 
  71  * notice and this permission notice appear in all copies of the 
  72  * software, derivative works or modified versions, and any portions 
  73  * thereof, and that both notices appear in supporting documentation. 
  75  * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS 
  76  * IS" CONDITION.  THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF 
  77  * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 
  79  * CSL requests users of this software to return to csl-dist@cs.utah.edu any 
  80  * improvements that they make and grant CSL redistribution rights. 
  84  * NOTICE: This file was modified by McAfee Research in 2004 to introduce 
  85  * support for mandatory and extensible security protections.  This notice 
  86  * is included in support of clause 2.2 (b) of the Apple Public License, 
  88  * Copyright (c) 2005 SPARTA, Inc. 
  94 #include <kern/kern_types.h> 
  95 #include <mach/mach_types.h> 
  96 #include <sys/cdefs.h> 
  98 #ifdef  MACH_KERNEL_PRIVATE 
 100 #include <mach/boolean.h> 
 101 #include <mach/port.h> 
 102 #include <mach/time_value.h> 
 103 #include <mach/message.h> 
 104 #include <mach/mach_param.h> 
 105 #include <mach/task_info.h> 
 106 #include <mach/exception_types.h> 
 107 #include <mach/vm_statistics.h> 
 108 #include <machine/task.h> 
 110 #include <kern/cpu_data.h> 
 111 #include <kern/queue.h> 
 112 #include <kern/exception.h> 
 113 #include <kern/locks.h> 
 114 #include <security/_label.h> 
 115 #include <ipc/ipc_port.h> 
 116 #endif /* MACH_KERNEL_PRIVATE */ 
 118 #ifdef XNU_KERNEL_PRIVATE 
 120 #include <mach/sfi_class.h> 
 122 /* defns for task->rsu_controldata */ 
 123 #define TASK_POLICY_CPU_RESOURCE_USAGE          0 
 124 #define TASK_POLICY_WIREDMEM_RESOURCE_USAGE     1 
 125 #define TASK_POLICY_VIRTUALMEM_RESOURCE_USAGE   2 
 126 #define TASK_POLICY_DISK_RESOURCE_USAGE         3 
 127 #define TASK_POLICY_NETWORK_RESOURCE_USAGE      4 
 128 #define TASK_POLICY_POWER_RESOURCE_USAGE        5 
 130 #define TASK_POLICY_RESOURCE_USAGE_COUNT 6 
 132 #define TASK_POLICY_CPUMON_DISABLE                      0xFF 
 133 #define TASK_POLICY_CPUMON_DEFAULTS                     0xFE 
 135 /* Resource usage/low resource attributes */ 
 136 #define TASK_POLICY_RESOURCE_ATTRIBUTE_NONE             0x00 
 137 #define TASK_POLICY_RESOURCE_ATTRIBUTE_THROTTLE         0x01 
 138 #define TASK_POLICY_RESOURCE_ATTRIBUTE_SUSPEND          0x02 
 139 #define TASK_POLICY_RESOURCE_ATTRIBUTE_TERMINATE        0x03 
 140 #define TASK_POLICY_RESOURCE_ATTRIBUTE_NOTIFY_KQ        0x04 
 141 #define TASK_POLICY_RESOURCE_ATTRIBUTE_NOTIFY_EXC       0x05 
 142 #define TASK_POLICY_RESOURCE_ATTRIBUTE_DEFAULT          TASK_POLICY_RESOURCE_ATTRIBUTE_NONE 
 144 #endif /* XNU_KERNEL_PRIVATE */ 
 146 #ifdef MACH_KERNEL_PRIVATE 
 149 #include <kern/thread.h> 
 152 #include <atm/atm_internal.h> 
 155 struct _cpu_time_qos_stats 
{ 
 156         uint64_t cpu_time_qos_default
; 
 157         uint64_t cpu_time_qos_maintenance
; 
 158         uint64_t cpu_time_qos_background
; 
 159         uint64_t cpu_time_qos_utility
; 
 160         uint64_t cpu_time_qos_legacy
; 
 161         uint64_t cpu_time_qos_user_initiated
; 
 162         uint64_t cpu_time_qos_user_interactive
; 
 166 #include <bank/bank_internal.h> 
 170         /* Synchronization/destruction information */ 
 171         decl_lck_mtx_data(,lock
)                /* Task's lock */ 
 172         uint32_t        ref_count
;      /* Number of references to me */ 
 173         boolean_t       active
;         /* Task has not been terminated */ 
 174         boolean_t       halting
;        /* Task is being halted */ 
 177         vm_map_t        map
;            /* Address space description */ 
 178         queue_chain_t   tasks
;  /* global list of tasks */ 
 179         void            *user_data
;     /* Arbitrary data settable via IPC */ 
 181 #if defined(CONFIG_SCHED_MULTIQ) 
 182         sched_group_t sched_group
; 
 183 #endif /* defined(CONFIG_SCHED_MULTIQ) */ 
 185         /* Threads in this task */ 
 186         queue_head_t            threads
; 
 188         processor_set_t         pset_hint
; 
 189         struct affinity_space   
*affinity_space
; 
 192         uint32_t                active_thread_count
; 
 193         int                     suspend_count
;  /* Internal scheduling only */ 
 195         /* User-visible scheduling information */ 
 196         integer_t               user_stop_count
;        /* outstanding stops */ 
 197         integer_t               legacy_stop_count
;      /* outstanding legacy stops */ 
 199         integer_t               priority
;                       /* base priority for threads */ 
 200         integer_t               max_priority
;           /* maximum priority for threads */ 
 202         integer_t               importance
;             /* priority offset (BSD 'nice' value) */ 
 204         /* Task security and audit tokens */ 
 205         security_token_t sec_token
; 
 206         audit_token_t   audit_token
; 
 209         uint64_t                total_user_time
;        /* terminated threads only */ 
 210         uint64_t                total_system_time
; 
 216         decl_lck_mtx_data(,itk_lock_data
) 
 217         struct ipc_port 
*itk_self
;      /* not a right, doesn't hold ref */ 
 218         struct ipc_port 
*itk_nself
;     /* not a right, doesn't hold ref */ 
 219         struct ipc_port 
*itk_sself
;     /* a send right */ 
 220         struct exception_action exc_actions
[EXC_TYPES_COUNT
]; 
 221                                         /* a send right each valid element  */ 
 222         struct ipc_port 
*itk_host
;      /* a send right */ 
 223         struct ipc_port 
*itk_bootstrap
; /* a send right */ 
 224         struct ipc_port 
*itk_seatbelt
;  /* a send right */ 
 225         struct ipc_port 
*itk_gssd
;      /* yet another send right */ 
 226         struct ipc_port 
*itk_debug_control
; /* send right for debugmode communications */ 
 227         struct ipc_port 
*itk_task_access
; /* and another send right */  
 228         struct ipc_port 
*itk_resume
;    /* a receive right to resume this task */ 
 229         struct ipc_port 
*itk_registered
[TASK_PORT_REGISTER_MAX
]; 
 230                                         /* all send rights */ 
 232         struct ipc_space 
*itk_space
; 
 234         /* Synchronizer ownership information */ 
 235         queue_head_t    semaphore_list
;         /* list of owned semaphores   */ 
 236         int             semaphores_owned
;       /* number of semaphores owned */ 
 240         unsigned int    priv_flags
;                     /* privilege resource flags */ 
 241 #define VM_BACKING_STORE_PRIV   0x1 
 245         integer_t faults
;              /* faults counter */ 
 246         integer_t pageins
;             /* pageins counter */ 
 247         integer_t cow_faults
;          /* copy on write fault counter */ 
 248         integer_t messages_sent
;       /* messages sent counter */ 
 249         integer_t messages_received
;   /* messages received counter */ 
 250         integer_t syscalls_mach
;       /* mach system call counter */ 
 251         integer_t syscalls_unix
;       /* unix system call counter */ 
 252                 uint32_t  c_switch
;                        /* total context switches */ 
 253                 uint32_t  p_switch
;                        /* total processor switches */ 
 254                 uint32_t  ps_switch
;               /* total pset switches */ 
 256         zinfo_usage_t tkm_zinfo
;        /* per-task, per-zone usage statistics */ 
 261         struct vm_shared_region         
*shared_region
; 
 262         volatile uint32_t t_flags
;                                      /* general-purpose task flags protected by task_lock (TL) */ 
 263 #define TF_64B_ADDR             0x00000001                              /* task has 64-bit addressing */ 
 264 #define TF_64B_DATA             0x00000002                              /* task has 64-bit data registers */ 
 265 #define TF_CPUMON_WARNING       0x00000004                              /* task has at least one thread in CPU usage warning zone */ 
 266 #define TF_WAKEMON_WARNING      0x00000008                              /* task is in wakeups monitor warning zone */ 
 267 #define TF_TELEMETRY            (TF_CPUMON_WARNING | TF_WAKEMON_WARNING) /* task is a telemetry participant */ 
 268 #define TF_GPU_DENIED           0x00000010                              /* task is not allowed to access the GPU */ 
 270 #define task_has_64BitAddr(task)        \ 
 271          (((task)->t_flags & TF_64B_ADDR) != 0) 
 272 #define task_set_64BitAddr(task)        \ 
 273          ((task)->t_flags |= TF_64B_ADDR) 
 274 #define task_clear_64BitAddr(task)      \ 
 275          ((task)->t_flags &= ~TF_64B_ADDR) 
 276 #define task_has_64BitData(task)    \ 
 277          (((task)->t_flags & TF_64B_DATA) != 0) 
 279         mach_vm_address_t       all_image_info_addr
; /* dyld __all_image_info     */ 
 280         mach_vm_size_t          all_image_info_size
; /* section location and size */ 
 282 #if CONFIG_COUNTERS || KPERF 
 283 #define TASK_PMC_FLAG                   0x1     /* Bit in "t_chud" signifying PMC interest */ 
 284 #define TASK_KPC_FORCED_ALL_CTRS        0x2     /* Bit in "t_chud" signifying KPC forced all counters */ 
 286         uint32_t t_chud
;                /* CHUD flags, used for Shark */ 
 289         boolean_t pidsuspended
; /* pid_suspend called; no threads can execute */ 
 290         boolean_t frozen
;       /* frozen; private resident pages committed to swap */ 
 291         boolean_t changing_freeze_state
;        /* in the process of freezing or thawing */ 
 292         uint16_t policy_ru_cpu          
:4, 
 293                  policy_ru_cpu_ext      
:4, 
 295                  applied_ru_cpu_ext     
:4; 
 296         uint8_t  rusage_cpu_flags
; 
 297         uint8_t  rusage_cpu_percentage
;         /* Task-wide CPU limit percentage */ 
 298         uint64_t rusage_cpu_interval
;           /* Task-wide CPU limit interval */ 
 299         uint8_t  rusage_cpu_perthr_percentage
;  /* Per-thread CPU limit percentage */ 
 300         uint64_t rusage_cpu_perthr_interval
;    /* Per-thread CPU limit interval */ 
 301         uint64_t rusage_cpu_deadline
; 
 302         thread_call_t rusage_cpu_callt
; 
 305         struct atm_task_descriptor 
*atm_context
;  /* pointer to per task atm descriptor */ 
 308         struct bank_task 
*bank_context
;  /* pointer to per task bank structure */ 
 311 #if IMPORTANCE_INHERITANCE 
 312         struct ipc_importance_task  
*task_imp_base
;     /* Base of IPC importance chain */ 
 313 #endif /* IMPORTANCE_INHERITANCE */ 
 315         vm_extmod_statistics_data_t     extmod_statistics
; 
 318         int8_t          suspends_outstanding
;   /* suspends this task performed in excess of resumes */ 
 321         struct task_requested_policy requested_policy
; 
 322         struct task_effective_policy effective_policy
; 
 323         struct task_pended_policy    pended_policy
; 
 326          * Can be merged with imp_donor bits, once the IMPORTANCE_INHERITANCE macro goes away. 
 328         uint32_t        low_mem_notified_warn     
:1,    /* warning low memory notification is sent to the task */ 
 329                         low_mem_notified_critical 
:1,    /* critical low memory notification is sent to the task */ 
 330                         purged_memory_warn        
:1,    /* purgeable memory of the task is purged for warning level pressure */ 
 331                         purged_memory_critical    
:1,    /* purgeable memory of the task is purged for critical level pressure */ 
 332                         mem_notify_reserved       
:28;   /* reserved for future use */ 
 334         io_stat_info_t  task_io_stats
; 
 337          * The cpu_time_qos_stats fields are protected by the task lock 
 339         struct _cpu_time_qos_stats      cpu_time_qos_stats
; 
 341         /* Statistics accumulated for terminated threads from this task */ 
 342         uint32_t        task_timer_wakeups_bin_1
; 
 343         uint32_t        task_timer_wakeups_bin_2
; 
 344         uint64_t        task_gpu_ns
; 
 346         /* # of purgeable volatile VM objects owned by this task: */ 
 347         int             task_volatile_objects
; 
 348         /* # of purgeable but not volatile VM objects owned by this task: */ 
 349         int             task_nonvolatile_objects
; 
 350         boolean_t       task_purgeable_disowning
; 
 351         boolean_t       task_purgeable_disowned
; 
 353         /* Coalition is set in task_create_internal and unset in task_deallocate_internal, so it can be referenced without the task lock. */ 
 354         coalition_t     coalition
;              /* coalition this task belongs to */ 
 355         /* These fields are protected by coalition->lock, not the task lock. */ 
 356         queue_chain_t   coalition_tasks
;        /* list of tasks in the coalition */ 
 359         void *hv_task_target
; /* hypervisor virtual machine object associated with this task */ 
 360 #endif /* HYPERVISOR */ 
 363 #define task_lock(task)                 lck_mtx_lock(&(task)->lock) 
 364 #define task_lock_assert_owned(task)    lck_mtx_assert(&(task)->lock, LCK_MTX_ASSERT_OWNED) 
 365 #define task_lock_try(task)             lck_mtx_try_lock(&(task)->lock) 
 366 #define task_unlock(task)               lck_mtx_unlock(&(task)->lock) 
 368 #define itk_lock_init(task)     lck_mtx_init(&(task)->itk_lock_data, &ipc_lck_grp, &ipc_lck_attr) 
 369 #define itk_lock_destroy(task)  lck_mtx_destroy(&(task)->itk_lock_data, &ipc_lck_grp) 
 370 #define itk_lock(task)          lck_mtx_lock(&(task)->itk_lock_data) 
 371 #define itk_unlock(task)        lck_mtx_unlock(&(task)->itk_lock_data) 
 373 #define TASK_REFERENCE_LEAK_DEBUG 0 
 375 #if TASK_REFERENCE_LEAK_DEBUG 
 376 extern void task_reference_internal(task_t task
); 
 377 extern uint32_t task_deallocate_internal(task_t task
); 
 379 #define task_reference_internal(task)           \ 
 380                         (void)hw_atomic_add(&(task)->ref_count, 1) 
 382 #define task_deallocate_internal(task)          \ 
 383                         hw_atomic_sub(&(task)->ref_count, 1) 
 386 #define task_reference(task)                                    \ 
 388         if ((task) != TASK_NULL)                                        \ 
 389                 task_reference_internal(task);                  \ 
 392 extern kern_return_t    
kernel_task_create( 
 394                                                         vm_offset_t             map_base
, 
 398 /* Initialize task module */ 
 399 extern void             task_init(void); 
 401 /* coalition_init() calls this to initialize ledgers before task_init() */ 
 402 extern void             init_task_ledgers(void); 
 404 #define current_task_fast()     (current_thread()->task) 
 405 #define current_task()          current_task_fast() 
 407 extern lck_attr_t      task_lck_attr
; 
 408 extern lck_grp_t       task_lck_grp
; 
 410 #define QOS_OVERRIDE_MODE_OVERHANG_PEAK 0 
 411 #define QOS_OVERRIDE_MODE_IGNORE_OVERRIDE 1 
 412 #define QOS_OVERRIDE_MODE_FINE_GRAINED_OVERRIDE 2 
 413 #define QOS_OVERRIDE_MODE_FINE_GRAINED_OVERRIDE_BUT_IGNORE_DISPATCH 3 
 414 #define QOS_OVERRIDE_MODE_FINE_GRAINED_OVERRIDE_BUT_SINGLE_MUTEX_OVERRIDE 4 
 416 extern uint32_t qos_override_mode
; 
 418 #else   /* MACH_KERNEL_PRIVATE */ 
 422 extern task_t   
current_task(void); 
 424 extern void             task_reference(task_t   task
); 
 428 #endif  /* MACH_KERNEL_PRIVATE */ 
 432 #ifdef  XNU_KERNEL_PRIVATE 
 434 /* Hold all threads in a task */ 
 435 extern kern_return_t    
task_hold( 
 438 /* Wait for task to stop running, either just to get off CPU or to cease being runnable */ 
 439 extern kern_return_t    
task_wait( 
 441                                                         boolean_t       until_not_runnable
); 
 443 /* Release hold on all threads in a task */ 
 444 extern kern_return_t    
task_release( 
 447 /* Suspends a task by placing a hold on its threads */ 
 448 extern kern_return_t    
task_pidsuspend( 
 450 extern kern_return_t    
task_pidsuspend_locked( 
 453 /* Resumes a previously paused task */ 
 454 extern kern_return_t    
task_pidresume( 
 457 extern kern_return_t    
task_send_trace_memory( 
 464 /* Freeze a task's resident pages */ 
 465 extern kern_return_t    
task_freeze( 
 467                                                         uint32_t        *purgeable_count
, 
 468                                                         uint32_t        *wired_count
, 
 469                                                         uint32_t        *clean_count
, 
 470                                                         uint32_t        *dirty_count
, 
 471                                                         uint32_t        dirty_budget
, 
 473                                                         boolean_t       walk_only
); 
 475 /* Thaw a currently frozen task */ 
 476 extern kern_return_t    
task_thaw( 
 479 #endif /* CONFIG_FREEZE */ 
 481 /* Halt all other threads in the current task */ 
 482 extern kern_return_t    
task_start_halt( 
 485 /* Wait for other threads to halt and free halting task resources */ 
 486 extern void             task_complete_halt( 
 489 extern kern_return_t    
task_terminate_internal( 
 492 extern kern_return_t    
task_create_internal( 
 494                                                         coalition_t     parent_coalition
, 
 495                                                         boolean_t       inherit_memory
, 
 497                                                         task_t          
*child_task
);   /* OUT */ 
 499 extern kern_return_t    
task_importance( 
 501                                                         integer_t               importance
); 
 503 extern void             task_power_info_locked( 
 505                                                         task_power_info_t       info
, 
 506                                                gpu_energy_data_t gpu_energy
); 
 508 extern uint64_t         task_gpu_utilisation( 
 511 extern void             task_vtimer_set( 
 515 extern void             task_vtimer_clear( 
 519 extern void             task_vtimer_update( 
 522                                         uint32_t        *microsecs
); 
 524 #define TASK_VTIMER_USER                0x01 
 525 #define TASK_VTIMER_PROF                0x02 
 526 #define TASK_VTIMER_RLIM                0x04 
 528 extern void             task_set_64bit( 
 532 extern void             task_backing_store_privileged( 
 535 extern void             task_set_dyld_info( 
 537                                         mach_vm_address_t addr
, 
 538                                         mach_vm_size_t size
); 
 540 /* Get number of activations in a task */ 
 541 extern int              get_task_numacts( 
 544 extern int get_task_numactivethreads(task_t task
); 
 546 /* JMM - should just be temporary (implementation in bsd_kern still) */ 
 547 extern void     set_bsdtask_info(task_t
,void *); 
 548 extern vm_map_t 
get_task_map_reference(task_t
); 
 549 extern vm_map_t 
swap_task_map(task_t
, thread_t
, vm_map_t
, boolean_t
); 
 550 extern pmap_t   
get_task_pmap(task_t
); 
 551 extern uint64_t get_task_resident_size(task_t
); 
 552 extern uint64_t get_task_compressed(task_t
); 
 553 extern uint64_t get_task_resident_max(task_t
); 
 554 extern uint64_t get_task_phys_footprint(task_t
); 
 555 extern uint64_t get_task_phys_footprint_max(task_t
); 
 556 extern uint64_t get_task_purgeable_size(task_t
); 
 557 extern uint64_t get_task_cpu_time(task_t
); 
 559 extern kern_return_t 
task_set_phys_footprint_limit_internal(task_t
, int, int *, boolean_t
); 
 560 extern kern_return_t 
task_get_phys_footprint_limit(task_t task
, int *limit_mb
); 
 562 extern boolean_t        
is_kerneltask(task_t task
); 
 564 extern kern_return_t 
check_actforsig(task_t task
, thread_t thread
, int setast
); 
 566 extern kern_return_t 
machine_task_get_state( 
 569                                         thread_state_t state
,  
 570                                         mach_msg_type_number_t 
*state_count
); 
 572 extern kern_return_t 
machine_task_set_state( 
 575                                         thread_state_t state
,  
 576                                         mach_msg_type_number_t state_count
); 
 578 extern void machine_task_terminate(task_t task
); 
 580 struct _task_ledger_indices 
{ 
 588         int alternate_accounting
; 
 590         int internal_compressed
; 
 591         int purgeable_volatile
; 
 592         int purgeable_nonvolatile
; 
 593         int purgeable_volatile_compressed
; 
 594         int purgeable_nonvolatile_compressed
; 
 595         int platform_idle_wakeups
; 
 596         int interrupt_wakeups
; 
 597         int sfi_wait_times
[MAX_SFI_CLASS_ID
]; 
 599         int cpu_time_billed_to_me
; 
 600         int cpu_time_billed_to_others
; 
 603 extern struct _task_ledger_indices task_ledgers
; 
 605 /* Begin task_policy */ 
 608 #define TASK_POLICY_DISABLE             0x0 
 609 #define TASK_POLICY_ENABLE              0x1 
 612 #define TASK_POLICY_INTERNAL            0x0 
 613 #define TASK_POLICY_EXTERNAL            0x1 
 614 #define TASK_POLICY_ATTRIBUTE           0x2 
 617 #define TASK_POLICY_TASK                0x4 
 618 #define TASK_POLICY_THREAD              0x8 
 620 /* flavors (also DBG_IMPORTANCE subclasses  0x20 - 0x3F) */ 
 622 /* internal or external, thread or task */ 
 623 #define TASK_POLICY_DARWIN_BG           0x21 
 624 #define TASK_POLICY_IOPOL               0x22 
 625 #define TASK_POLICY_IO                  0x23 
 626 #define TASK_POLICY_PASSIVE_IO          0x24 
 628 /* internal, task only */ 
 629 #define TASK_POLICY_DARWIN_BG_IOPOL     0x27 
 631 /* task-only attributes */ 
 632 #define TASK_POLICY_TAL                 0x28 
 633 #define TASK_POLICY_BOOST               0x29 
 634 #define TASK_POLICY_ROLE                0x2A 
 635 #define TASK_POLICY_SUPPRESSED_CPU      0x2B 
 636 #define TASK_POLICY_TERMINATED          0x2C 
 637 #define TASK_POLICY_NEW_SOCKETS_BG      0x2D 
 638 #define TASK_POLICY_LOWPRI_CPU          0x2E 
 639 #define TASK_POLICY_LATENCY_QOS         0x2F 
 640 #define TASK_POLICY_THROUGH_QOS         0x30 
 641 #define TASK_POLICY_WATCHERS_BG         0x31 
 643 #define TASK_POLICY_SFI_MANAGED         0x34 
 644 #define TASK_POLICY_ALL_SOCKETS_BG      0x37 
 646 #define TASK_POLICY_BASE_LATENCY_AND_THROUGHPUT_QOS  0x39 /* latency as value1, throughput as value2 */ 
 647 #define TASK_POLICY_OVERRIDE_LATENCY_AND_THROUGHPUT_QOS  0x3A /* latency as value1, throughput as value2 */ 
 649 /* thread-only attributes */ 
 650 #define TASK_POLICY_PIDBIND_BG          0x32 
 651 #define TASK_POLICY_WORKQ_BG            0x33 
 652 #define TASK_POLICY_QOS                 0x35 
 653 #define TASK_POLICY_QOS_OVERRIDE        0x36 
 654 #define TASK_POLICY_QOS_AND_RELPRIO     0x38 /* QoS as value1, relative priority as value2 */ 
 656 #define TASK_POLICY_MAX                 0x3F 
 658 /* The main entrance to task policy is this function */ 
 659 extern void proc_set_task_policy(task_t task
, thread_t thread
, int category
, int flavor
, int value
); 
 660 extern int  proc_get_task_policy(task_t task
, thread_t thread
, int category
, int flavor
); 
 662 /* For attributes that have two scalars as input/output */ 
 663 extern void proc_set_task_policy2(task_t task
, thread_t thread
, int category
, int flavor
, int value1
, int value2
); 
 664 extern void proc_get_task_policy2(task_t task
, thread_t thread
, int category
, int flavor
, int *value1
, int *value2
); 
 666 /* For use by kernel threads and others who don't hold a reference on the target thread */ 
 667 extern void proc_set_task_policy_thread(task_t task
, uint64_t tid
, int category
, int flavor
, int value
); 
 669 extern void proc_set_task_spawnpolicy(task_t task
, int apptype
, int qos_clamp
, 
 670                                       ipc_port_t 
* portwatch_ports
, int portwatch_count
); 
 672 extern void task_set_main_thread_qos(task_t task
, thread_t main_thread
); 
 674 /* IO Throttle tiers */ 
 675 #define THROTTLE_LEVEL_NONE     -1 
 676 #define THROTTLE_LEVEL_TIER0     0      /* IOPOL_NORMAL, IOPOL_DEFAULT, IOPOL_PASSIVE */ 
 678 #define THROTTLE_LEVEL_THROTTLED 1 
 679 #define THROTTLE_LEVEL_TIER1     1      /* IOPOL_STANDARD */ 
 680 #define THROTTLE_LEVEL_TIER2     2      /* IOPOL_UTILITY */ 
 681 #define THROTTLE_LEVEL_TIER3     3      /* IOPOL_THROTTLE */ 
 683 #define THROTTLE_LEVEL_START     0 
 684 #define THROTTLE_LEVEL_END       3 
 686 #define THROTTLE_LEVEL_COMPRESSOR_TIER0         THROTTLE_LEVEL_TIER0 
 687 #define THROTTLE_LEVEL_COMPRESSOR_TIER1         THROTTLE_LEVEL_TIER1 
 688 #define THROTTLE_LEVEL_COMPRESSOR_TIER2         THROTTLE_LEVEL_TIER2 
 690 #define THROTTLE_LEVEL_PAGEOUT_THROTTLED        THROTTLE_LEVEL_TIER2 
 691 #define THROTTLE_LEVEL_PAGEOUT_UNTHROTTLED      THROTTLE_LEVEL_TIER1 
 694 #define IOSCHED_METADATA_TIER                   THROTTLE_LEVEL_TIER1 
 695 #endif /* CONFIG_IOSCHED */ 
 697 extern int proc_apply_workq_bgthreadpolicy(thread_t thread
); 
 698 extern int proc_restore_workq_bgthreadpolicy(thread_t thread
); 
 700 extern int proc_get_darwinbgstate(task_t task
, uint32_t *flagsp
); 
 701 extern boolean_t 
proc_task_is_tal(task_t task
); 
 702 extern integer_t 
task_grab_latency_qos(task_t task
); 
 703 extern void task_policy_create(task_t task
, int parent_boosted
); 
 704 extern void thread_policy_create(thread_t thread
); 
 707  * for IPC importance hooks into task policy 
 709 typedef struct task_pend_token 
{ 
 710         uint32_t        tpt_update_sockets      
:1, 
 711                         tpt_update_timers       
:1, 
 712                         tpt_update_watchers     
:1, 
 713                         tpt_update_live_donor   
:1, 
 714                         tpt_update_coal_sfi     
:1; 
 715 } *task_pend_token_t
; 
 717 extern void task_policy_update_complete_unlocked(task_t task
, thread_t thread
, task_pend_token_t pend_token
); 
 718 extern void task_update_boost_locked(task_t task
, boolean_t boost_active
, task_pend_token_t pend_token
); 
 719 extern void task_set_boost_locked(task_t task
, boolean_t boost_active
); 
 722  * Get effective policy 
 723  * Only for use by relevant subsystem, should never be passed into a setter! 
 726 extern int proc_get_effective_task_policy(task_t task
, int flavor
); 
 727 extern int proc_get_effective_thread_policy(thread_t thread
, int flavor
); 
 729 /* temporary compatibility */ 
 730 int proc_setthread_saved_importance(thread_t thread
, int importance
); 
 732 int proc_get_task_ruse_cpu(task_t task
, uint32_t *policyp
, uint8_t *percentagep
, uint64_t *intervalp
, uint64_t *deadlinep
); 
 733 int proc_set_task_ruse_cpu(task_t task
, uint32_t policy
, uint8_t percentage
, uint64_t interval
, uint64_t deadline
, int cpumon_entitled
); 
 734 int proc_clear_task_ruse_cpu(task_t task
, int cpumon_entitled
); 
 735 thread_t 
task_findtid(task_t
, uint64_t); 
 736 void set_thread_iotier_override(thread_t
, int policy
); 
 738 boolean_t 
proc_thread_qos_add_override(task_t task
, thread_t thread
, uint64_t tid
, int override_qos
, boolean_t first_override_for_resource
, user_addr_t resource
, int resource_type
); 
 739 boolean_t 
proc_thread_qos_remove_override(task_t task
, thread_t thread
, uint64_t tid
, user_addr_t resource
, int resource_type
); 
 740 boolean_t 
proc_thread_qos_reset_override(task_t task
, thread_t thread
, uint64_t tid
, user_addr_t resource
, int resource_type
); 
 741 void proc_thread_qos_deallocate(thread_t thread
); 
 743 #define TASK_RUSECPU_FLAGS_PROC_LIMIT                   0x01 
 744 #define TASK_RUSECPU_FLAGS_PERTHR_LIMIT                 0x02 
 745 #define TASK_RUSECPU_FLAGS_DEADLINE                     0x04 
 746 #define TASK_RUSECPU_FLAGS_FATAL_CPUMON                 0x08    /* CPU usage monitor violations are fatal */ 
 747 #define TASK_RUSECPU_FLAGS_FATAL_WAKEUPSMON             0x10    /* wakeups monitor violations are fatal */ 
 748 #define TASK_RUSECPU_FLAGS_PHYS_FOOTPRINT_EXCEPTION     0x20    /* exceeding physical footprint generates EXC_RESOURCE */ 
 750 /* BSD call back functions */ 
 751 extern int proc_apply_resource_actions(void * p
, int type
, int action
); 
 752 extern int proc_restore_resource_actions(void * p
, int type
, int action
); 
 753 extern int task_restore_resource_actions(task_t task
, int type
); 
 755 extern int task_clear_cpuusage(task_t task
, int cpumon_entitled
); 
 757 extern kern_return_t 
task_wakeups_monitor_ctl(task_t task
, uint32_t *rate_hz
, int32_t *flags
); 
 758 extern kern_return_t 
task_cpu_usage_monitor_ctl(task_t task
, uint32_t *flags
); 
 761 extern void task_importance_mark_donor(task_t task
, boolean_t donating
); 
 762 extern void task_importance_mark_live_donor(task_t task
, boolean_t donating
); 
 763 extern void task_importance_mark_receiver(task_t task
, boolean_t receiving
); 
 764 extern void task_importance_mark_denap_receiver(task_t task
, boolean_t denap
); 
 765 extern void task_importance_reset(task_t task
); 
 766 extern void task_atm_reset(task_t task
); 
 768 #if IMPORTANCE_INHERITANCE 
 770 extern boolean_t 
task_is_importance_donor(task_t task
); 
 771 extern boolean_t 
task_is_marked_importance_donor(task_t task
); 
 772 extern boolean_t 
task_is_marked_live_importance_donor(task_t task
); 
 774 extern boolean_t 
task_is_importance_receiver(task_t task
); 
 775 extern boolean_t 
task_is_marked_importance_receiver(task_t task
); 
 777 extern boolean_t 
task_is_importance_denap_receiver(task_t task
); 
 778 extern boolean_t 
task_is_marked_importance_denap_receiver(task_t task
); 
 780 extern boolean_t 
task_is_importance_receiver_type(task_t task
); 
 782 extern int task_importance_hold_watchport_assertion(task_t target_task
, uint32_t count
); 
 783 extern int task_importance_hold_internal_assertion(task_t target_task
, uint32_t count
); 
 784 extern int task_importance_drop_internal_assertion(task_t target_task
, uint32_t count
); 
 786 extern int task_importance_hold_file_lock_assertion(task_t target_task
, uint32_t count
); 
 787 extern int task_importance_drop_file_lock_assertion(task_t target_task
, uint32_t count
); 
 789 extern int task_importance_hold_legacy_external_assertion(task_t target_task
, uint32_t count
); 
 790 extern int task_importance_drop_legacy_external_assertion(task_t target_task
, uint32_t count
); 
 792 #endif /* IMPORTANCE_INHERITANCE */ 
 794 extern boolean_t 
task_has_been_notified(task_t task
, int pressurelevel
); 
 795 extern boolean_t 
task_used_for_purging(task_t task
, int pressurelevel
); 
 796 extern void task_mark_has_been_notified(task_t task
, int pressurelevel
); 
 797 extern void task_mark_used_for_purging(task_t task
, int pressurelevel
); 
 798 extern void task_clear_has_been_notified(task_t task
, int pressurelevel
); 
 799 extern void task_clear_used_for_purging(task_t task
); 
 800 extern int task_importance_estimate(task_t task
); 
 803  * This should only be used for debugging. 
 804  * pid is stored in audit_token by set_security_token(). 
 806 #define audit_token_pid_from_task(task)  ((task)->audit_token.val[5]) 
 808 /* End task_policy */ 
 810 extern kern_return_t 
task_purge_volatile_memory(task_t task
); 
 812 extern void      task_set_gpu_denied(task_t task
, boolean_t denied
); 
 813 extern boolean_t 
task_is_gpu_denied(task_t task
); 
 815 #endif  /* XNU_KERNEL_PRIVATE */ 
 817 #ifdef  KERNEL_PRIVATE 
 819 extern void     *get_bsdtask_info(task_t
); 
 820 extern void     *get_bsdthreadtask_info(thread_t
); 
 821 extern vm_map_t 
get_task_map(task_t
); 
 822 extern ledger_t 
get_task_ledger(task_t
); 
 824 extern boolean_t 
get_task_pidsuspended(task_t
); 
 825 extern boolean_t 
get_task_frozen(task_t
); 
 827 /* Convert from a task to a port */ 
 828 extern ipc_port_t 
convert_task_to_port(task_t
); 
 829 extern ipc_port_t 
convert_task_name_to_port(task_name_t
); 
 830 extern ipc_port_t 
convert_task_suspension_token_to_port(task_suspension_token_t task
); 
 832 /* Convert from a port (in this case, an SO right to a task's resume port) to a task. */ 
 833 extern task_suspension_token_t 
convert_port_to_task_suspension_token(ipc_port_t port
); 
 835 extern boolean_t 
task_suspension_notify(mach_msg_header_t 
*); 
 837 #endif  /* KERNEL_PRIVATE */ 
 839 extern task_t   kernel_task
; 
 841 extern void             task_deallocate( 
 844 extern void             task_name_deallocate( 
 845                                         task_name_t             task_name
); 
 847 extern void             task_suspension_token_deallocate( 
 848                                         task_suspension_token_t token
); 
 851 #endif  /* _KERN_TASK_H_ */