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>