[BACK]Return to locore.S CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / arch / i386 / i386

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/sys/arch/i386/i386/locore.S between version 1.11 and 1.11.2.1

version 1.11, 2003/06/26 16:47:15 version 1.11.2.1, 2004/08/03 10:35:49
Line 51 
Line 51 
  * 2. Redistributions in binary form must reproduce the above copyright   * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the   *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.   *    documentation and/or other materials provided with the distribution.
  * 3. All advertising materials mentioning features or use of this software   * 3. Neither the name of the University nor the names of its contributors
  *    must display the following acknowledgement:  
  *      This product includes software developed by the University of  
  *      California, Berkeley and its contributors.  
  * 4. Neither the name of the University nor the names of its contributors  
  *    may be used to endorse or promote products derived from this software   *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.   *    without specific prior written permission.
  *   *
Line 74 
Line 70 
  *      @(#)locore.s    7.3 (Berkeley) 5/13/91   *      @(#)locore.s    7.3 (Berkeley) 5/13/91
  */   */
   
   #include "opt_compat_netbsd.h"
   #include "opt_compat_oldboot.h"
 #include "opt_cputype.h"  #include "opt_cputype.h"
 #include "opt_ddb.h"  #include "opt_ddb.h"
 #include "opt_ipkdb.h"  #include "opt_ipkdb.h"
 #include "opt_vm86.h"  
 #include "opt_user_ldt.h"  
 #include "opt_dummy_nops.h"  
 #include "opt_compat_oldboot.h"  
 #include "opt_multiprocessor.h"  
 #include "opt_lockdebug.h"  #include "opt_lockdebug.h"
   #include "opt_multiprocessor.h"
 #include "opt_realmem.h"  #include "opt_realmem.h"
   #include "opt_user_ldt.h"
   #include "opt_vm86.h"
   
 #include "npx.h"  #include "npx.h"
 #include "assym.h"  #include "assym.h"
Line 129 
Line 125 
   
 #define GET_CURPCB(reg)                 movl    CPUVAR(CURPCB),reg  #define GET_CURPCB(reg)                 movl    CPUVAR(CURPCB),reg
 #define SET_CURPCB(reg)                 movl    reg,CPUVAR(CURPCB)  #define SET_CURPCB(reg)                 movl    reg,CPUVAR(CURPCB)
   
 #define CLEAR_RESCHED(reg)              movl    reg,CPUVAR(RESCHED)  #define CLEAR_RESCHED(reg)              movl    reg,CPUVAR(RESCHED)
   
 /* XXX temporary kluge; these should not be here */  /* XXX temporary kluge; these should not be here */
Line 242  _C_LABEL(biosextmem): .long REALEXTMEM
Line 238  _C_LABEL(biosextmem): .long REALEXTMEM
 tmpstk:  tmpstk:
   
   
 #define _RELOC(x)       ((x) - KERNBASE)  #define _RELOC(x)       ((x) - KERNBASE_LOCORE)
 #define RELOC(x)        _RELOC(_C_LABEL(x))  #define RELOC(x)        _RELOC(_C_LABEL(x))
   
         .text          .text
Line 296  start: movw $0x1234,0x472   # warm boot
Line 292  start: movw $0x1234,0x472   # warm boot
         movl    16(%esp),%eax          movl    16(%esp),%eax
         testl   %eax,%eax          testl   %eax,%eax
         jz      1f          jz      1f
         addl    $KERNBASE,%eax          addl    $KERNBASE_LOCORE,%eax
 1:      movl    %eax,RELOC(esym)  1:      movl    %eax,RELOC(esym)
   
         movl    RELOC(biosextmem),%eax          movl    RELOC(biosextmem),%eax
Line 516  try586: /* Use the `cpuid' instruction. 
Line 512  try586: /* Use the `cpuid' instruction. 
         movl    RELOC(esym),%eax          movl    RELOC(esym),%eax
         testl   %eax,%eax          testl   %eax,%eax
         jz      1f          jz      1f
         subl    $KERNBASE,%eax          subl    $KERNBASE_LOCORE,%eax
         movl    %eax,%edi          movl    %eax,%edi
 1:  1:
 #endif  #endif
Line 632  try586: /* Use the `cpuid' instruction. 
Line 628  try586: /* Use the `cpuid' instruction. 
         ret          ret
   
 begin:  begin:
         /* Now running relocated at KERNBASE.  Remove double mapping. */          /* Now running relocated at KERNBASE_LOCORE.  Remove double mapping. */
         movl    _C_LABEL(nkpde),%ecx            # for this many pde s,          movl    _C_LABEL(nkpde),%ecx            # for this many pde s,
         leal    (PROC0PDIR+0*4)(%esi),%ebx      # which is where temp maps!          leal    (PROC0PDIR+0*4)(%esi),%ebx      # which is where temp maps!
         addl    $(KERNBASE), %ebx       # now use relocated address          addl    $(KERNBASE_LOCORE), %ebx        # now use relocated address
 1:      movl    $0,(%ebx)  1:      movl    $0,(%ebx)
         addl    $4,%ebx # next pde          addl    $4,%ebx # next pde
         loop    1b          loop    1b
Line 643  begin:
Line 639  begin:
         /* Relocate atdevbase. */          /* Relocate atdevbase. */
         movl    _C_LABEL(nkpde),%edx          movl    _C_LABEL(nkpde),%edx
         shll    $PGSHIFT,%edx          shll    $PGSHIFT,%edx
         addl    $(TABLESIZE+KERNBASE),%edx          addl    $(TABLESIZE+KERNBASE_LOCORE),%edx
         addl    %esi,%edx          addl    %esi,%edx
         movl    %edx,_C_LABEL(atdevbase)          movl    %edx,_C_LABEL(atdevbase)
   
         /* Set up bootstrap stack. */          /* Set up bootstrap stack. */
         leal    (PROC0STACK+KERNBASE)(%esi),%eax          leal    (PROC0STACK+KERNBASE_LOCORE)(%esi),%eax
         movl    %eax,_C_LABEL(proc0paddr)          movl    %eax,_C_LABEL(proc0paddr)
         leal    (USPACE-FRAMESIZE)(%eax),%esp          leal    (USPACE-FRAMESIZE)(%eax),%esp
         movl    %esi,PCB_CR3(%eax)      # pcb->pcb_cr3          movl    %esi,PCB_CR3(%eax)      # pcb->pcb_cr3
Line 705  NENTRY(proc_trampoline)
Line 701  NENTRY(proc_trampoline)
         pushl   %ebx          pushl   %ebx
         call    *%esi          call    *%esi
         addl    $4,%esp          addl    $4,%esp
           DO_DEFERRED_SWITCH(%eax)
         INTRFASTEXIT          INTRFASTEXIT
         /* NOTREACHED */          /* NOTREACHED */
   
 /*****************************************************************************/  /*****************************************************************************/
   #ifdef COMPAT_16
 /*  /*
  * Signal trampoline; copied to top of user stack.   * Signal trampoline; copied to top of user stack.
  */   */
Line 722  NENTRY(sigcode)
Line 719  NENTRY(sigcode)
         leal    12(%esp),%eax           # get pointer to sigcontext          leal    12(%esp),%eax           # get pointer to sigcontext
         movl    %eax,4(%esp)            # put it in the argument slot          movl    %eax,4(%esp)            # put it in the argument slot
                                         # fake return address already there                                          # fake return address already there
         movl    $SYS___sigreturn14,%eax          movl    $SYS_compat_16___sigreturn14,%eax
         int     $0x80                   # enter kernel with args on stack          int     $0x80                   # enter kernel with args on stack
         movl    $SYS_exit,%eax          movl    $SYS_exit,%eax
         int     $0x80                   # exit if sigreturn fails          int     $0x80                   # exit if sigreturn fails
         .globl  _C_LABEL(esigcode)          .globl  _C_LABEL(esigcode)
 _C_LABEL(esigcode):  _C_LABEL(esigcode):
   #endif
   
 /*****************************************************************************/  /*****************************************************************************/
   
Line 775  ENTRY(kcopy)
Line 773  ENTRY(kcopy)
         pushl   %edi          pushl   %edi
         GET_CURPCB(%eax)                # load curpcb into eax and set on-fault          GET_CURPCB(%eax)                # load curpcb into eax and set on-fault
         pushl   PCB_ONFAULT(%eax)          pushl   PCB_ONFAULT(%eax)
         movl    $_C_LABEL(copy_fault), PCB_ONFAULT(%eax)          movl    $_C_LABEL(kcopy_fault), PCB_ONFAULT(%eax)
   
         movl    16(%esp),%esi          movl    16(%esp),%esi
         movl    20(%esp),%edi          movl    20(%esp),%edi
Line 868  _C_LABEL(copyin_func):
Line 866  _C_LABEL(copyin_func):
  */   */
 /* LINTSTUB: Func: int copyout(const void *kaddr, void *uaddr, size_t len) */  /* LINTSTUB: Func: int copyout(const void *kaddr, void *uaddr, size_t len) */
 ENTRY(copyout)  ENTRY(copyout)
           DO_DEFERRED_SWITCH(%eax)
         jmp     *_C_LABEL(copyout_func)          jmp     *_C_LABEL(copyout_func)
   
 #if defined(I386_CPU)  #if defined(I386_CPU)
Line 1009  ENTRY(i486_copyout)
Line 1008  ENTRY(i486_copyout)
  */   */
 /* LINTSTUB: Func: int copyin(const void *uaddr, void *kaddr, size_t len) */  /* LINTSTUB: Func: int copyin(const void *uaddr, void *kaddr, size_t len) */
 ENTRY(copyin)  ENTRY(copyin)
           DO_DEFERRED_SWITCH(%eax)
         jmp     *_C_LABEL(copyin_func)          jmp     *_C_LABEL(copyin_func)
   
 #if defined(I386_CPU) || defined(I486_CPU) || defined(I586_CPU) || \  #if defined(I386_CPU) || defined(I486_CPU) || defined(I586_CPU) || \
Line 1059  ENTRY(i386_copyin)
Line 1059  ENTRY(i386_copyin)
 NENTRY(copy_efault)  NENTRY(copy_efault)
         movl    $EFAULT,%eax          movl    $EFAULT,%eax
   
   /*
    * kcopy_fault is used by kcopy and copy_fault is used by copyin/out.
    *
    * they're distinguished for lazy pmap switching.  see trap().
    */
   /* LINTSTUB: Ignore */
   NENTRY(kcopy_fault)
           GET_CURPCB(%edx)
           popl    PCB_ONFAULT(%edx)
           popl    %edi
           popl    %esi
           ret
   
 /* LINTSTUB: Ignore */  /* LINTSTUB: Ignore */
 NENTRY(copy_fault)  NENTRY(copy_fault)
         GET_CURPCB(%edx)          GET_CURPCB(%edx)
Line 1080  ENTRY(copyoutstr)
Line 1093  ENTRY(copyoutstr)
         pushl   %esi          pushl   %esi
         pushl   %edi          pushl   %edi
   
           DO_DEFERRED_SWITCH(%eax)
   
         movl    12(%esp),%esi           # esi = from          movl    12(%esp),%esi           # esi = from
         movl    16(%esp),%edi           # edi = to          movl    16(%esp),%edi           # edi = to
         movl    20(%esp),%edx           # edx = maxlen          movl    20(%esp),%edx           # edx = maxlen
Line 1197  ENTRY(copyoutstr)
Line 1212  ENTRY(copyoutstr)
 ENTRY(copyinstr)  ENTRY(copyinstr)
         pushl   %esi          pushl   %esi
         pushl   %edi          pushl   %edi
   
           DO_DEFERRED_SWITCH(%eax)
   
         GET_CURPCB(%ecx)          GET_CURPCB(%ecx)
         movl    $_C_LABEL(copystr_fault),PCB_ONFAULT(%ecx)          movl    $_C_LABEL(copystr_fault),PCB_ONFAULT(%ecx)
   
Line 1308  ENTRY(copystr)
Line 1326  ENTRY(copystr)
  */   */
 /* LINTSTUB: Func: long fuword(const void *base) */  /* LINTSTUB: Func: long fuword(const void *base) */
 ENTRY(fuword)  ENTRY(fuword)
           DO_DEFERRED_SWITCH(%eax)
         movl    4(%esp),%edx          movl    4(%esp),%edx
         cmpl    $VM_MAXUSER_ADDRESS-4,%edx          cmpl    $VM_MAXUSER_ADDRESS-4,%edx
         ja      _C_LABEL(fusuaddrfault)          ja      _C_LABEL(fusuaddrfault)
Line 1324  ENTRY(fuword)
Line 1343  ENTRY(fuword)
  */   */
 /* LINTSTUB: Func: int fusword(const void *base) */  /* LINTSTUB: Func: int fusword(const void *base) */
 ENTRY(fusword)  ENTRY(fusword)
           DO_DEFERRED_SWITCH(%eax)
         movl    4(%esp),%edx          movl    4(%esp),%edx
         cmpl    $VM_MAXUSER_ADDRESS-2,%edx          cmpl    $VM_MAXUSER_ADDRESS-2,%edx
         ja      _C_LABEL(fusuaddrfault)          ja      _C_LABEL(fusuaddrfault)
Line 1341  ENTRY(fusword)
Line 1361  ENTRY(fusword)
  */   */
 /* LINTSTUB: Func: int fuswintr(const void *base) */  /* LINTSTUB: Func: int fuswintr(const void *base) */
 ENTRY(fuswintr)  ENTRY(fuswintr)
           cmpl    $TLBSTATE_VALID, CPUVAR(TLBSTATE)
           jnz     _C_LABEL(fusuaddrfault)
         movl    4(%esp),%edx          movl    4(%esp),%edx
         cmpl    $VM_MAXUSER_ADDRESS-2,%edx          cmpl    $VM_MAXUSER_ADDRESS-2,%edx
         ja      _C_LABEL(fusuaddrfault)          ja      _C_LABEL(fusuaddrfault)
Line 1358  ENTRY(fuswintr)
Line 1380  ENTRY(fuswintr)
  */   */
 /* LINTSTUB: Func: int fubyte(const void *base) */  /* LINTSTUB: Func: int fubyte(const void *base) */
 ENTRY(fubyte)  ENTRY(fubyte)
           DO_DEFERRED_SWITCH(%eax)
         movl    4(%esp),%edx          movl    4(%esp),%edx
         cmpl    $VM_MAXUSER_ADDRESS-1,%edx          cmpl    $VM_MAXUSER_ADDRESS-1,%edx
         ja      _C_LABEL(fusuaddrfault)          ja      _C_LABEL(fusuaddrfault)
Line 1402  NENTRY(fusuaddrfault)
Line 1425  NENTRY(fusuaddrfault)
  */   */
 /* LINTSTUB: Func: int suword(void *base, long c) */  /* LINTSTUB: Func: int suword(void *base, long c) */
 ENTRY(suword)  ENTRY(suword)
           DO_DEFERRED_SWITCH(%eax)
         movl    4(%esp),%edx          movl    4(%esp),%edx
         cmpl    $VM_MAXUSER_ADDRESS-4,%edx          cmpl    $VM_MAXUSER_ADDRESS-4,%edx
         ja      _C_LABEL(fusuaddrfault)          ja      _C_LABEL(fusuaddrfault)
Line 1449  ENTRY(suword)
Line 1473  ENTRY(suword)
  */   */
 /* LINTSTUB: Func: int susword(void *base, short c) */  /* LINTSTUB: Func: int susword(void *base, short c) */
 ENTRY(susword)  ENTRY(susword)
           DO_DEFERRED_SWITCH(%eax)
         movl    4(%esp),%edx          movl    4(%esp),%edx
         cmpl    $VM_MAXUSER_ADDRESS-2,%edx          cmpl    $VM_MAXUSER_ADDRESS-2,%edx
         ja      _C_LABEL(fusuaddrfault)          ja      _C_LABEL(fusuaddrfault)
Line 1497  ENTRY(susword)
Line 1522  ENTRY(susword)
  */   */
 /* LINTSTUB: Func: int suswintr(void *base, short c) */  /* LINTSTUB: Func: int suswintr(void *base, short c) */
 ENTRY(suswintr)  ENTRY(suswintr)
           cmpl    $TLBSTATE_VALID, CPUVAR(TLBSTATE)
           jnz     _C_LABEL(fusuaddrfault)
         movl    4(%esp),%edx          movl    4(%esp),%edx
         cmpl    $VM_MAXUSER_ADDRESS-2,%edx          cmpl    $VM_MAXUSER_ADDRESS-2,%edx
         ja      _C_LABEL(fusuaddrfault)          ja      _C_LABEL(fusuaddrfault)
Line 1534  ENTRY(suswintr)
Line 1561  ENTRY(suswintr)
  */   */
 /* LINTSTUB: Func: int subyte(void *base, int c) */  /* LINTSTUB: Func: int subyte(void *base, int c) */
 ENTRY(subyte)  ENTRY(subyte)
           DO_DEFERRED_SWITCH(%eax)
         movl    4(%esp),%edx          movl    4(%esp),%edx
         cmpl    $VM_MAXUSER_ADDRESS-1,%edx          cmpl    $VM_MAXUSER_ADDRESS-1,%edx
         ja      _C_LABEL(fusuaddrfault)          ja      _C_LABEL(fusuaddrfault)
Line 1719  ENTRY(cpu_switch)
Line 1747  ENTRY(cpu_switch)
          */           */
   
         pushl   %esi          pushl   %esi
         call    _C_LABEL(pmap_deactivate)       # pmap_deactivate(oldproc)          call    _C_LABEL(pmap_deactivate2)      # pmap_deactivate(oldproc)
         addl    $4,%esp          addl    $4,%esp
   
         movl    L_ADDR(%esi),%esi          movl    L_ADDR(%esi),%esi
Line 1746  ENTRY(cpu_switch)
Line 1774  ENTRY(cpu_switch)
         movl    PCB_ESP(%edi),%esp          movl    PCB_ESP(%edi),%esp
         movl    PCB_EBP(%edi),%ebp          movl    PCB_EBP(%edi),%ebp
   
   
         /* Switch address space. */  
         movl    PCB_CR3(%edi),%ecx  
         movl    %ecx,%cr3  
   
         /* Switch TSS. Reset "task busy" flag before loading. */          /* Switch TSS. Reset "task busy" flag before loading. */
           movl    %cr3,%eax
           movl    %eax,PCB_CR3(%edi)
 #ifdef MULTIPROCESSOR  #ifdef MULTIPROCESSOR
         movl    CPUVAR(GDT),%eax          movl    CPUVAR(GDT),%eax
 #else  #else
Line 1800  idle_start: 
Line 1825  idle_start: 
         jz      idle_loop          jz      idle_loop
 idle_exit:  idle_exit:
         movl    $IPL_HIGH,CPUVAR(ILEVEL)                # splhigh          movl    $IPL_HIGH,CPUVAR(ILEVEL)                # splhigh
           sti
 #if defined(MULTIPROCESSOR) || defined(LOCKDEBUG)  #if defined(MULTIPROCESSOR) || defined(LOCKDEBUG)
         call    _C_LABEL(sched_lock_idle)          call    _C_LABEL(sched_lock_idle)
 #endif  #endif
Line 1868  switch_resume:
Line 1894  switch_resume:
          */           */
   
         pushl   %esi          pushl   %esi
         call    _C_LABEL(pmap_deactivate)       # pmap_deactivate(oldproc)          call    _C_LABEL(pmap_deactivate2)      # pmap_deactivate(oldproc)
         addl    $4,%esp          addl    $4,%esp
   
         movl    L_ADDR(%esi),%esi          movl    L_ADDR(%esi),%esi
Line 1901  switch_exited:
Line 1927  switch_exited:
         jnz     switch_restored          jnz     switch_restored
 #endif  #endif
   
           /* Switch TSS. Reset "task busy" flag before loading. */
           movl    %cr3,%eax
           movl    %eax,PCB_CR3(%esi) /* XXX should be done by pmap_activate? */
 #ifdef MULTIPROCESSOR  #ifdef MULTIPROCESSOR
         movl    CPUVAR(GDT),%eax          movl    CPUVAR(GDT),%eax
 #else  #else
Line 1909  switch_exited:
Line 1938  switch_exited:
 #endif  #endif
         movl    L_MD_TSS_SEL(%edi),%edx          movl    L_MD_TSS_SEL(%edi),%edx
   
         /* Switch TSS. Reset "task busy" flag before loading. */  
         andl    $~0x0200,4(%eax,%edx, 1)          andl    $~0x0200,4(%eax,%edx, 1)
         ltr     %dx          ltr     %dx
   
Line 1924  switch_restored:
Line 1952  switch_restored:
         movl    PCB_CR0(%esi),%ecx          movl    PCB_CR0(%esi),%ecx
 #ifdef MULTIPROCESSOR  #ifdef MULTIPROCESSOR
         /*          /*
          * If our floating point registers are on a different cpu,           * If our floating point registers are on a different CPU,
          * clear CR0_TS so we'll trap rather than reuse bogus state.           * clear CR0_TS so we'll trap rather than reuse bogus state.
          */           */
         movl    PCB_FPCPU(%esi),%ebx          movl    PCB_FPCPU(%esi),%ebx
Line 1946  switch_restored:
Line 1974  switch_restored:
  */   */
         movl    CPUVAR(CURLWP),%edi          movl    CPUVAR(CURLWP),%edi
         movl    L_PROC(%edi),%esi          movl    L_PROC(%edi),%esi
         cmpl    $0,P_NRAS(%esi)          cmpl    $0,P_RASLIST(%esi)
         je      1f          jne     2f
         movl    L_MD_REGS(%edi),%ebx  
         movl    TF_EIP(%ebx),%eax  
         pushl   %eax  
         pushl   %esi  
         call    _C_LABEL(ras_lookup)  
         addl    $8,%esp  
         cmpl    $-1,%eax  
         je      1f  
         movl    %eax,TF_EIP(%ebx)  
 1:  1:
         movl    $1,%ebx          movl    $1,%ebx
   
Line 1964  switch_return:
Line 1983  switch_return:
 #if defined(MULTIPROCESSOR) || defined(LOCKDEBUG)  #if defined(MULTIPROCESSOR) || defined(LOCKDEBUG)
         call    _C_LABEL(sched_unlock_idle)          call    _C_LABEL(sched_unlock_idle)
 #endif  #endif
           cmpl    $0,CPUVAR(IPENDING)
           jz      3f
         pushl   $IPL_NONE               # spl0()          pushl   $IPL_NONE               # spl0()
         call    _C_LABEL(Xspllower)     # process pending interrupts          call    _C_LABEL(Xspllower)     # process pending interrupts
         addl    $4,%esp          addl    $4,%esp
   3:
         movl    $IPL_HIGH,CPUVAR(ILEVEL)        # splhigh()          movl    $IPL_HIGH,CPUVAR(ILEVEL)        # splhigh()
   
         movl    %ebx,%eax          movl    %ebx,%eax
Line 1976  switch_return:
Line 1998  switch_return:
         popl    %ebx          popl    %ebx
         ret          ret
   
   2:                                      # check RAS list
           movl    L_MD_REGS(%edi),%ebx
           movl    TF_EIP(%ebx),%eax
           pushl   %eax
           pushl   %esi
           call    _C_LABEL(ras_lookup)
           addl    $8,%esp
           cmpl    $-1,%eax
           je      1b
           movl    %eax,TF_EIP(%ebx)
           jmp     1b
   
 /*  /*
  * void cpu_switchto(struct lwp *current, struct lwp *next)   * void cpu_switchto(struct lwp *current, struct lwp *next)
  * Switch to the specified next LWP.   * Switch to the specified next LWP.
Line 2020  ENTRY(cpu_switchto)
Line 2054  ENTRY(cpu_switchto)
         jmp     switch_resume          jmp     switch_resume
   
 /*  /*
  * void switch_exit(struct lwp *l, void (*exit)(struct lwp *));   * void cpu_exit(struct lwp *l)
  * Switch to the appropriate idle context (lwp0's if uniprocessor; the cpu's   * Switch to the appropriate idle context (lwp0's if uniprocessor; the CPU's
  * if multiprocessor) and deallocate the address space and kernel stack for p.   * if multiprocessor) and deallocate the address space and kernel stack for p.
  * Then jump into cpu_switch(), as if we were in the idle proc all along.   * Then jump into cpu_switch(), as if we were in the idle proc all along.
  */   */
Line 2030  ENTRY(cpu_switchto)
Line 2064  ENTRY(cpu_switchto)
 #endif  #endif
         .globl  _C_LABEL(uvmspace_free),_C_LABEL(kernel_map)          .globl  _C_LABEL(uvmspace_free),_C_LABEL(kernel_map)
         .globl  _C_LABEL(uvm_km_free),_C_LABEL(tss_free)          .globl  _C_LABEL(uvm_km_free),_C_LABEL(tss_free)
 /* LINTSTUB: Func: void switch_exit(struct lwp *l, void (*exit)(struct lwp *)) */  /* LINTSTUB: Func: void cpu_exit(struct lwp *l) */
 ENTRY(switch_exit)  ENTRY(cpu_exit)
         movl    4(%esp),%edi            # old process          movl    4(%esp),%edi            # old process
         movl    8(%esp),%eax            # exit func  
 #ifndef MULTIPROCESSOR  #ifndef MULTIPROCESSOR
         movl    $_C_LABEL(lwp0),%ebx          movl    $_C_LABEL(lwp0),%ebx
         movl    L_ADDR(%ebx),%esi          movl    L_ADDR(%ebx),%esi
Line 2052  ENTRY(switch_exit)
Line 2085  ENTRY(switch_exit)
         movl    PCB_ESP(%esi),%esp          movl    PCB_ESP(%esi),%esp
         movl    PCB_EBP(%esi),%ebp          movl    PCB_EBP(%esi),%ebp
   
         /* Save exit func. */          /* Switch TSS. Reset "task busy" flag before loading. */
         pushl   %eax          movl    %cr3,%eax
           movl    %eax,PCB_CR3(%esi)
         /* Load TSS info. */  
 #ifdef MULTIPROCESSOR  #ifdef MULTIPROCESSOR
         movl    CPUVAR(GDT),%eax          movl    CPUVAR(GDT),%eax
 #else  #else
Line 2063  ENTRY(switch_exit)
Line 2095  ENTRY(switch_exit)
         movl    _C_LABEL(gdt),%eax          movl    _C_LABEL(gdt),%eax
 #endif  #endif
   
         /* Switch address space. */  
         movl    PCB_CR3(%esi),%ecx  
         movl    %ecx,%cr3  
   
         /* Switch TSS. */  
         andl    $~0x0200,4-SEL_KPL(%eax,%edx,1)          andl    $~0x0200,4-SEL_KPL(%eax,%edx,1)
         ltr     %dx          ltr     %dx
   
Line 2084  ENTRY(switch_exit)
Line 2111  ENTRY(switch_exit)
         sti          sti
   
         /*          /*
          * Schedule the dead process's vmspace and stack to be freed.           * Schedule the dead LWP's stack to be freed.
          */           */
         movl    0(%esp),%eax            /* %eax = exit func */          pushl   %edi
         movl    %edi,0(%esp)            /* {lwp_}exit2(l) */          call    _C_LABEL(lwp_exit2)
         call    *%eax  
         addl    $4,%esp          addl    $4,%esp
   
         /* Jump into cpu_switch() with the right state. */          /* Jump into cpu_switch() with the right state. */
Line 2132  syscall1:
Line 2158  syscall1:
         INTRENTRY          INTRENTRY
   
 #ifdef DIAGNOSTIC  #ifdef DIAGNOSTIC
           cmpl    $0, CPUVAR(WANT_PMAPLOAD)
           jz      1f
           pushl   $6f
           call    _C_LABEL(printf)
           addl    $4, %esp
   1:
         movl    CPUVAR(ILEVEL),%ebx          movl    CPUVAR(ILEVEL),%ebx
         testl   %ebx,%ebx          testl   %ebx,%ebx
         jz      1f          jz      1f
Line 2146  syscall1:
Line 2178  syscall1:
         movl    CPUVAR(CURLWP),%edx          movl    CPUVAR(CURLWP),%edx
         movl    %esp,L_MD_REGS(%edx)    # save pointer to frame          movl    %esp,L_MD_REGS(%edx)    # save pointer to frame
         movl    L_PROC(%edx),%edx          movl    L_PROC(%edx),%edx
           pushl   %esp
         call    *P_MD_SYSCALL(%edx)     # get pointer to syscall() function          call    *P_MD_SYSCALL(%edx)     # get pointer to syscall() function
 2:      /* Check for ASTs on exit to user mode. */          addl    $4,%esp
   .Lsyscall_checkast:
           /* Check for ASTs on exit to user mode. */
         cli          cli
         CHECK_ASTPENDING(%eax)          CHECK_ASTPENDING(%eax)
         je      1f          je      1f
Line 2155  syscall1:
Line 2190  syscall1:
         CLEAR_ASTPENDING(%eax)          CLEAR_ASTPENDING(%eax)
         sti          sti
         /* Pushed T_ASTFLT into tf_trapno on entry. */          /* Pushed T_ASTFLT into tf_trapno on entry. */
           pushl   %esp
         call    _C_LABEL(trap)          call    _C_LABEL(trap)
         jmp     2b          addl    $4,%esp
           jmp     .Lsyscall_checkast      /* re-check ASTs */
   1:      CHECK_DEFERRED_SWITCH(%eax)
           jnz     9f
 #ifndef DIAGNOSTIC  #ifndef DIAGNOSTIC
 1:      INTRFASTEXIT          INTRFASTEXIT
 #else /* DIAGNOSTIC */  #else /* DIAGNOSTIC */
 1:      cmpl    $IPL_NONE,CPUVAR(ILEVEL)          cmpl    $IPL_NONE,CPUVAR(ILEVEL)
         jne     3f          jne     3f
         INTRFASTEXIT          INTRFASTEXIT
 3:      sti  3:      sti
Line 2174  syscall1:
Line 2213  syscall1:
         jmp     2b          jmp     2b
 4:      .asciz  "WARNING: SPL NOT LOWERED ON SYSCALL EXIT\n"  4:      .asciz  "WARNING: SPL NOT LOWERED ON SYSCALL EXIT\n"
 5:      .asciz  "WARNING: SPL NOT ZERO ON SYSCALL ENTRY\n"  5:      .asciz  "WARNING: SPL NOT ZERO ON SYSCALL ENTRY\n"
   6:      .asciz  "WARNING: WANT PMAPLOAD ON SYSCALL ENTRY\n"
 #endif /* DIAGNOSTIC */  #endif /* DIAGNOSTIC */
   9:      sti
           call    _C_LABEL(pmap_load)
           jmp     .Lsyscall_checkast      /* re-check ASTs */
   
 #if NNPX > 0  #if NNPX > 0
 /*  /*

Legend:
Removed from v.1.11  
changed lines
  Added in v.1.11.2.1

CVSweb <webmaster@jp.NetBSD.org>