Commit 8ae81ff5 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] more i386 head.S cleanups

From: Brian Gerst <bgerst@didntduck.org>

- Move empty_zero_page and swapper_pg_dir to BSS.  This requires that BSS
  is cleared earlier, but reclaims over 3k that was lost due to page
  alignment.

- Move stack_start, ready, and int_msg, boot_gdt_descr, idt_descr, and
  cpu_gdt_descr to .data.  They were interfering with disassembly while in
  .text.
parent f0d53a52
...@@ -68,10 +68,23 @@ ENTRY(startup_32) ...@@ -68,10 +68,23 @@ ENTRY(startup_32)
movl %eax,%fs movl %eax,%fs
movl %eax,%gs movl %eax,%gs
/*
* Clear BSS first so that there are no surprises...
* No need to cld as DF is already clear from cld above...
*/
xorl %eax,%eax
movl $__bss_start - __PAGE_OFFSET,%edi
movl $__bss_stop - __PAGE_OFFSET,%ecx
subl %edi,%ecx
shrl $2,%ecx
rep ; stosl
/* /*
* Initialize page tables. This creates a PDE and a set of page * Initialize page tables. This creates a PDE and a set of page
* tables, which are located immediately beyond _end. The variable * tables, which are located immediately beyond _end. The variable
* init_pg_tables_end is set up to point to the first "safe" location. * init_pg_tables_end is set up to point to the first "safe" location.
* Mappings are created both at virtual address 0 (identity mapping)
* and PAGE_OFFSET for up to _end+sizeof(page tables)+INIT_MAP_BEYOND_END.
* *
* Warning: don't use %esi or the stack in this code. However, %esp * Warning: don't use %esi or the stack in this code. However, %esp
* can be used as a GPR if you really need it... * can be used as a GPR if you really need it...
...@@ -172,17 +185,6 @@ ENTRY(startup_32_smp) ...@@ -172,17 +185,6 @@ ENTRY(startup_32_smp)
1: 1:
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
/*
* Clear BSS first so that there are no surprises...
* No need to cld as DF is already clear from cld above...
*/
xorl %eax,%eax
movl $__bss_start,%edi
movl $__bss_stop,%ecx
subl %edi,%ecx
shrl $2,%ecx
rep ; stosl
/* /*
* start system 32-bit setup. We need to re-do some of the things done * start system 32-bit setup. We need to re-do some of the things done
* in 16-bit mode for the "real" operations. * in 16-bit mode for the "real" operations.
...@@ -304,8 +306,6 @@ L6: ...@@ -304,8 +306,6 @@ L6:
jmp L6 # main should never return here, but jmp L6 # main should never return here, but
# just in case, we know what happens. # just in case, we know what happens.
ready: .byte 0
/* /*
* We depend on ET to be correct. This checks for 287/387. * We depend on ET to be correct. This checks for 287/387.
*/ */
...@@ -353,13 +353,7 @@ rp_sidt: ...@@ -353,13 +353,7 @@ rp_sidt:
jne rp_sidt jne rp_sidt
ret ret
ENTRY(stack_start)
.long init_thread_union+THREAD_SIZE
.long __BOOT_DS
/* This is the default interrupt "handler" :-) */ /* This is the default interrupt "handler" :-) */
int_msg:
.asciz "Unknown interrupt or fault at EIP %p %p %p\n"
ALIGN ALIGN
ignore_int: ignore_int:
cld cld
...@@ -385,6 +379,35 @@ ignore_int: ...@@ -385,6 +379,35 @@ ignore_int:
popl %eax popl %eax
iret iret
/*
* Real beginning of normal "text" segment
*/
ENTRY(stext)
ENTRY(_stext)
/*
* BSS section
*/
.section ".bss.page_aligned","w"
ENTRY(swapper_pg_dir)
.fill 1024,4,0
ENTRY(empty_zero_page)
.fill 4096,1,0
/*
* This starts the data section.
*/
.data
ENTRY(stack_start)
.long init_thread_union+THREAD_SIZE
.long __BOOT_DS
ready: .byte 0
int_msg:
.asciz "Unknown interrupt or fault at EIP %p %p %p\n"
/* /*
* The IDT and GDT 'descriptors' are a strange 48-bit object * The IDT and GDT 'descriptors' are a strange 48-bit object
* only used by the lidt and lgdt instructions. They are not * only used by the lidt and lgdt instructions. They are not
...@@ -416,39 +439,6 @@ cpu_gdt_descr: ...@@ -416,39 +439,6 @@ cpu_gdt_descr:
.fill NR_CPUS-1,8,0 # space for the other GDT descriptors .fill NR_CPUS-1,8,0 # space for the other GDT descriptors
/*
* swapper_pg_dir is the main page directory, address 0x00101000
*
* This is initialized to create an identity-mapping at 0 (for bootup
* purposes) and another mapping at virtual address PAGE_OFFSET. The
* values put here should be all invalid (zero); the valid
* entries are created dynamically at boot time.
*
* The code creates enough page tables to map 0-_end, the page tables
* themselves, plus INIT_MAP_BEYOND_END bytes; see comment at beginning.
*/
.org 0x1000
ENTRY(swapper_pg_dir)
.fill 1024,4,0
.org 0x2000
ENTRY(empty_zero_page)
.fill 4096,1,0
.org 0x3000
/*
* Real beginning of normal "text" segment
*/
ENTRY(stext)
ENTRY(_stext)
/*
* This starts the data section. Note that the above is all
* in the text section because it has alignment requirements
* that we cannot fulfill any other way.
*/
.data
/* /*
* The boot_gdt_table must mirror the equivalent in setup.S and is * The boot_gdt_table must mirror the equivalent in setup.S and is
* used only for booting. * used only for booting.
......
...@@ -106,7 +106,10 @@ SECTIONS ...@@ -106,7 +106,10 @@ SECTIONS
/* freed after init ends here */ /* freed after init ends here */
__bss_start = .; /* BSS */ __bss_start = .; /* BSS */
.bss : { *(.bss) } .bss : {
*(.bss.page_aligned)
*(.bss)
}
. = ALIGN(4); . = ALIGN(4);
__bss_stop = .; __bss_stop = .;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment