1 /* SPDX-License-Identifier: GPL-2.0+ */
3 * (C) Copyright 2011-2012
4 * Pali Rohár <pali@kernel.org>
8 #include <linux/linkage.h>
10 kernoffs: /* offset of kernel image from this address */
11 .word . - CONFIG_TEXT_BASE - KERNEL_OFFSET
13 kernaddr: /* address of kernel after copying */
16 kernsize: /* maximal size of kernel image */
19 imagesize: /* maximal size of image */
22 ih_magic: /* IH_MAGIC in big endian from include/image.h */
25 z_magic: /* LINUX_ARM_ZIMAGE_MAGIC */
29 * Routine: save_boot_params (called after reset from start.S)
30 * Description: Copy attached kernel to address KERNEL_ADDRESS
33 ENTRY(save_boot_params)
36 * Copy valid attached kernel to absolute address KERNEL_ADDRESS
38 * Nokia X-Loader is loading secondary image to address 0x80400000.
39 * NOLO is loading boot image to random place, so it doesn't really
40 * matter what is set in CONFIG_TEXT_BASE. We have to detect
41 * KERNEL_OFFSET from the current execution address and copy it to
42 * absolute address KERNEL_ADDRESS.
44 * Note that U-Boot has to be compiled with CONFIG_POSITION_INDEPENDENT
45 * because it is loaded at random address and not to the fixed address
49 /* r0 - start of kernel before */
50 adr r0, kernoffs /* r0 - current address of kernoffs section */
51 ldr r1, kernoffs /* r1 - offset of kernel image from kernoffs section */
54 /* r3 - start of kernel after */
57 /* r2 - end of kernel after */
61 /* r1 - end of kernel before */
64 /* remove header in target kernel */
66 str r5, [r3] /* remove 4 bytes header of kernel uImage */
67 str r5, [r3, #36] /* remove 4 bytes header of kernel zImage */
69 /* check for valid kernel uImage */
70 ldr r4, [r0] /* r4 - 4 bytes header of kernel */
71 ldr r5, ih_magic /* r5 - IH_MAGIC */
75 /* check for valid kernel zImage */
76 ldr r4, [r0, #36] /* r4 - 4 bytes header of kernel at offset 36 */
77 ldr r5, z_magic /* r5 - LINUX_ARM_ZIMAGE_MAGIC */
79 bne skip_copy /* skip if invalid image */
87 /* remove header in source kernel image */
89 str r5, [r0] /* remove 4 bytes header of kernel uImage */
90 str r5, [r0, #36] /* remove 4 bytes header of kernel zImage */
95 b save_boot_params_ret
97 ENDPROC(save_boot_params)