#ifndef _KERN_POLICY_INTERNAL_H_
#define _KERN_POLICY_INTERNAL_H_
#ifdef XNU_KERNEL_PRIVATE
#include <sys/cdefs.h>
#include <mach/kern_return.h>
#include <kern/kern_types.h>
#include <mach/task_policy.h>
#include <kern/task.h>
#include <kern/ledger.h>
extern int proc_get_effective_task_policy(task_t task, int flavor);
extern int proc_get_effective_thread_policy(thread_t thread, int flavor);
extern kern_return_t task_importance(task_t task, integer_t importance);
#define TASK_POLICY_DISABLE 0x0
#define TASK_POLICY_ENABLE 0x1
#define TASK_POLICY_INTERNAL 0x0
#define TASK_POLICY_EXTERNAL 0x1
#define TASK_POLICY_ATTRIBUTE 0x2
#define TASK_POLICY_TASK 0x4
#define TASK_POLICY_THREAD 0x8
#define TASK_POLICY_DARWIN_BG 0x21
#define TASK_POLICY_IOPOL 0x22
#define TASK_POLICY_IO 0x23
#define TASK_POLICY_PASSIVE_IO 0x24
#define TASK_POLICY_DARWIN_BG_IOPOL 0x27
#define TASK_POLICY_TAL 0x28
#define TASK_POLICY_BOOST 0x29
#define TASK_POLICY_ROLE 0x2A
#define TASK_POLICY_TERMINATED 0x2C
#define TASK_POLICY_NEW_SOCKETS_BG 0x2D
#define TASK_POLICY_LATENCY_QOS 0x2F
#define TASK_POLICY_THROUGH_QOS 0x30
#define TASK_POLICY_WATCHERS_BG 0x31
#define TASK_POLICY_SFI_MANAGED 0x34
#define TASK_POLICY_ALL_SOCKETS_BG 0x37
#define TASK_POLICY_BASE_LATENCY_AND_THROUGHPUT_QOS 0x39
#define TASK_POLICY_OVERRIDE_LATENCY_AND_THROUGHPUT_QOS 0x3A
#define TASK_POLICY_PIDBIND_BG 0x32
#define TASK_POLICY_QOS 0x35
#define TASK_POLICY_QOS_OVERRIDE 0x36
#define TASK_POLICY_QOS_AND_RELPRIO 0x38
#define TASK_POLICY_QOS_PROMOTE 0x3C
#define TASK_POLICY_QOS_IPC_OVERRIDE 0x3D
#define TASK_POLICY_MAX 0x3F
extern void proc_set_task_policy(task_t task, int category, int flavor, int value);
extern int proc_get_task_policy(task_t task, int category, int flavor);
extern void proc_set_thread_policy(thread_t thread, int category, int flavor, int value);
extern int proc_get_thread_policy(thread_t thread, int category, int flavor);
extern void proc_set_thread_policy_with_tid(task_t task, uint64_t tid, int category, int flavor, int value);
extern boolean_t thread_has_qos_policy(thread_t thread);
extern kern_return_t thread_remove_qos_policy(thread_t thread);
extern int proc_darwin_role_to_task_role(int darwin_role, int* task_role);
extern int proc_task_role_to_darwin_role(int task_role);
extern void task_set_main_thread_qos(task_t task, thread_t main_thread);
extern void proc_set_task_spawnpolicy(task_t task, int apptype, int qos_clamp, int role,
ipc_port_t * portwatch_ports, int portwatch_count);
#define THROTTLE_LEVEL_NONE -1
#define THROTTLE_LEVEL_TIER0 0
#define THROTTLE_LEVEL_THROTTLED 1
#define THROTTLE_LEVEL_TIER1 1
#define THROTTLE_LEVEL_TIER2 2
#define THROTTLE_LEVEL_TIER3 3
#define THROTTLE_LEVEL_START 0
#define THROTTLE_LEVEL_END 3
#define THROTTLE_LEVEL_COMPRESSOR_TIER0 THROTTLE_LEVEL_TIER0
#define THROTTLE_LEVEL_COMPRESSOR_TIER1 THROTTLE_LEVEL_TIER1
#define THROTTLE_LEVEL_COMPRESSOR_TIER2 THROTTLE_LEVEL_TIER2
#define THROTTLE_LEVEL_PAGEOUT_THROTTLED THROTTLE_LEVEL_TIER2
#define THROTTLE_LEVEL_PAGEOUT_UNTHROTTLED THROTTLE_LEVEL_TIER1
#if CONFIG_IOSCHED
#define IOSCHED_METADATA_TIER THROTTLE_LEVEL_TIER1
#endif
extern int proc_get_darwinbgstate(task_t task, uint32_t *flagsp);
extern int task_get_apptype(task_t);
#ifdef MACH_BSD
extern void proc_apply_task_networkbg(void * bsd_info, thread_t thread);
#endif
extern 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);
extern int proc_thread_qos_add_override_check_owner(thread_t thread, int override_qos,
boolean_t first_override_for_resource, user_addr_t resource, int resource_type,
user_addr_t user_lock_addr, mach_port_name_t user_lock_owner);
extern boolean_t proc_thread_qos_remove_override(task_t task, thread_t thread, uint64_t tid,
user_addr_t resource, int resource_type);
extern boolean_t proc_thread_qos_reset_override(task_t task, thread_t thread, uint64_t tid,
user_addr_t resource, int resource_type);
extern int proc_thread_qos_squash_override(thread_t thread, user_addr_t resource, int resource_type);
extern kern_return_t
thread_set_workq_qos(thread_t thread, int qos_tier, int relprio);
extern kern_return_t
thread_set_workq_pri(thread_t thread, integer_t priority, integer_t policy);
extern int
task_get_default_manager_qos(task_t task);
extern void proc_thread_qos_deallocate(thread_t thread);
extern int task_clear_cpuusage(task_t task, int cpumon_entitled);
extern void task_importance_mark_donor(task_t task, boolean_t donating);
extern void task_importance_reset(task_t task);
#if IMPORTANCE_INHERITANCE
extern boolean_t task_is_importance_donor(task_t task);
extern boolean_t task_is_importance_receiver_type(task_t task);
extern int task_importance_hold_file_lock_assertion(task_t target_task, uint32_t count);
extern int task_importance_drop_file_lock_assertion(task_t target_task, uint32_t count);
extern int task_importance_hold_legacy_external_assertion(task_t target_task, uint32_t count);
extern int task_importance_drop_legacy_external_assertion(task_t target_task, uint32_t count);
#endif
extern boolean_t proc_task_is_tal(task_t task);
#define TASK_POLICY_RESOURCE_ATTRIBUTE_NONE 0x00
#define TASK_POLICY_RESOURCE_ATTRIBUTE_THROTTLE 0x01
#define TASK_POLICY_RESOURCE_ATTRIBUTE_SUSPEND 0x02
#define TASK_POLICY_RESOURCE_ATTRIBUTE_TERMINATE 0x03
#define TASK_POLICY_RESOURCE_ATTRIBUTE_NOTIFY_KQ 0x04
#define TASK_POLICY_RESOURCE_ATTRIBUTE_NOTIFY_EXC 0x05
#define TASK_POLICY_RESOURCE_ATTRIBUTE_DEFAULT TASK_POLICY_RESOURCE_ATTRIBUTE_NONE
extern int proc_get_task_ruse_cpu(task_t task, uint32_t *policyp, uint8_t *percentagep,
uint64_t *intervalp, uint64_t *deadlinep);
extern int proc_set_task_ruse_cpu(task_t task, uint32_t policy, uint8_t percentage,
uint64_t interval, uint64_t deadline, int cpumon_entitled);
extern int task_suspend_cpumon(task_t task);
extern int task_resume_cpumon(task_t task);
extern int proc_clear_task_ruse_cpu(task_t task, int cpumon_entitled);
extern int proc_apply_resource_actions(void * p, int type, int action);
extern int proc_restore_resource_actions(void * p, int type, int action);
extern int task_low_mem_privileged_listener(task_t task, boolean_t new_value, boolean_t *old_value);
extern boolean_t task_has_been_notified(task_t task, int pressurelevel);
extern boolean_t task_used_for_purging(task_t task, int pressurelevel);
extern void task_mark_has_been_notified(task_t task, int pressurelevel);
extern void task_mark_used_for_purging(task_t task, int pressurelevel);
extern void task_clear_has_been_notified(task_t task, int pressurelevel);
extern void task_clear_used_for_purging(task_t task);
extern int task_importance_estimate(task_t task);
extern kern_return_t thread_policy_create_work_interval(thread_t thread, uint64_t *work_interval_id);
extern kern_return_t thread_policy_destroy_work_interval(thread_t thread, uint64_t work_interval_id);
extern kern_return_t thread_policy_set_internal(thread_t thread, thread_policy_flavor_t flavor,
thread_policy_t policy_info, mach_msg_type_number_t count);
struct promote_token {
uint16_t pt_basepri;
uint16_t pt_qos;
};
#define PROMOTE_TOKEN_INIT ((struct promote_token){.pt_basepri = 0, .pt_qos = 0})
extern void thread_user_promotion_add(thread_t thread, thread_t promoter, struct promote_token* promote_token);
extern void thread_user_promotion_update(thread_t thread, thread_t promoter, struct promote_token* promote_token);
extern void thread_user_promotion_drop(thread_t thread);
extern void thread_add_ipc_override(thread_t thread, uint32_t qos_override);
extern void thread_update_ipc_override(thread_t thread, uint32_t qos_override);
extern void thread_drop_ipc_override(thread_t thread);
extern uint32_t thread_get_ipc_override(thread_t thread);
#ifdef MACH_KERNEL_PRIVATE
typedef struct task_pend_token {
uint32_t tpt_update_sockets :1,
tpt_update_timers :1,
tpt_update_watchers :1,
tpt_update_live_donor :1,
tpt_update_coal_sfi :1,
tpt_update_throttle :1,
tpt_update_thread_sfi :1,
tpt_force_recompute_pri :1;
} *task_pend_token_t;
extern void task_policy_update_complete_unlocked(task_t task, task_pend_token_t pend_token);
extern void task_update_boost_locked(task_t task, boolean_t boost_active, task_pend_token_t pend_token);
extern void thread_policy_update_locked(thread_t thread, task_pend_token_t pend_token);
extern void thread_policy_update_complete_unlocked(thread_t task, task_pend_token_t pend_token);
typedef struct {
int qos_pri[THREAD_QOS_LAST];
int qos_iotier[THREAD_QOS_LAST];
uint32_t qos_through_qos[THREAD_QOS_LAST];
uint32_t qos_latency_qos[THREAD_QOS_LAST];
} qos_policy_params_t;
extern const qos_policy_params_t thread_qos_policy_params;
uintptr_t threquested_0(thread_t thread);
uintptr_t threquested_1(thread_t thread);
uintptr_t theffective_0(thread_t thread);
uintptr_t theffective_1(thread_t thread);
extern uint32_t tpending(task_pend_token_t pend_token);
extern void proc_iopol_to_tier(int iopolicy, int *tier, int *passive);
extern int proc_tier_to_iopol(int tier, int passive);
extern void set_thread_iotier_override(thread_t, int policy);
extern integer_t task_grab_latency_qos(task_t task);
extern void task_policy_create(task_t task, task_t parent_task);
extern void thread_policy_create(thread_t thread);
extern boolean_t task_is_daemon(task_t task);
extern boolean_t task_is_app(task_t task);
#if IMPORTANCE_INHERITANCE
extern boolean_t task_is_marked_importance_donor(task_t task);
extern boolean_t task_is_marked_importance_receiver(task_t task);
extern boolean_t task_is_marked_importance_denap_receiver(task_t task);
#endif
#define TASK_RUSECPU_FLAGS_PROC_LIMIT 0x01
#define TASK_RUSECPU_FLAGS_PERTHR_LIMIT 0x02
#define TASK_RUSECPU_FLAGS_DEADLINE 0x04
#define TASK_RUSECPU_FLAGS_FATAL_CPUMON 0x08
#define TASK_RUSECPU_FLAGS_FATAL_WAKEUPSMON 0x10
#define TASK_RUSECPU_FLAGS_PHYS_FOOTPRINT_EXCEPTION 0x20
extern void proc_init_cpumon_params(void);
extern void thread_policy_init(void);
int task_compute_main_thread_qos(task_t task);
extern void thread_policy_reset(thread_t thread);
extern kern_return_t thread_set_mode_and_absolute_pri(thread_t thread, integer_t policy, integer_t priority);
extern void thread_policy_update_tasklocked(thread_t thread, integer_t priority, integer_t max_priority, task_pend_token_t pend_token);
#include "mach/resource_notify.h"
kern_return_t send_resource_violation(typeof(send_cpu_usage_violation),
task_t violator,
struct ledger_entry_info *ledger_info,
resource_notify_flags_t flags);
void trace_resource_violation(uint16_t code,
struct ledger_entry_info *ledger_info);
#endif
#endif
#endif