Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/arch/i386/i386/locore.S,v rcsdiff: /ftp/cvs/cvsroot/src/sys/arch/i386/i386/locore.S,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.51.2.3 retrieving revision 1.53.2.3 diff -u -p -r1.51.2.3 -r1.53.2.3 --- src/sys/arch/i386/i386/locore.S 2007/11/18 19:34:28 1.51.2.3 +++ src/sys/arch/i386/i386/locore.S 2007/12/27 00:43:07 1.53.2.3 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.S,v 1.51.2.3 2007/11/18 19:34:28 bouyer Exp $ */ +/* $NetBSD: locore.S,v 1.53.2.3 2007/12/27 00:43:07 mjf Exp $ */ /* * Copyright-o-rama! @@ -110,6 +110,9 @@ * @(#)locore.s 7.3 (Berkeley) 5/13/91 */ +#include +__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.53.2.3 2007/12/27 00:43:07 mjf Exp $"); + #include "opt_compat_oldboot.h" #include "opt_ddb.h" #include "opt_realmem.h" @@ -130,7 +133,6 @@ #include #include #include -#include #include #include @@ -722,7 +724,8 @@ ENTRY(longjmp) ret /* - * struct lwp *cpu_switchto(struct lwp *oldlwp, struct newlwp) + * struct lwp *cpu_switchto(struct lwp *oldlwp, struct newlwp, + * bool returning) * * 1. if (oldlwp != NULL), save its context. * 2. then, restore context of newlwp. @@ -738,6 +741,7 @@ ENTRY(cpu_switchto) movl 16(%esp),%esi # oldlwp movl 20(%esp),%edi # newlwp + movl 24(%esp),%edx # returning testl %esi,%esi jz 1f @@ -751,6 +755,13 @@ ENTRY(cpu_switchto) movl PCB_EBP(%ebx),%ebp movl PCB_ESP(%ebx),%esp + /* Set curlwp. */ + movl %edi,CPUVAR(CURLWP) + + /* Skip the rest if returning to a pinned LWP. */ + testl %edx,%edx + jnz 4f + /* Switch TSS. Reset "task busy" flag before loading. */ movl %cr3,%eax movl %eax,PCB_CR3(%ebx) # for TSS gates @@ -759,9 +770,6 @@ ENTRY(cpu_switchto) andl $~0x0200,4(%ecx,%edx, 1) ltr %dx - /* Set curlwp. */ - movl %edi,CPUVAR(CURLWP) - /* Don't bother with the rest if switching to a system process. */ testl $LW_SYSTEM,L_FLAG(%edi) jnz 4f @@ -905,10 +913,9 @@ syscall1: pushl $4f call _C_LABEL(printf) addl $4,%esp -#ifdef DDB - int $3 -#endif /* DDB */ - movl $IPL_NONE,CPUVAR(ILEVEL) + pushl $IPL_NONE + call _C_LABEL(spllower) + addl $4,%esp jmp .Lsyscall_checkast 4: .asciz "WARNING: SPL NOT LOWERED ON SYSCALL EXIT\n" 5: .asciz "WARNING: SPL NOT ZERO ON SYSCALL ENTRY\n"