+ thread_update_qos_cpu_time(thread);
+ }
+ ri->ri_cpu_time_qos_default = task->cpu_time_eqos_stats.cpu_time_qos_default;
+ ri->ri_cpu_time_qos_maintenance = task->cpu_time_eqos_stats.cpu_time_qos_maintenance;
+ ri->ri_cpu_time_qos_background = task->cpu_time_eqos_stats.cpu_time_qos_background;
+ ri->ri_cpu_time_qos_utility = task->cpu_time_eqos_stats.cpu_time_qos_utility;
+ ri->ri_cpu_time_qos_legacy = task->cpu_time_eqos_stats.cpu_time_qos_legacy;
+ ri->ri_cpu_time_qos_user_initiated = task->cpu_time_eqos_stats.cpu_time_qos_user_initiated;
+ ri->ri_cpu_time_qos_user_interactive = task->cpu_time_eqos_stats.cpu_time_qos_user_interactive;
+
+ task_unlock(task);
+ return 0;
+}
+
+void
+fill_task_monotonic_rusage(task_t task, rusage_info_current *ri)
+{
+#if MONOTONIC
+ if (!mt_core_supported) {
+ return;
+ }
+
+ assert(task != TASK_NULL);
+
+ uint64_t counts[MT_CORE_NFIXED] = { 0 };
+ mt_fixed_task_counts(task, counts);
+#ifdef MT_CORE_INSTRS
+ ri->ri_instructions = counts[MT_CORE_INSTRS];
+#endif /* defined(MT_CORE_INSTRS) */
+ ri->ri_cycles = counts[MT_CORE_CYCLES];
+#else /* MONOTONIC */
+#pragma unused(task, ri)
+#endif /* !MONOTONIC */
+}
+
+uint64_t
+get_task_logical_writes(task_t task, boolean_t external)
+{
+ assert(task != TASK_NULL);
+ struct ledger_entry_info lei;
+
+ task_lock(task);
+
+ if (external == FALSE) {
+ ledger_get_entry_info(task->ledger, task_ledgers.logical_writes, &lei);
+ } else {
+ ledger_get_entry_info(task->ledger, task_ledgers.logical_writes_to_external, &lei);
+ }
+
+ ledger_get_entry_info(task->ledger, task_ledgers.logical_writes, &lei);
+
+ task_unlock(task);
+ return lei.lei_balance;
+}
+
+uint64_t
+get_task_dispatchqueue_serialno_offset(task_t task)
+{
+ uint64_t dq_serialno_offset = 0;
+
+ if (task->bsd_info) {
+ dq_serialno_offset = get_dispatchqueue_serialno_offset_from_proc(task->bsd_info);
+ }
+
+ return dq_serialno_offset;
+}
+
+uint64_t
+get_task_dispatchqueue_label_offset(task_t task)
+{
+ uint64_t dq_label_offset = 0;
+
+ if (task->bsd_info) {
+ dq_label_offset = get_dispatchqueue_label_offset_from_proc(task->bsd_info);
+ }
+
+ return dq_label_offset;
+}
+
+uint64_t
+get_task_uniqueid(task_t task)
+{
+ if (task->bsd_info) {
+ return proc_uniqueid(task->bsd_info);
+ } else {
+ return UINT64_MAX;
+ }
+}
+
+int
+get_task_version(task_t task)
+{
+ if (task->bsd_info) {
+ return proc_pidversion(task->bsd_info);
+ } else {
+ return INT_MAX;
+ }
+}
+
+#if CONFIG_MACF
+struct label *
+get_task_crash_label(task_t task)
+{
+ return task->crash_label;
+}
+#endif
+
+int
+fill_taskipctableinfo(task_t task, uint32_t *table_size, uint32_t *table_free)
+{
+ ipc_space_t space = task->itk_space;
+ if (space == NULL) {
+ return -1;
+ }
+
+ is_read_lock(space);
+ if (!is_active(space)) {
+ is_read_unlock(space);
+ return -1;