Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/arch/i386/i386/locore.S,v rcsdiff: /ftp/cvs/cvsroot/src/sys/arch/i386/i386/locore.S,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.50.2.4 retrieving revision 1.56 diff -u -p -r1.50.2.4 -r1.56 --- src/sys/arch/i386/i386/locore.S 2007/09/29 11:25:39 1.50.2.4 +++ src/sys/arch/i386/i386/locore.S 2007/11/13 18:20:18 1.56 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.S,v 1.50.2.4 2007/09/29 11:25:39 yamt Exp $ */ +/* $NetBSD: locore.S,v 1.56 2007/11/13 18:20:18 ad Exp $ */ /* * Copyright-o-rama! @@ -464,10 +464,11 @@ try586: /* Use the `cpuid' instruction. addl $PGOFSET,%esi # page align up andl $~PGOFSET,%esi - /* nkptp = (esi + ~L2_FRAME) >> L2_SHIFT; */ + /* nkptp[1] = (esi + ~L2_FRAME) >> L2_SHIFT + 1; */ movl %esi,%eax addl $~L2_FRAME,%eax shrl $L2_SHIFT,%eax + incl %eax /* one more ptp for VAs stolen by bootstrap */ 1: movl %eax,RELOC(nkptp)+1*4 /* tablesize = (1 + UPAGES + nkptp) << PGSHIFT; */ @@ -479,6 +480,7 @@ try586: /* Use the `cpuid' instruction. addl %esi,%eax addl $~L2_FRAME,%eax shrl $L2_SHIFT,%eax + incl %eax cmpl %eax,RELOC(nkptp)+1*4 jnz 1b @@ -497,12 +499,11 @@ try586: /* Use the `cpuid' instruction. * Build initial page tables. */ /* - * Compute etext - KERNBASE. This can't be > 4G, or we can't deal - * with it anyway, since we can't load it in 32 bit mode. So use - * the bottom 32 bits. + * Compute &__data_start - KERNBASE. This can't be > 4G, + * or we can't deal with it anyway, since we can't load it in + * 32 bit mode. So use the bottom 32 bits. */ - movl $RELOC(etext),%edx - addl $PGOFSET,%edx + movl $RELOC(__data_start),%edx andl $~PGOFSET,%edx /* @@ -688,47 +689,6 @@ NENTRY(sigcode) _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 *) * * Used primarily by DDB. @@ -795,9 +755,9 @@ ENTRY(cpu_switchto) /* Switch TSS. Reset "task busy" flag before loading. */ movl %cr3,%eax movl %eax,PCB_CR3(%ebx) # for TSS gates - movl CPUVAR(GDT),%eax + movl CPUVAR(GDT),%ecx movl L_MD_TSS_SEL(%edi),%edx - andl $~0x0200,4(%eax,%edx, 1) + andl $~0x0200,4(%ecx,%edx, 1) ltr %dx /* Set curlwp. */ @@ -807,6 +767,16 @@ ENTRY(cpu_switchto) testl $LW_SYSTEM,L_FLAG(%edi) jnz 4f + /* 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) + /* Is this process using RAS (restartable atomic sequences)? */ movl L_PROC(%edi),%eax cmpl $0,P_RASLIST(%eax) @@ -940,7 +910,7 @@ syscall1: int $3 #endif /* DDB */ movl $IPL_NONE,CPUVAR(ILEVEL) - jmp 2b + jmp .Lsyscall_checkast 4: .asciz "WARNING: SPL NOT LOWERED ON SYSCALL EXIT\n" 5: .asciz "WARNING: SPL NOT ZERO ON SYSCALL ENTRY\n" 6: .asciz "WARNING: WANT PMAPLOAD ON SYSCALL ENTRY\n"