machine.h
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/thread_group.h> 39 40 #include <kern/work_interval.h> 41 42 #include <kern/sched_urgency.h> 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 /* 123 * Machine-dependent routine to fill in an array with up to callstack_max 124 * levels of return pc information. 125 */ 126 extern void machine_callstack( 127 uintptr_t *buf, 128 vm_size_t callstack_max); 129 130 extern void consider_machine_collect(void); 131 132 /* 133 * Machine-dependent routine to inform platform layer and external 134 * CPU power management about context switches 135 */ 136 137 extern void machine_thread_going_on_core(thread_t new_thread, 138 thread_urgency_t urgency, 139 uint64_t sched_latency, 140 uint64_t same_pri_latency, 141 uint64_t dispatch_time); 142 143 extern void machine_thread_going_off_core(thread_t old_thread, boolean_t thread_terminating, 144 uint64_t last_dispatch, boolean_t thread_runnable); 145 146 extern void machine_max_runnable_latency(uint64_t bg_max_latency, 147 uint64_t default_max_latency, 148 uint64_t realtime_max_latency); 149 150 extern void machine_work_interval_notify(thread_t thread, struct kern_work_interval_args* kwi_args); 151 152 153 extern void machine_perfcontrol_deadline_passed(uint64_t deadline); 154 155 extern void machine_switch_perfcontrol_context(perfcontrol_event event, 156 uint64_t timestamp, 157 uint32_t flags, 158 uint64_t new_thread_same_pri_latency, 159 thread_t old, 160 thread_t new); 161 162 extern void machine_switch_perfcontrol_state_update(perfcontrol_event event, 163 uint64_t timestamp, 164 uint32_t flags, 165 thread_t thread); 166 167 #if CONFIG_THREAD_GROUPS 168 extern void machine_thread_group_init(struct thread_group *tg); 169 extern void machine_thread_group_deinit(struct thread_group *tg); 170 extern void machine_thread_group_flags_update(struct thread_group *tg, uint32_t flags); 171 extern void machine_thread_group_blocked(struct thread_group *tg_blocked, struct thread_group *tg_blocking, uint32_t flags, thread_t blocked_thread); 172 extern void machine_thread_group_unblocked(struct thread_group *tg_unblocked, struct thread_group *tg_unblocking, uint32_t flags, thread_t unblocked_thread); 173 #endif 174 175 #endif /* _KERN_MACHINE_H_ */