Date: Tue, 1 Aug 2017 23:11:45 +0200 From: Polytropon <freebsd@edvax.de> To: Makketron <makketronics@gmail.com> Cc: freebsd-questions@freebsd.org Subject: Re: FreeBSD System Calls in Assembly Message-ID: <20170801231145.b6972dc2.freebsd@edvax.de> In-Reply-To: <92ddcdcb-5033-73ec-0551-3bc26e5680f2@cordula.ws> References: <CACAG1gq7LuvJu5LtWCwfM91YcxWrs2u1J9WzuNu7gGmj2%2BGmDg@mail.gmail.com> <92ddcdcb-5033-73ec-0551-3bc26e5680f2@cordula.ws>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, 1 Aug 2017 03:00:42 +0200, cpghost wrote: > On 07/31/17 21:59, Makketron wrote: > > Hello, > > It seems that the documentation here doesn't apply for 64-bits. > > > > https://www.freebsd.org/doc/en/books/developers-handbook/x86.html > > > > I asked a question on stackoverflow. I thought I should ask it here too > > https://stackoverflow.com/questions/45423987/freebsd-64bits-convention-call-documentation > > > > I am running FreeBSD 11.0. > > > > The following from the FreeBSD manual does NOT print the "Hello, World!" > > message: > > [snip] > > https://farid.hajji.org/en/blog/29-hello-world-in-freebsd-assembly > https://farid.hajji.org/en/blog/32-return-values-of-freebsd-syscalls-in-assembly > > Basically, in i386, you pass function values on the stack, > and on amd64 via registers. > > The amd64 ABI calling convention, shared by common Unices: > > https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI > > Just remember that the list of syscalls and therefore the > syscall ID differs across the various Unix variants... Addition: The 64 bit ABI specifies that the registers to be used for parameters are rdi, rsi, rdx, r10, r8, r9. Compare with this table, but as it has been mentioned, the syscall numbers of FreeBSD are different than the ones of Linux: http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/ You can find the correct numbers in /usr/src/sys/kern/syscalls.c (and in different places on the system, as they are generated from a master table into different formats for the various purposes). However, FreeBSD manual pages are a good place for reference for the parameters, and you just have to use the registers in the same order as the parameters. For example, from "man 2 write": ssize_t write(int d, const void *buf, size_t nbytes); ^ ^ ^ rdi rsi rdx The syscalls usually don't have hundreds of parameters. :-) Further documentation: https://en.wikibooks.org/wiki/X86_Assembly/Interfacing_with_Linux#syscall_2 -- Polytropon Magdeburg, Germany Happy FreeBSD user since 4.0 Andra moi ennepe, Mousa, ...
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20170801231145.b6972dc2.freebsd>