[PATCH] env: Leave invalid env for nowhere location
Marek Vasut
marex at denx.de
Mon Jun 7 19:33:56 CEST 2021
On 6/7/21 9:54 AM, Kunihiko Hayashi wrote:
Hi,
[...]
>>>> I would expect that after relocation, if all you have is env_nowhere
>>>> driver, the env_nowhere_init() is called again from the first for()
>>>> loop
>>>> of env_init() [1], which would set gd->env_valid to ENV_INVALID [1],
>>>> and
>>>> that for() loop would exit with ret = -ENOENT [2], so then the last
>>>> part
>>>> of env_init() would check for ret == -ENOENT and update gd->env_addr to
>>>> relocated default_environment [3].
>>>>
>>>> 324 int env_init(void)
>>>> 325 {
>>>> 326 struct env_driver *drv;
>>>> 327 int ret = -ENOENT;
>>>> 328 int prio;
>>>> 329
>>>> 330 for (prio = 0; (drv = env_driver_lookup(ENVOP_INIT, prio));
>>>> prio++) {
>>>> /* Part [1] */
>>>> 331 if (!drv->init || !(ret = drv->init()))
>>>> 332 env_set_inited(drv->location);
>>>> 333 if (ret == -ENOENT)
>>>> 334 env_set_inited(drv->location);
>>>> 335
>>>> 336 debug("%s: Environment %s init done (ret=%d)\n", __func__,
>>>> 337 drv->name, ret);
>>>> 338
>>>> /* Part [2] */
>>>> 339 if (gd->env_valid == ENV_INVALID)
>>>> 340 ret = -ENOENT;
>>>> 341 }
>>>> 342
>>>> 343 if (!prio)
>>>> 344 return -ENODEV;
>>>> 345
>>>> /* Part [3] */
>>>> 346 if (ret == -ENOENT) {
>>>> /* This should be relocated default_environment address */
>>>> 347 gd->env_addr = (ulong)&default_environment[0];
>>>> 348 gd->env_valid = ENV_VALID;
>>>> 349
>>>> 350 return 0;
>>>> 351 }
>>>> 352
>>>> 353 return ret;
>>>> 354 }
>>>>
>>>> Or am I missing something obvious ?
>>>
>>> These are called before relocation, and update gd->env_addr to
>>> non-relocated
>>> default_environment by [3].
>>>
>>> After that, gd->env_addr is relocated in initr_reloc_global_data()
>>> if CONFIG_SYS_RELOC_GD_ENV_ADDR is defined.
>>>
>>> | #ifdef CONFIG_SYS_RELOC_GD_ENV_ADDR
>>> | /*
>>> | * Relocate the early env_addr pointer unless we know it is not
>>> inside
>>> | * the binary. Some systems need this and for the rest, it
>>> doesn't hurt.
>>> | */
>>> | gd->env_addr += gd->reloc_off;
>>> | #endif
>>>
>>
>> Shouldn't the post-relocation env update happen in env_relocate() ?
>
> Usually env_relocate() calls env_load() that uses relocated gd->env_addr.
> It's no problem.
>
> If CONFIG_SYS_TEXT_BASE is zero, gd->reloc_off becomes illegal.
> CONFIG_SYS_RELOC_GD_ENV_ADDR should be disabled in that case.
But then, if CONFIG_SYS_TEXT_BASE is zero, the env shouldn't be
relocated or how should it behave ?
More information about the U-Boot
mailing list