]> git.karo-electronics.de Git - linux-beck.git/commitdiff
x86, boot: straighten out ranges to copy/zero in compressed/head*.S
authorH. Peter Anvin <hpa@zytor.com>
Fri, 8 May 2009 23:20:34 +0000 (16:20 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Sat, 9 May 2009 00:18:10 +0000 (17:18 -0700)
Both on 32 and 64 bits, we copy all the way up to the end of bss,
except that on 64 bits there is a hack to avoid copying on top of the
page tables.  There is no point in copying bss at all, especially
since we are just about to zero it all anyway.

To clean up and unify the handling, we now do:

  - copy from startup_32 to _bss.
  - zero from _bss to _ebss.
  - the _ebss symbol is aligned to an 8-byte boundary.
  - the page tables are moved to a separate section.

Use _bss as the copy endpoint since _edata may be misaligned.

[ Impact: cleanup, trivial performance improvement ]

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

index 7bd7766ffabfd25d9dbcc61620efb83de8c63bd1..59425e157df3b43907eea26127ada3786d41fd25 100644 (file)
@@ -93,9 +93,9 @@ ENTRY(startup_32)
  * where decompression in place becomes safe.
  */
        pushl   %esi
-       leal    _ebss(%ebp), %esi
-       leal    _ebss(%ebx), %edi
-       movl    $(_ebss - startup_32), %ecx
+       leal    _bss(%ebp), %esi
+       leal    _bss(%ebx), %edi
+       movl    $(_bss - startup_32), %ecx
        std
        rep     movsb
        cld
@@ -125,7 +125,7 @@ relocated:
  * Clear BSS
  */
        xorl    %eax, %eax
-       leal    _edata(%ebx), %edi
+       leal    _bss(%ebx), %edi
        leal    _ebss(%ebx), %ecx
        subl    %edi, %ecx
        cld
index 26c3def43ace95bf0995d77a27aae7120f0a3d66..5bc9052615b6dba4f39fb6470c5d871b7d24db29 100644 (file)
@@ -253,9 +253,9 @@ ENTRY(startup_64)
  * Copy the compressed kernel to the end of our buffer
  * where decompression in place becomes safe.
  */
-       leaq    _end_before_pgt(%rip), %r8
-       leaq    _end_before_pgt(%rbx), %r9
-       movq    $_end_before_pgt /* - $startup_32 */, %rcx
+       leaq    _bss(%rip), %r8
+       leaq    _bss(%rbx), %r9
+       movq    $_bss /* - $startup_32 */, %rcx
 1:     subq    $8, %r8
        subq    $8, %r9
        movq    0(%r8), %rax
@@ -276,8 +276,8 @@ relocated:
  * Clear BSS
  */
        xorq    %rax, %rax
-       leaq    _edata(%rbx), %rdi
-       leaq    _end_before_pgt(%rbx), %rcx
+       leaq    _bss(%rbx), %rdi
+       leaq    _ebss(%rbx), %rcx
        subq    %rdi, %rcx
        cld
        rep     stosb
@@ -329,3 +329,11 @@ boot_heap:
 boot_stack:
        .fill BOOT_STACK_SIZE, 1, 0
 boot_stack_end:
+
+/*
+ * Space for page tables (not in .bss so not zeroed)
+ */
+       .section ".pgtable","a",@nobits
+       .balign 4096
+pgtable:
+       .fill 6*4096, 1, 0
index dbe515e13fef2c290a65948d8da305ae7fedcc95..cc353e1b3ffd49185f2cf0683e21894462f0c1de 100644 (file)
@@ -2,6 +2,8 @@ OUTPUT_FORMAT(CONFIG_OUTPUT_FORMAT, CONFIG_OUTPUT_FORMAT, CONFIG_OUTPUT_FORMAT)
 
 #undef i386
 
+#include <asm/page_types.h>
+
 #ifdef CONFIG_X86_64
 OUTPUT_ARCH(i386:x86-64)
 ENTRY(startup_64)
@@ -48,13 +50,16 @@ SECTIONS
                *(.bss)
                *(.bss.*)
                *(COMMON)
-#ifdef CONFIG_X86_64
-               . = ALIGN(8);
-               _end_before_pgt = . ;
-               . = ALIGN(4096);
-               pgtable = . ;
-               . = . + 4096 * 6;
-#endif
+               . = ALIGN(8);   /* For convenience during zeroing */
                _ebss = .;
        }
+#ifdef CONFIG_X86_64
+       . = ALIGN(PAGE_SIZE);
+       .pgtable : {
+               _pgtable = . ;
+               *(.pgtable)
+               _epgtable = . ;
+       }
+#endif
+       _end = .;
 }