Re: int 16 & math error

Linus Torvalds (torvalds@cs.helsinki.fi)
Thu, 19 Sep 1996 09:17:41 +0300 (EET DST)


On Wed, 18 Sep 1996, Ulrich Windl wrote:
>
> Yesterday I've noticed that in /proc/interrupts int 13 is assigned to
> math error while during boot the messages states my Pentium is using
> exception 16. I'm not a processor guru. Is interrupt 13 used? Is
> interrupt 16 used? Is the information in /proc/interrupts correct?

Welcome to the world of confusion.

The original AT/386 had the math chip error line connected to device
interrupt #13. That's not what intel specified if should do, at least not for
the i387, but hey, we all know IBM engineers know exactly what they are doing
and have good reasons for it, don't we? Snicker. IBM engineers had earlier in
the life of the PC ignored intel's specifications that exceptions 0-31 are
reserved, and I guess that along with backwards compatibility with some
strange original-PC 8087 linkage was to blame for this all.

Note that "device interrupt #13" is NOT the same as "exception #13". The
device interrupts (0-15) can be routed to different exceptions (0-255), and
under Linux, for example, interrupt #x is routed to exception #32+x. Under
DOS, interrupt #x is routed to exception #8+x (x < 8) and #XX+(x&7) (x >= 8,
XX is something strange like 0x78 or something).

Now the DOS interrupt layout is really bad, because exception #8+x is also
where the CPU assigns things like page fault exceptions etc. Oops. Chalk one
up for the BIOS writers, who have a special place in hell waiting for them.

Now, the _intel_ exception for math errors is exception #16. However, the
original IBM design said that that was bad, and math exceptions should come
in on irq#13, so they did some non-standard wiring of the 386/387-coupling
instead of just having a straight connection between them.

At this point I'd like to point out that the IBM nonstandard wiring of the
i387 is _really_ _really_ braindamaged. Not just "a bit wrong", but "so
incredibly stupid that it's scary". There are horrible implications of using
(asychronous and blockable) external interrupts for math errors when you do
things like lazy i387 state saving etc. The intel direct exception #16
handling is a lot better, but IBM totally disabled that with their
motherboard setup.

Anyway, when intel made the integrated FPU's, they were able to fix the IBM
braindamage, but on the other hand they wanted to be compatible with it, so
they left the irq13 stuff in as a "special feature". There is a special
external pin to tell the rest of the world about math errors, just so that
those can be looped back through the interrupt controller. Whee!

End result: Linux always uses exception 16 if it works on that hardware. But
all x86 PC motherboards have irq13 (which maps to exception 45 in Linux) tied
to the same signal, and on non-integrated FPU's that's what Linux has to use.
So you can't use irq13 for anything else.

Linus