提交 0a137736 编写于 作者: H H. Peter Anvin

x86, boot: set up the decompression stack as early as possible

Set up the decompression stack as soon as we know where it needs to
go.  That way we have a full-service stack as soon as possible, rather
than relying on the BP_scratch field.

Note that the stack does need to be empty during bss zeroing (or
else the stack needs to be moved out of the bss segment, which is also
an option.)

[ Impact: cleanup, minor paranoia ]
Signed-off-by: NH. Peter Anvin <hpa@zytor.com>
上级 5b11f1ce
...@@ -88,6 +88,9 @@ ENTRY(startup_32) ...@@ -88,6 +88,9 @@ ENTRY(startup_32)
addl $4095, %ebx addl $4095, %ebx
andl $~4095, %ebx andl $~4095, %ebx
/* Set up the stack */
leal boot_stack_end(%ebx), %esp
/* /*
* Copy the compressed kernel to the end of our buffer * Copy the compressed kernel to the end of our buffer
* where decompression in place becomes safe. * where decompression in place becomes safe.
...@@ -122,7 +125,7 @@ ENDPROC(startup_32) ...@@ -122,7 +125,7 @@ ENDPROC(startup_32)
relocated: relocated:
/* /*
* Clear BSS * Clear BSS (stack is currently empty)
*/ */
xorl %eax, %eax xorl %eax, %eax
leal _bss(%ebx), %edi leal _bss(%ebx), %edi
...@@ -131,11 +134,6 @@ relocated: ...@@ -131,11 +134,6 @@ relocated:
cld cld
rep stosb rep stosb
/*
* Setup the stack for the decompressor
*/
leal boot_stack_end(%ebx), %esp
/* /*
* Do the decompression, and jump to the new kernel.. * Do the decompression, and jump to the new kernel..
*/ */
......
...@@ -249,6 +249,13 @@ ENTRY(startup_64) ...@@ -249,6 +249,13 @@ ENTRY(startup_64)
addq $(32768 + 18 + 4095), %rbx addq $(32768 + 18 + 4095), %rbx
andq $~4095, %rbx andq $~4095, %rbx
/* Set up the stack */
leaq boot_stack_end(%rbx), %rsp
/* Zero EFLAGS */
pushq $0
popfq
/* /*
* Copy the compressed kernel to the end of our buffer * Copy the compressed kernel to the end of our buffer
* where decompression in place becomes safe. * where decompression in place becomes safe.
...@@ -273,7 +280,7 @@ ENTRY(startup_64) ...@@ -273,7 +280,7 @@ ENTRY(startup_64)
relocated: relocated:
/* /*
* Clear BSS * Clear BSS (stack is currently empty)
*/ */
xorq %rax, %rax xorq %rax, %rax
leaq _bss(%rbx), %rdi leaq _bss(%rbx), %rdi
...@@ -282,13 +289,6 @@ relocated: ...@@ -282,13 +289,6 @@ relocated:
cld cld
rep stosb rep stosb
/* Setup the stack */
leaq boot_stack_end(%rip), %rsp
/* zero EFLAGS after setting rsp */
pushq $0
popfq
/* /*
* Do the decompression, and jump to the new kernel.. * Do the decompression, and jump to the new kernel..
*/ */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册