Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 2 Feb 2024 06:11:30 +0000
From:      Jessica Clarke <jrtc27@freebsd.org>
To:        Lin Lee <leelin2602@gmail.com>
Cc:        freebsd-riscv <freebsd-riscv@freebsd.org>, Mitchell Horne <mhorne@freebsd.org>
Subject:   Re: A little bit wondering about how a syscall works
Message-ID:  <1D587966-19FD-47C9-B362-B55068665C2E@freebsd.org>
In-Reply-To: <bd2bd011-be87-4f87-825b-dd533198bcc9@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> <b4e54e75-fcfd-475c-b0f7-6be7a6cf5e84@freebsd.org> <8867a483-7e92-4579-9236-32b4a704713e@Spark> <51285fdf-dbcf-4d71-82cb-f49353db95cd@freebsd.org> <bd2bd011-be87-4f87-825b-dd533198bcc9@Spark>

next in thread | previous in thread | raw e-mail | index | archive | help
On 2 Feb 2024, at 05:49, Lin Lee <leelin2602@gmail.com> wrote:
>=20
> Hi,
>=20
> But what I see in =
https://github.com/freebsd/freebsd-src/blob/main/sys/kern/subr_syscall.c =
is(after removing some condition branching):
>=20
> 77 error =3D (p->p_sysent->sv_fetch_syscall_args)(td);
> 78 se =3D sa->callp;
> 156  error =3D (se->sy_call)(td, sa->args);
>=20
> It seems that `sv_set_syscall_retval hook` is called earlier than =
syscall is executed.

And sv_set_syscall_retval is called on line 204 after all of that.
What=E2=80=99s making you think otherwise?

Jess

> Thank you so much for your replying.=20
>=20
> Best Regards,=20
> Lin Lee
> On Feb 2, 2024 at 12:19 AM +0800, Mitchell Horne <mhorne@freebsd.org>, =
wrote:
>> On 2/1/24 00:47, Lin Lee wrote:
>>> Hi,
>>>=20
>>> So, if I understand correctly,
>>>=20
>>> Each thread's sv_fetch_syscall_args hook function is initialized as
>>> cpu_fetch_syscall_args(),
>>>=20
>>> And when it enter syscallenter, it first use `error =3D
>>> (p->p_sysent->sv_fetch_syscall_args)(td);` to read the system call
>>> number, then use `error =3D (se->sy_call)(td, sa->args)` to execute =
the
>>> system call.
>>>=20
>>> Do I understand corrected?
>>>=20
>>=20
>> That's right.
>>=20
>>> Thank you very much.
>>>=20
>>> Best Regards,
>>> Lin Lee
>>> On Feb 1, 2024 at 12:27 AM +0800, Mitchell Horne =
<mhorne@freebsd.org>,
>>> wrote:
>>>> On 1/31/24 01:03, Lin Lee wrote:
>>>>> Hello Mitchell,
>>>>>=20
>>>>> Thank you for your kindly responding.
>>>>>=20
>>>>> Now I have still a question, when does the function
>>>>> cpu_fetch_syscall_args be called?
>>>>>=20
>>>>> As the previous letter mentions, I traced the code and entered the
>>>>> elf_machdep.c.
>>>>>=20
>>>>> I have no idea if there are something to do between elf_machdep.c =
and
>>>>> system calll.
>>>>>=20
>>>>=20
>>>> The short answer is yes, it is related. In syscallenter() we have:
>>>>=20
>>>> error =3D (p->p_sysent->sv_fetch_syscall_args)(td);
>>>>=20
>>>> 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.
>>>>=20
>>=20
>> One correction: the sv_set_syscall_retval hook is actually called at =
the
>> very end of syscallenter(), after the execution of the syscall has
>> completed.
>>=20
>>>> 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.
>>>>=20
>>>> 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 =3D linux_sysent).
>>>>=20
>>>> 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.
>>>>=20
>>>> Mitchell
>>>>=20
>>>>> If not, when(how) the cpu_fetch_syscall_args is called?
>>>>>=20
>>>>> Thank you very much.
>>>>>=20
>>>>> Best Regards,
>>>>> Lin Lee
>>>>> On Jan 31, 2024 at 1:17 AM +0800, Mitchell Horne =
<mhorne@freebsd.org>,
>>>>> wrote:
>>>>>>=20
>>>>>> Mitchell
>>>>=20
>>=20




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1D587966-19FD-47C9-B362-B55068665C2E>