Files
u-boot/lib
Kunihiko Hayashi 534f0fbd65 arm64: Fix relocation of env_addr if POSITION_INDEPENDENT=y
If both POSITION_INDEPENDENT and SYS_RELOC_GD_ENV_ADDR are enabled,
wherever original env is placed anywhere, it should be relocated to
the right address.

Relocation offset gd->reloc_off is calculated with SYS_TEXT_BASE in
setup_reloc() and env address gd->env_addr is relocated by the offset in
initr_reloc_global_data().

gd->env_addr
  = (orig env) + gd->reloc_off
  = (orig env) + (gd->relocaddr - SYS_TEXT_BASE)

However, SYS_TEXT_BASE isn't always runtime base address when
POSITION_INDEPENDENT is enabled. So the relocated env_addr might point to
wrong address. For example, if SYS_TEXT_BASE is zero, gd->env_addr is
out of memory location and memory exception will occur.

There is a difference between linked address such as SYS_TEXT_BASE and
runtime base address. In _main, the difference is calculated as
"run-vs-link" offset. The env_addr should also be added to the offset
to fix the address.

gd->env_addr
  = (orig env) + ("run-vs-link" offset)   + gd->reloc_off
  = (orig env) + (SYS_TEXT_BASE - _start) + (gd->relocaddr - SYS_TEXT_BASE)
  = (orig env) + (gd->relocaddr - _start)

Cc: Marek Vasut <marex@denx.de>
Signed-off-by: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
Acked-by: Marek Vasut <marex@denx.de>
Tested-by: Marek Vasut <marex@denx.de>
2021-06-28 14:47:10 -04:00
..
2021-06-09 12:35:01 +02:00
2021-04-14 17:45:04 -04:00
2021-01-16 19:17:11 -05:00
2020-05-18 21:19:18 -04:00
2021-03-07 17:37:13 +01:00
2019-12-02 18:23:07 -05:00
2019-10-31 07:22:53 -04:00
2020-10-30 10:56:11 -04:00
2020-04-24 10:51:32 -04:00
2021-04-20 07:31:12 -04:00
2019-12-06 16:44:20 -05:00
2020-05-18 21:19:18 -04:00
2021-02-24 16:51:49 -05:00
2020-05-18 21:19:18 -04:00
2020-08-24 14:11:31 -04:00
2020-05-01 11:03:24 -04:00
2021-03-02 15:53:37 -05:00
2021-01-19 09:15:02 -05:00
2019-05-05 08:48:50 -04:00