Sync with sys/i386/i386/machdep.c and trap.c revisions 1.293 and
1.123, respectively.
This commit is contained in:
parent
469057f93e
commit
c85e487d23
@ -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;
|
||||
|
||||
|
@ -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 @@ trap(frame)
|
||||
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 @@ trap(frame)
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
#ifdef VM86
|
||||
kernel_trap:
|
||||
#endif
|
||||
/* kernel trap */
|
||||
|
||||
switch (type) {
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user