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