]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/i386/acpi.c
xnu-3789.70.16.tar.gz
[apple/xnu.git] / osfmk / i386 / acpi.c
index 76617a0da90dd32591e606b7b4a20337cd6f8fb8..955301c6d72bc6d3a6feec828fefe5ec11b39b50 100644 (file)
@@ -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();