X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fi386%2Fpower%2Fswsusp.S;h=c893b897217fa597ce6c43692eb5630f171a1e25;hb=43bc926fffd92024b46cafaf7350d669ba9ca884;hp=ac2b57d7a045b9ff624c56174a02726f29b9c31f;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/arch/i386/power/swsusp.S b/arch/i386/power/swsusp.S index ac2b57d7a..c893b8972 100644 --- a/arch/i386/power/swsusp.S +++ b/arch/i386/power/swsusp.S @@ -12,89 +12,62 @@ #include #include #include +#include .text -ENTRY(do_magic) - pushl %ebx - cmpl $0,8(%esp) - jne .L1450 - call do_magic_suspend_1 - call save_processor_state +ENTRY(swsusp_arch_suspend) movl %esp, saved_context_esp - movl %eax, saved_context_eax movl %ebx, saved_context_ebx - movl %ecx, saved_context_ecx - movl %edx, saved_context_edx movl %ebp, saved_context_ebp movl %esi, saved_context_esi movl %edi, saved_context_edi pushfl ; popl saved_context_eflags - call do_magic_suspend_2 - jmp .L1449 - .p2align 4,,7 -.L1450: - movl $swapper_pg_dir-__PAGE_OFFSET,%ecx - movl %ecx,%cr3 - - call do_magic_resume_1 - movl $0,loop - cmpl $0,nr_copy_pages - je .L1453 - .p2align 4,,7 -.L1455: - movl $0,loop2 + call swsusp_save + ret + +ENTRY(swsusp_arch_resume) + movl $swsusp_pg_dir-__PAGE_OFFSET, %ecx + movl %ecx, %cr3 + + movl pagedir_nosave, %edx .p2align 4,,7 -.L1459: - movl pagedir_nosave,%ecx - movl loop,%eax - movl loop2,%edx - sall $4,%eax - movl 4(%ecx,%eax),%ebx - movl (%ecx,%eax),%eax - movb (%edx,%eax),%al - movb %al,(%edx,%ebx) - movl %cr3, %eax; - movl %eax, %cr3; # flush TLB - - movl loop2,%eax - leal 1(%eax),%edx - movl %edx,loop2 - movl %edx,%eax - cmpl $4095,%eax - jbe .L1459 - movl loop,%eax - leal 1(%eax),%edx - movl %edx,loop - movl %edx,%eax - cmpl nr_copy_pages,%eax - jb .L1455 + +copy_loop: + testl %edx, %edx + jz done + + movl pbe_address(%edx), %esi + movl pbe_orig_address(%edx), %edi + + movl $1024, %ecx + rep + movsl + + movl pbe_next(%edx), %edx + jmp copy_loop .p2align 4,,7 -.L1453: - movl $__USER_DS,%eax - movw %ax, %ds - movw %ax, %es +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_eax, %eax movl saved_context_ebx, %ebx - movl saved_context_ecx, %ecx - movl saved_context_edx, %edx movl saved_context_esi, %esi movl saved_context_edi, %edi - call restore_processor_state + pushl saved_context_eflags ; popfl - call do_magic_resume_2 -.L1449: - popl %ebx - ret - .section .data.nosave -loop: - .quad 0 -loop2: - .quad 0 - .previous + xorl %eax, %eax + + ret