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