[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.2.2 and 1.11.2.3

version 1.11.2.2, 2004/08/12 11:41:13 version 1.11.2.3, 2004/08/25 06:57:19
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)
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 572  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 661  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 882  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 924  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 932  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 972  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 1027  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 1219  ENTRY(copyoutstr)
Line 1219  ENTRY(copyoutstr)
 ENTRY(copyinstr)  ENTRY(copyinstr)
         pushl   %esi          pushl   %esi
         pushl   %edi          pushl   %edi
   
         DO_DEFERRED_SWITCH(%eax)          DO_DEFERRED_SWITCH(%eax)
   
         GET_CURPCB(%ecx)          GET_CURPCB(%ecx)
Line 1342  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 1359  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 1379  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 1472  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 1579  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 1696  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 1713  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 1803  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 1812  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 1826  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 1939  switch_exited:
Line 1939  switch_exited:
         movl    %eax,PCB_CR3(%esi) /* XXX should be done by pmap_activate? */          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
Line 1958  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.
          */           */
Line 1966  switch_restored:
Line 1966  switch_restored:
         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 1987  switch_restored:
Line 1987  switch_restored:
         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)          cmpl    $0,CPUVAR(IPENDING)
Line 1999  switch_return:
Line 1999  switch_return:
         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
Line 2062  ENTRY(cpu_switchto)
Line 2062  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.
  */   */
 #ifndef MULTIPROCESSOR  #ifndef MULTIPROCESSOR
Line 2097  ENTRY(cpu_exit)
Line 2097  ENTRY(cpu_exit)
         movl    %eax,PCB_CR3(%esi)          movl    %eax,PCB_CR3(%esi)
 #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
Line 2136  ENTRY(cpu_exit)
Line 2136  ENTRY(cpu_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 2180  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 2219  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"  6:      .asciz  "WARNING: WANT PMAPLOAD ON SYSCALL ENTRY\n"
 #endif /* DIAGNOSTIC */  #endif /* DIAGNOSTIC */
 9:      sti  9:      sti
         call    _C_LABEL(pmap_load)          call    _C_LABEL(pmap_load)

Legend:
Removed from v.1.11.2.2  
changed lines
  Added in v.1.11.2.3

CVSweb <webmaster@jp.NetBSD.org>