1ed407be5SPali Rohár/* 2ed407be5SPali Rohár * (C) Copyright 2011-2012 3ed407be5SPali Rohár * Pali Rohár <pali.rohar@gmail.com> 4ed407be5SPali Rohár * 51a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 6ed407be5SPali Rohár */ 7ed407be5SPali Rohár 8ed407be5SPali Rohár#include <config.h> 9ed407be5SPali Rohár 10ed407be5SPali Rohárrelocaddr: /* address of this relocaddr section after coping */ 11ed407be5SPali Rohár .word . /* address of section (calculated at compile time) */ 12ed407be5SPali Rohár 13ed407be5SPali Rohárstartaddr: /* address of u-boot after copying */ 14ed407be5SPali Rohár .word CONFIG_SYS_TEXT_BASE 15ed407be5SPali Rohár 16ed407be5SPali Rohárkernaddr: /* address of kernel after copying */ 17ed407be5SPali Rohár .word KERNEL_ADDRESS 18ed407be5SPali Rohár 19ed407be5SPali Rohárkernsize: /* maximal size of kernel image */ 20ed407be5SPali Rohár .word KERNEL_MAXSIZE 21ed407be5SPali Rohár 22ed407be5SPali Rohárkernoffs: /* offset of kernel image in loaded u-boot */ 23ed407be5SPali Rohár .word KERNEL_OFFSET 24ed407be5SPali Rohár 25ed407be5SPali Rohárimagesize: /* maximal size of image */ 26ed407be5SPali Rohár .word IMAGE_MAXSIZE 27ed407be5SPali Rohár 28ed407be5SPali Rohárih_magic: /* IH_MAGIC in big endian from include/image.h */ 29ed407be5SPali Rohár .word 0x56190527 30ed407be5SPali Rohár 31ed407be5SPali Rohár/* 32ed407be5SPali Rohár * Routine: save_boot_params (called after reset from start.S) 33ed407be5SPali Rohár * Description: Copy attached kernel to address KERNEL_ADDRESS 34ed407be5SPali Rohár * Copy u-boot to address CONFIG_SYS_TEXT_BASE 35ed407be5SPali Rohár * Return to copied u-boot address 36ed407be5SPali Rohár */ 37ed407be5SPali Rohár 38ed407be5SPali Rohár.global save_boot_params 39ed407be5SPali Rohársave_boot_params: 40*e11c6c27SSimon Glass /* Get return address */ 41*e11c6c27SSimon Glass ldr lr, =save_boot_params_ret 42ed407be5SPali Rohár 43ed407be5SPali Rohár/* Copy valid attached kernel to address KERNEL_ADDRESS */ 44ed407be5SPali Rohár 45ed407be5SPali Rohárcopy_kernel_start: 46ed407be5SPali Rohár adr r0, relocaddr /* r0 - address of section relocaddr */ 47ed407be5SPali Rohár ldr r1, relocaddr /* r1 - address of relocaddr after relocation */ 48ed407be5SPali Rohár cmp r0, r1 49ed407be5SPali Rohár 50ed407be5SPali Rohár /* r4 - calculated offset */ 51ed407be5SPali Rohár subhi r4, r0, r1 52ed407be5SPali Rohár sublo r4, r1, r0 53ed407be5SPali Rohár 54ed407be5SPali Rohár /* r0 - start of kernel before */ 55ed407be5SPali Rohár ldr r0, startaddr 56ed407be5SPali Rohár addhi r0, r0, r4 57ed407be5SPali Rohár sublo r0, r0, r4 58ed407be5SPali Rohár ldr r1, kernoffs 59ed407be5SPali Rohár add r0, r0, r1 60ed407be5SPali Rohár 61ed407be5SPali Rohár /* r3 - start of kernel after */ 62ed407be5SPali Rohár ldr r3, kernaddr 63ed407be5SPali Rohár 64ed407be5SPali Rohár /* r2 - end of kernel after */ 65ed407be5SPali Rohár ldr r1, kernsize 66ed407be5SPali Rohár add r2, r3, r1 67ed407be5SPali Rohár 68ed407be5SPali Rohár /* r1 - end of kernel before */ 69ed407be5SPali Rohár add r1, r0, r1 70ed407be5SPali Rohár 71ed407be5SPali Rohár /* remove header in target kernel */ 72ed407be5SPali Rohár mov r5, #0 73ed407be5SPali Rohár str r5, [r3] 74ed407be5SPali Rohár 75ed407be5SPali Rohár /* check for valid kernel uImage */ 76ed407be5SPali Rohár ldr r4, [r0] /* r4 - 4 bytes header of kernel */ 77ed407be5SPali Rohár ldr r5, ih_magic /* r5 - IH_MAGIC */ 78ed407be5SPali Rohár cmp r4, r5 79ed407be5SPali Rohár bne copy_kernel_end /* skip if invalid image */ 80ed407be5SPali Rohár 81ed407be5SPali Rohárcopy_kernel_loop: 82ed407be5SPali Rohár ldmdb r1!, {r3 - r10} 83ed407be5SPali Rohár stmdb r2!, {r3 - r10} 84ed407be5SPali Rohár cmp r1, r0 85ed407be5SPali Rohár bhi copy_kernel_loop 86ed407be5SPali Rohár 87ed407be5SPali Rohárcopy_kernel_end: 88ed407be5SPali Rohár mov r5, #0 89ed407be5SPali Rohár str r5, [r0] /* remove 4 bytes header of kernel */ 90ed407be5SPali Rohár 91ed407be5SPali Rohár 92ed407be5SPali Rohár/* Fix u-boot code */ 93ed407be5SPali Rohár 94ed407be5SPali Rohárfix_start: 95ed407be5SPali Rohár adr r0, relocaddr /* r0 - address of section relocaddr */ 96ed407be5SPali Rohár ldr r1, relocaddr /* r1 - address of relocaddr after relocation */ 97ed407be5SPali Rohár cmp r0, r1 98ed407be5SPali Rohár 99ed407be5SPali Rohár beq copy_uboot_end /* skip if u-boot is on correct address */ 100ed407be5SPali Rohár 101ed407be5SPali Rohár /* r5 - calculated offset */ 102ed407be5SPali Rohár subhi r5, r0, r1 103ed407be5SPali Rohár sublo r5, r1, r0 104ed407be5SPali Rohár 105ed407be5SPali Rohár /* r6 - maximal u-boot size */ 106ed407be5SPali Rohár ldr r6, imagesize 107ed407be5SPali Rohár 108ed407be5SPali Rohár /* fix return address */ 109ed407be5SPali Rohár subhi lr, lr, r5 110ed407be5SPali Rohár addlo lr, lr, r5 111ed407be5SPali Rohár 112ed407be5SPali Rohár /* r1 - start of u-boot after */ 113ed407be5SPali Rohár ldr r1, startaddr 114ed407be5SPali Rohár 115ed407be5SPali Rohár /* r0 - start of u-boot before */ 116ed407be5SPali Rohár addhi r0, r1, r5 117ed407be5SPali Rohár sublo r0, r1, r5 118ed407be5SPali Rohár 119ed407be5SPali Rohár /* check if we need to move uboot copy code before calling it */ 120ed407be5SPali Rohár cmp r5, r6 121ed407be5SPali Rohár bhi copy_uboot_start /* now coping u-boot code directly is safe */ 122ed407be5SPali Rohár 123ed407be5SPali Rohár 124ed407be5SPali Rohárcopy_code_start: 125ed407be5SPali Rohár /* r0 - start of u-boot before */ 126ed407be5SPali Rohár /* r1 - start of u-boot after */ 127ed407be5SPali Rohár /* r6 - maximal u-boot size */ 128ed407be5SPali Rohár 129ed407be5SPali Rohár /* r7 - maximal kernel size */ 130ed407be5SPali Rohár ldr r7, kernsize 131ed407be5SPali Rohár 132ed407be5SPali Rohár /* r4 - end of kernel before */ 133ed407be5SPali Rohár add r4, r0, r6 134ed407be5SPali Rohár add r4, r4, r7 135ed407be5SPali Rohár 136ed407be5SPali Rohár /* r5 - end of u-boot after */ 137ed407be5SPali Rohár ldr r5, startaddr 138ed407be5SPali Rohár add r5, r5, r6 139ed407be5SPali Rohár 140ed407be5SPali Rohár /* r2 - start of loop code after */ 141ed407be5SPali Rohár cmp r4, r5 /* higher address (r4 or r5) */ 142ed407be5SPali Rohár movhs r2, r4 143ed407be5SPali Rohár movlo r2, r5 144ed407be5SPali Rohár 145ed407be5SPali Rohár /* r3 - end of loop code before */ 146ed407be5SPali Rohár adr r3, end 147ed407be5SPali Rohár 148ed407be5SPali Rohár /* r4 - end of loop code after */ 149ed407be5SPali Rohár adr r4, copy_uboot_start 150ed407be5SPali Rohár sub r4, r3, r4 151ed407be5SPali Rohár add r4, r2, r4 152ed407be5SPali Rohár 153ed407be5SPali Rohárcopy_code_loop: 154ed407be5SPali Rohár ldmdb r3!, {r7 - r10} 155ed407be5SPali Rohár stmdb r4!, {r7 - r10} 156ed407be5SPali Rohár cmp r4, r2 157ed407be5SPali Rohár bhi copy_code_loop 158ed407be5SPali Rohár 159ed407be5SPali Rohárcopy_code_end: 160ed407be5SPali Rohár mov pc, r2 161ed407be5SPali Rohár 162ed407be5SPali Rohár 163ed407be5SPali Rohár/* Copy u-boot to address CONFIG_SYS_TEXT_BASE */ 164ed407be5SPali Rohár 165ed407be5SPali Rohárcopy_uboot_start: 166ed407be5SPali Rohár /* r0 - start of u-boot before */ 167ed407be5SPali Rohár /* r1 - start of u-boot after */ 168ed407be5SPali Rohár /* r6 - maximal u-boot size */ 169ed407be5SPali Rohár 170ed407be5SPali Rohár /* r2 - end of u-boot after */ 171ed407be5SPali Rohár add r2, r1, r6 172ed407be5SPali Rohár 173ed407be5SPali Rohár /* condition for copying from left to right */ 174ed407be5SPali Rohár cmp r0, r1 175ed407be5SPali Rohár addlo r1, r0, r6 /* r1 - end of u-boot before */ 176ed407be5SPali Rohár blo copy_uboot_loop_right 177ed407be5SPali Rohár 178ed407be5SPali Rohárcopy_uboot_loop_left: 179ed407be5SPali Rohár ldmia r0!, {r3 - r10} 180ed407be5SPali Rohár stmia r1!, {r3 - r10} 181ed407be5SPali Rohár cmp r1, r2 182ed407be5SPali Rohár blo copy_uboot_loop_left 183ed407be5SPali Rohár b copy_uboot_end 184ed407be5SPali Rohár 185ed407be5SPali Rohárcopy_uboot_loop_right: 186ed407be5SPali Rohár ldmdb r1!, {r3 - r10} 187ed407be5SPali Rohár stmdb r2!, {r3 - r10} 188ed407be5SPali Rohár cmp r1, r0 189ed407be5SPali Rohár bhi copy_uboot_loop_right 190ed407be5SPali Rohár 191ed407be5SPali Rohárcopy_uboot_end: 192ed407be5SPali Rohár bx lr 193ed407be5SPali Rohár 194ed407be5SPali Rohárend: 195