Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 36d3793c authored by H. Peter Anvin's avatar H. Peter Anvin
Browse files

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: default avatarH. Peter Anvin <hpa@zytor.com>
parent 97541912
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -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

@@ -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..
+13 −13
Original line number Diff line number Diff line
@@ -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.
@@ -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..