/*
- * Copyright (c) 2000-2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2009 Apple Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
#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>
#include <kern/task.h>
#include <kern/thread.h>
+#include <machine/commpage.h>
+
#if HIBERNATION
#include <IOKit/IOHibernatePrivate.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->processor_count == 1)
- pset->low_pri = pset->low_count = 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);
+ commpage_update_active_cpus();
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);
}
}
if (processor->state == PROCESSOR_IDLE)
- remqueue(&pset->idle_queue, (queue_entry_t)processor);
+ remqueue((queue_entry_t)processor);
else
if (processor->state == PROCESSOR_RUNNING)
- remqueue(&pset->active_queue, (queue_entry_t)processor);
+ remqueue((queue_entry_t)processor);
processor->state = PROCESSOR_SHUTDOWN;
processor_doshutdown(processor);
splx(s);
- cpu_exit_wait(processor->cpu_num);
+ cpu_exit_wait(processor->cpu_id);
return (KERN_SUCCESS);
}
/*
- * 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;
processor->current_pri = IDLEPRI;
+ processor->current_thmode = TH_MODE_NONE;
processor->deadline = UINT64_MAX;
new_thread->last_processor = processor;
thread_dispatch(old_thread, new_thread);
- PMAP_DEACTIVATE_KERNEL(processor->cpu_num);
-
- pset = processor->processor_set;
- pset_lock(pset);
- processor->state = PROCESSOR_OFF_LINE;
- if (--pset->processor_count == 0)
- pset->low_pri = pset->low_count = PROCESSOR_NULL;
- (void)hw_atomic_sub(&processor_avail_count, 1);
- processor_queue_shutdown(processor);
- /* pset lock dropped */
-
- ml_cpu_down();
+ PMAP_DEACTIVATE_KERNEL(processor->cpu_id);
cpu_sleep();
panic("zombie processor");