/** * copyback_post - post atomic-restore actions * * After doing the atomic restore, we have a few more things to do: * 1) We want to retain some values across the restore, so we now copy * these from the nosave variables to the normal ones. * 2) Set the status flags. * 3) Resume devices. * 4) Tell userui so it can redraw & restore settings. * 5) Reread the page cache. **/ void copyback_post(void) { struct toi_boot_kernel_data *bkd = (struct toi_boot_kernel_data *)boot_kernel_data_buffer; if (toi_activate_storage(1)) panic("Failed to reactivate our storage."); toi_post_atomic_restore_modules(bkd); toi_cond_pause(1, "About to reload secondary pagedir."); if (read_pageset2(0)) panic("Unable to successfully reread the page cache."); /* * If the user wants to sleep again after resuming from full-off, * it's most likely to be in order to suspend to ram, so we'll * do this check after loading pageset2, to give them the fastest * wakeup when they are ready to use the computer again. */ toi_check_resleep(); }
static void __toi_power_down(int method) { int error; toi_cond_pause(1, test_action_state(TOI_REBOOT) ? "Ready to reboot." : "Powering down."); if (test_result_state(TOI_ABORTED)) goto out; if (test_action_state(TOI_REBOOT)) kernel_restart(NULL); switch (method) { case 0: break; case 3: /* * Re-read the overwritten part of pageset2 to make post-resume * faster. */ if (read_pageset2(1)) panic("Attempt to reload pagedir 2 failed. " "Try rebooting."); pm_prepare_console(); error = pm_notifier_call_chain(PM_SUSPEND_PREPARE); if (!error) { pm_restore_gfp_mask(); error = suspend_devices_and_enter(PM_SUSPEND_MEM); pm_restrict_gfp_mask(); if (!error) did_suspend_to_both = 1; } pm_notifier_call_chain(PM_POST_SUSPEND); pm_restore_console(); // jonathan.jmchen: FIXME, Create API to add another wakeup source to power down, // if system is idle after xxx (e.g., 5 min) without user interaction!! /* Success - we're now post-resume-from-ram */ if (did_suspend_to_both) return; /* Failed to suspend to ram - do normal power off */ break; case 4: /* * If succeeds, doesn't return. If fails, do a simple * powerdown. */ hibernation_platform_enter(); break; case 5: /* Historic entry only now */ break; } if (method && method != 5) toi_cond_pause(1, "Falling back to alternate power off method."); if (test_result_state(TOI_ABORTED)) goto out; kernel_power_off(); kernel_halt(); toi_cond_pause(1, "Powerdown failed."); while (1) cpu_relax(); out: if (read_pageset2(1)) panic("Attempt to reload pagedir 2 failed. Try rebooting."); return; }