diff options
Diffstat (limited to 'board')
-rw-r--r-- | board/nokia/rx51/lowlevel_init.S | 127 |
1 files changed, 15 insertions, 112 deletions
diff --git a/board/nokia/rx51/lowlevel_init.S b/board/nokia/rx51/lowlevel_init.S index 632595f8378..dd3c830cc2e 100644 --- a/board/nokia/rx51/lowlevel_init.S +++ b/board/nokia/rx51/lowlevel_init.S @@ -33,16 +33,24 @@ z_magic: /* LINUX_ARM_ZIMAGE_MAGIC */ /* * Routine: save_boot_params (called after reset from start.S) * 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 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: 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, #36] /* remove 4 bytes header of kernel zImage */ - -/* Fix u-boot code */ - -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: + /* Returns */ + b save_boot_params_ret |