X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/04b8595b18b1b41ac7a206e4b3d51a635f8413d7..4d15aeb193b2c68f1d38666c317f8d3734f5f083:/osfmk/i386/acpi.c diff --git a/osfmk/i386/acpi.c b/osfmk/i386/acpi.c index 76617a0da..955301c6d 100644 --- a/osfmk/i386/acpi.c +++ b/osfmk/i386/acpi.c @@ -89,12 +89,7 @@ acpi_install_wake_handler(void) #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; @@ -102,7 +97,13 @@ static uint64_t acpi_idle_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) { @@ -139,6 +140,10 @@ acpi_hibernate(void *refcon) } } + +#if CONFIG_VMX + vmx_suspend(); +#endif kdebug_enable = 0; IOCPURunPlatformQuiesceActions(); @@ -149,8 +154,8 @@ acpi_hibernate(void *refcon) /* should never get here! */ } -#endif /* CONFIG_SLEEP */ #endif /* HIBERNATION */ +#endif /* CONFIG_SLEEP */ extern void slave_pstart(void); extern void hibernate_rebuild_vm_structs(void); @@ -201,13 +206,6 @@ acpi_sleep_kernel(acpi_sleep_callback func, void *refcon) 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 */ @@ -230,10 +228,19 @@ acpi_sleep_kernel(acpi_sleep_callback func, void *refcon) #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); @@ -273,16 +280,16 @@ acpi_sleep_kernel(acpi_sleep_callback func, void *refcon) /* 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 /* @@ -296,22 +303,19 @@ acpi_sleep_kernel(acpi_sleep_callback func, void *refcon) 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; } } @@ -323,6 +327,7 @@ acpi_sleep_kernel(acpi_sleep_callback func, void *refcon) IOCPURunPlatformActiveActions(); +#if HIBERNATION if (did_hibernate) { elapsed += mach_absolute_time() - start; @@ -334,6 +339,7 @@ acpi_sleep_kernel(acpi_sleep_callback func, void *refcon) 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 */ @@ -380,12 +386,6 @@ acpi_idle_kernel(acpi_sleep_callback func, void *refcon) 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)) { @@ -434,7 +434,6 @@ acpi_idle_kernel(acpi_sleep_callback func, void *refcon) } 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, @@ -443,7 +442,7 @@ acpi_idle_kernel(acpi_sleep_callback func, void *refcon) /* 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();