[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.17 and 1.30

version 1.17, 2003/09/10 19:48:49 version 1.30, 2004/08/22 06:46:34
Line 70 
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 110 
Line 110 
 #include <machine/asm.h>  #include <machine/asm.h>
   
 #if defined(MULTIPROCESSOR)  #if defined(MULTIPROCESSOR)
   
 #define SET_CURLWP(lwp,cpu)                             \  #define SET_CURLWP(lwp,cpu)                             \
         movl    CPUVAR(SELF),cpu                ;       \          movl    CPUVAR(SELF),cpu                ;       \
         movl    lwp,CPUVAR(CURLWP)      ;       \          movl    lwp,CPUVAR(CURLWP)      ;       \
         movl    cpu,L_CPU(lwp)          movl    cpu,L_CPU(lwp)
   
 #else  #else
   
 #define SET_CURLWP(lwp,tcpu)            movl    lwp,CPUVAR(CURLWP)  #define SET_CURLWP(lwp,tcpu)            movl    lwp,CPUVAR(CURLWP)
Line 123 
Line 123 
   
 #endif  #endif
   
 #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 152 
Line 152 
 #ifdef MULTIPROCESSOR  #ifdef MULTIPROCESSOR
 #include <machine/i82489reg.h>  #include <machine/i82489reg.h>
 #endif  #endif
   
 /*  /*
  * PTmap is recursive pagemap at top of virtual address space.   * PTmap is recursive pagemap at top of virtual address space.
  * Within PTmap, the page directory can be found (third indirection).   * Within PTmap, the page directory can be found (third indirection).
Line 191 
Line 191 
 #ifdef I586_CPU  #ifdef I586_CPU
         .globl  _C_LABEL(idt)          .globl  _C_LABEL(idt)
 #endif  #endif
         .globl  _C_LABEL(lapic_tpr)          .globl  _C_LABEL(lapic_tpr)
   
 #if NLAPIC > 0  #if NLAPIC > 0
 #ifdef __ELF__  #ifdef __ELF__
         .align  PAGE_SIZE          .align  PAGE_SIZE
Line 202 
Line 202 
         .globl _C_LABEL(local_apic), _C_LABEL(lapic_id)          .globl _C_LABEL(local_apic), _C_LABEL(lapic_id)
 _C_LABEL(local_apic):  _C_LABEL(local_apic):
         .space  LAPIC_ID          .space  LAPIC_ID
 _C_LABEL(lapic_id):  _C_LABEL(lapic_id):
         .long   0x00000000          .long   0x00000000
         .space  LAPIC_TPRI-(LAPIC_ID+4)          .space  LAPIC_TPRI-(LAPIC_ID+4)
 _C_LABEL(lapic_tpr):  _C_LABEL(lapic_tpr):
         .space  LAPIC_PPRI-LAPIC_TPRI          .space  LAPIC_PPRI-LAPIC_TPRI
 _C_LABEL(lapic_ppr):  _C_LABEL(lapic_ppr):
         .space  LAPIC_ISR-LAPIC_PPRI          .space  LAPIC_ISR-LAPIC_PPRI
 _C_LABEL(lapic_isr):  _C_LABEL(lapic_isr):
         .space  PAGE_SIZE-LAPIC_ISR          .space  PAGE_SIZE-LAPIC_ISR
 #else  #else
 _C_LABEL(lapic_tpr):  _C_LABEL(lapic_tpr):
         .long 0          .long 0
 #endif  #endif
   
   
 _C_LABEL(cpu):          .long   0       # are we 386, 386sx, or 486,  _C_LABEL(cpu):          .long   0       # are we 386, 386sx, or 486,
                                         #   or Pentium, or..                                          #   or Pentium, or..
Line 233  _C_LABEL(biosextmem): .long 0 # extended
Line 233  _C_LABEL(biosextmem): .long 0 # extended
 #else  #else
 _C_LABEL(biosextmem):   .long   REALEXTMEM  _C_LABEL(biosextmem):   .long   REALEXTMEM
 #endif  #endif
   
         .space 512          .space 512
 tmpstk:  tmpstk:
   
Line 497  try586: /* Use the `cpuid' instruction. 
Line 497  try586: /* Use the `cpuid' instruction. 
 /*  /*
  * Virtual address space of kernel:   * Virtual address space of kernel:
  *   *
  * text | data | bss | [syms] | page dir | proc0 kstack   * text | data | bss | [syms] | page dir | proc0 kstack
  *                            0          1       2      3   *                            0          1       2      3
  */   */
 #define PROC0PDIR       ((0)              * PAGE_SIZE)  #define PROC0PDIR       ((0)              * PAGE_SIZE)
Line 524  try586: /* Use the `cpuid' instruction. 
Line 524  try586: /* Use the `cpuid' instruction. 
   
         /*          /*
          * Calculate the size of the kernel page table directory, and           * Calculate the size of the kernel page table directory, and
          * how many entries it will have.           * how many entries it will have.  Adjust nkpde to the actual
            * kernel size automatically.  Account for the bootstrap tables,
            * round up, and add an extra 4MB.
          */           */
           leal    TABLESIZE+NBPD+PDOFSET(%edi),%eax
           shrl    $PDSHIFT,%eax
         movl    RELOC(nkpde),%ecx               # get nkpde          movl    RELOC(nkpde),%ecx               # get nkpde
         cmpl    $NKPTP_MIN,%ecx                 # larger than min?          cmpl    %ecx,%eax
           jb      1f
           movl    %eax,%ecx
   1:      cmpl    $NKPTP_MIN,%ecx                 # larger than min?
         jge     1f          jge     1f
         movl    $NKPTP_MIN,%ecx                 # set at min          movl    $NKPTP_MIN,%ecx                 # set at min
         jmp     2f          jmp     2f
 1:      cmpl    $NKPTP_MAX,%ecx                 # larger than max?  1:      cmpl    $NKPTP_MAX,%ecx                 # larger than max?
         jle     2f          jle     2f
         movl    $NKPTP_MAX,%ecx          movl    $NKPTP_MAX,%ecx
 2:  2:      movl    %ecx,RELOC(nkpde)
   
         /* Clear memory for bootstrap tables. */          /* Clear memory for bootstrap tables. */
         shll    $PGSHIFT,%ecx          shll    $PGSHIFT,%ecx
Line 565  try586: /* Use the `cpuid' instruction. 
Line 572  try586: /* Use the `cpuid' instruction. 
         /* Calculate end of text segment, rounded to a page. */          /* Calculate end of text segment, rounded to a page. */
         leal    (RELOC(etext)+PGOFSET),%edx          leal    (RELOC(etext)+PGOFSET),%edx
         andl    $~PGOFSET,%edx          andl    $~PGOFSET,%edx
   
         /* Skip over the first 1MB. */          /* Skip over the first 1MB. */
         movl    $_RELOC(KERNTEXTOFF),%eax          movl    $_RELOC(KERNTEXTOFF),%eax
         movl    %eax,%ecx          movl    %eax,%ecx
Line 654  begin:
Line 661  begin:
         pushl   %esp          pushl   %esp
         call    _C_LABEL(initgdt)          call    _C_LABEL(initgdt)
         addl    $4,%esp          addl    $4,%esp
   
         movl    _C_LABEL(nkpde),%eax          movl    _C_LABEL(nkpde),%eax
         shll    $PGSHIFT,%eax          shll    $PGSHIFT,%eax
         addl    $TABLESIZE,%eax          addl    $TABLESIZE,%eax
Line 701  NENTRY(proc_trampoline)
Line 708  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 */
   
Line 772  ENTRY(kcopy)
Line 780  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 865  _C_LABEL(copyin_func):
Line 873  _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 873  ENTRY(i386_copyout)
Line 882  ENTRY(i386_copyout)
         pushl   %esi          pushl   %esi
         pushl   %edi          pushl   %edi
         pushl   $0          pushl   $0
   
         movl    16(%esp),%esi          movl    16(%esp),%esi
         movl    20(%esp),%edi          movl    20(%esp),%edi
         movl    24(%esp),%eax          movl    24(%esp),%eax
Line 915  ENTRY(i386_copyout)
Line 924  ENTRY(i386_copyout)
 1:      /* Check PTE for each page. */  1:      /* Check PTE for each page. */
         testb   $PG_RW,_C_LABEL(PTmap)(,%edi,4)          testb   $PG_RW,_C_LABEL(PTmap)(,%edi,4)
         jz      2f          jz      2f
   
 4:      incl    %edi  4:      incl    %edi
         decl    %ecx          decl    %ecx
         jns     1b          jns     1b
Line 923  ENTRY(i386_copyout)
Line 932  ENTRY(i386_copyout)
         movl    20(%esp),%edi          movl    20(%esp),%edi
         movl    24(%esp),%eax          movl    24(%esp),%eax
         jmp     3f          jmp     3f
   
 2:      /* Simulate a trap. */  2:      /* Simulate a trap. */
         pushl   %ecx          pushl   %ecx
         movl    %edi,%eax          movl    %edi,%eax
Line 963  ENTRY(i486_copyout)
Line 972  ENTRY(i486_copyout)
         pushl   %esi          pushl   %esi
         pushl   %edi          pushl   %edi
         pushl   $0          pushl   $0
   
         movl    16(%esp),%esi          movl    16(%esp),%esi
         movl    20(%esp),%edi          movl    20(%esp),%edi
         movl    24(%esp),%eax          movl    24(%esp),%eax
Line 1006  ENTRY(i486_copyout)
Line 1015  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 1017  ENTRY(i386_copyin)
Line 1027  ENTRY(i386_copyin)
         GET_CURPCB(%eax)          GET_CURPCB(%eax)
         pushl   $0          pushl   $0
         movl    $_C_LABEL(copy_fault),PCB_ONFAULT(%eax)          movl    $_C_LABEL(copy_fault),PCB_ONFAULT(%eax)
   
         movl    16(%esp),%esi          movl    16(%esp),%esi
         movl    20(%esp),%edi          movl    20(%esp),%edi
         movl    24(%esp),%eax          movl    24(%esp),%eax
Line 1056  ENTRY(i386_copyin)
Line 1066  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 1077  ENTRY(copyoutstr)
Line 1100  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 1194  ENTRY(copyoutstr)
Line 1219  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 1305  ENTRY(copystr)
Line 1333  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 1313  ENTRY(fuword)
Line 1342  ENTRY(fuword)
         movl    (%edx),%eax          movl    (%edx),%eax
         movl    $0,PCB_ONFAULT(%ecx)          movl    $0,PCB_ONFAULT(%ecx)
         ret          ret
   
 /*  /*
  * int fusword(const void *uaddr);   * int fusword(const void *uaddr);
  * Fetch a short from the user's address space.   * Fetch a short from the user's address space.
Line 1321  ENTRY(fuword)
Line 1350  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 1329  ENTRY(fusword)
Line 1359  ENTRY(fusword)
         movzwl  (%edx),%eax          movzwl  (%edx),%eax
         movl    $0,PCB_ONFAULT(%ecx)          movl    $0,PCB_ONFAULT(%ecx)
         ret          ret
   
 /*  /*
  * int fuswintr(const void *uaddr);   * int fuswintr(const void *uaddr);
  * Fetch a short from the user's address space.  Can be called during an   * Fetch a short from the user's address space.  Can be called during an
Line 1338  ENTRY(fusword)
Line 1368  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 1347  ENTRY(fuswintr)
Line 1379  ENTRY(fuswintr)
         movzwl  (%edx),%eax          movzwl  (%edx),%eax
         movl    $0,PCB_ONFAULT(%ecx)          movl    $0,PCB_ONFAULT(%ecx)
         ret          ret
   
 /*  /*
  * int fubyte(const void *uaddr);   * int fubyte(const void *uaddr);
  * Fetch a byte from the user's address space.   * Fetch a byte from the user's address space.
Line 1355  ENTRY(fuswintr)
Line 1387  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 1399  NENTRY(fusuaddrfault)
Line 1432  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 1438  ENTRY(suword)
Line 1472  ENTRY(suword)
         xorl    %eax,%eax          xorl    %eax,%eax
         movl    %eax,PCB_ONFAULT(%ecx)          movl    %eax,PCB_ONFAULT(%ecx)
         ret          ret
   
 /*  /*
  * int susword(void *uaddr, short x);   * int susword(void *uaddr, short x);
  * Store a short in the user's address space.   * Store a short in the user's address space.
Line 1446  ENTRY(suword)
Line 1480  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 1494  ENTRY(susword)
Line 1529  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 1531  ENTRY(suswintr)
Line 1568  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 1541  ENTRY(subyte)
Line 1579  ENTRY(subyte)
         jne     2f          jne     2f
 #endif /* I486_CPU || I586_CPU || I686_CPU */  #endif /* I486_CPU || I586_CPU || I686_CPU */
   
         GET_CURPCB(%eax)          GET_CURPCB(%eax)
         movl    $3f,PCB_ONFAULT(%eax)          movl    $3f,PCB_ONFAULT(%eax)
   
         movl    %edx,%eax          movl    %edx,%eax
Line 1658  NENTRY(switch_error)
Line 1696  NENTRY(switch_error)
  * Find a runnable process and switch to it.  Wait if necessary.  If the new   * Find a runnable process and switch to it.  Wait if necessary.  If the new
  * process is the same as the old one, we short-circuit the context save and   * process is the same as the old one, we short-circuit the context save and
  * restore.   * restore.
  *   *
  * Note that the stack frame layout is known to "struct switchframe"   * Note that the stack frame layout is known to "struct switchframe"
  * in <machine/frame.h> and to the code in cpu_fork() which initializes   * in <machine/frame.h> and to the code in cpu_fork() which initializes
  * it for a new lwp.   * it for a new lwp.
  */   */
 ENTRY(cpu_switch)  ENTRY(cpu_switch)
Line 1675  ENTRY(cpu_switch)
Line 1713  ENTRY(cpu_switch)
         call    _C_LABEL(panic)          call    _C_LABEL(panic)
         /* NOTREACHED */          /* NOTREACHED */
 2:      .asciz  "not splsched() in cpu_switch!"  2:      .asciz  "not splsched() in cpu_switch!"
 1:  1:
 #endif /* DEBUG */  #endif /* DEBUG */
   
         movl    16(%esp),%esi           # current          movl    16(%esp),%esi           # current
   
         /*          /*
Line 1716  ENTRY(cpu_switch)
Line 1754  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 1743  ENTRY(cpu_switch)
Line 1781  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 1768  ENTRY(cpu_switch)
Line 1803  ENTRY(cpu_switch)
   
         xorl    %esi,%esi          xorl    %esi,%esi
         sti          sti
 idle_unlock:  idle_unlock:
 #if defined(MULTIPROCESSOR) || defined(LOCKDEBUG)  #if defined(MULTIPROCESSOR) || defined(LOCKDEBUG)
         call    _C_LABEL(sched_unlock_idle)          call    _C_LABEL(sched_unlock_idle)
 #endif  #endif
         /* Interrupts are okay again. */          /* Interrupts are okay again. */
Line 1777  idle_unlock: 
Line 1812  idle_unlock: 
         call    _C_LABEL(Xspllower)     # process pending interrupts          call    _C_LABEL(Xspllower)     # process pending interrupts
         addl    $4,%esp          addl    $4,%esp
         jmp     idle_start          jmp     idle_start
 idle_zero:  idle_zero:
         sti          sti
         call    _C_LABEL(uvm_pageidlezero)          call    _C_LABEL(uvm_pageidlezero)
         cli          cli
Line 1791  idle_loop:
Line 1826  idle_loop:
         sti          sti
         hlt          hlt
 NENTRY(mpidle)  NENTRY(mpidle)
 idle_start:  idle_start:
         cli          cli
         cmpl    $0,_C_LABEL(sched_whichqs)          cmpl    $0,_C_LABEL(sched_whichqs)
         jz      idle_loop          jz      idle_loop
 idle_exit:  idle_exit:
         movl    $IPL_HIGH,CPUVAR(ILEVEL)                # splhigh          movl    $IPL_HIGH,CPUVAR(ILEVEL)                # splhigh
         sti          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
         movl    _C_LABEL(sched_whichqs),%ecx          movl    _C_LABEL(sched_whichqs),%ecx
         bsfl    %ecx,%ebx          bsfl    %ecx,%ebx
         jz      idle_unlock          jz      idle_unlock
   
 switch_dequeue:  switch_dequeue:
         /*          /*
          * we're running at splhigh(), but it's otherwise okay to take           * we're running at splhigh(), but it's otherwise okay to take
          * interrupts here.           * interrupts here.
          */           */
         sti          sti
         leal    _C_LABEL(sched_qs)(,%ebx,8),%eax # select q          leal    _C_LABEL(sched_qs)(,%ebx,8),%eax # select q
Line 1866  switch_resume:
Line 1901  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 1899  switch_exited:
Line 1934  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
         /* Load TSS info. */          /* Load TSS info. */
         movl    _C_LABEL(gdt),%eax          movl    _C_LABEL(gdt),%eax
 #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 1921  switch_restored:
Line 1958  switch_restored:
         /* Restore cr0 (including FPU state). */          /* Restore cr0 (including FPU state). */
         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
         cmpl    CPUVAR(SELF),%ebx          cmpl    CPUVAR(SELF),%ebx
         jz      1f          jz      1f
         orl     $CR0_TS,%ecx          orl     $CR0_TS,%ecx
 1:  1:
 #endif  #endif
         movl    %ecx,%cr0          movl    %ecx,%cr0
   
         /* Record new pcb. */          /* Record new pcb. */
Line 1944  switch_restored:
Line 1981  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
   
 switch_return:  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
   
         popl    %edi          popl    %edi
         popl    %esi          popl    %esi
         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 2018  ENTRY(cpu_switchto)
Line 2061  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.
  */   */
 #ifndef MULTIPROCESSOR  #ifndef MULTIPROCESSOR
Line 2028  ENTRY(cpu_switchto)
Line 2071  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 2050  ENTRY(switch_exit)
Line 2092  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
         /* Load TSS info. */          /* Load TSS info. */
         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 2082  ENTRY(switch_exit)
Line 2118  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 2101  ENTRY(switch_exit)
Line 2136  ENTRY(switch_exit)
 /* LINTSTUB: Func: void savectx(struct pcb *pcb) */  /* LINTSTUB: Func: void savectx(struct pcb *pcb) */
 ENTRY(savectx)  ENTRY(savectx)
         movl    4(%esp),%edx            # edx = p->p_addr          movl    4(%esp),%edx            # edx = p->p_addr
   
         /* Save stack pointers. */          /* Save stack pointers. */
         movl    %esp,PCB_ESP(%edx)          movl    %esp,PCB_ESP(%edx)
         movl    %ebp,PCB_EBP(%edx)          movl    %ebp,PCB_EBP(%edx)
Line 2130  syscall1:
Line 2165  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 2139  syscall1:
Line 2180  syscall1:
 #ifdef DDB  #ifdef DDB
         int     $3          int     $3
 #endif  #endif
 1:  1:
 #endif /* DIAGNOSTIC */  #endif /* DIAGNOSTIC */
         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
Line 2147  syscall1:
Line 2188  syscall1:
         pushl   %esp          pushl   %esp
         call    *P_MD_SYSCALL(%edx)     # get pointer to syscall() function          call    *P_MD_SYSCALL(%edx)     # get pointer to syscall() function
         addl    $4,%esp          addl    $4,%esp
 2:      /* Check for ASTs on exit to user mode. */  .Lsyscall_checkast:
           /* Check for ASTs on exit to user mode. */
         cli          cli
         CHECK_ASTPENDING(%eax)          CHECK_ASTPENDING(%eax)
         je      1f          je      1f
Line 2158  syscall1:
Line 2200  syscall1:
         pushl   %esp          pushl   %esp
         call    _C_LABEL(trap)          call    _C_LABEL(trap)
         addl    $4,%esp          addl    $4,%esp
         jmp     2b          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 2175  syscall1:
Line 2219  syscall1:
         movl    $IPL_NONE,CPUVAR(ILEVEL)          movl    $IPL_NONE,CPUVAR(ILEVEL)
         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.17  
changed lines
  Added in v.1.30

CVSweb <webmaster@jp.NetBSD.org>