1f1d2b313SHeiko SchocherTo make relocation on arm working, the following changes are done: 2f1d2b313SHeiko Schocher 3*92d5ecbaSAlbert AribaudAt arch level: add linker flag -pie 4f1d2b313SHeiko Schocher 5*92d5ecbaSAlbert Aribaud This causes the linker to generate fixup tables .rel.dyn and .dynsym, 6*92d5ecbaSAlbert Aribaud which must be applied to the relocated image before transferring 7*92d5ecbaSAlbert Aribaud control to it. 8f1d2b313SHeiko Schocher 9*92d5ecbaSAlbert Aribaud These fixups are described in the ARM ELF documentation as type 23 10*92d5ecbaSAlbert Aribaud (program-base-relative) and 2 (symbol-relative) 11f1d2b313SHeiko Schocher 12*92d5ecbaSAlbert AribaudAt cpu level: modify linker file and add a relocation and fixup loop 13f1d2b313SHeiko Schocher 14*92d5ecbaSAlbert Aribaud the linker file must be modified to include the .rel.dyn and .dynsym 15*92d5ecbaSAlbert Aribaud tables in the binary image, and to provide symbols for the relocation 16*92d5ecbaSAlbert Aribaud code to access these tables 17f1d2b313SHeiko Schocher 18*92d5ecbaSAlbert Aribaud The relocation and fixup loop must be executed after executing 19*92d5ecbaSAlbert Aribaud board_init_f at initial location and before executing board_init_r 20*92d5ecbaSAlbert Aribaud at final location. 21f1d2b313SHeiko Schocher 22*92d5ecbaSAlbert AribaudAt board level: 23f1d2b313SHeiko Schocher 24*92d5ecbaSAlbert Aribaud dram_init(): bd pointer is now at this point not accessible, so only 25*92d5ecbaSAlbert Aribaud detect the real dramsize, and store it in gd->ram_size. Bst detected 26*92d5ecbaSAlbert Aribaud with get_ram_size(). 27f1d2b313SHeiko Schocher 28*92d5ecbaSAlbert AribaudTODO: move also dram initialization there on boards where it is possible. 29f1d2b313SHeiko Schocher 30*92d5ecbaSAlbert Aribaud Setup of the the bd_t dram bank info is done in the new function 31*92d5ecbaSAlbert Aribaud dram_init_banksize() called after bd is accessible. 32f1d2b313SHeiko Schocher 33*92d5ecbaSAlbert AribaudAt lib level: 34f1d2b313SHeiko Schocher 35*92d5ecbaSAlbert Aribaud Board.c code is adapted from ppc code 36f1d2b313SHeiko Schocher 37*92d5ecbaSAlbert AribaudAt config level: 38f1d2b313SHeiko Schocher 39*92d5ecbaSAlbert Aribaud Define CONFIG_RELOC_FIXUP_WORKS. 40*92d5ecbaSAlbert Aribaud Undefine CONFIG_SYS_ARM_WITHOUT_RELOC 41f1d2b313SHeiko Schocher 42*92d5ecbaSAlbert Aribaud* WARNING ** WARNING ** WARNING ** WARNING ** WARNING ** WARNING ** WARNING * 43f1d2b313SHeiko Schocher 44*92d5ecbaSAlbert AribaudBoards which are not fixed to support relocation will be REMOVED! 45*92d5ecbaSAlbert Aribaud 46*92d5ecbaSAlbert AribaudEventually, CONFIG_SYS_ARM_WITHOUT_RELOC and CONFIG_RELOC_FIXUP_WORKS will 47*92d5ecbaSAlbert Aribauddisappear and boards which have to migrated to relocation will disappear too. 48*92d5ecbaSAlbert Aribaud 49*92d5ecbaSAlbert Aribaud----------------------------------------------------------------------------- 50*92d5ecbaSAlbert Aribaud 51*92d5ecbaSAlbert AribaudFor boards which boot from nand_spl, it is possible to save one copy 52ab86f72cSHeiko Schocherif TEXT_BASE == relocation address! This prevents that uboot code 53ab86f72cSHeiko Schocheris copied again in relocate_code(). 54ab86f72cSHeiko Schocher 55ab86f72cSHeiko Schocherexample for the tx25 board: 56ab86f72cSHeiko Schocher 57ab86f72cSHeiko Schochera) cpu starts 58ab86f72cSHeiko Schocherb) it copies the first page in nand to internal ram 59ab86f72cSHeiko Schocher (nand_spl_code) 60ab86f72cSHeiko Schocherc) end executes this code 61ab86f72cSHeiko Schocherd) this initialize CPU, RAM, ... and copy itself to RAM 62ab86f72cSHeiko Schocher (this bin must fit in one page, so board_init_f() 63ab86f72cSHeiko Schocher don;t fit in it ... ) 64ab86f72cSHeiko Schochere) there it copy u-boot to CONFIG_SYS_NAND_U_BOOT_DST and 65ab86f72cSHeiko Schocher starts this image @ CONFIG_SYS_NAND_U_BOOT_START 66ab86f72cSHeiko Schocherf) u-boot code steps through board_init_f() and calculates 67ab86f72cSHeiko Schocher the relocation address and copy itself to it 68ab86f72cSHeiko Schocher 69ab86f72cSHeiko SchocherIf TEXT_BASE == relocation address, the copying of u-boot 70ab86f72cSHeiko Schocherin f) could be saved. 71ab86f72cSHeiko Schocher 72*92d5ecbaSAlbert Aribaud----------------------------------------------------------------------------- 73ab86f72cSHeiko Schocher 74*92d5ecbaSAlbert AribaudTODO 75f1d2b313SHeiko Schocher 76f1d2b313SHeiko Schocher- fill in bd_t infos (check) 77f1d2b313SHeiko Schocher- adapt all boards 78f1d2b313SHeiko Schocher 79f1d2b313SHeiko Schocher- maybe adapt TEXT_BASE (this must be checked from board maintainers) 80f1d2b313SHeiko Schocher This *must* be done for boards, which boot from NOR flash 81f1d2b313SHeiko Schocher 82f1d2b313SHeiko Schocher on other boards if TEXT_BASE = relocation baseaddr, this saves 83f1d2b313SHeiko Schocher one copying from u-boot code. 84f1d2b313SHeiko Schocher 85f1d2b313SHeiko Schocher- new function dram_init_banksize() is actual board specific. Maybe 86f1d2b313SHeiko Schocher we make a weak default function in arch/arm/lib/board.c ? 87f1d2b313SHeiko Schocher 88*92d5ecbaSAlbert Aribaud----------------------------------------------------------------------------- 89f1d2b313SHeiko Schocher 90f1d2b313SHeiko SchocherRelocation with NAND_SPL (example for the tx25): 91f1d2b313SHeiko Schocher 92f1d2b313SHeiko Schocher- cpu copies the first page from NAND to 0xbb000000 (IMX_NFC_BASE) 93f1d2b313SHeiko Schocher and start with code execution on this address. 94f1d2b313SHeiko Schocher 95f1d2b313SHeiko Schocher- The First page contains u-boot code from u-boot:nand_spl/nand_boot_fsl_nfc.c 96f1d2b313SHeiko Schocher which inits the dram, cpu registers, reloacte itself to TEXT_BASE and loads 97f1d2b313SHeiko Schocher the "real" u-boot to CONFIG_SYS_NAND_U_BOOT_DST and starts execution 98f1d2b313SHeiko Schocher @CONFIG_SYS_NAND_U_BOOT_START 99f1d2b313SHeiko Schocher 100f1d2b313SHeiko Schocher- This u-boot does no ram int, nor cpu register setup. Just looks 101f1d2b313SHeiko Schocher where it have to relocate and relocate itself to this address. 102f1d2b313SHeiko Schocher If relocate address = TEXT_BASE(not the same, as the TEXT_BASE 103f1d2b313SHeiko Schocher from the nand_spl code), no need to copy, just go on with bss clear 104f1d2b313SHeiko Schocher and jump to board_init_r. 105f1d2b313SHeiko Schocher 106*92d5ecbaSAlbert Aribaud----------------------------------------------------------------------------- 107f1d2b313SHeiko Schocher 108*92d5ecbaSAlbert AribaudHow ELF relocations 23 and 2 work. 109f1d2b313SHeiko Schocher 110*92d5ecbaSAlbert AribaudTBC 111f1d2b313SHeiko Schocher 112f1d2b313SHeiko Schocher------------------------------------------------------------------------------------- 113f1d2b313SHeiko Schocher 114f1d2b313SHeiko SchocherDebugging u-boot in RAM: 115f1d2b313SHeiko Schocher(example on the qong board) 116f1d2b313SHeiko Schocher 117f1d2b313SHeiko Schochera) add in config.mk: 118f1d2b313SHeiko Schocher 119f1d2b313SHeiko SchocherPLATFORM_CPPFLAGS += -DDEBUG 120f1d2b313SHeiko Schocher 121f1d2b313SHeiko Schocher----------------- 122f1d2b313SHeiko Schocher 123f1d2b313SHeiko Schocherb) start debugger 124f1d2b313SHeiko Schocher 125f1d2b313SHeiko Schocherarm-linux-gdb u-boot 126f1d2b313SHeiko Schocher 127f1d2b313SHeiko Schocher[hs@pollux u-boot]$ arm-linux-gdb u-boot 128f1d2b313SHeiko SchocherGNU gdb Red Hat Linux (6.7-2rh) 129f1d2b313SHeiko SchocherCopyright (C) 2007 Free Software Foundation, Inc. 130f1d2b313SHeiko SchocherLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 131f1d2b313SHeiko SchocherThis is free software: you are free to change and redistribute it. 132f1d2b313SHeiko SchocherThere is NO WARRANTY, to the extent permitted by law. Type "show copying" 133f1d2b313SHeiko Schocherand "show warranty" for details. 134f1d2b313SHeiko SchocherThis GDB was configured as "--host=i686-pc-linux-gnu --target=arm-linux". 135f1d2b313SHeiko SchocherThe target architecture is set automatically (currently arm) 136f1d2b313SHeiko Schocher.. 137f1d2b313SHeiko Schocher(gdb) 138f1d2b313SHeiko Schocher 139f1d2b313SHeiko Schocher----------------- 140f1d2b313SHeiko Schocher 141f1d2b313SHeiko Schocherc) connect to target 142f1d2b313SHeiko Schocher 143f1d2b313SHeiko Schochertarget remote bdi10:2001 144f1d2b313SHeiko Schocher 145f1d2b313SHeiko Schocher(gdb) target remote bdi10:2001 146f1d2b313SHeiko SchocherRemote debugging using bdi10:2001 147f1d2b313SHeiko Schocher0x8ff17f10 in ?? () 148f1d2b313SHeiko Schocher(gdb) 149f1d2b313SHeiko Schocher 150f1d2b313SHeiko Schocher----------------- 151f1d2b313SHeiko Schocher 152f1d2b313SHeiko Schocherd) discard symbol-file 153f1d2b313SHeiko Schocher 154f1d2b313SHeiko Schocher(gdb) symbol-file 155f1d2b313SHeiko SchocherDiscard symbol table from `/home/hs/celf/u-boot/u-boot'? (y or n) y 156f1d2b313SHeiko SchocherNo symbol file now. 157f1d2b313SHeiko Schocher(gdb) 158f1d2b313SHeiko Schocher 159f1d2b313SHeiko Schocher----------------- 160f1d2b313SHeiko Schocher 161f1d2b313SHeiko Schochere) load new symbol table: 162f1d2b313SHeiko Schocher 163f1d2b313SHeiko Schocher(gdb) add-symbol-file u-boot 0x8ff08000 164f1d2b313SHeiko Schocheradd symbol table from file "u-boot" at 165f1d2b313SHeiko Schocher .text_addr = 0x8ff08000 166f1d2b313SHeiko Schocher(y or n) y 167f1d2b313SHeiko SchocherReading symbols from /home/hs/celf/u-boot/u-boot...done. 168f1d2b313SHeiko Schocher(gdb) c 169f1d2b313SHeiko SchocherContinuing. 170f1d2b313SHeiko Schocher^C 171f1d2b313SHeiko SchocherProgram received signal SIGSTOP, Stopped (signal). 172f1d2b313SHeiko Schocher0x8ff17f18 in serial_getc () at serial_mxc.c:192 173f1d2b313SHeiko Schocher192 while (__REG(UART_PHYS + UTS) & UTS_RXEMPTY); 174f1d2b313SHeiko Schocher(gdb) 175f1d2b313SHeiko Schocher 176f1d2b313SHeiko Schocheradd-symbol-file u-boot 0x8ff08000 177f1d2b313SHeiko Schocher ^^^^^^^^^^ 178f1d2b313SHeiko Schocher get this address from u-boot debug printfs 179f1d2b313SHeiko Schocher 180f1d2b313SHeiko SchocherU-Boot 2010.06-rc2-00009-gf77b8b8-dirty (Jun 22 2010 - 09:43:46) 181f1d2b313SHeiko Schocher 182f1d2b313SHeiko SchocherU-Boot code: A0000000 -> A0058BAC BSS: -> A0061F10 183f1d2b313SHeiko SchocherCPU: Freescale i.MX31 at 398 MHz 184f1d2b313SHeiko SchocherBoard: DAVE/DENX Qong 185f1d2b313SHeiko Schochermon: FFFFFFFF gd->monLen: 00061F10 186f1d2b313SHeiko SchocherTop of RAM usable for U-Boot at: 90000000 187f1d2b313SHeiko SchocherLCD panel info: 640 x 480, 16 bit/pix 188f1d2b313SHeiko SchocherReserving 600k for LCD Framebuffer at: 8ff6a000 189f1d2b313SHeiko SchocherReserving 391k for U-Boot at: 8ff08000 190f1d2b313SHeiko Schocher ^^^^^^^^ 191f1d2b313SHeiko SchocherReserving 1280k for malloc() at: 8fdc8000 192f1d2b313SHeiko SchocherReserving 24 Bytes for Board Info at: 8fdc7fe8 193f1d2b313SHeiko SchocherReserving 52 Bytes for Global Data at: 8fdc7fb4 194f1d2b313SHeiko SchocherNew Stack Pointer is: 8fdc7fb0 195f1d2b313SHeiko SchocherRAM Configuration: 196f1d2b313SHeiko SchocherBank #0: 80000000 256 MiB 197f1d2b313SHeiko Schocherrelocation Offset is: eff08000 198f1d2b313SHeiko Schochermon: 00058BAC gd->monLen: 00061F10 199f1d2b313SHeiko SchocherNow running in RAM - U-Boot at: 8ff08000 200f1d2b313SHeiko Schocher ^^^^^^^^ 201f1d2b313SHeiko Schocher 202f1d2b313SHeiko SchocherNow you can use gdb as usual :-) 203