]> git.hungrycats.org Git - linux/commitdiff
[PATCH] swsusp: fix x86-64 - do not use memory in copy loop
authorPavel Machek <pavel@ucw.cz>
Sun, 17 Oct 2004 02:20:42 +0000 (19:20 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Sun, 17 Oct 2004 02:20:42 +0000 (19:20 -0700)
In assembly code, there are some problems with "nosave" section (linker was
doing something stupid, like duplicating the section).  We attempted to fix
it, but fix was worse then first problem.  This fixes is for good: We no
longer use any memory in the copy loop.  (Plus it fixes indentation and
uses meaningful labels.)

Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/x86_64/kernel/suspend_asm.S

index 48ad06289d49570bd1d10c3e567bd3cee8214049..8a39998106fabeef28ef478f9127427dfa8a4998 100644 (file)
@@ -39,29 +39,28 @@ ENTRY(swsusp_arch_resume)
        /* set up cr3 */        
        leaq    init_level4_pgt(%rip),%rax
        subq    $__START_KERNEL_map,%rax
-       movq %rax,%cr3
+       movq    %rax,%cr3
 
        movq    mmu_cr4_features(%rip), %rax
        movq    %rax, %rdx
-       
        andq    $~(1<<7), %rdx  # PGE
-       movq %rdx, %cr4;  # turn off PGE     
-       movq %cr3, %rcx;  # flush TLB        
-       movq %rcx, %cr3;                     
-       movq %rax, %cr4;  # turn PGE back on 
+       movq    %rdx, %cr4;  # turn off PGE
+       movq    %cr3, %rcx;  # flush TLB
+       movq    %rcx, %cr3;
+       movq    %rax, %cr4;  # turn PGE back on
 
        movl    nr_copy_pages(%rip), %eax
        xorl    %ecx, %ecx
-       movq    $0, loop(%rip)
+       movq    $0, %r10
        testl   %eax, %eax
-       je      .L108
+       jz      done
 .L105:
        xorl    %esi, %esi
-       movq    $0, loop2(%rip)
+       movq    $0, %r11
        jmp     .L104
        .p2align 4,,7
-.L111:
-       movq    loop(%rip), %rcx
+copy_one_page:
+       movq    %r10, %rcx
 .L104:
        movq    pagedir_nosave(%rip), %rdx
        movq    %rcx, %rax
@@ -71,27 +70,26 @@ ENTRY(swsusp_arch_resume)
        movzbl  (%rsi,%rax), %eax
        movb    %al, (%rsi,%rcx)
 
-       movq %cr3, %rax;  # flush TLB 
-       movq %rax, %cr3;              
+       movq    %cr3, %rax;  # flush TLB
+       movq    %rax, %cr3;
 
-       movq    loop2(%rip), %rax
+       movq    %r11, %rax
        incq    %rax
        cmpq    $4095, %rax
        movq    %rax, %rsi
-       movq    %rax, loop2(%rip)
-       jbe     .L111
-       movq    loop(%rip), %rax
+       movq    %rax, %r11
+       jbe     copy_one_page
+       movq    %r10, %rax
        incq    %rax
        movq    %rax, %rcx
-       movq    %rax, loop(%rip)
+       movq    %rax, %r10
        mov     nr_copy_pages(%rip), %eax
        cmpq    %rax, %rcx
        jb      .L105
-.L108:
-       .align 4
+done:
        movl    $24, %eax
+       movl    %eax, %ds
 
-       movl %eax, %ds
        movq saved_context_esp(%rip), %rsp
        movq saved_context_ebp(%rip), %rbp
        movq saved_context_eax(%rip), %rax
@@ -111,10 +109,3 @@ ENTRY(swsusp_arch_resume)
        pushq saved_context_eflags(%rip) ; popfq
        call    swsusp_restore
        ret
-
-       .section .data.nosave
-loop:
-       .quad 0
-loop2: 
-       .quad 0         
-       .previous