Date: Mon, 18 Jun 2012 22:56:30 +0400 From: Daniil Cherednik <dcherednik@roshianokatachi.com> To: freebsd-hackers@freebsd.org Subject: Fast syscalls via sysenter Message-ID: <201206182256.30535.dcherednik@roshianokatachi.com>
next in thread | raw e-mail | index | archive | help
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 */ 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. -- Daniil Cherednik
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201206182256.30535.dcherednik>