fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / arch / i386 / power / swsusp.S
index 6e6335f..53662e0 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/linkage.h>
 #include <asm/segment.h>
 #include <asm/page.h>
+#include <asm/asm-offsets.h>
 
        .text
 
@@ -27,29 +28,43 @@ ENTRY(swsusp_arch_suspend)
        call swsusp_save
        ret
 
-ENTRY(swsusp_arch_resume)
-       movl $swsusp_pg_dir-__PAGE_OFFSET,%ecx
-       movl %ecx,%cr3
+ENTRY(restore_image)
+       movl    resume_pg_dir, %ecx
+       subl    $__PAGE_OFFSET, %ecx
+       movl    %ecx, %cr3
 
-       movl    pagedir_nosave, %ebx
-       xorl    %eax, %eax
-       xorl    %edx, %edx
+       movl    restore_pblist, %edx
        .p2align 4,,7
 
 copy_loop:
-       movl    4(%ebx,%edx),%edi
-       movl    (%ebx,%edx),%esi
+       testl   %edx, %edx
+       jz      done
+
+       movl    pbe_address(%edx), %esi
+       movl    pbe_orig_address(%edx), %edi
 
        movl    $1024, %ecx
        rep
        movsl
 
-       incl    %eax
-       addl    $16, %edx
-       cmpl    nr_copy_pages,%eax
-       jb copy_loop
+       movl    pbe_next(%edx), %edx
+       jmp     copy_loop
        .p2align 4,,7
 
+done:
+       /* go back to the original page tables */
+       movl    $swapper_pg_dir, %ecx
+       subl    $__PAGE_OFFSET, %ecx
+       movl    %ecx, %cr3
+       /* Flush TLB, including "global" things (vmalloc) */
+       movl    mmu_cr4_features, %eax
+       movl    %eax, %edx
+       andl    $~(1<<7), %edx;  # PGE
+       movl    %edx, %cr4;  # turn off PGE
+       movl    %cr3, %ecx;  # flush TLB
+       movl    %ecx, %cr3
+       movl    %eax, %cr4;  # turn PGE back on
+
        movl saved_context_esp, %esp
        movl saved_context_ebp, %ebp
        movl saved_context_ebx, %ebx
@@ -57,5 +72,7 @@ copy_loop:
        movl saved_context_edi, %edi
 
        pushl saved_context_eflags ; popfl
-       call swsusp_restore
+
+       xorl    %eax, %eax
+
        ret