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
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to