1/* 2 * relocate_kernel.S - put the kernel image in place to boot 3 */ 4 5#include <linux/linkage.h> 6#include <asm/kexec.h> 7 8 .align 3 /* not needed for this code, but keeps fncpy() happy */ 9 10ENTRY(relocate_new_kernel) 11 12 ldr r0,kexec_indirection_page 13 ldr r1,kexec_start_address 14 15 /* 16 * If there is no indirection page (we are doing crashdumps) 17 * skip any relocation. 18 */ 19 cmp r0, #0 20 beq 2f 21 220: /* top, read another word for the indirection page */ 23 ldr r3, [r0],#4 24 25 /* Is it a destination page. Put destination address to r4 */ 26 tst r3,#1,0 27 beq 1f 28 bic r4,r3,#1 29 b 0b 301: 31 /* Is it an indirection page */ 32 tst r3,#2,0 33 beq 1f 34 bic r0,r3,#2 35 b 0b 361: 37 38 /* are we done ? */ 39 tst r3,#4,0 40 beq 1f 41 b 2f 42 431: 44 /* is it source ? */ 45 tst r3,#8,0 46 beq 0b 47 bic r3,r3,#8 48 mov r6,#1024 499: 50 ldr r5,[r3],#4 51 str r5,[r4],#4 52 subs r6,r6,#1 53 bne 9b 54 b 0b 55 562: 57 /* Jump to relocated kernel */ 58 mov lr,r1 59 mov r0,#0 60 ldr r1,kexec_mach_type 61 ldr r2,kexec_boot_atags 62 ARM( mov pc, lr ) 63 THUMB( bx lr ) 64 65 .align 66 67 .globl kexec_start_address 68kexec_start_address: 69 .long 0x0 70 71 .globl kexec_indirection_page 72kexec_indirection_page: 73 .long 0x0 74 75 .globl kexec_mach_type 76kexec_mach_type: 77 .long 0x0 78 79 /* phy addr of the atags for the new kernel */ 80 .globl kexec_boot_atags 81kexec_boot_atags: 82 .long 0x0 83 84ENDPROC(relocate_new_kernel) 85 86relocate_new_kernel_end: 87 88 .globl relocate_new_kernel_size 89relocate_new_kernel_size: 90 .long relocate_new_kernel_end - relocate_new_kernel 91 92 93