void sysrforkchild(Proc* child, Proc* parent) { Ureg *cureg; // If STACKPAD is 1 things go very bad very quickly. // But it is the right value ... #define STACKPAD 1 /* for return PC? */ /* * Add STACKPAD*BY2SE to the stack to account for * - the return PC * (NOT NOW) - trap's arguments (syscallnr, ureg) */ child->sched.sp = PTR2UINT(child->kstack+KSTACK-((sizeof(Ureg)+STACKPAD*BY2SE))); child->sched.pc = PTR2UINT(sysrforkret); cureg = (Ureg*)(child->sched.sp+STACKPAD*BY2SE); memmove(cureg, parent->dbgreg, sizeof(Ureg)); /* Things from bottom of syscall which were never executed */ child->psstate = 0; child->insyscall = 0; //iprint("Child SP set tp %p\n", (void *)child->sched.sp); fpusysrforkchild(child, parent); }
/* * Craft a return frame which will cause the child to pop out of * the scheduler in user mode with the return register zero. Set * pc to point to a l.s return function. */ void forkchild(Proc *p, Ureg *ureg) { Ureg *cureg; //print("%lud setting up for forking child %lud\n", up->pid, p->pid); p->sched.sp = (ulong)p->kstack+KSTACK-sizeof(Ureg); p->sched.pc = (ulong)forkret; cureg = (Ureg*)(p->sched.sp); memmove(cureg, ureg, sizeof(Ureg)); /* syscall returns 0 for child */ cureg->r0 = 0; /* Things from bottom of syscall which were never executed */ p->psstate = 0; p->insyscall = 0; fpusysrforkchild(p, cureg, up); }
void sysrforkchild(Proc* child, Proc* parent) { Ureg *cureg; /* * Add 3*BY2SE to the stack to account for * - the return PC * - trap's arguments (syscallnr, ureg) */ child->sched.sp = PTR2UINT(child->kstack+KSTACK-(sizeof(Ureg)+3*BY2SE)); child->sched.pc = PTR2UINT(sysrforkret); cureg = (Ureg*)(child->sched.sp+3*BY2SE); memmove(cureg, parent->dbgreg, sizeof(Ureg)); /* Things from bottom of syscall which were never executed */ child->psstate = 0; child->insyscall = 0; fpusysrforkchild(child, parent); }