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.143 retrieving revision 1.158 diff -u -p -r1.143 -r1.158 --- src/sys/arch/i386/i386/locore.S 2016/12/16 19:52:22 1.143 +++ src/sys/arch/i386/i386/locore.S 2018/06/29 19:21:43 1.158 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.S,v 1.143 2016/12/16 19:52:22 maxv Exp $ */ +/* $NetBSD: locore.S,v 1.158 2018/06/29 19:21:43 maxv Exp $ */ /* * Copyright-o-rama! @@ -128,15 +128,13 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.143 2016/12/16 19:52:22 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.158 2018/06/29 19:21:43 maxv Exp $"); -#include "opt_compat_oldboot.h" #include "opt_copy_symtab.h" #include "opt_ddb.h" #include "opt_modular.h" #include "opt_multiboot.h" #include "opt_realmem.h" -#include "opt_vm86.h" #include "opt_xen.h" #include "assym.h" @@ -343,11 +341,13 @@ _C_LABEL(Multiboot_Header): jne 1f /* - * Indeed, a multiboot-compliant boot loader executed us. We copy - * the received Multiboot information structure into kernel's data - * space to process it later -- after we are relocated. It will - * be safer to run complex C code than doing it at this point. + * Indeed, a multiboot-compliant boot loader executed us. We switch + * to the temporary stack, and copy the received Multiboot information + * structure into kernel's data space to process it later -- after we + * are relocated. It will be safer to run complex C code than doing it + * at this point. */ + movl $_RELOC(tmpstk),%esp pushl %ebx /* Address of Multiboot information */ call _C_LABEL(multiboot_pre_reloc) addl $4,%esp @@ -633,7 +633,7 @@ no_NOX: incl %eax /* one more PTP for VAs stolen by bootstrap */ 1: movl %eax,RELOC(nkptp)+1*4 - /* tablesize = (PDP_SIZE + UPAGES + nkptp) << PGSHIFT; */ + /* tablesize = (PDP_SIZE + UPAGES + nkptp[1]) << PGSHIFT; */ addl $(PDP_SIZE+UPAGES),%eax #ifdef PAE incl %eax /* one more page for L3 */ @@ -643,7 +643,8 @@ no_NOX: #endif movl %eax,RELOC(tablesize) - /* Ensure that nkptp covers BOOTSTRAP TABLES. */ + /* Ensure that nkptp[1] covers BOOTSTRAP TABLES, ie: + * (esi + tablesize) >> L2_SHIFT + 1 < nkptp[1] */ addl %esi,%eax addl $~L2_FRAME,%eax shrl $L2_SHIFT,%eax @@ -670,7 +671,7 @@ no_NOX: */ leal (PROC0_PTP1_OFF)(%esi),%ebx - /* Skip the first MB. */ + /* Skip the area below the kernel text. */ movl $(KERNTEXTOFF - KERNBASE),%ecx shrl $PGSHIFT,%ecx fillkpt_blank @@ -837,28 +838,11 @@ begin: pushl $0 /* init386() expects a 64 bits paddr_t with PAE */ #endif pushl %eax + call _C_LABEL(init_bootspace) call _C_LABEL(init386) addl $PDE_SIZE,%esp /* pop paddr_t */ addl $NGDT*8,%esp /* pop temporary gdt */ -#ifdef SAFARI_FIFO_HACK - movb $5,%al - movw $0x37b,%dx - outb %al,%dx - movw $0x37f,%dx - inb %dx,%al - movb %al,%cl - - orb $1,%cl - - movb $5,%al - movw $0x37b,%dx - outb %al,%dx - movw $0x37f,%dx - movb %cl,%al - outb %al,%dx -#endif /* SAFARI_FIFO_HACK */ - call _C_LABEL(main) #else /* XEN */ /* First, reset the PSL. */ @@ -926,6 +910,7 @@ begin: pushl $0 /* init386() expects a 64 bits paddr_t with PAE */ #endif pushl %esi + call _C_LABEL(init_bootspace) call _C_LABEL(init386) addl $PDE_SIZE,%esp /* pop paddr_t */ call _C_LABEL(main) @@ -1127,7 +1112,21 @@ skip_save: addl $4,%esp #else movl PCB_ESP0(%ebx),%eax - movl %eax,CPUVAR(ESP0) + movl CPUVAR(TSS),%ecx + movl %eax,TSS_ESP0(%ecx) +#endif + +#ifndef XEN + pushl %edx + movb _C_LABEL(x86_fpu_eager),%dl + testb %dl,%dl + jz .Lno_eagerfpu + pushl %edi + pushl %esi + call _C_LABEL(fpu_eagerswitch) + addl $8,%esp +.Lno_eagerfpu: + popl %edx #endif /* Don't bother with the rest if switching to a system process. */ @@ -1151,7 +1150,8 @@ skip_save: movl PCB_IOMAP(%ebx),%eax orl %eax,%eax jnz .Lcopy_iobitmap - movl $(IOMAP_INVALOFF << 16),CPUVAR(IOBASE) + movl CPUVAR(TSS),%eax + movl $(IOMAP_INVALOFF << 16),TSS_IOBASE(%eax) .Liobitmap_done: /* Is this process using RAS (restartable atomic sequences)? */ @@ -1215,13 +1215,14 @@ switch_return: pushl %esi pushl %edi movl %eax,%esi /* pcb_iomap */ - movl CPUVAR(SELF),%edi - leal CPU_INFO_IOMAP(%edi),%edi + movl CPUVAR(TSS),%edi + leal TSS_IOMAP(%edi),%edi rep movsl popl %edi popl %esi - movl $((CPU_INFO_IOMAP - CPU_INFO_TSS) << 16),CPUVAR(IOBASE) + movl CPUVAR(TSS),%eax + movl $(IOMAP_VALIDOFF << 16),TSS_IOBASE(%eax) jmp .Liobitmap_done END(cpu_switchto) @@ -1238,30 +1239,12 @@ ENTRY(savectx) END(savectx) /* - * osyscall() - * - * Old call gate entry for syscall - */ -IDTVEC(osyscall) -#ifndef XEN - /* XXX we are in trouble! interrupts be off here. */ - cli /* must be first instruction */ -#endif - pushfl /* set eflags in trap frame */ - popl 8(%esp) - orl $PSL_I,8(%esp) /* re-enable ints on return to user */ - pushl $7 /* size of instruction for restart */ - jmp syscall1 -IDTVEC_END(osyscall) - -/* * syscall() * * Trap gate entry for syscall */ IDTVEC(syscall) pushl $2 /* size of instruction for restart */ -syscall1: pushl $T_ASTFLT /* trap # for doing ASTs */ INTRENTRY STI(%eax) @@ -1348,39 +1331,6 @@ syscall1: jmp .Lsyscall_checkast /* re-check ASTs */ IDTVEC_END(syscall) -IDTVEC(svr4_fasttrap) - pushl $2 /* size of instruction for restart */ - pushl $T_ASTFLT /* trap # for doing ASTs */ - INTRENTRY - STI(%eax) - pushl $RW_READER - pushl $_C_LABEL(svr4_fasttrap_lock) - call _C_LABEL(rw_enter) - addl $8,%esp - call *_C_LABEL(svr4_fasttrap_vec) - pushl $_C_LABEL(svr4_fasttrap_lock) - call _C_LABEL(rw_exit) - addl $4,%esp -2: /* Check for ASTs on exit to user mode. */ - cli - CHECK_ASTPENDING(%eax) - je 1f - /* Always returning to user mode here. */ - CLEAR_ASTPENDING(%eax) - sti - /* Pushed T_ASTFLT into tf_trapno on entry. */ - pushl %esp - call _C_LABEL(trap) - addl $4,%esp - jmp 2b -1: CHECK_DEFERRED_SWITCH - jnz 9f - INTRFASTEXIT -9: sti - call _C_LABEL(pmap_load) - cli - jmp 2b - /* * int npx586bug1(int a, int b) * Used when checking for the FDIV bug on first generations pentiums. @@ -1435,3 +1385,20 @@ ENTRY(sse2_idlezero_page) popl %ebp ret END(sse2_idlezero_page) + +ENTRY(intrfastexit) + movw TF_GS(%esp),%gs + movw TF_FS(%esp),%fs + movw TF_ES(%esp),%es + movw TF_DS(%esp),%ds + movl TF_EDI(%esp),%edi + movl TF_ESI(%esp),%esi + movl TF_EBP(%esp),%ebp + movl TF_EBX(%esp),%ebx + movl TF_EDX(%esp),%edx + movl TF_ECX(%esp),%ecx + movl TF_EAX(%esp),%eax + addl $(TF_PUSHSIZE+8),%esp + iret +END(intrfastexit) +