From owner-freebsd-arch Mon Oct 29 12:21: 8 2001 Delivered-To: freebsd-arch@freebsd.org Received: from p3.locore.ca (p3.locore.ca [198.96.117.171]) by hub.freebsd.org (Postfix) with ESMTP id D2BC137B407; Mon, 29 Oct 2001 12:21:05 -0800 (PST) Received: (from jake@localhost) by p3.locore.ca (8.11.4/8.11.4) id f9TKJCM39381; Mon, 29 Oct 2001 15:19:12 -0500 (EST) (envelope-from jake) Date: Mon, 29 Oct 2001 15:19:12 -0500 From: Jake Burkholder To: John Baldwin Cc: arch@FreeBSD.ORG Subject: Re: syscall() ABI questions Message-ID: <20011029151912.D14748@locore.ca> References: <20011029145458.C14748@locore.ca> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: ; from jhb@FreeBSD.ORG on Mon, Oct 29, 2001 at 11:59:01AM -0800 Sender: owner-freebsd-arch@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG Apparently, On Mon, Oct 29, 2001 at 11:59:01AM -0800, John Baldwin said words to the effect of; [...] > >> > > >> > I think you're right about fork and rfork being able to use the MIASM > >> > code. rfork with RFMEM is special but it can';t be safely called from > >> > C anyway. The vfork wrapper needs to stay on x86 at least because both > >> > processes return to the same stack; if the retunr address is not saved in > >> > a register the child may clobber the parent's when it "rets" and pops > >> > the stack. > >> > >> Same kernel stack? The register is set in the trapframe which means it is > >> saved on the kernel stack. Is that shared in the vfork case? > > > > Same user stack. The trapframe is copied to the child's kernel stack. > > Then the vfork case should be fine, b/c we fixup %eax in the child's kernel > stack so that when it returns from the syscall, %eax already has the right > value. Sorry, maybe I wasn;t clear. The problem is that the parent's return address can get clobbered unless its saved in a register and copied through the trapframe. Otherwise if the child returns from the kernel and immediately executes a "ret", the parent's return address will be below %esp on the shared stack and could get clobbered. It uses jmp *%ecx now to return, which works fine because both parent and child have a _copy_ of the value. I hope this makes sense :) > > -- > > John Baldwin -- http://www.FreeBSD.org/~jhb/ > PGP Key: http://www.baldwin.cx/~john/pgpkey.asc > "Power Users Use the Power to Serve!" - http://www.FreeBSD.org/ > > To Unsubscribe: send mail to majordomo@FreeBSD.org > with "unsubscribe freebsd-arch" in the body of the message To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-arch" in the body of the message