1/* 2 * Copyright (c) 2000-2010 Apple Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 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. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 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. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28/* 29 * @OSF_FREE_COPYRIGHT@ 30 */ 31/* 32 * Mach Operating System 33 * Copyright (c) 1991,1990,1989,1988 Carnegie Mellon University 34 * All Rights Reserved. 35 * 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. 41 * 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. 45 * 46 * Carnegie Mellon requests users of this software to return to 47 * 48 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 49 * School of Computer Science 50 * Carnegie Mellon University 51 * Pittsburgh PA 15213-3890 52 * 53 * any improvements or extensions that they make and grant Carnegie Mellon 54 * the rights to redistribute these changes. 55 */ 56/* 57 */ 58/* 59 * File: task.h 60 * Author: Avadis Tevanian, Jr. 61 * 62 * This file contains the structure definitions for tasks. 63 * 64 */ 65/* 66 * Copyright (c) 1993 The University of Utah and 67 * the Computer Systems Laboratory (CSL). All rights reserved. 68 * 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. 74 * 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. 78 * 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. 81 * 82 */ 83/* 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, 87 * Version 2.0. 88 * Copyright (c) 2005 SPARTA, Inc. 89 */ 90 91#ifndef _KERN_TASK_H_ 92#define _KERN_TASK_H_ 93 94#include <kern/kern_types.h> 95#include <mach/mach_types.h> 96#include <sys/cdefs.h> 97 98#ifdef MACH_KERNEL_PRIVATE 99 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> 109 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 */ 117 118#ifdef XNU_KERNEL_PRIVATE 119 120#include <mach/sfi_class.h> 121 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 129 130#define TASK_POLICY_RESOURCE_USAGE_COUNT 6 131 132#define TASK_POLICY_CPUMON_DISABLE 0xFF 133#define TASK_POLICY_CPUMON_DEFAULTS 0xFE 134 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 143 144#endif /* XNU_KERNEL_PRIVATE */ 145 146#ifdef MACH_KERNEL_PRIVATE 147 148 149#include <kern/thread.h> 150 151#ifdef CONFIG_ATM 152#include <atm/atm_internal.h> 153#endif 154 155struct _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; 163}; 164 165#ifdef CONFIG_BANK 166#include <bank/bank_internal.h> 167#endif 168 169struct task { 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 */ 175 176 /* Miscellaneous */ 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 */ 180 181#if defined(CONFIG_SCHED_MULTIQ) 182 sched_group_t sched_group; 183#endif /* defined(CONFIG_SCHED_MULTIQ) */ 184 185 /* Threads in this task */ 186 queue_head_t threads; 187 188 processor_set_t pset_hint; 189 struct affinity_space *affinity_space; 190 191 int thread_count; 192 uint32_t active_thread_count; 193 int suspend_count; /* Internal scheduling only */ 194 195 /* User-visible scheduling information */ 196 integer_t user_stop_count; /* outstanding stops */ 197 integer_t legacy_stop_count; /* outstanding legacy stops */ 198 199 integer_t priority; /* base priority for threads */ 200 integer_t max_priority; /* maximum priority for threads */ 201 202 integer_t importance; /* priority offset (BSD 'nice' value) */ 203 204 /* Task security and audit tokens */ 205 security_token_t sec_token; 206 audit_token_t audit_token; 207 208 /* Statistics */ 209 uint64_t total_user_time; /* terminated threads only */ 210 uint64_t total_system_time; 211 212 /* Virtual timers */ 213 uint32_t vtimers; 214 215 /* IPC structures */ 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 */ 231 232 struct ipc_space *itk_space; 233 234 /* Synchronizer ownership information */ 235 queue_head_t semaphore_list; /* list of owned semaphores */ 236 int semaphores_owned; /* number of semaphores owned */ 237 238 ledger_t ledger; 239 240 unsigned int priv_flags; /* privilege resource flags */ 241#define VM_BACKING_STORE_PRIV 0x1 242 243 MACHINE_TASK 244 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 */ 255 256 zinfo_usage_t tkm_zinfo; /* per-task, per-zone usage statistics */ 257 258#ifdef MACH_BSD 259 void *bsd_info; 260#endif 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 */ 269 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) 278 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 */ 281 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 */ 285 286 uint32_t t_chud; /* CHUD flags, used for Shark */ 287#endif 288 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, 294 applied_ru_cpu :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; 303 304#if CONFIG_ATM 305 struct atm_task_descriptor *atm_context; /* pointer to per task atm descriptor */ 306#endif 307#if CONFIG_BANK 308 struct bank_task *bank_context; /* pointer to per task bank structure */ 309#endif 310 311#if IMPORTANCE_INHERITANCE 312 struct ipc_importance_task *task_imp_base; /* Base of IPC importance chain */ 313#endif /* IMPORTANCE_INHERITANCE */ 314 315 vm_extmod_statistics_data_t extmod_statistics; 316 317#if MACH_ASSERT 318 int8_t suspends_outstanding; /* suspends this task performed in excess of resumes */ 319#endif 320 321 struct task_requested_policy requested_policy; 322 struct task_effective_policy effective_policy; 323 struct task_pended_policy pended_policy; 324 325 /* 326 * Can be merged with imp_donor bits, once the IMPORTANCE_INHERITANCE macro goes away. 327 */ 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 */ 333 334 io_stat_info_t task_io_stats; 335 336 /* 337 * The cpu_time_qos_stats fields are protected by the task lock 338 */ 339 struct _cpu_time_qos_stats cpu_time_qos_stats; 340 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; 345 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; 352 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 */ 357 358#if HYPERVISOR 359 void *hv_task_target; /* hypervisor virtual machine object associated with this task */ 360#endif /* HYPERVISOR */ 361}; 362 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) 367 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) 372 373#define TASK_REFERENCE_LEAK_DEBUG 0 374 375#if TASK_REFERENCE_LEAK_DEBUG 376extern void task_reference_internal(task_t task); 377extern uint32_t task_deallocate_internal(task_t task); 378#else 379#define task_reference_internal(task) \ 380 (void)hw_atomic_add(&(task)->ref_count, 1) 381 382#define task_deallocate_internal(task) \ 383 hw_atomic_sub(&(task)->ref_count, 1) 384#endif 385 386#define task_reference(task) \ 387MACRO_BEGIN \ 388 if ((task) != TASK_NULL) \ 389 task_reference_internal(task); \ 390MACRO_END 391 392extern kern_return_t kernel_task_create( 393 task_t task, 394 vm_offset_t map_base, 395 vm_size_t map_size, 396 task_t *child); 397 398/* Initialize task module */ 399extern void task_init(void); 400 401/* coalition_init() calls this to initialize ledgers before task_init() */ 402extern void init_task_ledgers(void); 403 404#define current_task_fast() (current_thread()->task) 405#define current_task() current_task_fast() 406 407extern lck_attr_t task_lck_attr; 408extern lck_grp_t task_lck_grp; 409 410#else /* MACH_KERNEL_PRIVATE */ 411 412__BEGIN_DECLS 413 414extern task_t current_task(void); 415 416extern void task_reference(task_t task); 417 418__END_DECLS 419 420#endif /* MACH_KERNEL_PRIVATE */ 421 422__BEGIN_DECLS 423 424#ifdef XNU_KERNEL_PRIVATE 425 426/* Hold all threads in a task */ 427extern kern_return_t task_hold( 428 task_t task); 429 430/* Wait for task to stop running, either just to get off CPU or to cease being runnable */ 431extern kern_return_t task_wait( 432 task_t task, 433 boolean_t until_not_runnable); 434 435/* Release hold on all threads in a task */ 436extern kern_return_t task_release( 437 task_t task); 438 439/* Suspends a task by placing a hold on its threads */ 440extern kern_return_t task_pidsuspend( 441 task_t task); 442extern kern_return_t task_pidsuspend_locked( 443 task_t task); 444 445/* Resumes a previously paused task */ 446extern kern_return_t task_pidresume( 447 task_t task); 448 449extern kern_return_t task_send_trace_memory( 450 task_t task, 451 uint32_t pid, 452 uint64_t uniqueid); 453 454#if CONFIG_FREEZE 455 456/* Freeze a task's resident pages */ 457extern kern_return_t task_freeze( 458 task_t task, 459 uint32_t *purgeable_count, 460 uint32_t *wired_count, 461 uint32_t *clean_count, 462 uint32_t *dirty_count, 463 uint32_t dirty_budget, 464 boolean_t *shared, 465 boolean_t walk_only); 466 467/* Thaw a currently frozen task */ 468extern kern_return_t task_thaw( 469 task_t task); 470 471#endif /* CONFIG_FREEZE */ 472 473/* Halt all other threads in the current task */ 474extern kern_return_t task_start_halt( 475 task_t task); 476 477/* Wait for other threads to halt and free halting task resources */ 478extern void task_complete_halt( 479 task_t task); 480 481extern kern_return_t task_terminate_internal( 482 task_t task); 483 484extern kern_return_t task_create_internal( 485 task_t parent_task, 486 coalition_t parent_coalition, 487 boolean_t inherit_memory, 488 boolean_t is_64bit, 489 task_t *child_task); /* OUT */ 490 491extern kern_return_t task_importance( 492 task_t task, 493 integer_t importance); 494 495extern void task_power_info_locked( 496 task_t task, 497 task_power_info_t info, 498 gpu_energy_data_t gpu_energy); 499 500extern uint64_t task_gpu_utilisation( 501 task_t task); 502 503extern void task_vtimer_set( 504 task_t task, 505 integer_t which); 506 507extern void task_vtimer_clear( 508 task_t task, 509 integer_t which); 510 511extern void task_vtimer_update( 512 task_t task, 513 integer_t which, 514 uint32_t *microsecs); 515 516#define TASK_VTIMER_USER 0x01 517#define TASK_VTIMER_PROF 0x02 518#define TASK_VTIMER_RLIM 0x04 519 520extern void task_set_64bit( 521 task_t task, 522 boolean_t is64bit); 523 524extern void task_backing_store_privileged( 525 task_t task); 526 527extern void task_set_dyld_info( 528 task_t task, 529 mach_vm_address_t addr, 530 mach_vm_size_t size); 531 532/* Get number of activations in a task */ 533extern int get_task_numacts( 534 task_t task); 535 536extern int get_task_numactivethreads(task_t task); 537 538/* JMM - should just be temporary (implementation in bsd_kern still) */ 539extern void set_bsdtask_info(task_t,void *); 540extern vm_map_t get_task_map_reference(task_t); 541extern vm_map_t swap_task_map(task_t, thread_t, vm_map_t, boolean_t); 542extern pmap_t get_task_pmap(task_t); 543extern uint64_t get_task_resident_size(task_t); 544extern uint64_t get_task_compressed(task_t); 545extern uint64_t get_task_resident_max(task_t); 546extern uint64_t get_task_phys_footprint(task_t); 547extern uint64_t get_task_phys_footprint_max(task_t); 548extern uint64_t get_task_purgeable_size(task_t); 549extern uint64_t get_task_cpu_time(task_t); 550 551extern kern_return_t task_set_phys_footprint_limit_internal(task_t, int, int *, boolean_t); 552extern kern_return_t task_get_phys_footprint_limit(task_t task, int *limit_mb); 553 554extern boolean_t is_kerneltask(task_t task); 555 556extern kern_return_t check_actforsig(task_t task, thread_t thread, int setast); 557 558extern kern_return_t machine_task_get_state( 559 task_t task, 560 int flavor, 561 thread_state_t state, 562 mach_msg_type_number_t *state_count); 563 564extern kern_return_t machine_task_set_state( 565 task_t task, 566 int flavor, 567 thread_state_t state, 568 mach_msg_type_number_t state_count); 569 570extern void machine_task_terminate(task_t task); 571 572struct _task_ledger_indices { 573 int cpu_time; 574 int tkm_private; 575 int tkm_shared; 576 int phys_mem; 577 int wired_mem; 578 int internal; 579 int iokit_mapped; 580 int alternate_accounting; 581 int phys_footprint; 582 int internal_compressed; 583 int purgeable_volatile; 584 int purgeable_nonvolatile; 585 int purgeable_volatile_compressed; 586 int purgeable_nonvolatile_compressed; 587 int platform_idle_wakeups; 588 int interrupt_wakeups; 589 int sfi_wait_times[MAX_SFI_CLASS_ID]; 590#ifdef CONFIG_BANK 591 int cpu_time_billed_to_me; 592 int cpu_time_billed_to_others; 593#endif 594}; 595extern struct _task_ledger_indices task_ledgers; 596 597/* Begin task_policy */ 598 599/* value */ 600#define TASK_POLICY_DISABLE 0x0 601#define TASK_POLICY_ENABLE 0x1 602 603/* category */ 604#define TASK_POLICY_INTERNAL 0x0 605#define TASK_POLICY_EXTERNAL 0x1 606#define TASK_POLICY_ATTRIBUTE 0x2 607 608/* for tracing */ 609#define TASK_POLICY_TASK 0x4 610#define TASK_POLICY_THREAD 0x8 611 612/* flavors (also DBG_IMPORTANCE subclasses 0x20 - 0x3F) */ 613 614/* internal or external, thread or task */ 615#define TASK_POLICY_DARWIN_BG 0x21 616#define TASK_POLICY_IOPOL 0x22 617#define TASK_POLICY_IO 0x23 618#define TASK_POLICY_PASSIVE_IO 0x24 619 620/* internal, task only */ 621#define TASK_POLICY_DARWIN_BG_IOPOL 0x27 622 623/* task-only attributes */ 624#define TASK_POLICY_TAL 0x28 625#define TASK_POLICY_BOOST 0x29 626#define TASK_POLICY_ROLE 0x2A 627#define TASK_POLICY_SUPPRESSED_CPU 0x2B 628#define TASK_POLICY_TERMINATED 0x2C 629#define TASK_POLICY_NEW_SOCKETS_BG 0x2D 630#define TASK_POLICY_LOWPRI_CPU 0x2E 631#define TASK_POLICY_LATENCY_QOS 0x2F 632#define TASK_POLICY_THROUGH_QOS 0x30 633#define TASK_POLICY_WATCHERS_BG 0x31 634 635#define TASK_POLICY_SFI_MANAGED 0x34 636#define TASK_POLICY_ALL_SOCKETS_BG 0x37 637 638#define TASK_POLICY_BASE_LATENCY_AND_THROUGHPUT_QOS 0x39 /* latency as value1, throughput as value2 */ 639#define TASK_POLICY_OVERRIDE_LATENCY_AND_THROUGHPUT_QOS 0x3A /* latency as value1, throughput as value2 */ 640 641/* thread-only attributes */ 642#define TASK_POLICY_PIDBIND_BG 0x32 643#define TASK_POLICY_WORKQ_BG 0x33 644#define TASK_POLICY_QOS 0x35 645#define TASK_POLICY_QOS_OVERRIDE 0x36 646#define TASK_POLICY_QOS_AND_RELPRIO 0x38 /* QoS as value1, relative priority as value2 */ 647 648#define TASK_POLICY_MAX 0x3F 649 650/* The main entrance to task policy is this function */ 651extern void proc_set_task_policy(task_t task, thread_t thread, int category, int flavor, int value); 652extern int proc_get_task_policy(task_t task, thread_t thread, int category, int flavor); 653 654/* For attributes that have two scalars as input/output */ 655extern void proc_set_task_policy2(task_t task, thread_t thread, int category, int flavor, int value1, int value2); 656extern void proc_get_task_policy2(task_t task, thread_t thread, int category, int flavor, int *value1, int *value2); 657 658/* For use by kernel threads and others who don't hold a reference on the target thread */ 659extern void proc_set_task_policy_thread(task_t task, uint64_t tid, int category, int flavor, int value); 660 661extern void proc_set_task_spawnpolicy(task_t task, int apptype, int qos_clamp, 662 ipc_port_t * portwatch_ports, int portwatch_count); 663 664extern void task_set_main_thread_qos(task_t task, thread_t main_thread); 665 666/* IO Throttle tiers */ 667#define THROTTLE_LEVEL_NONE -1 668#define THROTTLE_LEVEL_TIER0 0 /* IOPOL_NORMAL, IOPOL_DEFAULT, IOPOL_PASSIVE */ 669 670#define THROTTLE_LEVEL_THROTTLED 1 671#define THROTTLE_LEVEL_TIER1 1 /* IOPOL_STANDARD */ 672#define THROTTLE_LEVEL_TIER2 2 /* IOPOL_UTILITY */ 673#define THROTTLE_LEVEL_TIER3 3 /* IOPOL_THROTTLE */ 674 675#define THROTTLE_LEVEL_START 0 676#define THROTTLE_LEVEL_END 3 677 678#define THROTTLE_LEVEL_COMPRESSOR_TIER0 THROTTLE_LEVEL_TIER0 679#define THROTTLE_LEVEL_COMPRESSOR_TIER1 THROTTLE_LEVEL_TIER1 680#define THROTTLE_LEVEL_COMPRESSOR_TIER2 THROTTLE_LEVEL_TIER2 681 682#define THROTTLE_LEVEL_PAGEOUT_THROTTLED THROTTLE_LEVEL_TIER2 683#define THROTTLE_LEVEL_PAGEOUT_UNTHROTTLED THROTTLE_LEVEL_TIER1 684 685#if CONFIG_IOSCHED 686#define IOSCHED_METADATA_TIER THROTTLE_LEVEL_TIER1 687#endif /* CONFIG_IOSCHED */ 688 689extern int proc_apply_workq_bgthreadpolicy(thread_t thread); 690extern int proc_restore_workq_bgthreadpolicy(thread_t thread); 691 692extern int proc_get_darwinbgstate(task_t task, uint32_t *flagsp); 693extern boolean_t proc_task_is_tal(task_t task); 694extern integer_t task_grab_latency_qos(task_t task); 695extern void task_policy_create(task_t task, int parent_boosted); 696extern void thread_policy_create(thread_t thread); 697 698/* 699 * for IPC importance hooks into task policy 700 */ 701typedef struct task_pend_token { 702 uint32_t tpt_update_sockets :1, 703 tpt_update_timers :1, 704 tpt_update_watchers :1, 705 tpt_update_live_donor :1; 706} *task_pend_token_t; 707 708extern void task_policy_update_complete_unlocked(task_t task, thread_t thread, task_pend_token_t pend_token); 709extern void task_update_boost_locked(task_t task, boolean_t boost_active, task_pend_token_t pend_token); 710extern void task_set_boost_locked(task_t task, boolean_t boost_active); 711 712/* 713 * Get effective policy 714 * Only for use by relevant subsystem, should never be passed into a setter! 715 */ 716 717extern int proc_get_effective_task_policy(task_t task, int flavor); 718extern int proc_get_effective_thread_policy(thread_t thread, int flavor); 719 720/* temporary compatibility */ 721int proc_setthread_saved_importance(thread_t thread, int importance); 722 723int proc_get_task_ruse_cpu(task_t task, uint32_t *policyp, uint8_t *percentagep, uint64_t *intervalp, uint64_t *deadlinep); 724int proc_set_task_ruse_cpu(task_t task, uint32_t policy, uint8_t percentage, uint64_t interval, uint64_t deadline, int cpumon_entitled); 725int proc_clear_task_ruse_cpu(task_t task, int cpumon_entitled); 726thread_t task_findtid(task_t, uint64_t); 727void set_thread_iotier_override(thread_t, int policy); 728 729boolean_t proc_thread_qos_add_override(task_t task, thread_t thread, uint64_t tid, int override_qos, boolean_t first_override_for_resource); 730boolean_t proc_thread_qos_remove_override(task_t task, thread_t thread, uint64_t tid); 731 732#define TASK_RUSECPU_FLAGS_PROC_LIMIT 0x01 733#define TASK_RUSECPU_FLAGS_PERTHR_LIMIT 0x02 734#define TASK_RUSECPU_FLAGS_DEADLINE 0x04 735#define TASK_RUSECPU_FLAGS_FATAL_CPUMON 0x08 /* CPU usage monitor violations are fatal */ 736#define TASK_RUSECPU_FLAGS_FATAL_WAKEUPSMON 0x10 /* wakeups monitor violations are fatal */ 737#define TASK_RUSECPU_FLAGS_PHYS_FOOTPRINT_EXCEPTION 0x20 /* exceeding physical footprint generates EXC_RESOURCE */ 738 739/* BSD call back functions */ 740extern int proc_apply_resource_actions(void * p, int type, int action); 741extern int proc_restore_resource_actions(void * p, int type, int action); 742extern int task_restore_resource_actions(task_t task, int type); 743 744extern int task_clear_cpuusage(task_t task, int cpumon_entitled); 745 746extern kern_return_t task_wakeups_monitor_ctl(task_t task, uint32_t *rate_hz, int32_t *flags); 747extern kern_return_t task_cpu_usage_monitor_ctl(task_t task, uint32_t *flags); 748 749 750extern void task_importance_mark_donor(task_t task, boolean_t donating); 751extern void task_importance_mark_live_donor(task_t task, boolean_t donating); 752extern void task_importance_mark_receiver(task_t task, boolean_t receiving); 753extern void task_importance_mark_denap_receiver(task_t task, boolean_t denap); 754extern void task_importance_reset(task_t task); 755extern void task_atm_reset(task_t task); 756 757#if IMPORTANCE_INHERITANCE 758 759extern boolean_t task_is_importance_donor(task_t task); 760extern boolean_t task_is_marked_importance_donor(task_t task); 761extern boolean_t task_is_marked_live_importance_donor(task_t task); 762 763extern boolean_t task_is_importance_receiver(task_t task); 764extern boolean_t task_is_marked_importance_receiver(task_t task); 765 766extern boolean_t task_is_importance_denap_receiver(task_t task); 767extern boolean_t task_is_marked_importance_denap_receiver(task_t task); 768 769extern boolean_t task_is_importance_receiver_type(task_t task); 770 771extern int task_importance_hold_watchport_assertion(task_t target_task, uint32_t count); 772extern int task_importance_hold_internal_assertion(task_t target_task, uint32_t count); 773extern int task_importance_drop_internal_assertion(task_t target_task, uint32_t count); 774 775extern int task_importance_hold_file_lock_assertion(task_t target_task, uint32_t count); 776extern int task_importance_drop_file_lock_assertion(task_t target_task, uint32_t count); 777 778extern int task_importance_hold_legacy_external_assertion(task_t target_task, uint32_t count); 779extern int task_importance_drop_legacy_external_assertion(task_t target_task, uint32_t count); 780 781#endif /* IMPORTANCE_INHERITANCE */ 782 783extern boolean_t task_has_been_notified(task_t task, int pressurelevel); 784extern boolean_t task_used_for_purging(task_t task, int pressurelevel); 785extern void task_mark_has_been_notified(task_t task, int pressurelevel); 786extern void task_mark_used_for_purging(task_t task, int pressurelevel); 787extern void task_clear_has_been_notified(task_t task, int pressurelevel); 788extern void task_clear_used_for_purging(task_t task); 789extern int task_importance_estimate(task_t task); 790 791/* 792 * This should only be used for debugging. 793 * pid is stored in audit_token by set_security_token(). 794 */ 795#define audit_token_pid_from_task(task) ((task)->audit_token.val[5]) 796 797/* End task_policy */ 798 799extern kern_return_t task_purge_volatile_memory(task_t task); 800 801extern void task_set_gpu_denied(task_t task, boolean_t denied); 802extern boolean_t task_is_gpu_denied(task_t task); 803 804#endif /* XNU_KERNEL_PRIVATE */ 805 806#ifdef KERNEL_PRIVATE 807 808extern void *get_bsdtask_info(task_t); 809extern void *get_bsdthreadtask_info(thread_t); 810extern vm_map_t get_task_map(task_t); 811extern ledger_t get_task_ledger(task_t); 812 813extern boolean_t get_task_pidsuspended(task_t); 814extern boolean_t get_task_frozen(task_t); 815 816/* Convert from a task to a port */ 817extern ipc_port_t convert_task_to_port(task_t); 818extern ipc_port_t convert_task_name_to_port(task_name_t); 819extern ipc_port_t convert_task_suspension_token_to_port(task_suspension_token_t task); 820 821/* Convert from a port (in this case, an SO right to a task's resume port) to a task. */ 822extern task_suspension_token_t convert_port_to_task_suspension_token(ipc_port_t port); 823 824extern boolean_t task_suspension_notify(mach_msg_header_t *); 825 826#endif /* KERNEL_PRIVATE */ 827 828extern task_t kernel_task; 829 830extern void task_deallocate( 831 task_t task); 832 833extern void task_name_deallocate( 834 task_name_t task_name); 835 836extern void task_suspension_token_deallocate( 837 task_suspension_token_t token); 838__END_DECLS 839 840#endif /* _KERN_TASK_H_ */ 841