]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
x86, boot: use appropriate rep string for move and clear
authorH. Peter Anvin <hpa@zytor.com>
Fri, 8 May 2009 23:45:15 +0000 (16:45 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Sat, 9 May 2009 00:34:52 +0000 (17:34 -0700)
In the pre-decompression code, use the appropriate largest possible
rep movs and rep stos to move code and clear bss, respectively.  For
reverse copy, do note that the initial values are supposed to be the
address of the first (highest) copy datum, not one byte beyond the end
of the buffer.

rep strings are not necessarily the fastest way to perform these
operations on all current processors, but are likely to be in the
future, and perhaps more importantly, we want to encourage the
architecturally right thing to do here.

This also fixes a couple of trivial inefficiencies on 64 bits.

[ Impact: trivial performance enhancement, increase code similarity ]

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
arch/x86/boot/compressed/head_32.S
arch/x86/boot/compressed/head_64.S

index d02a4f02be138bac46e0c7d54687f51a7dcddf17..6710dc78ac599244dea70c56c3ae62eea9ea628f 100644 (file)
@@ -100,11 +100,12 @@ ENTRY(startup_32)
  * where decompression in place becomes safe.
  */
        pushl   %esi
-       leal    _bss(%ebp), %esi
-       leal    _bss(%ebx), %edi
+       leal    (_bss-4)(%ebp), %esi
+       leal    (_bss-4)(%ebx), %edi
        movl    $(_bss - startup_32), %ecx
+       shrl    $2, %ecx
        std
-       rep     movsb
+       rep     movsl
        cld
        popl    %esi
 
@@ -135,8 +136,8 @@ relocated:
        leal    _bss(%ebx), %edi
        leal    _ebss(%ebx), %ecx
        subl    %edi, %ecx
-       cld
-       rep     stosb
+       shrl    $2, %ecx
+       rep     stosl
 
 /*
  * Do the decompression, and jump to the new kernel..
index a0b18426069a17a4ff7dfda0acf8f08a7876ed0a..723c72dfd7bc55a73df0ebb2bf9ad09e27937d77 100644 (file)
@@ -260,15 +260,15 @@ ENTRY(startup_64)
  * Copy the compressed kernel to the end of our buffer
  * where decompression in place becomes safe.
  */
-       leaq    _bss(%rip), %r8
-       leaq    _bss(%rbx), %r9
+       pushq   %rsi
+       leaq    (_bss-8)(%rip), %rsi
+       leaq    (_bss-8)(%rbx), %rdi
        movq    $_bss /* - $startup_32 */, %rcx
-1:     subq    $8, %r8
-       subq    $8, %r9
-       movq    0(%r8), %rax
-       movq    %rax, 0(%r9)
-       subq    $8, %rcx
-       jnz     1b
+       shrq    $3, %rcx
+       std
+       rep     movsq
+       cld
+       popq    %rsi
 
 /*
  * Jump to the relocated address.
@@ -282,12 +282,12 @@ relocated:
 /*
  * Clear BSS (stack is currently empty)
  */
-       xorq    %rax, %rax
-       leaq    _bss(%rbx), %rdi
-       leaq    _ebss(%rbx), %rcx
+       xorl    %eax, %eax
+       leaq    _bss(%rip), %rdi
+       leaq    _ebss(%rip), %rcx
        subq    %rdi, %rcx
-       cld
-       rep     stosb
+       shrq    $3, %rcx
+       rep     stosq
 
 /*
  * Do the decompression, and jump to the new kernel..