in src/lib/libc/i386/SYS.h we see:
#ifdef __ELF__
#define KERNCALL int $0x80 /* Faster */
#else
#define KERNCALL LCALL(7,0) /* The old way */
#endif
and in /usr/src/sys/i386/i386/exception.s
we see:
/*
* Call gate entry for syscall.
* The intersegment call has been set up to specify one dummy parameter.
* This leaves a place to put eflags so that the call frame can be
* converted to a trap frame. Note that the eflags is (semi-)bogusly
* pushed into (what will be) tf_err and then copied later into the
* final spot. It has to be done this way because esp can't be just
* temporarily altered for the pushfl - an interrupt might come in
* and clobber the saved cs/eip.
*/
* converted to a trap frame. Note that the eflags is (semi-)bogusly
* pushed into (what will be) tf_err and then copied later into the
* final spot. It has to be done this way because esp can't be just
* temporarily altered for the pushfl - an interrupt might come in
* and clobber the saved cs/eip.
*/
SUPERALIGN_TEXT
IDTVEC(syscall)
pushfl /* save eflags in tf_err for now
*/
subl $4,%esp /* skip over tf_trapno */
pushal
pushl %ds
pushl %es
pushl %fs
movl $KDSEL,%eax /* switch to kernel segments */
movl %ax,%ds
movl %ax,%es
MOVL_KPSEL_EAX
movl %ax,%fs
movl TF_ERR(%esp),%eax /* copy saved eflags to final spot
*/
movl %eax,TF_EFLAGS(%esp)
movl $7,TF_ERR(%esp) /* sizeof "lcall 7,0" */
FAKE_MCOUNT(13*4(%esp))
MPLOCKED incl _cnt+V_SYSCALL
SYSCALL_LOCK
call _syscall
/*
* Return via _doreti to handle ASTs.
*/
pushl $0 /* cpl to restore */
subl $4,%esp /* dummy unit to finish intr frame
*/
movb $1,_intr_nesting_level
MEXITCOUNT
jmp _doreti
/*
* Call gate entry for Linux/NetBSD syscall (int 0x80)
*/
SUPERALIGN_TEXT
IDTVEC(int0x80_syscall)
subl $8,%esp /* skip over tf_trapno and tf_err
*/
pushal
pushl %ds
pushl %es
pushl %fs
movl $KDSEL,%eax /* switch to kernel segments */
movl %ax,%ds
movl %ax,%es
MOVL_KPSEL_EAX
movl %ax,%fs
movl $2,TF_ERR(%esp) /* sizeof "int 0x80" */
FAKE_MCOUNT(13*4(%esp))
MPLOCKED incl _cnt+V_SYSCALL
ALTSYSCALL_LOCK
call _syscall
/*
* Return via _doreti to handle ASTs.
*/
pushl $0 /* cpl to restore */
subl $4,%esp /* dummy unit to finish intr frame
*/
movb $1,_intr_nesting_level
MEXITCOUNT
jmp _doreti
Now, since teh code doesn't lie (one hopes)
I would PRESUME that the first handler is only used for old a.out
binaries, and the second is now the default entrypoint for syscalls
which would lead me to believe that the comment about Linux and NetBSD
is now incorrect and out of date...
Am I reading this right?
(I could imagin that someone could come to me and say
"no, because we aren't even using that file any more" or something.
There's a lot of cruft here that makes things hard to understand.)
Am I also right in assuming that all the registers that the user was
running when they did the KERNCALL have been saved on the KERNEL stack by
the time that the above routines are called?
(It's a pitty because if they were saved on the USER stack before teh
kernel switched to the kernel stack it would have a great simplifying
effect on kernel threads support :-) (I know that could lead to traps
during saving the context but..)
Julian
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message