crashme panic
Matthew Dillon
dillon at apollo.backplane.com
Sun Apr 2 12:13:40 PDT 2006
:Sorry,
:
:I should have quoted them directly. I ran it with the default values
:from the manual page, adding only verbose debugging output:
:
:dim# crashme +2000 666 100 1:00:00 5
:
:Regards,
:Sascha
:
:--
:http://yoyodyne.ath.cx
That did it.
I think I've figured it out. The floating point exception is installed
as a trap-gate, which leaves interrupts enabled. If an interrupt occurs
just as the FP exception occurs it can change the state of the FPU
and confuse npx_intr().
Try this patch out and tell me if you still get the panic. It isn't
the 'real' fix, but it will tell us if that is the problem. The
crash does not seem to occur with the patch.
The real fix is going to be simply to make npx_intr() and npxdna()
handle each other's cases as well as their own, and then get rid of
the assertion. I think I also need to have them go into a critical
section.
-Matt
Matthew Dillon
<dillon at xxxxxxxxxxxxx>
Index: i386/machdep.c
===================================================================
RCS file: /cvs/src/sys/i386/i386/machdep.c,v
retrieving revision 1.88
diff -u -r1.88 machdep.c
--- i386/machdep.c 24 Mar 2006 18:35:32 -0000 1.88
+++ i386/machdep.c 2 Apr 2006 19:01:12 -0000
@@ -1912,7 +1912,7 @@
setidt(4, &IDTVEC(ofl), SDT_SYS386TGT, SEL_UPL, GSEL(GCODE_SEL, SEL_KPL));
setidt(5, &IDTVEC(bnd), SDT_SYS386TGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
setidt(6, &IDTVEC(ill), SDT_SYS386TGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
- setidt(7, &IDTVEC(dna), SDT_SYS386TGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
+ setidt(7, &IDTVEC(dna), SDT_SYS386IGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
setidt(8, 0, SDT_SYSTASKGT, SEL_KPL, GSEL(GPANIC_SEL, SEL_KPL));
setidt(9, &IDTVEC(fpusegm), SDT_SYS386TGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
setidt(10, &IDTVEC(tss), SDT_SYS386TGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
@@ -1921,7 +1921,7 @@
setidt(13, &IDTVEC(prot), SDT_SYS386TGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
setidt(14, &IDTVEC(page), SDT_SYS386IGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
setidt(15, &IDTVEC(rsvd0), SDT_SYS386TGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
- setidt(16, &IDTVEC(fpu), SDT_SYS386TGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
+ setidt(16, &IDTVEC(fpu), SDT_SYS386IGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
setidt(17, &IDTVEC(align), SDT_SYS386TGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
setidt(18, &IDTVEC(mchk), SDT_SYS386TGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
setidt(19, &IDTVEC(xmm), SDT_SYS386TGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
More information about the Bugs
mailing list