number of args in a syscall

Konstantin Belousov kostikbel at gmail.com
Mon Oct 13 14:14:27 UTC 2014


On Mon, Oct 13, 2014 at 07:29:43PM +0800, Julian Elischer wrote:
> I'm faced with porting some code that has patched the 8.0 kernel
> to accept up to 16 args in a syscall.
> It makes my skin crawl a bit but if I can't give a good reason to
> suggest that they do things differently in 10 (pass a pointer to a 
> struct maybe)
> then I'll just take the easy path and s/8/16/ in
> the appropriate line in amd64/include/proc.h and get on with life.
It should work; I assume this is for your local modifications.

A fine point in the amd64 (syscall) calling sequence is that first
6 integer arguments are passed in registers, everything else and
more overflows to memory. Syscall parameters passing conventions are
very similar of the conventions for the regular functions, stubs
do very little. The syscall arg fetch code does distinguish the
registers/memory args and performs copyin for memory portion, see
cpu_fetch_syscall_args().

> 
> I initially thought it may confuse things like ktrace or truss but I 
> haven't seen any problems..
> allocating more space on the stack is another thing but you only ever 
> do one syscall at a time.

The difference in the stack usage for 8 vs.16 args would be around
100-200 bytes.


More information about the freebsd-current mailing list