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.34.2.8 retrieving revision 1.53 diff -u -p -r1.34.2.8 -r1.53 --- src/sys/arch/i386/i386/locore.S 2008/01/21 09:37:02 1.34.2.8 +++ src/sys/arch/i386/i386/locore.S 2007/10/18 15:28:35 1.53 @@ -1,40 +1,10 @@ -/* $NetBSD: locore.S,v 1.34.2.8 2008/01/21 09:37:02 yamt Exp $ */ +/* $NetBSD: locore.S,v 1.53 2007/10/18 15:28:35 yamt Exp $ */ /* * Copyright-o-rama! */ /* - * Copyright (c) 2006 Manuel Bouyer. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 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 - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/* * Copyright (c) 2001 Wasabi Systems, Inc. * All rights reserved. * @@ -140,14 +110,11 @@ * @(#)locore.s 7.3 (Berkeley) 5/13/91 */ -#include -__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.34.2.8 2008/01/21 09:37:02 yamt Exp $"); - #include "opt_compat_oldboot.h" +#include "opt_cputype.h" #include "opt_ddb.h" #include "opt_realmem.h" #include "opt_vm86.h" -#include "opt_xen.h" #include "npx.h" #include "assym.h" @@ -163,45 +130,15 @@ __KERNEL_RCSID(0, "$NetBSD: locore.S,v 1 #include #include #include +#include +#include #include #include -#ifndef XEN -#include -#endif /* XXX temporary kluge; these should not be here */ /* Get definitions for IOM_BEGIN, IOM_END, and IOM_SIZE */ #include -#ifdef XEN -/* - * 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 */ - .ascii ",ELF_PADDR_OFFSET=0xc0000000" /* KERNBASE */ -#else - .ascii ",VIRT_BASE=0xc0100000" /* KERNTEXTOFF */ - .ascii ",ELF_PADDR_OFFSET=0xc0100000" /* KERNTEXTOFF */ -#endif - .ascii ",VIRT_ENTRY=0xc0100000" /* KERNTEXTOFF */ -#if !defined(XEN_COMPAT_030001) - .ascii ",HYPERCALL_PAGE=0x00000101" - /* (???+HYPERCALL_PAGE_OFFSET)/PAGE_SIZE) */ -#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) - .ascii ",BSD_SYMTAB=yes" -#endif - .byte 0 -#endif - /* * Initialization */ @@ -247,11 +184,8 @@ _C_LABEL(tablesize): .long 0 .space 512 tmpstk: -#ifndef XEN + #define _RELOC(x) ((x) - KERNBASE) -#else -#define _RELOC(x) ((x)) -#endif /* XEN */ #define RELOC(x) _RELOC(_C_LABEL(x)) .text @@ -259,7 +193,6 @@ tmpstk: .set _C_LABEL(kernel_text),KERNTEXTOFF .globl start -#ifndef XEN start: movw $0x1234,0x472 # warm boot #if defined(MULTIBOOT) @@ -711,97 +644,6 @@ begin: #endif /* SAFARI_FIFO_HACK */ call _C_LABEL(main) -#else /* XEN */ -start: - /* First, reset the PSL. */ - pushl $PSL_MBO - 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... */ - xorl %eax,%eax - movl $RELOC(__bss_start),%edi - movl $RELOC(_end),%ecx - subl %edi,%ecx - rep stosb - - /* Copy the necessary stuff from start_info structure. */ - /* We need to copy shared_info early, so that sti/cli work */ - movl $RELOC(start_info_union),%edi - movl $128,%ecx - rep movsl - - /* Clear segment registers; always null in proc0. */ - xorl %eax,%eax - movw %ax,%fs - movw %ax,%gs - decl %eax - movl %eax,RELOC(cpu_info_primary)+CPU_INFO_LEVEL - - xorl %eax,%eax - cpuid - movl %eax,RELOC(cpu_info_primary)+CPU_INFO_LEVEL - - call xen_pmap_bootstrap - /* - * First avail returned by xen_pmap_bootstrap in %eax - */ - movl %eax, %esi; - movl %esi, _C_LABEL(proc0uarea) - -#define PROC0PDIR ((0) * PAGE_SIZE) -#define PROC0STACK ((1) * PAGE_SIZE) - - /* Set up bootstrap stack. */ - leal (KSTACK_SIZE-FRAMESIZE)(%eax),%esp - xorl %ebp,%ebp # mark end of frames - - addl $USPACE, %esi - subl $KERNBASE, %esi #init386 want a physical address - pushl %esi - call _C_LABEL(init386) # wire 386 chip for unix operation - addl $4,%esp - call _C_LABEL(main) - -#if defined(XEN3) && !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) */ - -/* - * void lgdt_finish(void); - * Finish load a new GDT pointer (do any necessary cleanup). - * XXX It's somewhat questionable whether reloading all the segment registers - * is necessary, since the actual descriptor data is not changed except by - * process creation and exit, both of which clean up via task switches. OTOH, - * this only happens at run time when the GDT is resized. - */ -/* LINTSTUB: Func: void lgdt_finish(void) */ -NENTRY(lgdt_finish) - movl $GSEL(GDATA_SEL, SEL_KPL),%eax - movw %ax,%ds - movw %ax,%es - movw %ax,%gs - movw %ax,%ss - movl $GSEL(GCPU_SEL, SEL_KPL),%eax - movw %ax,%fs - /* Reload code selector by doing intersegment return. */ - popl %eax - pushl $GSEL(GCODE_SEL, SEL_KPL) - pushl %eax - lret - -#endif /* XEN */ /* * void lwp_trampoline(void); @@ -881,23 +723,7 @@ ENTRY(longjmp) ret /* - * void dumpsys(void) - * - * Mimic cpu_switchto() for postmortem debugging. - */ -ENTRY(dumpsys) - pushl %ebx # set up fake switchframe - pushl %esi # and save context - pushl %edi - movl %esp,_C_LABEL(dumppcb)+PCB_ESP - movl %ebp,_C_LABEL(dumppcb)+PCB_EBP - call _C_LABEL(dodumpsys) # dump! - addl $(3*4), %esp # unwind switchframe - ret - -/* - * struct lwp *cpu_switchto(struct lwp *oldlwp, struct newlwp, - * bool returning) + * struct lwp *cpu_switchto(struct lwp *oldlwp, struct newlwp) * * 1. if (oldlwp != NULL), save its context. * 2. then, restore context of newlwp. @@ -913,7 +739,6 @@ ENTRY(cpu_switchto) movl 16(%esp),%esi # oldlwp movl 20(%esp),%edi # newlwp - movl 24(%esp),%edx # returning testl %esi,%esi jz 1f @@ -927,49 +752,21 @@ ENTRY(cpu_switchto) movl PCB_EBP(%ebx),%ebp movl PCB_ESP(%ebx),%esp - /* - * Set curlwp. This must be globally visible in order to permit - * non-interlocked mutex release. - */ - movl %edi,%ecx - xchgl %ecx,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 + movl CPUVAR(GDT),%eax + movl L_MD_TSS_SEL(%edi),%edx + andl $~0x0200,4(%eax,%edx, 1) + ltr %dx -#ifdef XEN - pushl %edi - call _C_LABEL(i386_switch_context) - addl $4,%esp -#else /* XEN */ - /* Switch ring0 esp */ - movl PCB_ESP0(%ebx),%eax - movl %eax,CPUVAR(ESP0) + /* 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 - /* Restore thread-private %fs/%gs descriptors. */ - movl CPUVAR(GDT),%ecx - movl PCB_FSD(%ebx), %eax - movl PCB_FSD+4(%ebx), %edx - movl %eax, (GUFS_SEL*8)(%ecx) - movl %edx, (GUFS_SEL*8+4)(%ecx) - movl PCB_GSD(%ebx), %eax - movl PCB_GSD+4(%ebx), %edx - movl %eax, (GUGS_SEL*8)(%ecx) - movl %edx, (GUGS_SEL*8+4)(%ecx) -#endif /* XEN */ - - /* Switch I/O bitmap */ - movl PCB_IOMAP(%ebx),%eax - orl %eax,%eax - jnz,pn .Lcopy_iobitmap - movl $(IOMAP_INVALOFF << 16),CPUVAR(IOBASE) -.Liobitmap_done: - /* Is this process using RAS (restartable atomic sequences)? */ movl L_PROC(%edi),%eax cmpl $0,P_RASLIST(%eax) @@ -980,9 +777,7 @@ ENTRY(cpu_switchto) * FPU IPIs can alter the LWP's saved cr0. Dropping the priority * is deferred until mi_switch(), when cpu_switchto() returns. */ -2: -#ifndef XEN - movl $IPL_IPI,CPUVAR(ILEVEL) +2: movl $IPL_IPI,CPUVAR(ILEVEL) movl PCB_CR0(%ebx),%ecx movl %cr0,%edx @@ -999,7 +794,6 @@ ENTRY(cpu_switchto) 3: cmpl %edx,%ecx je 4f movl %ecx,%cr0 -#endif /* XEN */ /* Return to the new LWP, returning 'oldlwp' in %eax. */ 4: movl %esi,%eax @@ -1020,21 +814,6 @@ ENTRY(cpu_switchto) movl %eax,TF_EIP(%ecx) jmp 2b -.Lcopy_iobitmap: - /* Copy I/O bitmap. */ - movl $(IOMAPSIZE/4),%ecx - pushl %esi - pushl %edi - movl %eax,%esi /* pcb_iomap */ - movl CPUVAR(SELF),%edi - leal CPU_INFO_IOMAP(%edi),%edi - rep - movsl - popl %edi - popl %esi - movl $((CPU_INFO_IOMAP - CPU_INFO_TSS) << 16),CPUVAR(IOBASE) - jmp .Liobitmap_done - /* * void savectx(struct pcb *pcb); * @@ -1094,12 +873,12 @@ syscall1: addl $4,%esp .Lsyscall_checkast: /* Check for ASTs on exit to user mode. */ - CLI(%eax) + cli CHECK_ASTPENDING(%eax) je 1f /* Always returning to user mode here. */ CLEAR_ASTPENDING(%eax) - STI(%eax) + sti /* Pushed T_ASTFLT into tf_trapno on entry. */ pushl %esp call _C_LABEL(trap) @@ -1107,48 +886,26 @@ syscall1: jmp .Lsyscall_checkast /* re-check ASTs */ 1: CHECK_DEFERRED_SWITCH jnz 9f -#ifdef XEN - STIC(%eax) - jz 14f - call _C_LABEL(stipending) - testl %eax,%eax - jz 14f - /* process pending interrupts */ - CLI(%eax) - movl CPUVAR(ILEVEL), %ebx - movl $.Lsyscall_resume, %esi # address to resume loop at -.Lsyscall_resume: - movl %ebx,%eax # get cpl - movl CPUVAR(IUNMASK)(,%eax,4),%eax - andl CPUVAR(IPENDING),%eax # any non-masked bits left? - jz 17f - bsrl %eax,%eax - btrl %eax,CPUVAR(IPENDING) - movl CPUVAR(ISOURCES)(,%eax,4),%eax - jmp *IS_RESUME(%eax) -17: movl %ebx, CPUVAR(ILEVEL) #restore cpl - jmp .Lsyscall_checkast -14: -#endif /* XEN */ #ifndef DIAGNOSTIC INTRFASTEXIT #else /* DIAGNOSTIC */ cmpl $IPL_NONE,CPUVAR(ILEVEL) jne 3f INTRFASTEXIT -3: STI(%eax) +3: sti pushl $4f call _C_LABEL(printf) addl $4,%esp - pushl $IPL_NONE - call _C_LABEL(spllower) - addl $4,%esp +#ifdef DDB + int $3 +#endif /* DDB */ + movl $IPL_NONE,CPUVAR(ILEVEL) jmp .Lsyscall_checkast 4: .asciz "WARNING: SPL NOT LOWERED ON SYSCALL EXIT\n" 5: .asciz "WARNING: SPL NOT ZERO ON SYSCALL ENTRY\n" 6: .asciz "WARNING: WANT PMAPLOAD ON SYSCALL ENTRY\n" #endif /* DIAGNOSTIC */ -9: STI(%eax) +9: sti call _C_LABEL(pmap_load) jmp .Lsyscall_checkast /* re-check ASTs */