1 /* 2 * Copyright (c) 2000-2008 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_COPYRIGHT@ 30 */ 31 32 #ifndef _KERN_MACHINE_H_ 33 #define _KERN_MACHINE_H_ 34 35 #include <mach/kern_return.h> 36 #include <mach/processor_info.h> 37 #include <kern/kern_types.h> 38 #include <kern/sched_urgency.h> 39 #include <kern/startup.h> 40 #include <kern/thread_group.h> 41 #include <kern/work_interval.h> 42 43 44 /* 45 * Machine support declarations. 46 */ 47 48 extern void processor_up( 49 processor_t processor); 50 51 extern void processor_start_thread(void *machine_param, 52 wait_result_t result); 53 54 /* 55 * Must be implemented in machine dependent code. 56 */ 57 58 /* Initialize machine dependent ast code */ 59 extern void init_ast_check( 60 processor_t processor); 61 62 /* Cause check for ast */ 63 extern void cause_ast_check( 64 processor_t processor); 65 66 extern kern_return_t cpu_control( 67 int slot_num, 68 processor_info_t info, 69 unsigned int count); 70 71 extern void cpu_sleep(void); 72 73 extern kern_return_t cpu_start( 74 int slot_num); 75 76 extern void cpu_exit_wait( 77 int slot_num); 78 79 extern boolean_t cpu_can_exit( 80 int slot_num); 81 82 extern kern_return_t cpu_info( 83 processor_flavor_t flavor, 84 int slot_num, 85 processor_info_t info, 86 unsigned int *count); 87 88 extern kern_return_t cpu_info_count( 89 processor_flavor_t flavor, 90 unsigned int *count); 91 92 extern thread_t machine_processor_shutdown( 93 thread_t thread, 94 void (*doshutdown)(processor_t), 95 processor_t processor); 96 97 extern void machine_idle(void); 98 99 extern void machine_track_platform_idle(boolean_t); 100 101 /* Signals a processor to bring it out of idle */ 102 extern void machine_signal_idle( 103 processor_t processor); 104 105 /* Signals a processor to bring it out of idle unless canceled */ 106 extern void machine_signal_idle_deferred( 107 processor_t processor); 108 109 /* Cancels an outstanding machine_signal_idle_deferred, if this is supported */ 110 extern void machine_signal_idle_cancel( 111 processor_t processor); 112 113 extern void halt_cpu(void); 114 115 extern void halt_all_cpus( 116 boolean_t reboot); 117 118 extern char *machine_boot_info( 119 char *buf, 120 vm_size_t buf_len); 121 122 extern void consider_machine_collect(void); 123 124 /* 125 * Machine-dependent routine to inform platform layer and external 126 * CPU power management about context switches 127 */ 128 129 extern void machine_thread_going_on_core(thread_t new_thread, 130 thread_urgency_t urgency, 131 uint64_t sched_latency, 132 uint64_t same_pri_latency, 133 uint64_t dispatch_time); 134 135 extern void machine_thread_going_off_core(thread_t old_thread, boolean_t thread_terminating, 136 uint64_t last_dispatch, boolean_t thread_runnable); 137 138 extern void machine_max_runnable_latency(uint64_t bg_max_latency, 139 uint64_t default_max_latency, 140 uint64_t realtime_max_latency); 141 142 extern void machine_work_interval_notify(thread_t thread, struct kern_work_interval_args* kwi_args); 143 144 145 extern void machine_perfcontrol_deadline_passed(uint64_t deadline); 146 147 extern void machine_switch_perfcontrol_context(perfcontrol_event event, 148 uint64_t timestamp, 149 uint32_t flags, 150 uint64_t new_thread_same_pri_latency, 151 thread_t old, 152 thread_t new); 153 154 extern void machine_switch_perfcontrol_state_update(perfcontrol_event event, 155 uint64_t timestamp, 156 uint32_t flags, 157 thread_t thread); 158 159 #if CONFIG_THREAD_GROUPS 160 extern void machine_thread_group_init(struct thread_group *tg); 161 extern void machine_thread_group_deinit(struct thread_group *tg); 162 extern void machine_thread_group_flags_update(struct thread_group *tg, uint32_t flags); 163 extern void machine_thread_group_blocked(struct thread_group *tg_blocked, struct thread_group *tg_blocking, uint32_t flags, thread_t blocked_thread); 164 extern void machine_thread_group_unblocked(struct thread_group *tg_unblocked, struct thread_group *tg_unblocking, uint32_t flags, thread_t unblocked_thread); 165 #endif 166 167 #endif /* _KERN_MACHINE_H_ */ 168