Schadensbegrenzung, c't 2/95 S.172, as
------------------------------------------------------------
Programme zum Umgang mit dem FDIV-Fehler im Pentium-Prozessor
unter DOS

FDIV.PAS Programm zum Erkennen fehlerhafter Pentium-Prozessoren
FDIV.EXE

FDIVFIX.OBJ   Linkfhiges Korrekturprogramm
FDIVFIXD.OBJ  Diagnose-Variable mit Ausgabe der FPU-Zhler
FIXUNIT.PAS   Pascal-Unit zum Einbinden von FDIVFIX
FIXUNIT.TPU

BUGFIX.PAS    Pascal-Program zum Abfangen des FDIV-Fehlers
BUGFIX.EXE    Residentes (TSR-) Programm
BUGFIXD.EXE   Diagnose-Variante mit Ausgabe der FPU-Zhler

TRAPFPU.PAS   Programm zum Abfangen und berprfen aller
              FPU-Befehle (unter DOS)
TRAPFPU.EXE

HIDE87.ASM    Program zum Verstecken des Coprozessors
HIDE87.COM

WIN87.PAS     BPW-Programm zur Anzeige der Coprozessorflags unter
              Windows
WIN87.EXE


Alle Pentium-Prozessoren bis ca. Ende 1994 verrechnen sich bei
Divisionen von bestimmten Fleikommazahlen. Der maximale Fehler
betrgt dabei 6*10e-5, also 0,006%. Intel tauscht bei
Bedarf den Prozessor um. Wie c't mit dieser Software zeigt, kann
man in vielen Fllen aber auch softwaremig den Fehler abfangen,
so da die extrem Ressourcen-fressenden Prozessoren wegen diese

kleinen Fehlers nicht unbedingt verschrottet werden mssen.
Zunchst wird hier eine Lsung unter DOS vorgestellt, eine
Windows-Lsung ist in Arbeit.

Vorraussetzung fr die Funktion der vorliegenden DOS-Lsung ist, da

a) man ber eigene Sourcen verfgt oder
b) die fliekommanutzende Software die Emulations-Interrupts
   benutzt, was blicherweise auch dann der Fall ist, wenn ein
   Coprozessor vorhanden ist (Der Emulations-Interrupt wird dann
   berschrieben) und
c) keine DOS-Extender benutzt werden.



FDIV.PAS
---------------------------------------------------------------
Einfaches Pascal-Programm (aus c't 12/95), das ein betroffenenes
Zahlenpaar ausprobiert und so einen fehlerhafen Pentium entlarvt.
Daneben enthlt es auch eine fehlersichere FDIV-Funktion fr
den Datentyp Double.

FDIVFIX.OBJ
---------------------------------------------------------------
Dieses linkfhige Modul enthlt die Behandlungsroutinen fr alle
Emulations-Interrupts, in denen FDIV oder FPREM auftaucht:

INT 34h, 35h 36h, 38h, 3Ah, 3Ch

(FPATAN mit dem nachgewiesenen Fehler von > 1e-8 wird nicht
korrigiert!).

Die anderen Interrupts bleiben den zur Software gehrenden
Emulatoren berlassen (etwa EM87.OBJ bei Pascal 6 und 7).

FDIVFIX berprft bei FDIV-Befehlen zunchst, ob ein
fehlerverdchtiges Muster des Divisors vorliegt, nur dann fhrt
es nach der Division eine Probe durch und korrigiert
in diesem Fall, in dem es Dividend und Divisor mit 1.0001
multipliziert. Dadurch wird der Fehler behoben, und so gut wie
keine zustzlichen ber- oder Unterlufe von Zahlenbereichen
provoziert.

Die Probe ist nicht einaml unbedingt ntig, man kann auch
gleich bei verdchtigem Muster die Korrektur durchfhren
(Noprobe=true). Die Probe vergleicht mit einem zulssigen
Fehlerwert (minerr vom Typ Double, Default: minerr=1e-15) und
dient dazu, tatschlich aufgetretene Fehler zu verpetzen, etwa
durch Programm-Abbruch mit der Fehlermeldung 17 (falls Abbruch
=true). Dann
wird sich zeigen, ob man wirklich 27000 Jahre auf eine
Fehlermeldung wird warten mssen (laut Intel).

FDIVFIX kennt drei "Entries":

Emu_int  (ohne Parameter): gemeinsame Behandlungsroutine aller
        abgefangener Interrupts)

InstallFDivFix (ohne Parameter):  Installation der Interrupts)
FDIVsetpara ( ): Zur bergabe obiger Flags und von minerr
                 Parameter (mit Pascal-miger bergabe !)
arg arg_minerr:qword,arg_display:word, arg_noprobe:word,arg_abbruch:word

Display betrifft nur die Diagnose-Version mit Anzeige der
FPU-Zhler.



FIXUNIT.PAS
-------------------------------------------------------------
Die Unit FIXUNIT.PAS zeigt den Umgang mit FDIVFIX.OBJ.

Die Unit prft zunchst, ob berhaupt ein fehlerhafter Pentium
vorliegt und installiert nur dann die Abfang-Interrupts. Ein
erneuter Auffruf fhrt lediglich zum Lschen der Zhlerstnde.

FIXUNIT kennt einige Parameter, die im Interface-Teil als
typisierte Konstante vorgegeben sind, die man auch per
Environment-Variable FDIVFIX setzen kann:

Q: quietmode (boolean) = true: keine Installationsmeldung
N: noprobe  (word) = 1  keine Probe
A: Abbruch (word)  = 1: Programmabbruch bei Fehler

Pascal-Programmierer brauchen in ihrem Hauptprogramm lediglich
diese Unit einzubinden und gegebenenfalls diese Flags zu setzen
-- keine weiteren nderungen in der Source sind ntig!

Die Diagnoseversion installiert zustzlich auf Wunsch
(withdisplaycounter) eine Anzeigeroutine (auf INT 8Fh), die
verschiedene Zhlerstnde anzeigt:

1: Anzahl aller FPU-Befehle der abgefangenen INTerrupts
2: Anzahl der  FDIV-Befehle
3: Anzahl der FDIV-Befehle mit fehlerverdchtigem Muster
4: Anzahl tatschlich gefundener Fehler

Achtung, die Zhlerstnde werden direkt in den
VGA-Text-Bildschirmspeicher ab B800h geschrieben!

Sie kennt folgende zustzliche Parameter:

D: Display (word) =  1:   Anzeige der FPU-Zhler
X: Display (word) =  0:   Abschalten der FPU-Zhler
L: Loesch (boolean)= 0:   Lschen der Zhler


BUGFIX.PAS
-------------------------------------------------------------
Installiert FDIVFIX resident, inklusive der nicht von FDIVFIX
behandelten Interrupts 37h,39h,3Bh,3Dh und 3Eh, die vom
Turbo-Pascal-Emulator behandelt werden. Hierzu sind drei Patches
in der System-Unit von FDIV/FREM-Befehlen ntig, damit auch diese
berprft werden. Daneben fngt Bugfix die DOS-Funktion 25h
(SetIntVektor) ab, damit die Interrupts 34h bis 3Eh
nicht von anderen Emulatoren berschrieben werden.
Bugfix untersttzt die gleichen Aufrufparameter wie die
Environment-Variable FDIVFIX.

Der Performance-Verlust durch BUGFIX bleibt (vor allem im
Real-Mode) klein. Zwar dauert ein FDIV nun etwa dreimal so lang,
alle anderen Befehle sind jedoch so gut wie gar nicht betroffen,
so da im Schnitt fliekommaintensive Software nur wenige Prozent
langsamer wird. Unter EMM386 verschlechtert sich leider die
Performance zum Teul erheblich, da der EMM eine unsgliche Zeit
fr die Interrupts verbrt. Ein bewachter FDIV verbraucht dann
gut die neunfache Zeit. Die mittlere Performance-Einbue kann
dann bei ber 10 Prozent liegen.


BUGFIXD.PAS
------------------------------------------------------------
Wie BUGFIX, nur wertet es das Flag Display aus, mit dem man die
FPU-Zhler ausgeben (via INT 8Fh) kann.


TRAPFPU
-------------------------------------------------------------
Kleines Diagnoseprogramm, das alle FPU-Befehle via Exception 7
abfngt und durchzhlt. Fr einen Bugfix ist der "Trapper" zu
langsam.


HIDE87.ASM
-------------------------------------------------------------
Versteckt den Coprozessor vor Windows (vor Aufruf von WIN
installieren).

WIN87.PAS
-------------------------------------------------------------
Gibt die Coprozessorflags von Windows aus.



