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 * Mach Operating System 33 * Copyright (c) 1991,1990,1989 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/* 60 * processor.h: Processor and processor-related definitions. 61 */ 62 63#ifndef _KERN_PROCESSOR_H_ 64#define _KERN_PROCESSOR_H_ 65 66#include <mach/boolean.h> 67#include <mach/kern_return.h> 68#include <kern/kern_types.h> 69 70#include <sys/cdefs.h> 71 72#ifdef MACH_KERNEL_PRIVATE 73 74#include <mach/mach_types.h> 75#include <kern/ast.h> 76#include <kern/cpu_number.h> 77#include <kern/lock.h> 78#include <kern/queue.h> 79#include <kern/sched.h> 80#include <kern/processor_data.h> 81 82#include <machine/ast_types.h> 83 84struct processor_set { 85 queue_head_t active_queue; /* active processors */ 86 queue_head_t idle_queue; /* idle processors */ 87 88 processor_t low_pri, low_count; 89 90 int processor_count; 91 92 decl_simple_lock_data(,sched_lock) /* lock for above */ 93 94 struct ipc_port * pset_self; /* port for operations */ 95 struct ipc_port * pset_name_self; /* port for information */ 96 97 processor_set_t pset_list; /* chain of associated psets */ 98 pset_node_t node; 99}; 100 101extern struct processor_set pset0; 102 103struct pset_node { 104 processor_set_t psets; /* list of associated psets */ 105 106 pset_node_t nodes; /* list of associated subnodes */ 107 pset_node_t node_list; /* chain of associated nodes */ 108 109 pset_node_t parent; 110}; 111 112extern struct pset_node pset_node0; 113 114extern queue_head_t tasks, threads; 115extern int tasks_count, threads_count; 116decl_mutex_data(extern,tasks_threads_lock) 117 118struct processor { 119 queue_chain_t processor_queue;/* idle/active queue link, 120 * MUST remain the first element */ 121 int state; /* See below */ 122 struct thread 123 *active_thread, /* thread running on processor */ 124 *next_thread, /* next thread when dispatched */ 125 *idle_thread; /* this processor's idle thread. */ 126 127 processor_set_t processor_set; /* assigned set */ 128 129 int current_pri; /* priority of current thread */ 130 int cpu_num; /* platform numeric id */ 131 132 timer_call_data_t quantum_timer; /* timer for quantum expiration */ 133 uint64_t quantum_end; /* time when current quantum ends */ 134 uint64_t last_dispatch; /* time of last dispatch */ 135 136 uint64_t deadline; /* current deadline */ 137 int timeslice; /* quanta before timeslice ends */ 138 139 struct run_queue runq; /* runq for this processor */ 140 141 struct ipc_port * processor_self; /* port for operations */ 142 decl_simple_lock_data(,lock) 143 144 processor_t processor_list; /* all existing processors */ 145 processor_data_t processor_data; /* per-processor data */ 146}; 147 148extern processor_t processor_list; 149extern unsigned int processor_count; 150decl_simple_lock_data(extern,processor_list_lock) 151 152extern uint32_t processor_avail_count; 153 154extern processor_t master_processor; 155 156/* 157 * Processor state is accessed by locking the scheduling lock 158 * for the assigned processor set. 159 */ 160#define PROCESSOR_OFF_LINE 0 /* Not available */ 161#define PROCESSOR_SHUTDOWN 1 /* Going off-line */ 162#define PROCESSOR_START 2 /* Being started */ 163#define PROCESSOR_INACTIVE 3 /* Inactive (unavailable) */ 164#define PROCESSOR_IDLE 4 /* Idle (available) */ 165#define PROCESSOR_DISPATCHING 5 /* Dispatching (idle -> active) */ 166#define PROCESSOR_RUNNING 6 /* Normal execution */ 167 168extern processor_t current_processor(void); 169 170extern processor_t cpu_to_processor( 171 int cpu); 172 173/* Lock macros */ 174 175#define pset_lock(p) simple_lock(&(p)->sched_lock) 176#define pset_unlock(p) simple_unlock(&(p)->sched_lock) 177#define pset_lock_init(p) simple_lock_init(&(p)->sched_lock, 0) 178 179#define processor_lock(p) simple_lock(&(p)->lock) 180#define processor_unlock(p) simple_unlock(&(p)->lock) 181#define processor_lock_init(p) simple_lock_init(&(p)->lock, 0) 182 183/* Update hints */ 184 185#define pset_pri_hint(ps, p, pri) \ 186MACRO_BEGIN \ 187 if ((p) != (ps)->low_pri) { \ 188 if ((pri) < (ps)->low_pri->current_pri) \ 189 (ps)->low_pri = (p); \ 190 else \ 191 if ((ps)->low_pri->state < PROCESSOR_IDLE) \ 192 (ps)->low_pri = (p); \ 193 } \ 194MACRO_END 195 196#define pset_count_hint(ps, p, cnt) \ 197MACRO_BEGIN \ 198 if ((p) != (ps)->low_count) { \ 199 if ((cnt) < (ps)->low_count->runq.count) \ 200 (ps)->low_count = (p); \ 201 else \ 202 if ((ps)->low_count->state < PROCESSOR_IDLE) \ 203 (ps)->low_count = (p); \ 204 } \ 205MACRO_END 206 207extern void processor_bootstrap(void) __attribute__((section("__TEXT, initcode"))); 208 209extern void processor_init( 210 processor_t processor, 211 int cpu_num, 212 processor_set_t processor_set) __attribute__((section("__TEXT, initcode"))); 213 214extern kern_return_t processor_shutdown( 215 processor_t processor); 216 217extern void processor_queue_shutdown( 218 processor_t processor); 219 220extern processor_set_t processor_pset( 221 processor_t processor); 222 223extern pset_node_t pset_node_root(void); 224 225extern processor_set_t pset_create( 226 pset_node_t node); 227 228extern void pset_init( 229 processor_set_t pset, 230 pset_node_t node) __attribute__((section("__TEXT, initcode"))); 231 232extern kern_return_t processor_info_count( 233 processor_flavor_t flavor, 234 mach_msg_type_number_t *count); 235 236#define pset_deallocate(x) 237#define pset_reference(x) 238 239extern void machine_run_count( 240 uint32_t count); 241 242extern boolean_t machine_cpu_is_inactive( 243 int num); 244 245#else /* MACH_KERNEL_PRIVATE */ 246 247__BEGIN_DECLS 248 249extern void pset_deallocate( 250 processor_set_t pset); 251 252extern void pset_reference( 253 processor_set_t pset); 254 255__END_DECLS 256 257#endif /* MACH_KERNEL_PRIVATE */ 258 259#endif /* _KERN_PROCESSOR_H_ */ 260