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