summaryrefslogtreecommitdiff
path: root/arch/x86/boot/compressed/head_32.S
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2009-05-08 17:42:16 -0700
committerH. Peter Anvin <hpa@zytor.com>2009-05-08 17:46:34 -0700
commit02a884c0fe7ec8459d00d34b7d4101af21fc4a86 (patch)
tree164783f84130482e52290af03d96ff8e887f8605 /arch/x86/boot/compressed/head_32.S
parent36d3793c947f1ef7ba3d24eeeddc1be41adc5ab4 (diff)
x86, boot: determine compressed code offset at compile time
Determine the compressed code offset (from the kernel runtime address) at compile time. This allows some minor optimizations in arch/x86/boot/compressed/head_*.S, but more importantly it makes this value available to the build process, which will enable a future patch to export the necessary linear memory footprint into the bzImage header. [ Impact: cleanup, future patch enabling ] Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'arch/x86/boot/compressed/head_32.S')
-rw-r--r--arch/x86/boot/compressed/head_32.S24
1 files changed, 5 insertions, 19 deletions
diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S
index 6710dc78ac59..470474bafc4d 100644
--- a/arch/x86/boot/compressed/head_32.S
+++ b/arch/x86/boot/compressed/head_32.S
@@ -75,18 +75,8 @@ ENTRY(startup_32)
movl $LOAD_PHYSICAL_ADDR, %ebx
#endif
- /* Replace the compressed data size with the uncompressed size */
- subl input_len(%ebp), %ebx
- movl output_len(%ebp), %eax
- addl %eax, %ebx
- /* Add 8 bytes for every 32K input block */
- shrl $12, %eax
- addl %eax, %ebx
- /* Add 32K + 18 bytes of extra slack */
- addl $(32768 + 18), %ebx
- /* Align on a 4K boundary */
- addl $4095, %ebx
- andl $~4095, %ebx
+ /* Target address to relocate to for decompression */
+ addl $z_extract_offset, %ebx
/* Set up the stack */
leal boot_stack_end(%ebx), %esp
@@ -142,12 +132,10 @@ relocated:
/*
* Do the decompression, and jump to the new kernel..
*/
- movl output_len(%ebx), %eax
- pushl %eax
+ leal z_extract_offset_negative(%ebx), %ebp
/* push arguments for decompress_kernel: */
pushl %ebp /* output address */
- movl input_len(%ebx), %eax
- pushl %eax /* input_len */
+ pushl $z_input_len /* input_len */
leal input_data(%ebx), %eax
pushl %eax /* input_data */
leal boot_heap(%ebx), %eax
@@ -155,14 +143,12 @@ relocated:
pushl %esi /* real mode pointer */
call decompress_kernel
addl $20, %esp
- popl %ecx
#if CONFIG_RELOCATABLE
/*
* Find the address of the relocations.
*/
- movl %ebp, %edi
- addl %ecx, %edi
+ leal z_output_len(%ebp), %edi
/*
* Calculate the delta between where vmlinux was compiled to run