[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.50.2.2 and 1.51.2.2

version 1.50.2.2, 2007/09/24 10:56:48 version 1.51.2.2, 2007/11/13 15:58:33
Line 464  try586: /* Use the `cpuid' instruction. 
Line 464  try586: /* Use the `cpuid' instruction. 
         addl    $PGOFSET,%esi                   # page align up          addl    $PGOFSET,%esi                   # page align up
         andl    $~PGOFSET,%esi          andl    $~PGOFSET,%esi
   
           /* nkptp[1] = (esi + ~L2_FRAME) >> L2_SHIFT + 1; */
         movl    %esi,%eax          movl    %esi,%eax
         addl    $-L2_FRAME,%eax          addl    $~L2_FRAME,%eax
         shrl    $L2_SHIFT,%eax          shrl    $L2_SHIFT,%eax
         movl    %eax,RELOC(nkptp)+1*4          incl    %eax            /* one more ptp for VAs stolen by bootstrap */
   1:      movl    %eax,RELOC(nkptp)+1*4
   
           /* tablesize = (1 + UPAGES + nkptp) << PGSHIFT; */
         addl    $(1+UPAGES),%eax          addl    $(1+UPAGES),%eax
         shll    $PGSHIFT,%eax          shll    $PGSHIFT,%eax
         movl    %eax,RELOC(tablesize)          movl    %eax,RELOC(tablesize)
   
           /* ensure that nkptp covers bootstrap tables */
           addl    %esi,%eax
           addl    $~L2_FRAME,%eax
           shrl    $L2_SHIFT,%eax
           incl    %eax
           cmpl    %eax,RELOC(nkptp)+1*4
           jnz     1b
   
         /* Clear tables */          /* Clear tables */
         movl    %esi,%edi          movl    %esi,%edi
         xorl    %eax,%eax          xorl    %eax,%eax
Line 488  try586: /* Use the `cpuid' instruction. 
Line 499  try586: /* Use the `cpuid' instruction. 
  * Build initial page tables.   * Build initial page tables.
  */   */
         /*          /*
          * Compute etext - KERNBASE. This can't be > 4G, or we can't deal           * Compute &__data_start - KERNBASE. This can't be > 4G,
          * with it anyway, since we can't load it in 32 bit mode. So use           * or we can't deal with it anyway, since we can't load it in
          * the bottom 32 bits.           * 32 bit mode. So use the bottom 32 bits.
          */           */
         movl    $RELOC(etext),%edx          movl    $RELOC(__data_start),%edx
         addl    $PGOFSET,%edx  
         andl    $~PGOFSET,%edx          andl    $~PGOFSET,%edx
   
         /*          /*
Line 653  NENTRY(lwp_trampoline)
Line 663  NENTRY(lwp_trampoline)
         pushl   %ebx          pushl   %ebx
         call    *%esi          call    *%esi
         addl    $4,%esp          addl    $4,%esp
         DO_DEFERRED_SWITCH(%eax)          DO_DEFERRED_SWITCH
         INTRFASTEXIT          INTRFASTEXIT
         /* NOTREACHED */          /* NOTREACHED */
   
Line 679  NENTRY(sigcode)
Line 689  NENTRY(sigcode)
 _C_LABEL(esigcode):  _C_LABEL(esigcode):
   
 /*  /*
  * void lgdt(struct region_descriptor *rdp);  
  *  
  * Load a new GDT pointer (and do any necessary cleanup).  
  * XXX It's somewhat questionable whether reloading all the segment registers  
  * is necessary, since the actual descriptor data is not changed except by  
  * process creation and exit, both of which clean up via task switches.  OTOH,  
  * this only happens at run time when the GDT is resized.  
  */  
 NENTRY(lgdt)  
         /* Reload the descriptor table. */  
         movl    4(%esp),%eax  
         lgdt    (%eax)  
         /* Flush the prefetch queue. */  
         jmp     1f  
         nop  
 1:      /* Reload "stale" selectors. */  
         movl    $GSEL(GDATA_SEL, SEL_KPL),%eax  
         movw    %ax,%ds  
         movw    %ax,%es  
         movw    %ax,%gs  
         movw    %ax,%ss  
         movl    $GSEL(GCPU_SEL, SEL_KPL),%eax  
         movw    %ax,%fs  
         /* Reload code selector by doing intersegment return. */  
         popl    %eax  
         pushl   $GSEL(GCODE_SEL, SEL_KPL)  
         pushl   %eax  
         lret  
   
 /*  
  * void x86_flush()  
  *  
  * Flush instruction pipelines by doing an intersegment (far) return.  
  */  
 NENTRY(x86_flush)  
         popl    %eax  
         pushl   $GSEL(GCODE_SEL, SEL_KPL)  
         pushl   %eax  
         lret  
   
 /*  
  * int setjmp(label_t *)   * int setjmp(label_t *)
  *   *
  * Used primarily by DDB.   * Used primarily by DDB.
Line 786  ENTRY(cpu_switchto)
Line 755  ENTRY(cpu_switchto)
         /* Switch TSS.  Reset "task busy" flag before loading. */          /* Switch TSS.  Reset "task busy" flag before loading. */
         movl    %cr3,%eax          movl    %cr3,%eax
         movl    %eax,PCB_CR3(%ebx)      # for TSS gates          movl    %eax,PCB_CR3(%ebx)      # for TSS gates
         movl    CPUVAR(GDT),%eax          movl    CPUVAR(GDT),%ecx
         movl    L_MD_TSS_SEL(%edi),%edx          movl    L_MD_TSS_SEL(%edi),%edx
         andl    $~0x0200,4(%eax,%edx, 1)          andl    $~0x0200,4(%ecx,%edx, 1)
         ltr     %dx          ltr     %dx
   
         /* Set curlwp. */          /* Set curlwp. */
Line 803  ENTRY(cpu_switchto)
Line 772  ENTRY(cpu_switchto)
         cmpl    $0,P_RASLIST(%eax)          cmpl    $0,P_RASLIST(%eax)
         jne     5f          jne     5f
   
           /* Restore thread-private %fs/%gs descriptors. */
           movl    PCB_FSD(%ebx), %eax
           movl    PCB_FSD+4(%ebx), %edx
           movl    %eax, (GUFS_SEL*8)(%ecx)
           movl    %edx, (GUFS_SEL*8+4)(%ecx)
           movl    PCB_GSD(%ebx), %eax
           movl    PCB_GSD+4(%ebx), %edx
           movl    %eax, (GUGS_SEL*8)(%ecx)
           movl    %edx, (GUGS_SEL*8+4)(%ecx)
   
         /*          /*
          * Restore cr0 (including FPU state).  Raise the IPL to IPL_IPI.           * Restore cr0 (including FPU state).  Raise the IPL to IPL_IPI.
          * FPU IPIs can alter the LWP's saved cr0.  Dropping the priority           * FPU IPIs can alter the LWP's saved cr0.  Dropping the priority
Line 915  syscall1:
Line 894  syscall1:
         call    _C_LABEL(trap)          call    _C_LABEL(trap)
         addl    $4,%esp          addl    $4,%esp
         jmp     .Lsyscall_checkast      /* re-check ASTs */          jmp     .Lsyscall_checkast      /* re-check ASTs */
 1:      CHECK_DEFERRED_SWITCH(%eax)  1:      CHECK_DEFERRED_SWITCH
         jnz     9f          jnz     9f
 #ifndef DIAGNOSTIC  #ifndef DIAGNOSTIC
         INTRFASTEXIT          INTRFASTEXIT
Line 931  syscall1:
Line 910  syscall1:
         int     $3          int     $3
 #endif /* DDB */  #endif /* DDB */
         movl    $IPL_NONE,CPUVAR(ILEVEL)          movl    $IPL_NONE,CPUVAR(ILEVEL)
         jmp     2b          jmp     .Lsyscall_checkast
 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"

Legend:
Removed from v.1.50.2.2  
changed lines
  Added in v.1.51.2.2

CVSweb <webmaster@jp.NetBSD.org>