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.102.2.3 retrieving revision 1.143 diff -u -p -r1.102.2.3 -r1.143 --- src/sys/arch/i386/i386/locore.S 2017/12/03 11:36:17 1.102.2.3 +++ src/sys/arch/i386/i386/locore.S 2016/12/16 19:52:22 1.143 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.S,v 1.102.2.3 2017/12/03 11:36:17 jdolecek Exp $ */ +/* $NetBSD: locore.S,v 1.143 2016/12/16 19:52:22 maxv Exp $ */ /* * Copyright-o-rama! @@ -128,13 +128,15 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.102.2.3 2017/12/03 11:36:17 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.143 2016/12/16 19:52:22 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" @@ -341,13 +343,11 @@ _C_LABEL(Multiboot_Header): jne 1f /* - * 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. + * 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. */ - 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[1]) << PGSHIFT; */ + /* tablesize = (PDP_SIZE + UPAGES + nkptp) << PGSHIFT; */ addl $(PDP_SIZE+UPAGES),%eax #ifdef PAE incl %eax /* one more page for L3 */ @@ -643,8 +643,7 @@ no_NOX: #endif movl %eax,RELOC(tablesize) - /* Ensure that nkptp[1] covers BOOTSTRAP TABLES, ie: - * (esi + tablesize) >> L2_SHIFT + 1 < nkptp[1] */ + /* Ensure that nkptp covers BOOTSTRAP TABLES. */ addl %esi,%eax addl $~L2_FRAME,%eax shrl $L2_SHIFT,%eax @@ -671,7 +670,7 @@ no_NOX: */ leal (PROC0_PTP1_OFF)(%esi),%ebx - /* Skip the area below the kernel text. */ + /* Skip the first MB. */ movl $(KERNTEXTOFF - KERNBASE),%ecx shrl $PGSHIFT,%ecx fillkpt_blank @@ -838,11 +837,28 @@ 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. */ @@ -910,7 +926,6 @@ 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) @@ -1223,12 +1238,30 @@ 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) @@ -1315,6 +1348,39 @@ IDTVEC(syscall) 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. @@ -1369,20 +1435,3 @@ 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) -