the "real" u-boot to CONFIG_SYS_NAND_U_BOOT_DST and starts execution
@CONFIG_SYS_NAND_U_BOOT_START
-- This u-boot does no ram int, nor cpu register setup. Just looks
- where it have to relocate and relocate itself to this address.
- If relocate address = CONFIG_SYS_TEXT_BASE(not the same, as the TEXT_BASE
- from the nand_spl code), no need to copy, just go on with bss clear
- and jump to board_init_r.
+- This u-boot does no RAM init, nor CPU register setup. Just look
+ where it has to copy and relocate itself to this address. If
+ relocate address = CONFIG_SYS_TEXT_BASE (not the same, as the
+ CONFIG_SYS_TEXT_BASE from the nand_spl code), then there is no need
+ to copy, just go on with bss clear and jump to board_init_r.
- -------------------------------------------------------------------------------------
-
- Relocation:
- How to translate flash addresses in GOT to ram addresses.
- This is automagically done from code, but this example
- shows, how this magic code works ;-)
- (example on the qong board)
-
- Find a variable:
-
- a) search it in System.map
- (for example flash_info)
-
- a005b4c0 B BootpID
- a005b4c4 B BootpTry
- a005b4c8 b slave
- a005b4cc B flash_info
- ^^^^^^^^
- a005c908 b saved_sector.4002
- a005c910 b cfi_mtd_info
- a005c9c0 b cfi_mtd_names
- a005c9d0 B mtd_table
-
- ---------------------------------------
-
- b) create hexdump from u-boot code:
-
- hexdump -C u-boot > gnlmpfhex
-
- ---------------------------------------
-
- c) search the variables address in the hexdump
-
-
- *
- 0005fc80 00 00 00 00 00 00 00 00 2c 06 01 a0 18 cd 05 a0 |........,.......|
- 0005fc90 9c d4 05 a0 bc b4 05 a0 1c 7f 05 a0 f0 05 01 a0 |................|
- 0005fca0 08 5a 04 a0 1c ab 05 a0 ec a4 05 a0 98 c3 01 a0 |.Z..............|
- 0005fcb0 a0 d6 05 a0 04 71 05 a0 c0 f9 00 a0 3c cd 05 a0 |.....q......<...|
- 0005fcc0 cc b4 05 a0 f0 fa 00 a0 f0 d6 05 a0 10 86 05 a0 |................|
- ^^^^^^^^^^^
- 0005fcd0 a4 16 06 a0 dc 64 05 a0 18 86 05 a0 52 48 05 a0 |.....d......RH..|
- 0005fce0 c0 86 05 a0 24 6e 02 a0 b4 6c 05 a0 b0 94 01 a0 |....$n...l......|
- 0005fcf0 1c 86 05 a0 50 85 05 a0 d4 0c 06 a0 bc 0b 06 a0 |....P...........|
-
-
- -> 0005fcc0
-
- ----------------------------------------
-
- d) know we calculate this address in RAM
-
-
- 8ff08000 (new address of code in RAM *1)
-
- + 0005fcc0
-
- - 00008000 (offset of text *2)
-
- ----------
-
- 8ff5fcc0 -> Addr GOT in RAM
-
- *1:
- activate debug and look for the line:
- Now running in RAM - U-Boot at: 8ff08000
- ^^^^^^^^
- new address of u-boot code in RAM
-
- *2:
- Section Headers:
- [Nr] Name Type Addr Off Size ES Flg Lk Inf Al
- [ 0] NULL 00000000 000000 000000 00 0 0 0
- [ 1] .text PROGBITS a0000000 008000 04599c 00 AX 0 0 32
- ^^^^^^
- Offset of text
-
- ----------------------------------------
-
- e) now we look in 8ff5fcc0 (RAM)
-
-
- QongEVB>md 0x8ff5fcc0
- 8ff5fcc0 : a005b4cc a000faf0 a005d6f0 a0058610 ................
- ^^^^^^^^
- Bingo, here we have the old flash address (when relocation
- is working, here is the fixed ram address. see @ f, how
- it gets calculated)
-
-
- ----------------------------------------
-
- f) now translate it in the new RAM address
-
- a005b4cc
-
- - a0000000 TextBase
-
- + 8ff08000 new address of u-boot in ram
- ----------
- 8ff634cc
-
- QongEVB>mm 0x8ff5fcc0 0x8ff634cc 1
- QongEVB>md 0x8ff5fcc0
- 8ff5fcc0 : 8ff634cc a000faf0 a005d6f0 a0058610 .4..............
- 8ff5fcd0 : a00616a4 a00564dc a0058618 a0054852 .....d......RH..
-
- As this must be done for all address in the GOT, the u-boot
- code did this automagically ... :-)
-
- ----------------------------------------------
-
- g) check if the new address is really in the bss section:
-
- bss start:
- 8ff6054c (8ff08000 + 0005854C monitorlen)
-
- bss end:
- 8ff698ac (8ff08000 + 618AC)
-
- 8ff634cc is in bss :-)
-
- ----------------------------------------------
-
- h) u-boot prints:
-
- important addresses:
-
- U-Boot code: A0000000 -> A005854C BSS: -> A00618AC TextBase 0xa0000000
- Now running in RAM - U-Boot at: 8ff08000 relocBase 0x8ff08000
-
-
- ---------
+ -----------------------------------------------------------------------------
- U-Boot 2010.06-rc2-00002-gf8fbb25-dirty (Jun 18 2010 - 17:07:19)
+ How ELF relocations 23 and 2 work.
- U-Boot code: A0000000 -> A005854C BSS: -> A00618AC
- CPU: Freescale i.MX31 at 398 MHz
- Board: DAVE/DENX Qong
- mon: FFFFFFFF gd->monLen: 000618AC
- Top of RAM usable for U-Boot at: 90000000
- LCD panel info: 640 x 480, 16 bit/pix
- Reserving 600k for LCD Framebuffer at: 8ff6a000
- Reserving 390k for U-Boot at: 8ff08000
- Reserving 1280k for malloc() at: 8fdc8000
- Reserving 28 Bytes for Board Info at: 8fdc7fe4
- Reserving 48 Bytes for Global Data at: 8fdc7fb4
- New Stack Pointer is: 8fdc7fb0
- RAM Configuration:
- Bank #0: 80000000 256 MiB
- mon: 0005854C gd->monLen: 000618AC
- Now running in RAM - U-Boot at: 8ff08000
+ TBC
-------------------------------------------------------------------------------------