Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 31 Jan 2024 12:27:58 -0400
From:      Mitchell Horne <mhorne@freebsd.org>
To:        Lin Lee <leelin2602@gmail.com>, freebsd-riscv@freebsd.org
Subject:   Re: A little bit wondering about how a syscall works
Message-ID:  <b4e54e75-fcfd-475c-b0f7-6be7a6cf5e84@freebsd.org>
In-Reply-To: <f2213278-0807-4a36-ab90-6d2a9555fc8c@Spark>
References:  <9204b5c5-63bc-4c29-af19-1f1bb85f74e8@Spark> <8f66f3ed-2a49-4ebc-89eb-66c53e6d22bb@Spark> <9bfbdbe2-ff30-4c2f-abf3-2763aa433107@freebsd.org> <f2213278-0807-4a36-ab90-6d2a9555fc8c@Spark>

next in thread | previous in thread | raw e-mail | index | archive | help
On 1/31/24 01:03, Lin Lee wrote:
> Hello Mitchell,
> 
> Thank you for your kindly responding.
> 
> Now I have still a question, when does the function 
> cpu_fetch_syscall_args be called?
> 
> As the previous letter mentions, I traced the code and entered the 
> elf_machdep.c.
> 
> I have no idea if there are something to do between elf_machdep.c and 
> system calll.
> 

The short answer is yes, it is related. In syscallenter() we have:

   error = (p->p_sysent->sv_fetch_syscall_args)(td);

And as you saw, the sv_fetch_syscall_args hook is set to cpu_fetch_syscall_args() for elf64_freebsd_sysvec. Similarly, there is an sv_set_syscall_retval hook, called by syscallret() when we are done executing the system call.

Each process 'p' has a corresponding sysentvec (p_sysent). On the riscv architecture there is currently only one registered systentvec, elf64_freebsd_sysvec, because we can only execute 64-bit FreeBSD ELF binaries on this platform.

By contrast, on amd64 there are several registered sysentvecs. This allows it to execute, for example, 32-bit FreeBSD ELF binaries, or 64-bit Linux ELF binaries. The sysentvec enables different handling for these different types of executables, e.g. the system call table is different for Linux processes (.sv_table = linux_sysent).

You will see also that Linux processes have a different function for sv_fetch_syscall_args, take a look in sys/amd64/linux/linux_sysvec.c.

Mitchell

> If not, when(how) the cpu_fetch_syscall_args is called?
> 
> Thank you very much.
> 
> Best Regards,
> Lin Lee
> On Jan 31, 2024 at 1:17 AM +0800, Mitchell Horne <mhorne@freebsd.org>, 
> wrote:
>>
>> Mitchell




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?b4e54e75-fcfd-475c-b0f7-6be7a6cf5e84>