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.
In fact, please see r217991 for related bug.
pgpS3viGKMIHx.pgp
Description: PGP signature