x86/boot: copy/clear sections more efficiently

Both the trampoline copy and BSS initialise can be performed more
efficiently by using 4-byte variants of the string operations.

On Intel systems with ERMSB (efficient rep movsb), this is no practical
difference.  On all other systems, this is 4 times more efficient.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Andrew Cooper committed 2016-06-23 12:58:04 +01:00
1 parent 544ad7f5ca
commit 6a35f1e1fb
2 files changed
+10 -4

No files matched your search

+5 -4
View File
@@ -128,7 +128,8 @@ __start:
mov $sym_phys(__bss_end),%ecx
sub %edi,%ecx
xor %eax,%eax
rep stosb
shr $2,%ecx
rep stosl
/* Interrogate CPU extended features via CPUID. */
mov $0x80000000,%eax
@@ -192,8 +193,8 @@ __start:
/* Copy bootstrap trampoline to low memory, below 1MB. */
mov $sym_phys(trampoline_start),%esi
mov $trampoline_end - trampoline_start,%ecx
rep movsb
mov $((trampoline_end - trampoline_start) / 4),%ecx
rep movsl
/* Jump into the relocated trampoline. */
lret
@@ -205,6 +206,6 @@ reloc:
ENTRY(trampoline_start)
#include "trampoline.S"
GLOBAL(trampoline_end)
ENTRY(trampoline_end)
#include "x86_64.S"
+5
View File
@@ -314,3 +314,8 @@ ASSERT(IS_ALIGNED(cpu0_stack, STACK_SIZE), "cpu0_stack misaligned")
ASSERT(IS_ALIGNED(__init_begin, PAGE_SIZE), "__init_begin misaligned")
ASSERT(IS_ALIGNED(__init_end, PAGE_SIZE), "__init_end misaligned")
ASSERT(IS_ALIGNED(trampoline_start, 4), "trampoline_start misaligned")
ASSERT(IS_ALIGNED(trampoline_end, 4), "trampoline_end misaligned")
ASSERT(IS_ALIGNED(__bss_start, 4), "__bss_start misaligned")
ASSERT(IS_ALIGNED(__bss_end, 4), "__bss_end misaligned")
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.