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.79 retrieving revision 1.89 diff -u -p -r1.79 -r1.89 --- src/sys/arch/i386/i386/locore.S 2008/11/11 14:40:18 1.79 +++ src/sys/arch/i386/i386/locore.S 2009/10/19 18:41:10 1.89 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.S,v 1.79 2008/11/11 14:40:18 ad Exp $ */ +/* $NetBSD: locore.S,v 1.89 2009/10/19 18:41:10 bouyer Exp $ */ /* * Copyright-o-rama! @@ -15,11 +15,6 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Manuel Bouyer. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES @@ -71,11 +66,11 @@ /*- - * Copyright (c) 1998, 2000, 2004, 2006, 2007 The NetBSD Foundation, Inc. + * Copyright (c) 1998, 2000, 2004, 2006, 2007, 2009 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation - * by Charles M. Hannum. + * by Charles M. Hannum, and by Andrew Doran. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -134,10 +129,11 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.79 2008/11/11 14:40:18 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.89 2009/10/19 18:41:10 bouyer Exp $"); #include "opt_compat_oldboot.h" #include "opt_ddb.h" +#include "opt_modular.h" #include "opt_multiboot.h" #include "opt_realmem.h" #include "opt_vm86.h" @@ -172,7 +168,6 @@ __KERNEL_RCSID(0, "$NetBSD: locore.S,v 1 * Xen guest identifier and loader selection */ .section __xen_guest -#ifdef XEN3 .ascii "GUEST_OS=netbsd,GUEST_VER=3.0,XEN_VER=xen-3.0" #if defined(DOM0OPS) || !defined(XEN_COMPAT_030001) .ascii ",VIRT_BASE=0xc0000000" /* KERNBASE */ @@ -189,11 +184,8 @@ __KERNEL_RCSID(0, "$NetBSD: locore.S,v 1 #ifdef PAE .ascii ",PAE=yes[extended-cr3]" #endif -#else /* !XEN3 */ - .ascii "GUEST_OS=netbsd,GUEST_VER=2.0,XEN_VER=2.0" -#endif /* XEN3 */ .ascii ",LOADER=generic" -#if (NKSYMS || defined(DDB) || defined(LKM)) && !defined(SYMTAB_SPACE) +#if (NKSYMS || defined(DDB) || defined(MODULAR)) && !defined(SYMTAB_SPACE) .ascii ",BSD_SYMTAB=yes" #endif .byte 0 @@ -517,7 +509,7 @@ try586: /* Use the `cpuid' instruction. /* Find end of kernel image. */ movl $RELOC(end),%edi -#if (NKSYMS || defined(DDB) || defined(LKM)) && !defined(SYMTAB_SPACE) +#if (NKSYMS || defined(DDB) || defined(MODULAR)) && !defined(SYMTAB_SPACE) /* Save the symbols (if loaded). */ movl RELOC(esym),%eax testl %eax,%eax @@ -726,11 +718,7 @@ start: popfl cld -#ifdef XEN3 movl %esp, %ebx # save start of available space -#else - movl %esi,%ebx # save start_info pointer -#endif movl $_RELOC(tmpstk),%esp # bootstrap stack end location /* Clear BSS first so that there are no surprises... */ @@ -778,13 +766,13 @@ start: addl $4,%esp call _C_LABEL(main) -#if defined(XEN3) && !defined(XEN_COMPAT_030001) +#if defined(XEN) && !defined(XEN_COMPAT_030001) /* space for the hypercall call page */ #define HYPERCALL_PAGE_OFFSET 0x1000 .org HYPERCALL_PAGE_OFFSET ENTRY(hypercall_page) .skip 0x1000 -#endif /* defined(XEN3) && !defined(XEN_COMPAT_030001) */ +#endif /* defined(XEN) && !defined(XEN_COMPAT_030001) */ /* * void lgdt_finish(void); @@ -1046,6 +1034,7 @@ ENTRY(cpu_switchto) .Lcopy_iobitmap: /* Copy I/O bitmap. */ + incl _C_LABEL(pmap_iobmp_evcnt)+EV_COUNT movl $(IOMAPSIZE/4),%ecx pushl %esi pushl %edi @@ -1078,8 +1067,13 @@ END(savectx) * Old call gate entry for syscall */ IDTVEC(osyscall) +#ifndef XEN + /* XXX we are in trouble! interrupts be off here. */ + cli # must be first instruction +#endif pushfl # set eflags in trap frame popl 8(%esp) + orl $PSL_I,(%esp) # re-enable ints on return to user pushl $7 # size of instruction for restart jmp syscall1 IDTVEC_END(osyscall) @@ -1094,12 +1088,13 @@ IDTVEC(syscall) syscall1: pushl $T_ASTFLT # trap # for doing ASTs INTRENTRY + STI(%eax) #ifdef DIAGNOSTIC movl CPUVAR(ILEVEL),%ebx testl %ebx,%ebx jz 1f pushl $5f - call _C_LABEL(printf) + call _C_LABEL(panic) addl $4,%esp #ifdef DDB int $3 @@ -1150,14 +1145,14 @@ syscall1: INTRFASTEXIT 3: STI(%eax) pushl $4f - call _C_LABEL(printf) + call _C_LABEL(panic) addl $4,%esp 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" +4: .asciz "SPL NOT LOWERED ON SYSCALL EXIT\n" +5: .asciz "SPL NOT ZERO ON SYSCALL ENTRY\n" #endif /* DIAGNOSTIC */ 9: cmpl $0, CPUVAR(WANT_PMAPLOAD) @@ -1176,6 +1171,39 @@ syscall1: jmp .Lsyscall_checkast /* re-check ASTs */ IDTVEC_END(syscall) +IDTVEC(svr4_fasttrap) + pushl $2 # size of instruction for restart + pushl $T_ASTFLT # trap # for doing ASTs + INTRENTRY + STI(%eax) + pushl $RW_READER + pushl $_C_LABEL(svr4_fasttrap_lock) + call _C_LABEL(rw_enter) + addl $8,%esp + call *_C_LABEL(svr4_fasttrap_vec) + pushl $_C_LABEL(svr4_fasttrap_lock) + call _C_LABEL(rw_exit) + addl $4,%esp +2: /* Check for ASTs on exit to user mode. */ + cli + CHECK_ASTPENDING(%eax) + je 1f + /* Always returning to user mode here. */ + CLEAR_ASTPENDING(%eax) + sti + /* Pushed T_ASTFLT into tf_trapno on entry. */ + pushl %esp + call _C_LABEL(trap) + addl $4,%esp + jmp 2b +1: CHECK_DEFERRED_SWITCH + jnz 9f + INTRFASTEXIT +9: sti + call _C_LABEL(pmap_load) + cli + jmp 2b + #if NNPX > 0 /* * Special interrupt handlers. Someday intr0-intr15 will be used to count @@ -1240,7 +1268,7 @@ ENTRY(sse2_idlezero_page) xorl %eax, %eax .align 16 1: - cmpl $0, CPUVAR(RESCHED) + testl $RESCHED_KPREEMPT, CPUVAR(RESCHED) jnz 2f movnti %eax, 0(%edx) movnti %eax, 4(%edx)