diff options
Diffstat (limited to 'arch/x86/boot')
-rw-r--r-- | arch/x86/boot/compressed/head_32.S | 11 | ||||
-rw-r--r-- | arch/x86/boot/compressed/head_64.S | 26 |
2 files changed, 19 insertions, 18 deletions
diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S index d02a4f02be13..6710dc78ac59 100644 --- a/arch/x86/boot/compressed/head_32.S +++ b/arch/x86/boot/compressed/head_32.S | |||
@@ -100,11 +100,12 @@ ENTRY(startup_32) | |||
100 | * where decompression in place becomes safe. | 100 | * where decompression in place becomes safe. |
101 | */ | 101 | */ |
102 | pushl %esi | 102 | pushl %esi |
103 | leal _bss(%ebp), %esi | 103 | leal (_bss-4)(%ebp), %esi |
104 | leal _bss(%ebx), %edi | 104 | leal (_bss-4)(%ebx), %edi |
105 | movl $(_bss - startup_32), %ecx | 105 | movl $(_bss - startup_32), %ecx |
106 | shrl $2, %ecx | ||
106 | std | 107 | std |
107 | rep movsb | 108 | rep movsl |
108 | cld | 109 | cld |
109 | popl %esi | 110 | popl %esi |
110 | 111 | ||
@@ -135,8 +136,8 @@ relocated: | |||
135 | leal _bss(%ebx), %edi | 136 | leal _bss(%ebx), %edi |
136 | leal _ebss(%ebx), %ecx | 137 | leal _ebss(%ebx), %ecx |
137 | subl %edi, %ecx | 138 | subl %edi, %ecx |
138 | cld | 139 | shrl $2, %ecx |
139 | rep stosb | 140 | rep stosl |
140 | 141 | ||
141 | /* | 142 | /* |
142 | * Do the decompression, and jump to the new kernel.. | 143 | * Do the decompression, and jump to the new kernel.. |
diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S index a0b18426069a..723c72dfd7bc 100644 --- a/arch/x86/boot/compressed/head_64.S +++ b/arch/x86/boot/compressed/head_64.S | |||
@@ -260,15 +260,15 @@ ENTRY(startup_64) | |||
260 | * Copy the compressed kernel to the end of our buffer | 260 | * Copy the compressed kernel to the end of our buffer |
261 | * where decompression in place becomes safe. | 261 | * where decompression in place becomes safe. |
262 | */ | 262 | */ |
263 | leaq _bss(%rip), %r8 | 263 | pushq %rsi |
264 | leaq _bss(%rbx), %r9 | 264 | leaq (_bss-8)(%rip), %rsi |
265 | leaq (_bss-8)(%rbx), %rdi | ||
265 | movq $_bss /* - $startup_32 */, %rcx | 266 | movq $_bss /* - $startup_32 */, %rcx |
266 | 1: subq $8, %r8 | 267 | shrq $3, %rcx |
267 | subq $8, %r9 | 268 | std |
268 | movq 0(%r8), %rax | 269 | rep movsq |
269 | movq %rax, 0(%r9) | 270 | cld |
270 | subq $8, %rcx | 271 | popq %rsi |
271 | jnz 1b | ||
272 | 272 | ||
273 | /* | 273 | /* |
274 | * Jump to the relocated address. | 274 | * Jump to the relocated address. |
@@ -282,12 +282,12 @@ relocated: | |||
282 | /* | 282 | /* |
283 | * Clear BSS (stack is currently empty) | 283 | * Clear BSS (stack is currently empty) |
284 | */ | 284 | */ |
285 | xorq %rax, %rax | 285 | xorl %eax, %eax |
286 | leaq _bss(%rbx), %rdi | 286 | leaq _bss(%rip), %rdi |
287 | leaq _ebss(%rbx), %rcx | 287 | leaq _ebss(%rip), %rcx |
288 | subq %rdi, %rcx | 288 | subq %rdi, %rcx |
289 | cld | 289 | shrq $3, %rcx |
290 | rep stosb | 290 | rep stosq |
291 | 291 | ||
292 | /* | 292 | /* |
293 | * Do the decompression, and jump to the new kernel.. | 293 | * Do the decompression, and jump to the new kernel.. |