ABI question, porting ports to amd64

Peter Wemm peter at wemm.org
Sun May 16 13:16:48 PDT 2004


On Sunday 16 May 2004 05:31 am, Marco van de Voort wrote:
> > I read the ABI info on x86-64.org, and objdumped some linux and
> > freebsd code, and I ran into a linux<->freebsd difference something
> > I can't figure out:
>
> Answering my own question:
>
> FreeBSD uses the gcc mechanism to build the same parameterlist for a
> syscall like for a normal procedure. (to avoid having to shift
> params)
>
> The register for the 4th parameter for gcc is %rcx, for the kernel it
> is %r10. So gcc puts the 4th param in %rcx, and the move moves it to
> %r10 for the kernel.

Correct.  We use the ABI argument ordering since that is what gcc gave 
us when calling the stub funtions, but the syscall instruction clobbers 
%rcx as it enters the kernel.

If we were smarter, we'd only do this move if we know the syscall had 4 
or more arguments.  But unfortunately, we don't have this information 
when building libc.

Or, we'd declare the syscall prototypes with an explicit override of the 
register parameter assignments or something.  (bad luck though if you 
neglect to use the right #includes for your code and miss out a 
prototype)
-- 
Peter Wemm - peter at wemm.org; peter at FreeBSD.org; peter at yahoo-inc.com
"All of this is for nothing if we don't go to the stars" - JMS/B5


More information about the freebsd-amd64 mailing list