diff options
author | Alexander van Heukelum <heukelum@mailshack.com> | 2008-04-08 06:54:30 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-04-19 13:19:54 -0400 |
commit | 7c53976404e2f906c60b69cc5793add87ee49c6a (patch) | |
tree | 164f28a8f8929188918fce267f8fd818c37f3f76 | |
parent | 4c8337ac425b220594fec45ad6d3ac76d3ce2b90 (diff) |
x86: cleanup boot-heap usage
The kernel decompressor wrapper uses memory located beyond the
end of the image. This might lead to hard to debug problems,
but even if it can be proven to be safe, it is at the very
least unclean. I don't see any advantages either, unless you
count it not being zeroed out as an advantage. This patch
moves the boot-heap area to the bss segment.
Signed-off-by: Alexander van Heukelum <heukelum@fastmail.fm>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-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 | ||||
-rw-r--r-- | include/asm-x86/boot.h | 8 |
4 files changed, 31 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; |
diff --git a/include/asm-x86/boot.h b/include/asm-x86/boot.h index ed8affbf96cb..2faed7ecb092 100644 --- a/include/asm-x86/boot.h +++ b/include/asm-x86/boot.h | |||
@@ -17,4 +17,12 @@ | |||
17 | + (CONFIG_PHYSICAL_ALIGN - 1)) \ | 17 | + (CONFIG_PHYSICAL_ALIGN - 1)) \ |
18 | & ~(CONFIG_PHYSICAL_ALIGN - 1)) | 18 | & ~(CONFIG_PHYSICAL_ALIGN - 1)) |
19 | 19 | ||
20 | #ifdef CONFIG_X86_64 | ||
21 | #define BOOT_HEAP_SIZE 0x7000 | ||
22 | #define BOOT_STACK_SIZE 0x4000 | ||
23 | #else | ||
24 | #define BOOT_HEAP_SIZE 0x4000 | ||
25 | #define BOOT_STACK_SIZE 0x1000 | ||
26 | #endif | ||
27 | |||
20 | #endif /* _ASM_BOOT_H */ | 28 | #endif /* _ASM_BOOT_H */ |