diff options
author | kato <kato@FreeBSD.org> | 1997-06-09 13:38:21 +0000 |
---|---|---|
committer | kato <kato@FreeBSD.org> | 1997-06-09 13:38:21 +0000 |
commit | 3ebcc2751a7c19c1999d9e55e5e266230c186c90 (patch) | |
tree | d589494dbdfae08bab896be3e1bf55c254e91119 /sys | |
parent | eb71c7d6f278ec2c0e409b99009f28e9468eaae1 (diff) | |
download | FreeBSD-src-3ebcc2751a7c19c1999d9e55e5e266230c186c90.zip FreeBSD-src-3ebcc2751a7c19c1999d9e55e5e266230c186c90.tar.gz |
Synchronize with sys/i386/i386/machdep.c and trap.c revisions 1.247
and 1.99, respectively.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/pc98/i386/machdep.c | 10 | ||||
-rw-r--r-- | sys/pc98/i386/trap.c | 21 | ||||
-rw-r--r-- | sys/pc98/pc98/machdep.c | 10 |
3 files changed, 38 insertions, 3 deletions
diff --git a/sys/pc98/i386/machdep.c b/sys/pc98/i386/machdep.c index 3db20f5..a89a96d 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.42 1997/05/28 09:16:19 kato Exp $ + * $Id: machdep.c,v 1.43 1997/06/02 15:45:32 kato Exp $ */ #include "npx.h" @@ -1552,6 +1552,7 @@ fill_regs(p, regs) struct proc *p; struct reg *regs; { + struct pcb *pcb; struct trapframe *tp; tp = p->p_md.md_regs; @@ -1569,6 +1570,9 @@ fill_regs(p, regs) regs->r_eflags = tp->tf_eflags; regs->r_esp = tp->tf_esp; regs->r_ss = tp->tf_ss; + pcb = &p->p_addr->u_pcb; + regs->r_fs = pcb->pcb_fs; + regs->r_gs = pcb->pcb_gs; return (0); } @@ -1577,6 +1581,7 @@ set_regs(p, regs) struct proc *p; struct reg *regs; { + struct pcb *pcb; struct trapframe *tp; tp = p->p_md.md_regs; @@ -1597,6 +1602,9 @@ set_regs(p, regs) tp->tf_eflags = regs->r_eflags; tp->tf_esp = regs->r_esp; tp->tf_ss = regs->r_ss; + pcb = &p->p_addr->u_pcb; + pcb->pcb_fs = regs->r_fs; + pcb->pcb_gs = regs->r_gs; return (0); } diff --git a/sys/pc98/i386/trap.c b/sys/pc98/i386/trap.c index 34b5972..b62f24d 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.22 1997/05/31 12:43:11 kato Exp $ + * $Id: trap.c,v 1.23 1997/06/02 15:45:32 kato Exp $ */ /* @@ -380,6 +380,25 @@ trap(frame) } while (0) if (intr_nesting_level == 0) { + /* + * Invalid %fs's and %gs's can be created using + * procfs or PT_SETREGS or by invalidating the + * underlying LDT entry. This causes a fault + * in kernel mode when the kernel attempts to + * switch contexts. Lose the bad context + * (XXX) so that we can continue, and generate + * a signal. + */ + if (frame.tf_eip == (int)cpu_switch_load_fs) { + curpcb->pcb_fs = 0; + psignal(p, SIGBUS); + return; + } + if (frame.tf_eip == (int)cpu_switch_load_gs) { + curpcb->pcb_gs = 0; + psignal(p, SIGBUS); + return; + } MAYBE_DORETI_FAULT(doreti_iret, doreti_iret_fault); MAYBE_DORETI_FAULT(doreti_popl_ds, diff --git a/sys/pc98/pc98/machdep.c b/sys/pc98/pc98/machdep.c index 3db20f5..a89a96d 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.42 1997/05/28 09:16:19 kato Exp $ + * $Id: machdep.c,v 1.43 1997/06/02 15:45:32 kato Exp $ */ #include "npx.h" @@ -1552,6 +1552,7 @@ fill_regs(p, regs) struct proc *p; struct reg *regs; { + struct pcb *pcb; struct trapframe *tp; tp = p->p_md.md_regs; @@ -1569,6 +1570,9 @@ fill_regs(p, regs) regs->r_eflags = tp->tf_eflags; regs->r_esp = tp->tf_esp; regs->r_ss = tp->tf_ss; + pcb = &p->p_addr->u_pcb; + regs->r_fs = pcb->pcb_fs; + regs->r_gs = pcb->pcb_gs; return (0); } @@ -1577,6 +1581,7 @@ set_regs(p, regs) struct proc *p; struct reg *regs; { + struct pcb *pcb; struct trapframe *tp; tp = p->p_md.md_regs; @@ -1597,6 +1602,9 @@ set_regs(p, regs) tp->tf_eflags = regs->r_eflags; tp->tf_esp = regs->r_esp; tp->tf_ss = regs->r_ss; + pcb = &p->p_addr->u_pcb; + pcb->pcb_fs = regs->r_fs; + pcb->pcb_gs = regs->r_gs; return (0); } |