More vfork(): If we get to vfork() via system call, then we need to clone some system call information so that the return form the cloned system call works correctly

This commit is contained in:
Gregory Nutt 2014-09-29 10:59:15 -06:00
parent 2b0c657b1f
commit 48f29ce348

View file

@ -227,6 +227,26 @@ pid_t up_vfork(const struct vfork_s *context)
child->cmn.xcp.regs[REG_FP] = newfp; /* Frame pointer */
child->cmn.xcp.regs[REG_SP] = newsp; /* Stack pointer */
#ifdef CONFIG_LIB_SYSCALL
/* If we got here via a syscall, then we are going to have to setup some
* syscall return information as well.
*/
if (parent->xcp.nsyscalls > 0)
{
int index;
for (index = 0; index < parent->xcp.nsyscalls; index++)
{
child->cmn.xcp.syscall[index].sysreturn =
parent->xcp.syscall[index].sysreturn;
child->cmn.xcp.syscall[index].excreturn =
parent->xcp.syscall[index].excreturn;
}
child->cmn.xcp.nsyscalls = parent->xcp.nsyscalls;
}
#endif
/* And, finally, start the child task. On a failure, task_vforkstart()
* will discard the TCB by calling task_vforkabort().
*/