sched/addrenv.c: Implement re-entrancy for addrenv_select()

Store the old environment in a local context so another temporary address
environment can be selected. This can happen especially when a process
is being loaded (the new process's mappings are temporarily instantiated)
and and interrupt occurs.
This commit is contained in:
Ville Juven
2023-04-19 15:29:00 +03:00
committed by Alin Jerpelea
parent 20623d7369
commit d48114a4b7
11 changed files with 56 additions and 24 deletions
+3 -3
View File
@@ -165,7 +165,7 @@ int exec_module(FAR struct binary_s *binp,
#if defined(CONFIG_ARCH_ADDRENV) && defined(CONFIG_BUILD_KERNEL)
/* Instantiate the address environment containing the user heap */
ret = addrenv_select(binp->addrenv);
ret = addrenv_select(binp->addrenv, &binp->oldenv);
if (ret < 0)
{
berr("ERROR: addrenv_select() failed: %d\n", ret);
@@ -273,7 +273,7 @@ int exec_module(FAR struct binary_s *binp,
#if defined(CONFIG_ARCH_ADDRENV) && defined(CONFIG_BUILD_KERNEL)
/* Restore the address environment of the caller */
ret = addrenv_restore();
ret = addrenv_restore(binp->oldenv);
if (ret < 0)
{
berr("ERROR: addrenv_restore() failed: %d\n", ret);
@@ -292,7 +292,7 @@ errout_with_tcbinit:
errout_with_addrenv:
#if defined(CONFIG_ARCH_ADDRENV) && defined(CONFIG_BUILD_KERNEL)
addrenv_restore();
addrenv_restore(binp->oldenv);
errout_with_envp:
#endif
binfmt_freeenv(envp);
+2 -2
View File
@@ -188,7 +188,7 @@ int elf_addrenv_select(FAR struct elf_loadinfo_s *loadinfo)
/* Instantiate the new address environment */
ret = addrenv_select(loadinfo->addrenv);
ret = addrenv_select(loadinfo->addrenv, &loadinfo->oldenv);
if (ret < 0)
{
berr("ERROR: addrenv_select failed: %d\n", ret);
@@ -240,7 +240,7 @@ int elf_addrenv_restore(FAR struct elf_loadinfo_s *loadinfo)
/* Restore the old address environment */
ret = addrenv_restore();
ret = addrenv_restore(loadinfo->oldenv);
if (ret < 0)
{
berr("ERROR: addrenv_restore failed: %d\n", ret);