Path: blob/master/arch/x86/power/hibernate_asm_32.S
10817 views
/*1* This may not use any stack, nor any variable that is not "NoSave":2*3* Its rewriting one kernel image with another. What is stack in "old"4* image could very well be data page in "new" image, and overwriting5* your own stack under you is bad idea.6*/78#include <linux/linkage.h>9#include <asm/segment.h>10#include <asm/page_types.h>11#include <asm/asm-offsets.h>12#include <asm/processor-flags.h>1314.text1516ENTRY(swsusp_arch_suspend)17movl %esp, saved_context_esp18movl %ebx, saved_context_ebx19movl %ebp, saved_context_ebp20movl %esi, saved_context_esi21movl %edi, saved_context_edi22pushfl23popl saved_context_eflags2425call swsusp_save26ret2728ENTRY(restore_image)29movl mmu_cr4_features, %ecx30movl resume_pg_dir, %eax31subl $__PAGE_OFFSET, %eax32movl %eax, %cr33334jecxz 1f # cr4 Pentium and higher, skip if zero35andl $~(X86_CR4_PGE), %ecx36movl %ecx, %cr4; # turn off PGE37movl %cr3, %eax; # flush TLB38movl %eax, %cr3391:40movl restore_pblist, %edx41.p2align 4,,74243copy_loop:44testl %edx, %edx45jz done4647movl pbe_address(%edx), %esi48movl pbe_orig_address(%edx), %edi4950movl $1024, %ecx51rep52movsl5354movl pbe_next(%edx), %edx55jmp copy_loop56.p2align 4,,75758done:59/* go back to the original page tables */60movl $swapper_pg_dir, %eax61subl $__PAGE_OFFSET, %eax62movl %eax, %cr363movl mmu_cr4_features, %ecx64jecxz 1f # cr4 Pentium and higher, skip if zero65movl %ecx, %cr4; # turn PGE back on661:6768movl saved_context_esp, %esp69movl saved_context_ebp, %ebp70movl saved_context_ebx, %ebx71movl saved_context_esi, %esi72movl saved_context_edi, %edi7374pushl saved_context_eflags75popfl7677xorl %eax, %eax7879ret808182