Date: Thu, 21 Jun 2012 08:11:20 -0400 From: John Baldwin <jhb@freebsd.org> To: freebsd-hackers@freebsd.org Cc: Daniil Cherednik <dcherednik@roshianokatachi.com> Subject: Re: Fast syscalls via sysenter Message-ID: <201206210811.20427.jhb@freebsd.org> In-Reply-To: <201206182256.30535.dcherednik@roshianokatachi.com> References: <201206182256.30535.dcherednik@roshianokatachi.com>
next in thread | previous in thread | raw e-mail | index | archive | help
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. -- John Baldwin
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201206210811.20427.jhb>