From: Pavel Machek 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 meaningfull labels.) Signed-off-by: Andrew Morton --- 25-akpm/arch/x86_64/kernel/suspend_asm.S | 47 ++++++++++++------------------- 1 files changed, 19 insertions(+), 28 deletions(-) diff -puN arch/x86_64/kernel/suspend_asm.S~swsusp-fix-x86-64-do-not-use-memory-in-copy-loop arch/x86_64/kernel/suspend_asm.S --- 25/arch/x86_64/kernel/suspend_asm.S~swsusp-fix-x86-64-do-not-use-memory-in-copy-loop 2004-10-03 15:59:11.927859248 -0700 +++ 25-akpm/arch/x86_64/kernel/suspend_asm.S 2004-10-03 15:59:11.931858640 -0700 @@ -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 _