From owner-freebsd-amd64@FreeBSD.ORG Tue Aug 24 09:20:47 2004 Return-Path: Delivered-To: freebsd-amd64@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id C5ECA16A4CE; Tue, 24 Aug 2004 09:20:47 +0000 (GMT) Received: from canning.wemm.org (canning.wemm.org [192.203.228.65]) by mx1.FreeBSD.org (Postfix) with ESMTP id B524543D48; Tue, 24 Aug 2004 09:20:47 +0000 (GMT) (envelope-from peter@evilpete.dyndns.org) Received: from fw.wemm.org (canning.wemm.org [192.203.228.65]) by canning.wemm.org (Postfix) with ESMTP id 5A4152A8FB; Tue, 24 Aug 2004 02:20:47 -0700 (PDT) (envelope-from peter@overcee.wemm.org) Received: from overcee.wemm.org (overcee.wemm.org [10.0.0.3]) by fw.wemm.org (Postfix) with ESMTP id 9C0EDE2B3; Tue, 24 Aug 2004 02:20:46 -0700 (PDT) (envelope-from peter@overcee.wemm.org) Received: from overcee.wemm.org (localhost [127.0.0.1]) by overcee.wemm.org (8.12.11/8.12.11) with ESMTP id i7O9KjPP003792; Tue, 24 Aug 2004 02:20:45 -0700 (PDT) (envelope-from peter@overcee.wemm.org) Received: from localhost (localhost [[UNIX: localhost]]) by overcee.wemm.org (8.12.11/8.12.11/Submit) id i7O9Kj8E003791; Tue, 24 Aug 2004 02:20:45 -0700 (PDT) (envelope-from peter) From: Peter Wemm To: freebsd-amd64@freebsd.org Date: Tue, 24 Aug 2004 02:20:45 -0700 User-Agent: KMail/1.6.1 References: <1093328434.6603.21.camel@server.mcneil.com> In-Reply-To: <1093328434.6603.21.camel@server.mcneil.com> MIME-Version: 1.0 Content-Disposition: inline Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <200408240220.45554.peter@wemm.org> cc: amd64@freebsd.org Subject: Re: va_list structure passing as argument X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 24 Aug 2004 09:20:47 -0000 On Monday 23 August 2004 11:20 pm, Sean McNeil wrote: > I'm looking at a problem I have on the amd64 with bsdtar. > Essentially, you get a core dump if you try to run the following: > > tar zxvvf nonexistent.tar.gz > > I've tracked it down to an issue where the ap is getting changed as a > side-effect of calling __vfprintf. It looks like this is happening > because the va_list structure is being passed by reference. The > va_list structure on amd64 is 24 bytes. I'm guessing that it is 16 > bytes or less for i386. It has been a while since I've looked at the > macro that determines when a structure is passed by reference or > value. Does anyone know what that is? I'm guessing that 24 passes > that cutoff but 16 does not and that is why I see this bug on amd64 > and not i386. Yes, its an external value. Consider it a pointer. It is the same on both ppc and amd64. The problem is that vfprintf "consumes" the values and advances the counters in the structure. (The argument passing ABI is very complex) What you need to do is this: myfunc(va_list ap) { va_list apcopy; va_copy(apcopy, ap); vprintf(stuff, ap1); va_copy(apcopy, ap); do_stuff_with(ap1); } etc. Using va_copy is "correct" for all our platforms, but neglecting to use it is only fatal for amd64 and ppc. Does that make sense? -- Peter Wemm - peter@wemm.org; peter@FreeBSD.org; peter@yahoo-inc.com "All of this is for nothing if we don't go to the stars" - JMS/B5