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->p=5Fsyse= nt->sv=5Ffetch=5Fsyscall=5Fargs)(td);=60 to read the system call numbe= r, then use =60error =3D (se->sy=5Fcall)(td, sa->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 <mhorne=40freebsd.org>, 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->p=5Fsysent->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 <mhorne=40freebsd.org= >,<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>