Date: Sat, 23 Jun 2012 14:17:53 +0800 From: David Xu <listlog2011@gmail.com> To: John Baldwin <jhb@freebsd.org> Cc: freebsd-hackers@freebsd.org, Daniil Cherednik <dcherednik@roshianokatachi.com>, kib@freebsd.org Subject: Re: Fast syscalls via sysenter Message-ID: <4FE55F91.5070303@gmail.com> In-Reply-To: <201206210811.20427.jhb@freebsd.org> References: <201206182256.30535.dcherednik@roshianokatachi.com> <201206210811.20427.jhb@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On 2012/06/21 20:11, John Baldwin wrote: > On Monday, June 18, 2012 2:56:30 pm Daniil Cherednik wrote: >> Hi! >> >> I am trying to continue the work started by DavidXu on implemention of fast >> syscalls via sysenter/sysexit. >> http://people.freebsd.org/~davidxu/sysenter/kernel/ >> I have ported it on FreeBSD9. It looks like it works. Unfortunately I am a >> beginner in kernel so I have some questions: >> >> 1. see http://people.freebsd.org/~davidxu/sysenter/kernel/kernel.patch >> /* >> * If %edx was changed, we can not use sysexit, because it >> * needs %edx to restore userland %eip. >> */ >> if (orig_edx != frame.tf_edx) >> td->td_pcb->pcb_flags |= PCB_FULLCTX; >> >> What is the reason why we have to do this additional check? In >> http://people.freebsd.org/~davidxu/sysenter/kernel/sysenter.s >> we store %edx to the stack in >> pushl %edx /* ring 3 next %eip */ >> and we restore the register in >> popl %edx /* ring 3 %eip */ > Some system calls return two return values (pipe(2)) or return a 64-bit > off_t (lseek(2)). Those system calls change %edx's value and need that > changed value to make it out to userland. > >> 2. see http://people.freebsd.org/~davidxu/sysenter/kernel/sysenter.s >> movl PCPU(CURPCB),%esi >> call syscall >> >> Why do we movl PCPU(CURPCB),%esi before calling syscall? syscall is just c- >> function. > No clue on this one, looks like it is not needed. > [kib@ is cc'ed] I implemented the sysenter syscall long time ago, it indeed can reduce system call overhead on i386. I think it might be the time to implement linux like vdso syscall now based on the work kib@ recently has done, though I don''t know how to hook it into kib's code. I quick googled it, and found they put some data into aux vector: http://www.trilithium.com/johan/2005/08/linux-gate/ http://www.takatan.net/lxr/source/arch/um/os-Linux/elf_aux.c?a=x86_64#L40 Regards, David Xu
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4FE55F91.5070303>