vserver 2.0 rc7
[linux-2.6.git] / arch / i386 / power / swsusp.S
index 6e6335f..c410528 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/linkage.h>
 #include <asm/segment.h>
 #include <asm/page.h>
+#include <asm/asm_offsets.h>
 
        .text
 
@@ -28,28 +29,37 @@ ENTRY(swsusp_arch_suspend)
        ret
 
 ENTRY(swsusp_arch_resume)
-       movl $swsusp_pg_dir-__PAGE_OFFSET,%ecx
-       movl %ecx,%cr3
+       movl    $swsusp_pg_dir-__PAGE_OFFSET, %ecx
+       movl    %ecx, %cr3
 
-       movl    pagedir_nosave, %ebx
-       xorl    %eax, %eax
-       xorl    %edx, %edx
+       movl    pagedir_nosave, %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:
+       /* 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 +67,7 @@ copy_loop:
        movl saved_context_edi, %edi
 
        pushl saved_context_eflags ; popfl
-       call swsusp_restore
+
+       xorl    %eax, %eax
+
        ret