1.text 2 3/* Originally gcc generated, modified by hand 4 * 5 * This may not use any stack, nor any variable that is not "NoSave": 6 * 7 * Its rewriting one kernel image with another. What is stack in "old" 8 * image could very well be data page in "new" image, and overwriting 9 * your own stack under you is bad idea. 10 */ 11 12#include <linux/linkage.h> 13#include <asm/segment.h> 14#include <asm/page.h> 15#include <asm/asm-offsets.h> 16 17 .text 18 19ENTRY(swsusp_arch_suspend) 20 21 movl %esp, saved_context_esp 22 movl %ebx, saved_context_ebx 23 movl %ebp, saved_context_ebp 24 movl %esi, saved_context_esi 25 movl %edi, saved_context_edi 26 pushfl ; popl saved_context_eflags 27 28 call swsusp_save 29 ret 30 31ENTRY(restore_image) 32 movl resume_pg_dir, %ecx 33 subl $__PAGE_OFFSET, %ecx 34 movl %ecx, %cr3 35 36 movl restore_pblist, %edx 37 .p2align 4,,7 38 39copy_loop: 40 testl %edx, %edx 41 jz done 42 43 movl pbe_address(%edx), %esi 44 movl pbe_orig_address(%edx), %edi 45 46 movl $1024, %ecx 47 rep 48 movsl 49 50 movl pbe_next(%edx), %edx 51 jmp copy_loop 52 .p2align 4,,7 53 54done: 55 /* go back to the original page tables */ 56 movl $swapper_pg_dir, %ecx 57 subl $__PAGE_OFFSET, %ecx 58 movl %ecx, %cr3 59 /* Flush TLB, including "global" things (vmalloc) */ 60 movl mmu_cr4_features, %eax 61 movl %eax, %edx 62 andl $~(1<<7), %edx; # PGE 63 movl %edx, %cr4; # turn off PGE 64 movl %cr3, %ecx; # flush TLB 65 movl %ecx, %cr3 66 movl %eax, %cr4; # turn PGE back on 67 68 movl saved_context_esp, %esp 69 movl saved_context_ebp, %ebp 70 movl saved_context_ebx, %ebx 71 movl saved_context_esi, %esi 72 movl saved_context_edi, %edi 73 74 pushl saved_context_eflags ; popfl 75 76 xorl %eax, %eax 77 78 ret 79