Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 29 May 2012 00:29:30 +1000 (EST)
From:      Bruce Evans <brde@optusnet.com.au>
To:        Konstantin Belousov <kostikbel@gmail.com>
Cc:        src-committers@FreeBSD.org, svn-src-all@FreeBSD.org, Ed Schouten <ed@FreeBSD.org>, rwatson@FreeBSD.org, Bruce Evans <brde@optusnet.com.au>, svn-src-head@FreeBSD.org, jonathan@FreeBSD.org
Subject:   Re: svn commit: r236026 - in head/sys: amd64/linux32 compat/freebsd32 kern
Message-ID:  <20120529002201.C1877@besplex.bde.org>
In-Reply-To: <20120528133633.GB2358@deviant.kiev.zoral.com.ua>
References:  <201205252150.q4PLomFk035064@svn.freebsd.org> <20120526173233.A885@besplex.bde.org> <20120526164927.GU2358@deviant.kiev.zoral.com.ua> <20120527043827.W3357@besplex.bde.org> <20120528133633.GB2358@deviant.kiev.zoral.com.ua>

index | next in thread | previous in thread | raw e-mail

On Mon, 28 May 2012, Konstantin Belousov wrote:

> On Sun, May 27, 2012 at 07:49:36AM +1000, Bruce Evans wrote:
>> On Sat, 26 May 2012, Konstantin Belousov wrote:
>>
>>> On Sat, May 26, 2012 at 10:21:25PM +1000, Bruce Evans wrote:
>>> The 'low level' AKA magic happens in several *_fetch_syscall_args()
>>> functions. For both linux32 and freebsd32, the magic code automatically
>>> zero-extends the arguments into 64bit entities. Linux passes args in
>>> registers, while FreeBSD uses words on stack.
>>
>> Actually, the amd64 linux_fetch32_fetch_syscall_args() just copies from
>> 64-bit registers frame->tf_r* to 64-bit sa->args[*].  I can't see how
>> this gives anything except garbage in the top bits.  Is there magic in
>> the switch to 64-bit mode that sets the top bits?  Anyway, sign extension
>> would give garbage for unsigned args, and zero-extension would give
>> garbage for negative signed args.
> Hardware zero-extends any register touched in the 32bit mode.

So they have garbage extension when not touched?  Or maybe the kernel
extends them.

> In fact, please see r217991 for related bug.

That seems to be the kernel extending them.  I tested on a kernel built
on 3 Mar 2012.  It is much later than that, and shows nonzero extensions
(about half of the wrong cases sign extensions).

Bruce


help

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120529002201.C1877>