diff options
Diffstat (limited to 'arch/arm/kernel/relocate_kernel.S')
| -rw-r--r-- | arch/arm/kernel/relocate_kernel.S | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/arch/arm/kernel/relocate_kernel.S b/arch/arm/kernel/relocate_kernel.S index 7baadae7cb2..95858966d84 100644 --- a/arch/arm/kernel/relocate_kernel.S +++ b/arch/arm/kernel/relocate_kernel.S @@ -2,14 +2,22 @@ * relocate_kernel.S - put the kernel image in place to boot */ +#include <linux/linkage.h> #include <asm/kexec.h> - .globl relocate_new_kernel -relocate_new_kernel: + .align 3 /* not needed for this code, but keeps fncpy() happy */ + +ENTRY(relocate_new_kernel) ldr r0,kexec_indirection_page ldr r1,kexec_start_address + /* + * If there is no indirection page (we are doing crashdumps) + * skip any relocation. + */ + cmp r0, #0 + beq 2f 0: /* top, read another word for the indirection page */ ldr r3, [r0],#4 @@ -50,8 +58,11 @@ relocate_new_kernel: mov lr,r1 mov r0,#0 ldr r1,kexec_mach_type - mov r2,#0 - mov pc,lr + ldr r2,kexec_boot_atags + ARM( mov pc, lr ) + THUMB( bx lr ) + + .align .globl kexec_start_address kexec_start_address: @@ -65,6 +76,13 @@ kexec_indirection_page: kexec_mach_type: .long 0x0 + /* phy addr of the atags for the new kernel */ + .globl kexec_boot_atags +kexec_boot_atags: + .long 0x0 + +ENDPROC(relocate_new_kernel) + relocate_new_kernel_end: .globl relocate_new_kernel_size |
