diff --git a/sched/task/task_fork.c b/sched/task/task_fork.c index 51b61f93fb9..00ade225f3f 100644 --- a/sched/task/task_fork.c +++ b/sched/task/task_fork.c @@ -145,6 +145,19 @@ FAR struct task_tcb_s *nxtask_setup_fork(start_t retaddr) child->cmn.flags |= TCB_FLAG_FREE_TCB; +#if defined(CONFIG_ARCH_ADDRENV) + /* Join the parent address environment (REVISIT: vfork() only) */ + + if (ttype != TCB_FLAG_TTYPE_KERNEL) + { + ret = addrenv_join(parent, &child->cmn); + if (ret < 0) + { + goto errout_with_tcb; + } + } +#endif + /* Initialize the task join */ nxtask_joininit(&child->cmn); @@ -184,6 +197,19 @@ FAR struct task_tcb_s *nxtask_setup_fork(start_t retaddr) goto errout_with_tcb; } +#if defined(CONFIG_ARCH_ADDRENV) && defined(CONFIG_ARCH_KERNEL_STACK) + /* Allocate the kernel stack */ + + if (ttype != TCB_FLAG_TTYPE_KERNEL) + { + ret = up_addrenv_kstackalloc(&child->cmn); + if (ret < 0) + { + goto errout_with_tcb; + } + } +#endif + /* Setup thread local storage */ ret = tls_dup_info(&child->cmn, parent);