xref: /openbmc/u-boot/doc/README.arm-relocation (revision 92d5ecba)
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