From mboxrd@z Thu Jan 1 00:00:00 1970 To: 9fans@9fans.net Subject: Re: [9fans] another kernel question From: "Russ Cox" Date: Tue, 12 Aug 2008 21:47:42 -0400 In-Reply-To: <30e8c9fe88deefa3ede46aec7b2f75c8@quintile.net> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit Message-Id: <20080813014505.2A9F51E8C1C@holo.morphisms.net> Topicbox-Message-UUID: fd909f82-ead3-11e9-9d60-3106f5b1d025 > this is fine for most calls, however rfork() explicitly sets up->nerrlab > to zero rather than copying it and memmove()ing up->errlab from the parent > proc to the child: > > /sys/src/9/port/sysproc.c:90 > > Surely this means that rfork will always fail with a "bad errstack [19]: -1 extra" > error? long sysrfork(ulong *arg) { ... /* Craft a return frame which will cause the child to pop out of * the scheduler in user mode with the return register zero */ forkchild(p, up->dbgreg); ... ready(p); ... } void forkchild(Proc *p, Ureg *ureg) { Ureg *cureg; /* * Add 2*BY2WD to the stack to account for * - the return PC * - trap's argument (ur) */ p->sched.sp = (ulong)p->kstack+KSTACK-(sizeof(Ureg)+2*BY2WD); p->sched.pc = (ulong)forkret; cureg = (Ureg*)(p->sched.sp+2*BY2WD); memmove(cureg, ureg, sizeof(Ureg)); /* return value of syscall in child */ cureg->ax = 0; /* Things from bottom of syscall which were never executed */ p->psstate = 0; p->insyscall = 0; } TEXT forkret(SB), $0 POPL AX POPAL POPL GS POPL FS POPL ES POPL DS ADDL $8, SP /* pop error code and trap type */ IRETL