1 /* SPDX-License-Identifier: GPL-2.0+ */
3 * (C) Copyright 2011-2012
4 * Pali Rohár <pali@kernel.org>
9 relocaddr: /* address of this relocaddr section after coping */
10 .word . /* address of section (calculated at compile time) */
12 startaddr: /* address of u-boot after copying */
13 .word CONFIG_SYS_TEXT_BASE
15 kernaddr: /* address of kernel after copying */
18 kernsize: /* maximal size of kernel image */
21 kernoffs: /* offset of kernel image in loaded u-boot */
24 imagesize: /* maximal size of image */
27 ih_magic: /* IH_MAGIC in big endian from include/image.h */
31 * Routine: save_boot_params (called after reset from start.S)
32 * Description: Copy attached kernel to address KERNEL_ADDRESS
33 * Copy u-boot to address CONFIG_SYS_TEXT_BASE
34 * Return to copied u-boot address
37 .global save_boot_params
39 /* Get return address */
40 ldr lr, =save_boot_params_ret
42 /* Copy valid attached kernel to address KERNEL_ADDRESS */
45 adr r0, relocaddr /* r0 - address of section relocaddr */
46 ldr r1, relocaddr /* r1 - address of relocaddr after relocation */
49 /* r4 - calculated offset */
53 /* r0 - start of kernel before */
60 /* r3 - start of kernel after */
63 /* r2 - end of kernel after */
67 /* r1 - end of kernel before */
70 /* remove header in target kernel */
74 /* check for valid kernel uImage */
75 ldr r4, [r0] /* r4 - 4 bytes header of kernel */
76 ldr r5, ih_magic /* r5 - IH_MAGIC */
78 bne copy_kernel_end /* skip if invalid image */
88 str r5, [r0] /* remove 4 bytes header of kernel */
94 adr r0, relocaddr /* r0 - address of section relocaddr */
95 ldr r1, relocaddr /* r1 - address of relocaddr after relocation */
98 beq copy_uboot_end /* skip if u-boot is on correct address */
100 /* r5 - calculated offset */
104 /* r6 - maximal u-boot size */
107 /* r1 - start of u-boot after */
110 /* r0 - start of u-boot before */
114 /* check if we need to move uboot copy code before calling it */
116 bhi copy_uboot_start /* now coping u-boot code directly is safe */
120 /* r0 - start of u-boot before */
121 /* r1 - start of u-boot after */
122 /* r6 - maximal u-boot size */
124 /* r7 - maximal kernel size */
127 /* r4 - end of kernel before */
131 /* r5 - end of u-boot after */
135 /* r2 - start of loop code after */
136 cmp r4, r5 /* higher address (r4 or r5) */
140 /* r3 - end of loop code before */
143 /* r4 - end of loop code after */
144 adr r4, copy_uboot_start
149 ldmdb r3!, {r7 - r10}
150 stmdb r4!, {r7 - r10}
159 * Copy u-boot to address CONFIG_SYS_TEXT_BASE
161 * Nokia X-Loader loading secondary image to address 0x80400000
162 * NOLO loading boot image to random place, so it doesn't really
163 * matter what is set in CONFIG_SYS_TEXT_BASE. We have to copy
164 * u-boot to CONFIG_SYS_TEXT_BASE address.
168 /* r0 - start of u-boot before */
169 /* r1 - start of u-boot after */
170 /* r6 - maximal u-boot size */
172 /* r2 - end of u-boot after */
175 /* condition for copying from left to right */
177 addlo r1, r0, r6 /* r1 - end of u-boot before */
178 blo copy_uboot_loop_right
180 copy_uboot_loop_left:
181 ldmia r0!, {r3 - r10}
182 stmia r1!, {r3 - r10}
184 blo copy_uboot_loop_left
187 copy_uboot_loop_right:
188 ldmdb r1!, {r3 - r10}
189 stmdb r2!, {r3 - r10}
191 bhi copy_uboot_loop_right