mirror of
https://github.com/apache/nuttx.git
synced 2026-06-04 23:03:27 +08:00
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:
committed by
Alin Jerpelea
parent
20623d7369
commit
d48114a4b7
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user