Skip site navigation (1)Skip section navigation (2)
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>