
On 6/10/21 10:25 AM, Kunihiko Hayashi wrote: Hi,
[...]
gd->reloc_off is relocated address offset from zero, however, gd->env_addr has still non-relocated address.
>>>> | gd->env_addr += gd->reloc_off;
I think the env should be relocated if CONFIG_SYS_RELOC_GD_ENV_ADDR=y. But this code sets gd->env_addr incorrectly.
In that case, there is a non-relocated <textbase> address instead of CONFIG_SYS_TEXT_BASE.
This should be "gd->env_addr = (gd->env_addr - <textbase>) + gd->reloc_off", However, I'm not sure how we get non-relocated <textbase> address.
Maybe what you need to do is store current $pc register when you enter U-Boot very early on, in _start function, and then use it here ? Although, I am not entirely sure whether this is still possible on arm64.
Exactly. I guess it's reasonable to fix gd->env_addr when POSITION_INDEPENDENT=y before relocation. I'll try it.
That sounds good, thank you !