Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 Feb 2024 12:47:50 +0800
From:      Lin Lee <leelin2602@gmail.com>
To:        freebsd-riscv@freebsd.org, Mitchell Horne <mhorne@freebsd.org>
Subject:   Re: A little bit wondering about how a syscall works
Message-ID:  <8867a483-7e92-4579-9236-32b4a704713e@Spark>
In-Reply-To: <b4e54e75-fcfd-475c-b0f7-6be7a6cf5e84@freebsd.org>
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>

next in thread | previous in thread | raw e-mail | index | archive | help
--65bb227b_41b5c1d5_c55
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Hi,

So, if I understand correctly,

Each thread's sv_fetch_syscall_args hook function is initialized as cpu_fetch_syscall_args(),

And when it enter syscallenter, it first use `error = (p->p_sysent->sv_fetch_syscall_args)(td);` to read the system call number, then use `error = (se->sy_call)(td, sa->args)` to execute the system call.

Do I understand corrected?

Thank you very much.

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,
> >
> > 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
>

--65bb227b_41b5c1d5_c55
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

<html xmlns=3D=22http://www.w3.org/1999/xhtml=22>;
<head>
<title></title>
</head>
<body>
<div name=3D=22messageBodySection=22>
<div dir=3D=22auto=22>Hi,<br />
<br />
So, if I understand correctly,<br />
<br />
Each thread's sv=5Ffetch=5Fsyscall=5Fargs hook function is initialized as=
 cpu=5Ffetch=5Fsyscall=5Fargs(),<br />
<br />
And when it enter syscallenter, it first use =60error =3D (p-&gt;p=5Fsyse=
nt-&gt;sv=5Ffetch=5Fsyscall=5Fargs)(td);=60 to read the system call numbe=
r, then use =60error =3D (se-&gt;sy=5Fcall)(td, sa-&gt;args)=60 to execut=
e the system call.<br />
<br />
Do I understand corrected=3F<br />
<br />
Thank you very much.</div>
</div>
<div name=3D=22messageSignatureSection=22><br />
<div class=3D=22match=46ont=22>Best Regards,
<div dir=3D=22auto=22>Lin Lee</div>
</div>
</div>
<div name=3D=22messageReplySection=22>On =46eb 1, 2024 at 12:27 AM +0800,=
 Mitchell Horne &lt;mhorne=40freebsd.org&gt;, wrote:<br />
<blockquote type=3D=22cite=22 style=3D=22border-left-color: grey; border-=
left-width: thin; border-left-style: solid; margin: 5px 5px;padding-left:=
 10px;=22>On 1/31/24 01:03, Lin Lee wrote:<br />
<blockquote type=3D=22cite=22>Hello Mitchell,<br />
<br />
Thank you for your kindly responding.<br />
<br />
Now I have still a question, when does the function<br />
cpu=5Ffetch=5Fsyscall=5Fargs be called=3F<br />
<br />
As the previous letter mentions, I traced the code and entered the<br />
elf=5Fmachdep.c.<br />
<br />
I have no idea if there are something to do between elf=5Fmachdep.c and<b=
r />
system calll.<br />
<br /></blockquote>
<br />
The short answer is yes, it is related. In syscallenter() we have:<br />
<br />
error =3D (p-&gt;p=5Fsysent-&gt;sv=5Ffetch=5Fsyscall=5Fargs)(td);<br />
<br />
And as you saw, the sv=5Ffetch=5Fsyscall=5Fargs hook is set to cpu=5Ffetc=
h=5Fsyscall=5Fargs() for elf64=5Ffreebsd=5Fsysvec. Similarly, there is an=
 sv=5Fset=5Fsyscall=5Fretval hook, called by syscallret() when we are don=
e executing the system call.<br />
<br />
Each process 'p' has a corresponding sysentvec (p=5Fsysent). On the riscv=
 architecture there is currently only one registered systentvec, elf64=5F=
freebsd=5Fsysvec, because we can only execute 64-bit =46reeBSD EL=46 bina=
ries on this platform.<br />
<br />
By contrast, on amd64 there are several registered sysentvecs. This allow=
s it to execute, for example, 32-bit =46reeBSD EL=46 binaries, or 64-bit =
Linux EL=46 binaries. The sysentvec enables different handling for these =
different types of executables, e.g. the system call table is different f=
or Linux processes (.sv=5Ftable =3D linux=5Fsysent).<br />
<br />
You will see also that Linux processes have a different function for sv=5F=
fetch=5Fsyscall=5Fargs, take a look in sys/amd64/linux/linux=5Fsysvec.c.<=
br />
<br />
Mitchell<br />
<br />
<blockquote type=3D=22cite=22>If not, when(how) the cpu=5Ffetch=5Fsyscall=
=5Fargs is called=3F<br />
<br />
Thank you very much.<br />
<br />
Best Regards,<br />
Lin Lee<br />
On Jan 31, 2024 at 1:17 AM +0800, Mitchell Horne &lt;mhorne=40freebsd.org=
&gt;,<br />
wrote:<br />
<blockquote type=3D=22cite=22><br />
Mitchell<br /></blockquote>
</blockquote>
<br /></blockquote>
</div>
</body>
</html>

--65bb227b_41b5c1d5_c55--




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?8867a483-7e92-4579-9236-32b4a704713e>