diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/boot/compressed/head_32.S | 15 | ||||
-rw-r--r-- | arch/x86/boot/compressed/head_64.S | 22 | ||||
-rw-r--r-- | arch/x86/boot/compressed/misc.c | 8 |
3 files changed, 23 insertions, 22 deletions
diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S index 036e635f18a3..ba7736cf2ec7 100644 --- a/arch/x86/boot/compressed/head_32.S +++ b/arch/x86/boot/compressed/head_32.S | |||
@@ -130,7 +130,7 @@ relocated: | |||
130 | /* | 130 | /* |
131 | * Setup the stack for the decompressor | 131 | * Setup the stack for the decompressor |
132 | */ | 132 | */ |
133 | leal stack_end(%ebx), %esp | 133 | leal boot_stack_end(%ebx), %esp |
134 | 134 | ||
135 | /* | 135 | /* |
136 | * Do the decompression, and jump to the new kernel.. | 136 | * Do the decompression, and jump to the new kernel.. |
@@ -142,8 +142,8 @@ relocated: | |||
142 | pushl %eax # input_len | 142 | pushl %eax # input_len |
143 | leal input_data(%ebx), %eax | 143 | leal input_data(%ebx), %eax |
144 | pushl %eax # input_data | 144 | pushl %eax # input_data |
145 | leal _end(%ebx), %eax | 145 | leal boot_heap(%ebx), %eax |
146 | pushl %eax # end of the image as third argument | 146 | pushl %eax # heap area as third argument |
147 | pushl %esi # real mode pointer as second arg | 147 | pushl %esi # real mode pointer as second arg |
148 | call decompress_kernel | 148 | call decompress_kernel |
149 | addl $20, %esp | 149 | addl $20, %esp |
@@ -181,7 +181,10 @@ relocated: | |||
181 | jmp *%ebp | 181 | jmp *%ebp |
182 | 182 | ||
183 | .bss | 183 | .bss |
184 | /* Stack and heap for uncompression */ | ||
184 | .balign 4 | 185 | .balign 4 |
185 | stack: | 186 | boot_heap: |
186 | .fill 4096, 1, 0 | 187 | .fill BOOT_HEAP_SIZE, 1, 0 |
187 | stack_end: | 188 | boot_stack: |
189 | .fill BOOT_STACK_SIZE, 1, 0 | ||
190 | boot_stack_end: | ||
diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S index e8657b98c902..7a212a62db36 100644 --- a/arch/x86/boot/compressed/head_64.S +++ b/arch/x86/boot/compressed/head_64.S | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <asm/segment.h> | 28 | #include <asm/segment.h> |
29 | #include <asm/pgtable.h> | 29 | #include <asm/pgtable.h> |
30 | #include <asm/page.h> | 30 | #include <asm/page.h> |
31 | #include <asm/boot.h> | ||
31 | #include <asm/msr.h> | 32 | #include <asm/msr.h> |
32 | #include <asm/asm-offsets.h> | 33 | #include <asm/asm-offsets.h> |
33 | 34 | ||
@@ -62,7 +63,7 @@ startup_32: | |||
62 | subl $1b, %ebp | 63 | subl $1b, %ebp |
63 | 64 | ||
64 | /* setup a stack and make sure cpu supports long mode. */ | 65 | /* setup a stack and make sure cpu supports long mode. */ |
65 | movl $user_stack_end, %eax | 66 | movl $boot_stack_end, %eax |
66 | addl %ebp, %eax | 67 | addl %ebp, %eax |
67 | movl %eax, %esp | 68 | movl %eax, %esp |
68 | 69 | ||
@@ -274,7 +275,7 @@ relocated: | |||
274 | stosb | 275 | stosb |
275 | 276 | ||
276 | /* Setup the stack */ | 277 | /* Setup the stack */ |
277 | leaq user_stack_end(%rip), %rsp | 278 | leaq boot_stack_end(%rip), %rsp |
278 | 279 | ||
279 | /* zero EFLAGS after setting rsp */ | 280 | /* zero EFLAGS after setting rsp */ |
280 | pushq $0 | 281 | pushq $0 |
@@ -285,7 +286,7 @@ relocated: | |||
285 | */ | 286 | */ |
286 | pushq %rsi # Save the real mode argument | 287 | pushq %rsi # Save the real mode argument |
287 | movq %rsi, %rdi # real mode address | 288 | movq %rsi, %rdi # real mode address |
288 | leaq _heap(%rip), %rsi # _heap | 289 | leaq boot_heap(%rip), %rsi # malloc area for uncompression |
289 | leaq input_data(%rip), %rdx # input_data | 290 | leaq input_data(%rip), %rdx # input_data |
290 | movl input_len(%rip), %eax | 291 | movl input_len(%rip), %eax |
291 | movq %rax, %rcx # input_len | 292 | movq %rax, %rcx # input_len |
@@ -310,9 +311,12 @@ gdt: | |||
310 | .quad 0x0080890000000000 /* TS descriptor */ | 311 | .quad 0x0080890000000000 /* TS descriptor */ |
311 | .quad 0x0000000000000000 /* TS continued */ | 312 | .quad 0x0000000000000000 /* TS continued */ |
312 | gdt_end: | 313 | gdt_end: |
313 | .bss | 314 | |
314 | /* Stack for uncompression */ | 315 | .bss |
315 | .balign 4 | 316 | /* Stack and heap for uncompression */ |
316 | user_stack: | 317 | .balign 4 |
317 | .fill 4096,4,0 | 318 | boot_heap: |
318 | user_stack_end: | 319 | .fill BOOT_HEAP_SIZE, 1, 0 |
320 | boot_stack: | ||
321 | .fill BOOT_STACK_SIZE, 1, 0 | ||
322 | boot_stack_end: | ||
diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index dad4e699f5a3..90456cee47c3 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c | |||
@@ -217,12 +217,6 @@ static void putstr(const char *); | |||
217 | static memptr free_mem_ptr; | 217 | static memptr free_mem_ptr; |
218 | static memptr free_mem_end_ptr; | 218 | static memptr free_mem_end_ptr; |
219 | 219 | ||
220 | #ifdef CONFIG_X86_64 | ||
221 | #define HEAP_SIZE 0x7000 | ||
222 | #else | ||
223 | #define HEAP_SIZE 0x4000 | ||
224 | #endif | ||
225 | |||
226 | static char *vidmem; | 220 | static char *vidmem; |
227 | static int vidport; | 221 | static int vidport; |
228 | static int lines, cols; | 222 | static int lines, cols; |
@@ -449,7 +443,7 @@ asmlinkage void decompress_kernel(void *rmode, memptr heap, | |||
449 | 443 | ||
450 | window = output; /* Output buffer (Normally at 1M) */ | 444 | window = output; /* Output buffer (Normally at 1M) */ |
451 | free_mem_ptr = heap; /* Heap */ | 445 | free_mem_ptr = heap; /* Heap */ |
452 | free_mem_end_ptr = heap + HEAP_SIZE; | 446 | free_mem_end_ptr = heap + BOOT_HEAP_SIZE; |
453 | inbuf = input_data; /* Input buffer */ | 447 | inbuf = input_data; /* Input buffer */ |
454 | insize = input_len; | 448 | insize = input_len; |
455 | inptr = 0; | 449 | inptr = 0; |