Nokia RX-51: Use U-Boot generic position independent code
Switch from custom board specific fixup/copy code to U-Boot generic position independent code provided by config option POSITION_INDEPENDENT. This also slightly decrease size of u-boot.bin binary (by 52 bytes). Note that option POSITION_INDEPENDENT increase size but not more than custom board fixup/copy code which is being deleted (as it is not needed anymore). Signed-off-by: Pali Rohár <pali@kernel.org>
This commit is contained in:
@@ -107,6 +107,7 @@ config TARGET_OMAP3_LOGIC
|
|||||||
|
|
||||||
config TARGET_NOKIA_RX51
|
config TARGET_NOKIA_RX51
|
||||||
bool "Nokia RX51"
|
bool "Nokia RX51"
|
||||||
|
select POSITION_INDEPENDENT
|
||||||
|
|
||||||
config TARGET_TAO3530
|
config TARGET_TAO3530
|
||||||
bool "TAO3530"
|
bool "TAO3530"
|
||||||
|
@@ -33,16 +33,24 @@ z_magic: /* LINUX_ARM_ZIMAGE_MAGIC */
|
|||||||
/*
|
/*
|
||||||
* Routine: save_boot_params (called after reset from start.S)
|
* Routine: save_boot_params (called after reset from start.S)
|
||||||
* Description: Copy attached kernel to address KERNEL_ADDRESS
|
* Description: Copy attached kernel to address KERNEL_ADDRESS
|
||||||
* Copy u-boot to address CONFIG_SYS_TEXT_BASE
|
|
||||||
* Return to copied u-boot address
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.global save_boot_params
|
.global save_boot_params
|
||||||
save_boot_params:
|
save_boot_params:
|
||||||
/* Get return address */
|
|
||||||
ldr lr, =save_boot_params_ret
|
|
||||||
|
|
||||||
/* Copy valid attached kernel to address KERNEL_ADDRESS */
|
/*
|
||||||
|
* Copy valid attached kernel to absolute address KERNEL_ADDRESS
|
||||||
|
*
|
||||||
|
* Nokia X-Loader is loading secondary image to address 0x80400000.
|
||||||
|
* NOLO is loading boot image to random place, so it doesn't really
|
||||||
|
* matter what is set in CONFIG_SYS_TEXT_BASE. We have to detect
|
||||||
|
* KERNEL_OFFSET from the current execution address and copy it to
|
||||||
|
* absolute address KERNEL_ADDRESS.
|
||||||
|
*
|
||||||
|
* Note that U-Boot has to be compiled with CONFIG_POSITION_INDEPENDENT
|
||||||
|
* because it is loaded at random address and not to the fixed address
|
||||||
|
* (CONFIG_SYS_TEXT_BASE).
|
||||||
|
*/
|
||||||
|
|
||||||
copy_kernel_start:
|
copy_kernel_start:
|
||||||
adr r0, relocaddr /* r0 - address of section relocaddr */
|
adr r0, relocaddr /* r0 - address of section relocaddr */
|
||||||
@@ -100,110 +108,5 @@ copy_kernel_end:
|
|||||||
str r5, [r0] /* remove 4 bytes header of kernel uImage */
|
str r5, [r0] /* remove 4 bytes header of kernel uImage */
|
||||||
str r5, [r0, #36] /* remove 4 bytes header of kernel zImage */
|
str r5, [r0, #36] /* remove 4 bytes header of kernel zImage */
|
||||||
|
|
||||||
|
/* Returns */
|
||||||
/* Fix u-boot code */
|
b save_boot_params_ret
|
||||||
|
|
||||||
fix_start:
|
|
||||||
adr r0, relocaddr /* r0 - address of section relocaddr */
|
|
||||||
ldr r1, relocaddr /* r1 - address of relocaddr after relocation */
|
|
||||||
cmp r0, r1
|
|
||||||
|
|
||||||
beq copy_uboot_end /* skip if u-boot is on correct address */
|
|
||||||
|
|
||||||
/* r5 - calculated offset */
|
|
||||||
subhi r5, r0, r1
|
|
||||||
sublo r5, r1, r0
|
|
||||||
|
|
||||||
/* r6 - maximal u-boot size */
|
|
||||||
ldr r6, imagesize
|
|
||||||
|
|
||||||
/* r1 - start of u-boot after */
|
|
||||||
ldr r1, startaddr
|
|
||||||
|
|
||||||
/* r0 - start of u-boot before */
|
|
||||||
addhi r0, r1, r5
|
|
||||||
sublo r0, r1, r5
|
|
||||||
|
|
||||||
/* check if we need to move uboot copy code before calling it */
|
|
||||||
cmp r5, r6
|
|
||||||
bhi copy_uboot_start /* now coping u-boot code directly is safe */
|
|
||||||
|
|
||||||
|
|
||||||
copy_code_start:
|
|
||||||
/* r0 - start of u-boot before */
|
|
||||||
/* r1 - start of u-boot after */
|
|
||||||
/* r6 - maximal u-boot size */
|
|
||||||
|
|
||||||
/* r7 - maximal kernel size */
|
|
||||||
ldr r7, kernsize
|
|
||||||
|
|
||||||
/* r4 - end of kernel before */
|
|
||||||
add r4, r0, r6
|
|
||||||
add r4, r4, r7
|
|
||||||
|
|
||||||
/* r5 - end of u-boot after */
|
|
||||||
ldr r5, startaddr
|
|
||||||
add r5, r5, r6
|
|
||||||
|
|
||||||
/* r2 - start of loop code after */
|
|
||||||
cmp r4, r5 /* higher address (r4 or r5) */
|
|
||||||
movhs r2, r4
|
|
||||||
movlo r2, r5
|
|
||||||
|
|
||||||
/* r3 - end of loop code before */
|
|
||||||
adr r3, end
|
|
||||||
|
|
||||||
/* r4 - end of loop code after */
|
|
||||||
adr r4, copy_uboot_start
|
|
||||||
sub r4, r3, r4
|
|
||||||
add r4, r2, r4
|
|
||||||
|
|
||||||
copy_code_loop:
|
|
||||||
ldmdb r3!, {r7 - r10}
|
|
||||||
stmdb r4!, {r7 - r10}
|
|
||||||
cmp r4, r2
|
|
||||||
bhi copy_code_loop
|
|
||||||
|
|
||||||
copy_code_end:
|
|
||||||
mov pc, r2
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copy u-boot to address CONFIG_SYS_TEXT_BASE
|
|
||||||
*
|
|
||||||
* Nokia X-Loader loading secondary image to address 0x80400000
|
|
||||||
* NOLO loading boot image to random place, so it doesn't really
|
|
||||||
* matter what is set in CONFIG_SYS_TEXT_BASE. We have to copy
|
|
||||||
* u-boot to CONFIG_SYS_TEXT_BASE address.
|
|
||||||
*/
|
|
||||||
|
|
||||||
copy_uboot_start:
|
|
||||||
/* r0 - start of u-boot before */
|
|
||||||
/* r1 - start of u-boot after */
|
|
||||||
/* r6 - maximal u-boot size */
|
|
||||||
|
|
||||||
/* r2 - end of u-boot after */
|
|
||||||
add r2, r1, r6
|
|
||||||
|
|
||||||
/* condition for copying from left to right */
|
|
||||||
cmp r0, r1
|
|
||||||
addlo r1, r0, r6 /* r1 - end of u-boot before */
|
|
||||||
blo copy_uboot_loop_right
|
|
||||||
|
|
||||||
copy_uboot_loop_left:
|
|
||||||
ldmia r0!, {r3 - r10}
|
|
||||||
stmia r1!, {r3 - r10}
|
|
||||||
cmp r1, r2
|
|
||||||
blo copy_uboot_loop_left
|
|
||||||
b copy_uboot_end
|
|
||||||
|
|
||||||
copy_uboot_loop_right:
|
|
||||||
ldmdb r1!, {r3 - r10}
|
|
||||||
stmdb r2!, {r3 - r10}
|
|
||||||
cmp r1, r0
|
|
||||||
bhi copy_uboot_loop_right
|
|
||||||
|
|
||||||
copy_uboot_end:
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
end:
|
|
||||||
|
@@ -9,7 +9,6 @@ CONFIG_INITRD_TAG=y
|
|||||||
CONFIG_REVISION_TAG=y
|
CONFIG_REVISION_TAG=y
|
||||||
CONFIG_STATIC_MACH_TYPE=y
|
CONFIG_STATIC_MACH_TYPE=y
|
||||||
CONFIG_MACH_TYPE=1955
|
CONFIG_MACH_TYPE=1955
|
||||||
CONFIG_SYS_TEXT_BASE=0x80008000
|
|
||||||
CONFIG_SYS_MALLOC_LEN=0xc0000
|
CONFIG_SYS_MALLOC_LEN=0xc0000
|
||||||
CONFIG_NR_DRAM_BANKS=2
|
CONFIG_NR_DRAM_BANKS=2
|
||||||
CONFIG_TARGET_NOKIA_RX51=y
|
CONFIG_TARGET_NOKIA_RX51=y
|
||||||
|
Reference in New Issue
Block a user