Skip to content

Commit

Permalink
x86, boot: use appropriate rep string for move and clear
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
H. Peter Anvin committed May 9, 2009
1 parent 9754191 commit 36d3793
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 18 deletions.
11 changes: 6 additions & 5 deletions arch/x86/boot/compressed/head_32.S
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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..
Expand Down
26 changes: 13 additions & 13 deletions arch/x86/boot/compressed/head_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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..
Expand Down

0 comments on commit 36d3793

Please sign in to comment.