Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 17 Jan 2022 14:04:37 +0100
From:      Gary Jennejohn <gljennjohn@gmail.com>
To:        Damian Malarczyk <damian@dmcyk.xyz>
Cc:        "freebsd-hackers@freebsd.org" <freebsd-hackers@freebsd.org>
Subject:   Re: amd64 syscall ABI (vs. Darwin)
Message-ID:  <20220117140437.13663e70@ernst.home>
In-Reply-To: <Gp_BfNXrv9qjA5V5DpeI-lfdH6EmwKDuqkMLI7DHkses-P6-bT7Ga9p_nURlQC2D4fYuWyf6pFC7s8FPUjWV5Ut7j7uL8iiqx9hv8oePlHs=@dmcyk.xyz>
References:  <Gp_BfNXrv9qjA5V5DpeI-lfdH6EmwKDuqkMLI7DHkses-P6-bT7Ga9p_nURlQC2D4fYuWyf6pFC7s8FPUjWV5Ut7j7uL8iiqx9hv8oePlHs=@dmcyk.xyz>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, 17 Jan 2022 12:41:59 +0000
Damian Malarczyk <damian@dmcyk.xyz> wrote:

> Hello,
> 
> I'm hacking on a toy project to run Darwin (MachO) binaries on FreeBSD.
> Currently I'm at a stage of syscalls support, and I've noticed a difference in the amd64 ABI that I didn't expect.
> 
> FreeBSD is changing values of some registers that aren't used as the syscall output. e.g., r8-r11 are changed, while r12-r15 don't seem to be affected.
> That's not the case on Darwin, from what I've seen onlyrax, rdx used as syscall results are changed.
> It looks like FreeBSD's syscalls calling convention is more like standard function calling, and r8-r11 should be always caller saved.
> 
> At a first glance Darwin approach seems more optimal, as less registers get clobbered. Is there any specific reason why this isn't also the case on FreeBSD?
> I'm also wondering where exactly the register values are changed. When I look at thetrapframe contents in the sv_set_syscall_retvalsystem vector callback the r8 register value is same as on the input, so it must be changed somewhere later. Does anyone know where exactly this happens?
> 
> Thanks in advance for any tips.
> 

This happens in the tree in various assembler files.  The primary use
of these registers appears to be for holding temporary data.

Try running this in /usr/src:

find -type f -name "*.S" -print0 | xargs -0 grep -e r8 -e r9 -e r10 -e r11 \
--mmap -l $1

> Here're the programs I used to test this behaviour:
> - [FreeBSD](https://gist.github.com/dmcyk/11c29b2d5e5d3e04e5b954e43e12d384)
> - [macOS](https://gist.github.com/dmcyk/ed1c6fcced78844c8e2e4a0fb3d18391)
> 
> When you run the macOS version it wil write twice the number of arguments to stdout, FreeBSD will write the number only once followed by a 0, because r8 got overwritten.
> 
> P.S. I'm relatively new to FreeBSD, and first time writing here on the mailing list so hello everyone :).
> 
> - Damian

-- 
Gary Jennejohn



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