[ARM] 3809/3: get rid of 4 megabyte kernel image size limit
We currently have a hardcoded 4 megabyte uncompressed kernel image size limit, which is easily exceeded by, for example, enabling some of the various kernel debugging options. When setting up the initial page tables (which is where this 4M limit is hardcoded), it's actually relatively easy to find out the true size of the uncompressed kernel image and create enough page table entries for things to fit, so this patch makes it so. In the decompressor, we also need to know the size of the uncompressed kernel image, to figure out whether there is any chance that uncompressing the kernel might overwrite the compressed kernel image stored elsewhere in memory. We don't have that info at this boot stage, though, so we approximate the size of the uncompressed kernel by taking the compressed kernel image size and allowing for a maximum 4x expansion. Signed-off-by: Lennert Buytenhek <buytenh@wantstofly.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
6ae5a6ef03
commit
2552fc27ff
2 changed files with 11 additions and 10 deletions
|
@ -237,7 +237,8 @@ not_relocated: mov r0, #0
|
||||||
*/
|
*/
|
||||||
cmp r4, r2
|
cmp r4, r2
|
||||||
bhs wont_overwrite
|
bhs wont_overwrite
|
||||||
add r0, r4, #4096*1024 @ 4MB largest kernel size
|
sub r3, sp, r5 @ > compressed kernel size
|
||||||
|
add r0, r4, r3, lsl #2 @ allow for 4x expansion
|
||||||
cmp r0, r5
|
cmp r0, r5
|
||||||
bls wont_overwrite
|
bls wont_overwrite
|
||||||
|
|
||||||
|
|
|
@ -234,18 +234,18 @@ __create_page_tables:
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now setup the pagetables for our kernel direct
|
* Now setup the pagetables for our kernel direct
|
||||||
* mapped region. We round TEXTADDR down to the
|
* mapped region.
|
||||||
* nearest megabyte boundary. It is assumed that
|
|
||||||
* the kernel fits within 4 contigous 1MB sections.
|
|
||||||
*/
|
*/
|
||||||
add r0, r4, #(TEXTADDR & 0xff000000) >> 18 @ start of kernel
|
add r0, r4, #(TEXTADDR & 0xff000000) >> 18 @ start of kernel
|
||||||
str r3, [r0, #(TEXTADDR & 0x00f00000) >> 18]!
|
str r3, [r0, #(TEXTADDR & 0x00f00000) >> 18]!
|
||||||
add r3, r3, #1 << 20
|
|
||||||
str r3, [r0, #4]! @ KERNEL + 1MB
|
ldr r6, =(_end - PAGE_OFFSET - 1) @ r6 = number of sections
|
||||||
add r3, r3, #1 << 20
|
mov r6, r6, lsr #20 @ needed for kernel minus 1
|
||||||
str r3, [r0, #4]! @ KERNEL + 2MB
|
|
||||||
add r3, r3, #1 << 20
|
1: add r3, r3, #1 << 20
|
||||||
str r3, [r0, #4] @ KERNEL + 3MB
|
str r3, [r0, #4]!
|
||||||
|
subs r6, r6, #1
|
||||||
|
bgt 1b
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Then map first 1MB of ram in case it contains our boot params.
|
* Then map first 1MB of ram in case it contains our boot params.
|
||||||
|
|
Loading…
Reference in a new issue