#endif
}
-#if HIBERNATION
-struct acpi_hibernate_callback_data {
- acpi_sleep_callback func;
- void *refcon;
-};
-typedef struct acpi_hibernate_callback_data acpi_hibernate_callback_data_t;
+#if CONFIG_SLEEP
unsigned int save_kdebug_enable = 0;
static uint64_t acpi_sleep_abstime;
static uint64_t acpi_wake_abstime, acpi_wake_postrebase_abstime;
boolean_t deep_idle_rebase = TRUE;
-#if CONFIG_SLEEP
+#if HIBERNATION
+struct acpi_hibernate_callback_data {
+ acpi_sleep_callback func;
+ void *refcon;
+};
+typedef struct acpi_hibernate_callback_data acpi_hibernate_callback_data_t;
+
static void
acpi_hibernate(void *refcon)
{
}
}
+
+#if CONFIG_VMX
+ vmx_suspend();
+#endif
kdebug_enable = 0;
IOCPURunPlatformQuiesceActions();
/* should never get here! */
}
-#endif /* CONFIG_SLEEP */
#endif /* HIBERNATION */
+#endif /* CONFIG_SLEEP */
extern void slave_pstart(void);
extern void hibernate_rebuild_vm_structs(void);
hv_suspend();
#endif
-#if CONFIG_VMX
- /*
- * Turn off VT, otherwise switching to legacy mode will fail
- */
- vmx_suspend();
-#endif
-
/*
* Enable FPU/SIMD unit for potential hibernate acceleration
*/
#if HIBERNATION
acpi_sleep_cpu(acpi_hibernate, &data);
#else
+#if CONFIG_VMX
+ vmx_suspend();
+#endif
acpi_sleep_cpu(func, refcon);
#endif
- start = mach_absolute_time();
+ acpi_wake_abstime = mach_absolute_time();
+ /* Rebase TSC->absolute time conversion, using timestamp
+ * recorded before sleep.
+ */
+ rtc_nanotime_init(acpi_sleep_abstime);
+ acpi_wake_postrebase_abstime = start = mach_absolute_time();
+ assert(start >= acpi_sleep_abstime);
x86_64_post_sleep(old_cr3);
/* update CPU microcode */
ucode_update_wake();
+#if CONFIG_MTRR
+ /* set up PAT following boot processor power up */
+ pat_init();
+#endif
+
#if CONFIG_VMX
/*
* Restore VT mode
*/
- vmx_resume();
-#endif
-
-#if CONFIG_MTRR
- /* set up PAT following boot processor power up */
- pat_init();
+ vmx_resume(did_hibernate);
#endif
/*
if (lapic_probe())
lapic_configure();
+#if HIBERNATION
hibernate_rebuild_vm_structs();
+#endif
elapsed += mach_absolute_time() - start;
- acpi_wake_abstime = mach_absolute_time();
-
- /* let the realtime clock reset */
- rtc_sleep_wakeup(acpi_sleep_abstime);
- acpi_wake_postrebase_abstime = mach_absolute_time();
- assert(mach_absolute_time() >= acpi_sleep_abstime);
+ rtc_decrementer_configure();
kdebug_enable = save_kdebug_enable;
if (kdebug_enable == 0) {
if (wake_nkdbufs) {
start = mach_absolute_time();
- start_kern_tracing(wake_nkdbufs, TRUE);
+ kdebug_trace_start(wake_nkdbufs, NULL, TRUE);
elapsed_trace_start += mach_absolute_time() - start;
}
}
IOCPURunPlatformActiveActions();
+#if HIBERNATION
if (did_hibernate) {
elapsed += mach_absolute_time() - start;
KERNEL_DEBUG_CONSTANT(IOKDBG_CODE(DBG_HIBERNATE, 0) | DBG_FUNC_END, 0, 0, 0, 0, 0);
} else
+#endif /* HIBERNATION */
KERNEL_DEBUG_CONSTANT(IOKDBG_CODE(DBG_HIBERNATE, 0) | DBG_FUNC_END, 0, 0, 0, 0, 0);
/* Restore power management register state */
assert(cpu_number() == master_cpu);
- /*
- * Effectively set the boot cpu offline.
- * This will stop further deadlines being set.
- */
- cpu_datap(master_cpu)->cpu_running = FALSE;
-
/* Cancel any pending deadline */
setPop(0);
while (lapic_is_interrupting(LAPIC_TIMER_VECTOR)) {
}
acpi_wake_postrebase_abstime = mach_absolute_time();
assert(mach_absolute_time() >= acpi_idle_abstime);
- cpu_datap(master_cpu)->cpu_running = TRUE;
KERNEL_DEBUG_CONSTANT(
MACHDBG_CODE(DBG_MACH_SCHED, MACH_DEEP_IDLE) | DBG_FUNC_END,
/* Like S3 sleep, turn on tracing if trace_wake boot-arg is present */
if (kdebug_enable == 0) {
if (wake_nkdbufs)
- start_kern_tracing(wake_nkdbufs, TRUE);
+ kdebug_trace_start(wake_nkdbufs, NULL, TRUE);
}
IOCPURunPlatformActiveActions();