summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorkato <kato@FreeBSD.org>1997-06-09 13:38:21 +0000
committerkato <kato@FreeBSD.org>1997-06-09 13:38:21 +0000
commit3ebcc2751a7c19c1999d9e55e5e266230c186c90 (patch)
treed589494dbdfae08bab896be3e1bf55c254e91119 /sys
parenteb71c7d6f278ec2c0e409b99009f28e9468eaae1 (diff)
downloadFreeBSD-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.c10
-rw-r--r--sys/pc98/i386/trap.c21
-rw-r--r--sys/pc98/pc98/machdep.c10
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);
}
OpenPOWER on IntegriCloud