[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.21 and 1.25

version 1.21, 2004/01/04 11:44:52 version 1.25, 2004/03/26 19:05:33
Line 74 
Line 74 
 #include "opt_compat_oldboot.h"  #include "opt_compat_oldboot.h"
 #include "opt_cputype.h"  #include "opt_cputype.h"
 #include "opt_ddb.h"  #include "opt_ddb.h"
 #include "opt_dummy_nops.h"  
 #include "opt_ipkdb.h"  #include "opt_ipkdb.h"
 #include "opt_lockdebug.h"  #include "opt_lockdebug.h"
 #include "opt_multiprocessor.h"  #include "opt_multiprocessor.h"
Line 126 
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 702  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 */
   
Line 719  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
 #if defined(SYS_compat_16___sigreturn14)  
         movl    $SYS_compat_16___sigreturn14,%eax          movl    $SYS_compat_16___sigreturn14,%eax
 #elif defined(SYS___sigreturn14)  
         movl    $SYS___sigreturn14,%eax  
 #else  
         #error "no sigreturn14 syscall"  
 #endif  
         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
Line 779  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 872  _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 1013  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 1063  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 1084  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 1201  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 1312  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 1328  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 1345  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 1362  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 1406  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 1453  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 1501  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 1538  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 1723  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 1750  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. */
 #ifdef MULTIPROCESSOR  #ifdef MULTIPROCESSOR
         movl    CPUVAR(GDT),%eax          movl    CPUVAR(GDT),%eax
Line 1873  switch_resume:
Line 1892  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 1929  switch_restored:
Line 1948  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 2029  ENTRY(cpu_switchto)
Line 2048  ENTRY(cpu_switchto)
   
 /*  /*
  * void cpu_exit(struct lwp *l)   * 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 2067  ENTRY(cpu_exit)
Line 2086  ENTRY(cpu_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. */          /* Switch TSS. */
         andl    $~0x0200,4-SEL_KPL(%eax,%edx,1)          andl    $~0x0200,4-SEL_KPL(%eax,%edx,1)
         ltr     %dx          ltr     %dx
Line 2135  syscall1:
Line 2150  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 2152  syscall1:
Line 2173  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. */  syscall_checkast:
           /* Check for ASTs on exit to user mode. */
         cli          cli
         CHECK_ASTPENDING(%eax)          CHECK_ASTPENDING(%eax)
         je      1f          je      1f
Line 2163  syscall1:
Line 2185  syscall1:
         pushl   %esp          pushl   %esp
         call    _C_LABEL(trap)          call    _C_LABEL(trap)
         addl    $4,%esp          addl    $4,%esp
         jmp     2b          jmp     syscall_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 2181  syscall1:
Line 2205  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     syscall_checkast        /* re-check ASTs */
   
 #if NNPX > 0  #if NNPX > 0
 /*  /*

Legend:
Removed from v.1.21  
changed lines
  Added in v.1.25

CVSweb <webmaster@jp.NetBSD.org>