/* * Snapshot kernel memory and reset the system. * * swsusp_save() is executed in the suspend finisher so that the CPU * context pointer and memory are part of the saved image, which is * required by the resume kernel image to restart execution from * swsusp_arch_suspend(). * * soft_restart is not technically needed, but is used to get success * returned from cpu_suspend. * * When soft reboot completes, the hibernation snapshot is written out. */ static int notrace arch_save_image(unsigned long unused) { int ret; ret = swsusp_save(); if (ret == 0) soft_restart(virt_to_phys(cpu_resume)); return ret; }
/* * Snapshot kernel memory and reset the system. * After resume, the hibernation snapshot is written out. */ static int notrace __swsusp_arch_save_image(unsigned long unused) { extern int swsusp_save(void); int ret; ret = swsusp_save(); swsusp_saved = (ret == 0) ? 1 : 0; return ret; }
/* * Snapshot kernel memory and reset the system. * * swsusp_save() is executed in the suspend finisher so that the CPU * context pointer and memory are part of the saved image, which is * required by the resume kernel image to restart execution from * swsusp_arch_suspend(). * * soft_restart is not technically needed, but is used to get success * returned from cpu_suspend. * * When soft reboot completes, the hibernation snapshot is written out. */ static int notrace arch_save_image(unsigned long unused) { int ret; ret = swsusp_save(); #ifdef CONFIG_MTK_HIBERNATION swsusp_saved = (ret == 0) ? 1 : 0; #else if (ret == 0) _soft_restart(virt_to_phys(cpu_resume), false); #endif return ret; }
int swsusp_arch_suspend(void) { int ret = 0; unsigned long flags; struct sleep_stack_data state; if (cpus_are_stuck_in_kernel()) { pr_err("Can't hibernate: no mechanism to offline secondary CPUs.\n"); return -EBUSY; } flags = local_daif_save(); if (__cpu_suspend_enter(&state)) { /* make the crash dump kernel image visible/saveable */ crash_prepare_suspend(); sleep_cpu = smp_processor_id(); ret = swsusp_save(); } else { /* Clean kernel core startup/idle code to PoC*/ dcache_clean_range(__mmuoff_data_start, __mmuoff_data_end); dcache_clean_range(__idmap_text_start, __idmap_text_end); /* Clean kvm setup code to PoC? */ if (el2_reset_needed()) dcache_clean_range(__hyp_idmap_text_start, __hyp_idmap_text_end); /* make the crash dump kernel image protected again */ crash_post_resume(); /* * Tell the hibernation core that we've just restored * the memory */ in_suspend = 0; sleep_cpu = -EINVAL; __cpu_suspend_exit(); } local_daif_restore(flags); return ret; }