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