#include <kern/cpu_data.h>
#include <kern/ipc_host.h>
#include <kern/host.h>
-#include <kern/lock.h>
#include <kern/machine.h>
#include <kern/misc_protos.h>
#include <kern/processor.h>
#endif
#include <IOKit/IOPlatformExpert.h>
+#if CONFIG_DTRACE
+extern void (*dtrace_cpu_state_changed_hook)(int, boolean_t);
+#endif
+
/*
* Exported variables:
*/
init_ast_check(processor);
pset = processor->processor_set;
pset_lock(pset);
- if (++pset->online_processor_count == 1) {
- pset_pri_init_hint(pset, processor);
- pset_count_init_hint(pset, processor);
- }
+ ++pset->online_processor_count;
enqueue_tail(&pset->active_queue, (queue_entry_t)processor);
processor->state = PROCESSOR_RUNNING;
(void)hw_atomic_add(&processor_avail_count, 1);
pset_unlock(pset);
ml_cpu_up();
splx(s);
+
+#if CONFIG_DTRACE
+ if (dtrace_cpu_state_changed_hook)
+ (*dtrace_cpu_state_changed_hook)(processor->cpu_id, TRUE);
+#endif
}
+#include <atm/atm_internal.h>
kern_return_t
host_reboot(
assert(host_priv == &realhost);
+#if DEVELOPMENT || DEBUG
if (options & HOST_REBOOT_DEBUGGER) {
Debugger("Debugger");
return (KERN_SUCCESS);
}
+#endif
if (options & HOST_REBOOT_UPSDELAY) {
// UPS power cutoff path
*/
while (processor->state == PROCESSOR_DISPATCHING) {
pset_unlock(pset);
+ splx(s);
delay(1);
+ s = splsched();
pset_lock(pset);
}
}
/*
- * Called at splsched.
+ * Called with interrupts disabled.
*/
void
processor_doshutdown(
{
thread_t old_thread, self = current_thread();
processor_t prev;
+ processor_set_t pset;
/*
* Get onto the processor to shutdown
prev = thread_bind(processor);
thread_block(THREAD_CONTINUE_NULL);
-#if HIBERNATION
- if (processor_avail_count < 2)
- hibernate_vm_lock();
+ assert(processor->state == PROCESSOR_SHUTDOWN);
+
+#if CONFIG_DTRACE
+ if (dtrace_cpu_state_changed_hook)
+ (*dtrace_cpu_state_changed_hook)(processor->cpu_id, FALSE);
#endif
- assert(processor->state == PROCESSOR_SHUTDOWN);
+ ml_cpu_down();
#if HIBERNATION
- if (processor_avail_count < 2)
+ if (processor_avail_count < 2) {
+ hibernate_vm_lock();
hibernate_vm_unlock();
+ }
#endif
+ pset = processor->processor_set;
+ pset_lock(pset);
+ processor->state = PROCESSOR_OFF_LINE;
+ --pset->online_processor_count;
+ (void)hw_atomic_sub(&processor_avail_count, 1);
+ commpage_update_active_cpus();
+ SCHED(processor_queue_shutdown)(processor);
+ /* pset lock dropped */
+
/*
* Continue processor shutdown in shutdown context.
*/
}
/*
- * Complete the shutdown and place the processor offline.
+ *Complete the shutdown and place the processor offline.
*
* Called at splsched in the shutdown context.
*/
processor_t processor)
{
thread_t new_thread, old_thread = processor->active_thread;
- processor_set_t pset;
new_thread = processor->idle_thread;
processor->active_thread = new_thread;
PMAP_DEACTIVATE_KERNEL(processor->cpu_id);
- pset = processor->processor_set;
- pset_lock(pset);
- processor->state = PROCESSOR_OFF_LINE;
- if (--pset->online_processor_count == 0) {
- pset_pri_init_hint(pset, PROCESSOR_NULL);
- pset_count_init_hint(pset, PROCESSOR_NULL);
- }
- (void)hw_atomic_sub(&processor_avail_count, 1);
- commpage_update_active_cpus();
- SCHED(processor_queue_shutdown)(processor);
- /* pset lock dropped */
-
- ml_cpu_down();
-
cpu_sleep();
panic("zombie processor");
/*NOTREACHED*/