diff --git a/sys/pc98/i386/machdep.c b/sys/pc98/i386/machdep.c index 4385b3ee80a..cb57233b539 100644 --- a/sys/pc98/i386/machdep.c +++ b/sys/pc98/i386/machdep.c @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * from: @(#)machdep.c 7.4 (Berkeley) 6/3/91 - * $Id: machdep.c,v 1.79 1998/03/07 15:42:54 kato Exp $ + * $Id: machdep.c,v 1.80 1998/03/08 03:55:35 kato Exp $ */ #include "apm.h" @@ -658,8 +658,6 @@ sigreturn(p, uap) if ((eflags & PSL_VIP) && (eflags & PSL_VIF)) trapsignal(p, SIGBUS, 0); -#define VM_USERCHANGE (PSL_USERCHANGE | PSL_RF) -#define VME_USERCHANGE (VM_USERCHANGE | PSL_VIP | PSL_VIF) if (vm86->vm86_has_vme) { eflags = (tf->tf_eflags & ~VME_USERCHANGE) | (eflags & VME_USERCHANGE) | PSL_VM; @@ -1263,11 +1261,42 @@ init386(first) setidt(13, &IDTVEC(prot), SDT_SYS386TGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL)); initializecpu(); /* Initialize CPU registers */ + /* make an initial tss so cpu can get interrupt stack on syscall! */ +#ifdef VM86 + common_tss.tss_esp0 = (int) proc0.p_addr + UPAGES*PAGE_SIZE - 16; +#else + common_tss.tss_esp0 = (int) proc0.p_addr + UPAGES*PAGE_SIZE; +#endif /* VM86 */ + common_tss.tss_ss0 = GSEL(GDATA_SEL, SEL_KPL) ; + common_tss.tss_ioopt = (sizeof common_tss) << 16; + gsel_tss = GSEL(GPROC0_SEL, SEL_KPL); + ltr(gsel_tss); +#ifdef VM86 + private_tss = 0; + my_tr = GPROC0_SEL; +#endif + + dblfault_tss.tss_esp = dblfault_tss.tss_esp0 = dblfault_tss.tss_esp1 = + dblfault_tss.tss_esp2 = (int) &dblfault_stack[sizeof(dblfault_stack)]; + dblfault_tss.tss_ss = dblfault_tss.tss_ss0 = dblfault_tss.tss_ss1 = + dblfault_tss.tss_ss2 = GSEL(GDATA_SEL, SEL_KPL); + dblfault_tss.tss_cr3 = (int)IdlePTD; + dblfault_tss.tss_eip = (int) dblfault_handler; + dblfault_tss.tss_eflags = PSL_KERNEL; + dblfault_tss.tss_ds = dblfault_tss.tss_es = dblfault_tss.tss_fs = + dblfault_tss.tss_gs = GSEL(GDATA_SEL, SEL_KPL); + dblfault_tss.tss_cs = GSEL(GCODE_SEL, SEL_KPL); + dblfault_tss.tss_ldt = GSEL(GLDT_SEL, SEL_KPL); + +#ifdef VM86 + initial_bioscalls(&biosbasemem, &biosextmem); +#endif + #ifdef PC98 pc98_getmemsize(); biosbasemem = 640; /* 640KB */ biosextmem = (Maxmem * PAGE_SIZE - 0x100000)/1024; /* extent memory */ -#else /* IBM-PC */ +#elif !defined(VM86) /* IBM-PC */ /* Use BIOS values stored in RTC CMOS RAM, since probing * breaks certain 386 AT relics. */ @@ -1319,7 +1348,7 @@ init386(first) * remain read-only and are unused by the kernel. * The base memory area is below the physical end of * the kernel and right now forms a read-only hole. - * The part of it from 0 to + * The part of it from PAGE_SIZE to * (trunc_page(biosbasemem * 1024) - 1) will be * remapped and used by the kernel later.) * @@ -1564,33 +1593,6 @@ init386(first) avail_end + off, VM_PROT_ALL, TRUE); msgbufmapped = 1; - /* make an initial tss so cpu can get interrupt stack on syscall! */ -#ifdef VM86 - common_tss.tss_esp0 = (int) proc0.p_addr + UPAGES*PAGE_SIZE - 16; -#else - common_tss.tss_esp0 = (int) proc0.p_addr + UPAGES*PAGE_SIZE; -#endif /* VM86 */ - common_tss.tss_ss0 = GSEL(GDATA_SEL, SEL_KPL) ; - common_tss.tss_ioopt = (sizeof common_tss) << 16; - gsel_tss = GSEL(GPROC0_SEL, SEL_KPL); - ltr(gsel_tss); -#ifdef VM86 - private_tss = 0; - my_tr = GPROC0_SEL; -#endif - - dblfault_tss.tss_esp = dblfault_tss.tss_esp0 = dblfault_tss.tss_esp1 = - dblfault_tss.tss_esp2 = (int) &dblfault_stack[sizeof(dblfault_stack)]; - dblfault_tss.tss_ss = dblfault_tss.tss_ss0 = dblfault_tss.tss_ss1 = - dblfault_tss.tss_ss2 = GSEL(GDATA_SEL, SEL_KPL); - dblfault_tss.tss_cr3 = (int)IdlePTD; - dblfault_tss.tss_eip = (int) dblfault_handler; - dblfault_tss.tss_eflags = PSL_KERNEL; - dblfault_tss.tss_ds = dblfault_tss.tss_es = dblfault_tss.tss_fs = - dblfault_tss.tss_gs = GSEL(GDATA_SEL, SEL_KPL); - dblfault_tss.tss_cs = GSEL(GCODE_SEL, SEL_KPL); - dblfault_tss.tss_ldt = GSEL(GLDT_SEL, SEL_KPL); - /* make a call gate to reenter kernel with */ gdp = &ldt[LSYS5CALLS_SEL].gd; diff --git a/sys/pc98/i386/trap.c b/sys/pc98/i386/trap.c index 2836f1c2652..1fe8eb36eb1 100644 --- a/sys/pc98/i386/trap.c +++ b/sys/pc98/i386/trap.c @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * from: @(#)trap.c 7.4 (Berkeley) 5/13/91 - * $Id: trap.c,v 1.44 1998/02/05 10:05:47 kato Exp $ + * $Id: trap.c,v 1.45 1998/02/06 12:14:00 eivind Exp $ */ /* @@ -245,6 +245,35 @@ restart: asm("sti"); #endif /* CPU_BUGGY_CYRIX */ +#ifdef VM86 + if (in_vm86call) { + if (frame.tf_eflags & PSL_VM && + (type == T_PROTFLT || type == T_STKFLT)) { + i = vm86_emulate((struct vm86frame *)&frame); + if (i != 0) + /* + * returns to original process + */ + vm86_trap((struct vm86frame *)&frame); + return; + } + switch (type) { + /* + * these traps want either a process context, or + * assume a normal userspace trap. + */ + case T_PROTFLT: + case T_SEGNPFLT: + trap_fatal(&frame); + return; + case T_TRCTRAP: + type = T_BPTFLT; /* kernel breakpoint */ + /* FALL THROUGH */ + } + goto kernel_trap; /* normal kernel trap handling */ + } +#endif + if ((ISPL(frame.tf_cs) == SEL_UPL) || (frame.tf_eflags & PSL_VM)) { /* user trap */ @@ -380,6 +409,9 @@ restart: break; } } else { +#ifdef VM86 +kernel_trap: +#endif /* kernel trap */ switch (type) { diff --git a/sys/pc98/pc98/machdep.c b/sys/pc98/pc98/machdep.c index 4385b3ee80a..cb57233b539 100644 --- a/sys/pc98/pc98/machdep.c +++ b/sys/pc98/pc98/machdep.c @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * from: @(#)machdep.c 7.4 (Berkeley) 6/3/91 - * $Id: machdep.c,v 1.79 1998/03/07 15:42:54 kato Exp $ + * $Id: machdep.c,v 1.80 1998/03/08 03:55:35 kato Exp $ */ #include "apm.h" @@ -658,8 +658,6 @@ sigreturn(p, uap) if ((eflags & PSL_VIP) && (eflags & PSL_VIF)) trapsignal(p, SIGBUS, 0); -#define VM_USERCHANGE (PSL_USERCHANGE | PSL_RF) -#define VME_USERCHANGE (VM_USERCHANGE | PSL_VIP | PSL_VIF) if (vm86->vm86_has_vme) { eflags = (tf->tf_eflags & ~VME_USERCHANGE) | (eflags & VME_USERCHANGE) | PSL_VM; @@ -1263,11 +1261,42 @@ init386(first) setidt(13, &IDTVEC(prot), SDT_SYS386TGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL)); initializecpu(); /* Initialize CPU registers */ + /* make an initial tss so cpu can get interrupt stack on syscall! */ +#ifdef VM86 + common_tss.tss_esp0 = (int) proc0.p_addr + UPAGES*PAGE_SIZE - 16; +#else + common_tss.tss_esp0 = (int) proc0.p_addr + UPAGES*PAGE_SIZE; +#endif /* VM86 */ + common_tss.tss_ss0 = GSEL(GDATA_SEL, SEL_KPL) ; + common_tss.tss_ioopt = (sizeof common_tss) << 16; + gsel_tss = GSEL(GPROC0_SEL, SEL_KPL); + ltr(gsel_tss); +#ifdef VM86 + private_tss = 0; + my_tr = GPROC0_SEL; +#endif + + dblfault_tss.tss_esp = dblfault_tss.tss_esp0 = dblfault_tss.tss_esp1 = + dblfault_tss.tss_esp2 = (int) &dblfault_stack[sizeof(dblfault_stack)]; + dblfault_tss.tss_ss = dblfault_tss.tss_ss0 = dblfault_tss.tss_ss1 = + dblfault_tss.tss_ss2 = GSEL(GDATA_SEL, SEL_KPL); + dblfault_tss.tss_cr3 = (int)IdlePTD; + dblfault_tss.tss_eip = (int) dblfault_handler; + dblfault_tss.tss_eflags = PSL_KERNEL; + dblfault_tss.tss_ds = dblfault_tss.tss_es = dblfault_tss.tss_fs = + dblfault_tss.tss_gs = GSEL(GDATA_SEL, SEL_KPL); + dblfault_tss.tss_cs = GSEL(GCODE_SEL, SEL_KPL); + dblfault_tss.tss_ldt = GSEL(GLDT_SEL, SEL_KPL); + +#ifdef VM86 + initial_bioscalls(&biosbasemem, &biosextmem); +#endif + #ifdef PC98 pc98_getmemsize(); biosbasemem = 640; /* 640KB */ biosextmem = (Maxmem * PAGE_SIZE - 0x100000)/1024; /* extent memory */ -#else /* IBM-PC */ +#elif !defined(VM86) /* IBM-PC */ /* Use BIOS values stored in RTC CMOS RAM, since probing * breaks certain 386 AT relics. */ @@ -1319,7 +1348,7 @@ init386(first) * remain read-only and are unused by the kernel. * The base memory area is below the physical end of * the kernel and right now forms a read-only hole. - * The part of it from 0 to + * The part of it from PAGE_SIZE to * (trunc_page(biosbasemem * 1024) - 1) will be * remapped and used by the kernel later.) * @@ -1564,33 +1593,6 @@ init386(first) avail_end + off, VM_PROT_ALL, TRUE); msgbufmapped = 1; - /* make an initial tss so cpu can get interrupt stack on syscall! */ -#ifdef VM86 - common_tss.tss_esp0 = (int) proc0.p_addr + UPAGES*PAGE_SIZE - 16; -#else - common_tss.tss_esp0 = (int) proc0.p_addr + UPAGES*PAGE_SIZE; -#endif /* VM86 */ - common_tss.tss_ss0 = GSEL(GDATA_SEL, SEL_KPL) ; - common_tss.tss_ioopt = (sizeof common_tss) << 16; - gsel_tss = GSEL(GPROC0_SEL, SEL_KPL); - ltr(gsel_tss); -#ifdef VM86 - private_tss = 0; - my_tr = GPROC0_SEL; -#endif - - dblfault_tss.tss_esp = dblfault_tss.tss_esp0 = dblfault_tss.tss_esp1 = - dblfault_tss.tss_esp2 = (int) &dblfault_stack[sizeof(dblfault_stack)]; - dblfault_tss.tss_ss = dblfault_tss.tss_ss0 = dblfault_tss.tss_ss1 = - dblfault_tss.tss_ss2 = GSEL(GDATA_SEL, SEL_KPL); - dblfault_tss.tss_cr3 = (int)IdlePTD; - dblfault_tss.tss_eip = (int) dblfault_handler; - dblfault_tss.tss_eflags = PSL_KERNEL; - dblfault_tss.tss_ds = dblfault_tss.tss_es = dblfault_tss.tss_fs = - dblfault_tss.tss_gs = GSEL(GDATA_SEL, SEL_KPL); - dblfault_tss.tss_cs = GSEL(GCODE_SEL, SEL_KPL); - dblfault_tss.tss_ldt = GSEL(GLDT_SEL, SEL_KPL); - /* make a call gate to reenter kernel with */ gdp = &ldt[LSYS5CALLS_SEL].gd;