[ARM] Allow r2 to be passed through the decompressor to the kernel
This is part of a patch from Marc Singer to allow r2 to be passed to the kernel. Marc's original comments follow: This revised R2 (atags pointer) patch incorporates comments from Nico Pitre and Ben Dooks. It modifies the head.S files such that the R2 value set by the bootloader is conveyed to the kernel startup code. The kernel head.S heuristically validates the pointer. It will set R2 to zero if it believes the pointer is invalid. Presently, it requires that the ATAGS list reside in the first 16KiB of physical RAM. Relaxing this contraint may be both desirable as well as tricky. Signed-off-by: Marc Singer <elf@buici.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
Родитель
90303b1023
Коммит
f4619025a5
|
@ -84,7 +84,7 @@
|
|||
kputc #'\n'
|
||||
kphex r5, 8 /* decompressed kernel start */
|
||||
kputc #'-'
|
||||
kphex r8, 8 /* decompressed kernel end */
|
||||
kphex r9, 8 /* decompressed kernel end */
|
||||
kputc #'>'
|
||||
kphex r4, 8 /* kernel execution address */
|
||||
kputc #'\n'
|
||||
|
@ -116,7 +116,7 @@ start:
|
|||
.word start @ absolute load/run zImage address
|
||||
.word _edata @ zImage end address
|
||||
1: mov r7, r1 @ save architecture ID
|
||||
mov r8, #0 @ save r0
|
||||
mov r8, r2 @ save atags pointer
|
||||
|
||||
#ifndef __ARM_ARCH_2__
|
||||
/*
|
||||
|
@ -144,7 +144,7 @@ not_angel:
|
|||
|
||||
/*
|
||||
* some architecture specific code can be inserted
|
||||
* by the linker here, but it should preserve r7 and r8.
|
||||
* by the linker here, but it should preserve r7, r8, and r9.
|
||||
*/
|
||||
|
||||
.text
|
||||
|
@ -249,16 +249,17 @@ not_relocated: mov r0, #0
|
|||
* r5 = decompressed kernel start
|
||||
* r6 = processor ID
|
||||
* r7 = architecture ID
|
||||
* r8-r14 = unused
|
||||
* r8 = atags pointer
|
||||
* r9-r14 = corrupted
|
||||
*/
|
||||
add r1, r5, r0 @ end of decompressed kernel
|
||||
adr r2, reloc_start
|
||||
ldr r3, LC1
|
||||
add r3, r2, r3
|
||||
1: ldmia r2!, {r8 - r13} @ copy relocation code
|
||||
stmia r1!, {r8 - r13}
|
||||
ldmia r2!, {r8 - r13}
|
||||
stmia r1!, {r8 - r13}
|
||||
1: ldmia r2!, {r9 - r14} @ copy relocation code
|
||||
stmia r1!, {r9 - r14}
|
||||
ldmia r2!, {r9 - r14}
|
||||
stmia r1!, {r9 - r14}
|
||||
cmp r2, r3
|
||||
blo 1b
|
||||
|
||||
|
@ -308,11 +309,12 @@ params: ldr r0, =params_phys
|
|||
* r4 = kernel execution address
|
||||
* r6 = processor ID
|
||||
* r7 = architecture number
|
||||
* r8 = run-time address of "start"
|
||||
* r8 = atags pointer
|
||||
* r9 = run-time address of "start" (???)
|
||||
* On exit,
|
||||
* r1, r2, r3, r8, r9, r12 corrupted
|
||||
* r1, r2, r3, r9, r10, r12 corrupted
|
||||
* This routine must preserve:
|
||||
* r4, r5, r6, r7
|
||||
* r4, r5, r6, r7, r8
|
||||
*/
|
||||
.align 5
|
||||
cache_on: mov r3, #8 @ cache_on function
|
||||
|
@ -326,15 +328,15 @@ __setup_mmu: sub r3, r4, #16384 @ Page directory size
|
|||
* bits for the RAM area only.
|
||||
*/
|
||||
mov r0, r3
|
||||
mov r8, r0, lsr #18
|
||||
mov r8, r8, lsl #18 @ start of RAM
|
||||
add r9, r8, #0x10000000 @ a reasonable RAM size
|
||||
mov r9, r0, lsr #18
|
||||
mov r9, r9, lsl #18 @ start of RAM
|
||||
add r10, r9, #0x10000000 @ a reasonable RAM size
|
||||
mov r1, #0x12
|
||||
orr r1, r1, #3 << 10
|
||||
add r2, r3, #16384
|
||||
1: cmp r1, r8 @ if virt > start of RAM
|
||||
orrhs r1, r1, #0x0c @ set cacheable, bufferable
|
||||
cmp r1, r9 @ if virt > end of RAM
|
||||
cmp r1, r10 @ if virt > end of RAM
|
||||
bichs r1, r1, #0x0c @ clear cacheable, bufferable
|
||||
str r1, [r0], #4 @ 1:1 mapping
|
||||
add r1, r1, #1048576
|
||||
|
@ -403,26 +405,28 @@ __common_cache_on:
|
|||
* r5 = decompressed kernel start
|
||||
* r6 = processor ID
|
||||
* r7 = architecture ID
|
||||
* r8-r14 = unused
|
||||
* r8 = atags pointer
|
||||
* r9-r14 = corrupted
|
||||
*/
|
||||
.align 5
|
||||
reloc_start: add r8, r5, r0
|
||||
reloc_start: add r9, r5, r0
|
||||
debug_reloc_start
|
||||
mov r1, r4
|
||||
1:
|
||||
.rept 4
|
||||
ldmia r5!, {r0, r2, r3, r9 - r13} @ relocate kernel
|
||||
stmia r1!, {r0, r2, r3, r9 - r13}
|
||||
ldmia r5!, {r0, r2, r3, r10 - r14} @ relocate kernel
|
||||
stmia r1!, {r0, r2, r3, r10 - r14}
|
||||
.endr
|
||||
|
||||
cmp r5, r8
|
||||
cmp r5, r9
|
||||
blo 1b
|
||||
debug_reloc_end
|
||||
|
||||
call_kernel: bl cache_clean_flush
|
||||
bl cache_off
|
||||
mov r0, #0
|
||||
mov r0, #0 @ must be zero
|
||||
mov r1, r7 @ restore architecture number
|
||||
mov r2, r8 @ restore atags pointer
|
||||
mov pc, r4 @ call kernel
|
||||
|
||||
/*
|
||||
|
|
Загрузка…
Ссылка в новой задаче