提交 36d3793c 编写于 作者: H H. Peter Anvin

x86, boot: use appropriate rep string for move and clear

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: NH. Peter Anvin <hpa@zytor.com>
上级 97541912
...@@ -100,11 +100,12 @@ ENTRY(startup_32) ...@@ -100,11 +100,12 @@ ENTRY(startup_32)
* where decompression in place becomes safe. * where decompression in place becomes safe.
*/ */
pushl %esi pushl %esi
leal _bss(%ebp), %esi leal (_bss-4)(%ebp), %esi
leal _bss(%ebx), %edi leal (_bss-4)(%ebx), %edi
movl $(_bss - startup_32), %ecx movl $(_bss - startup_32), %ecx
shrl $2, %ecx
std std
rep movsb rep movsl
cld cld
popl %esi popl %esi
...@@ -135,8 +136,8 @@ relocated: ...@@ -135,8 +136,8 @@ relocated:
leal _bss(%ebx), %edi leal _bss(%ebx), %edi
leal _ebss(%ebx), %ecx leal _ebss(%ebx), %ecx
subl %edi, %ecx subl %edi, %ecx
cld shrl $2, %ecx
rep stosb rep stosl
/* /*
* Do the decompression, and jump to the new kernel.. * Do the decompression, and jump to the new kernel..
......
...@@ -260,15 +260,15 @@ ENTRY(startup_64) ...@@ -260,15 +260,15 @@ ENTRY(startup_64)
* 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.
*/ */
leaq _bss(%rip), %r8 pushq %rsi
leaq _bss(%rbx), %r9 leaq (_bss-8)(%rip), %rsi
leaq (_bss-8)(%rbx), %rdi
movq $_bss /* - $startup_32 */, %rcx movq $_bss /* - $startup_32 */, %rcx
1: subq $8, %r8 shrq $3, %rcx
subq $8, %r9 std
movq 0(%r8), %rax rep movsq
movq %rax, 0(%r9) cld
subq $8, %rcx popq %rsi
jnz 1b
/* /*
* Jump to the relocated address. * Jump to the relocated address.
...@@ -282,12 +282,12 @@ relocated: ...@@ -282,12 +282,12 @@ relocated:
/* /*
* Clear BSS (stack is currently empty) * Clear BSS (stack is currently empty)
*/ */
xorq %rax, %rax xorl %eax, %eax
leaq _bss(%rbx), %rdi leaq _bss(%rip), %rdi
leaq _ebss(%rbx), %rcx leaq _ebss(%rip), %rcx
subq %rdi, %rcx subq %rdi, %rcx
cld shrq $3, %rcx
rep stosb rep stosq
/* /*
* 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.
先完成此消息的编辑!
想要评论请 注册