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