2 * (C) Copyright 2011-2012
3 * Pali Rohár <pali.rohar@gmail.com>
5 * SPDX-License-Identifier: GPL-2.0+
10 relocaddr: /* address of this relocaddr section after coping */
11 .word . /* address of section (calculated at compile time) */
13 startaddr: /* address of u-boot after copying */
14 .word CONFIG_SYS_TEXT_BASE
16 kernaddr: /* address of kernel after copying */
19 kernsize: /* maximal size of kernel image */
22 kernoffs: /* offset of kernel image in loaded u-boot */
25 imagesize: /* maximal size of image */
28 ih_magic: /* IH_MAGIC in big endian from include/image.h */
32 * Routine: save_boot_params (called after reset from start.S)
33 * Description: Copy attached kernel to address KERNEL_ADDRESS
34 * Copy u-boot to address CONFIG_SYS_TEXT_BASE
35 * Return to copied u-boot address
38 .global save_boot_params
40 /* Get return address */
41 ldr lr, =save_boot_params_ret
43 /* Copy valid attached kernel to address KERNEL_ADDRESS */
46 adr r0, relocaddr /* r0 - address of section relocaddr */
47 ldr r1, relocaddr /* r1 - address of relocaddr after relocation */
50 /* r4 - calculated offset */
54 /* r0 - start of kernel before */
61 /* r3 - start of kernel after */
64 /* r2 - end of kernel after */
68 /* r1 - end of kernel before */
71 /* remove header in target kernel */
75 /* check for valid kernel uImage */
76 ldr r4, [r0] /* r4 - 4 bytes header of kernel */
77 ldr r5, ih_magic /* r5 - IH_MAGIC */
79 bne copy_kernel_end /* skip if invalid image */
89 str r5, [r0] /* remove 4 bytes header of kernel */
95 adr r0, relocaddr /* r0 - address of section relocaddr */
96 ldr r1, relocaddr /* r1 - address of relocaddr after relocation */
99 beq copy_uboot_end /* skip if u-boot is on correct address */
101 /* r5 - calculated offset */
105 /* r6 - maximal u-boot size */
108 /* fix return address */
112 /* r1 - start of u-boot after */
115 /* r0 - start of u-boot before */
119 /* check if we need to move uboot copy code before calling it */
121 bhi copy_uboot_start /* now coping u-boot code directly is safe */
125 /* r0 - start of u-boot before */
126 /* r1 - start of u-boot after */
127 /* r6 - maximal u-boot size */
129 /* r7 - maximal kernel size */
132 /* r4 - end of kernel before */
136 /* r5 - end of u-boot after */
140 /* r2 - start of loop code after */
141 cmp r4, r5 /* higher address (r4 or r5) */
145 /* r3 - end of loop code before */
148 /* r4 - end of loop code after */
149 adr r4, copy_uboot_start
154 ldmdb r3!, {r7 - r10}
155 stmdb r4!, {r7 - r10}
163 /* Copy u-boot to address CONFIG_SYS_TEXT_BASE */
166 /* r0 - start of u-boot before */
167 /* r1 - start of u-boot after */
168 /* r6 - maximal u-boot size */
170 /* r2 - end of u-boot after */
173 /* condition for copying from left to right */
175 addlo r1, r0, r6 /* r1 - end of u-boot before */
176 blo copy_uboot_loop_right
178 copy_uboot_loop_left:
179 ldmia r0!, {r3 - r10}
180 stmia r1!, {r3 - r10}
182 blo copy_uboot_loop_left
185 copy_uboot_loop_right:
186 ldmdb r1!, {r3 - r10}
187 stmdb r2!, {r3 - r10}
189 bhi copy_uboot_loop_right