AMD Phenom CPU Errata und die Workarounds (TLB-Fix im Detail)

Diapolo

Vice Admiral Special
Mitglied seit
11.11.2001
Beiträge
839
Renomée
21
zuletzt aktualisiert: 27.02.2008

1. Vorwort​

In AMD Phenom CPUs des aktuellen B2 Steppings stecken leider einige Fehler, die AMD ab heute zumindest zu Teilen öffentlich dokumentiert (siehe den aktuellen AMD Revision-Guide). In der Dokumentation findet man zudem Workarounds, die von BIOS Programmieren genutzt werden können, um die vorhandenen Fehler auszuschließen oder zumindest abzumildern. Mein Thread befasst sich im Detail mit der Situation TLB-Fix aktiv bzw. der TLB-Fix Deaktivierung mit Hilfe von RW-Everything (siehe den P3DN Artikel - AMD Phenom ohne TLB-Fix - so geht´s zu diesem Thema).

Nun wünsche ich euch viel Spaß beim lesen :-)!

2. Um welche Errata geht es eigentlich?​

254: Internal Resource Livelock Involving Cached TLB Reload

Details im
Beschreibung:
Under a highly specific and detailed set of conditions, an internal resource livelock may occur between a TLB reload and other cached operations.

möglicher Einfluss auf das System:
The system may hang.

empfohlener Workaround:
BIOS should set MSR C001_1023h[21] to 1b.

Fehlerbehebung geplant: ja

298: L2 Eviction May Occur During Processor Operation To Set Accessed or Dirty Bit ("der" TLB-Bug)

Details im
Beschreibung:
The processor operation to change the accessed or dirty bits of a page translation table entry in the L2 from 0b to 1b may not be atomic. A small window of time exists where other cached operations may cause the stale page translation table entry to be installed in the L3 before the modified copy is returned to the L2. In addition, if a probe for this cache line occurs during this window of time, the processor may not set the accessed or dirty bit and may corrupt data for an unrelated cached operation.

möglicher Einfluss auf das System:
One or more of the following events may occur:
• Machine check for an L3 protocol error. The MC4 status register (MSR 0000_0410) will be equal to B2000000_000B0C0F or BA000000_000B0C0F. The MC4 address register (MSR 0000_0412) will be equal to 26h.
• Loss of coherency on a cache line containing a page translation table entry.
• Data corruption.

empfohlener Workaround:
BIOS should set MSR C001_0015h[3] (HWCR[TlbCacheDis]) to 1b and MSR C001_1023h[1] to 1b. In a multiprocessor platform, the workaround above should be applied to all processors regardless of silicon revision when an affected processor is present.

Fehlerbehebung geplant: ja

309 Processor Core May Execute Incorrect Instructions on Concurrent L2 and Northbridge Response

Details im
Beschreibung:
Under a specific set of internal timing conditions, an instruction fetch may receive responses from the L2 and the Northbridge concurrently. When this occurs, the processor core may execute incorrect instructions.

möglicher Einfluss auf das System:
Unpredictable system behavior.

empfohlener Workaround:
BIOS should set MSR C001_1023h[23].

Fehlerbehebung geplant: ja

3. Model Specific Register (MSR = Prozessorregister), die von den Workarounds verändert werden​

Über das BIOS werden bezüglich des TLB-Bugs MSRs verändert, diese scheinen im Phenom 64 Bit breit zu sein. Jedes dieser Bits kann also einen Zustand von 0 oder 1 besitzen. Stellt euch die Register wie viele Schalter vor, die jeweils eine Funktion haben oder eben bisher unbelegt (reserved) sind. Im Folgenden liste ich nur die 2 Register und zugehörige Register-Bits auf, die in Bezug zu unserem Thema hier stehen.

Hinweis: Jeder physikalische CPU-Kern besitzt eigene MSRs und soweit nicht anders geschrieben gelten die Aussagen hier im Thread immer für CPU1 - CPU4!

3.1. MSR C001_0015h (Hardware Configuration Register kurz HWCR)​

3.1.1. Funktionen der Register-Bits:
  • Bit 3 (TlbCacheDis): cacheable memory disable. / Workaround Setting für Erratum 298
    Details im
    1=Disable performance improvement that assumes that the PML4, PDP, PDE and PTE entries are in cacheable memory. Operating systems that maintain page tables in uncacheable memory (UC memory type) must set the TlbCacheDis bit to insure proper operation.
  • Bit 4 (INVD_WBINVD): INVD to WBINVD conversion. / kein Erratum Workaround Setting
    Details im
    1=Convert INVD to WBINVD. This bit is required to be set when the L3 cache is enabled.
  • Bit 24 (TscFreqSel): TSC frequency select. / kein Erratum Workaround Setting
    Details im
    0=The TSC increments at the rate of the NCLK frequency.
    1=The TSC increments at the rate of the core P-state 0 COF specified by MSRC001_0064 at the time this bit is set by software. Changing the state of this bit after setting it results in undefined behaviour from the TSC. Changing the state of MSRC001_0064 after setting this bit has no effect on the TSC rate. BIOS should program this bit to 1.

3.2. MSR C001_1023 (Bus Unit Configuration Register kurz BU_CFG):​

3.2.1. Funktionen der Register-Bits:
  • 1: nicht dokumentiert / Workaround Setting für Erratum 298
  • 5: nicht dokumentiert / unbekannt
  • 21: nicht dokumentiert / Workaround Setting für Erratum 254
  • 23: nicht dokumentiert / Workaround Setting für Erratum 309

4. Registerzustand mit aktivem TLB-Fix (ASUS M3A32-MVP Bios 0801 und Vista 64 SP1)​

Hinweis: Die BIOS-Option "Memory Cycle mapping" (ASUS Bezeichnung für den TLB-Fix) steht auf disabled, da das SP1 für Vista x64 selber den TLB-Fix aktiviert!

4.1. Zustand MSR C001_0015h (Hardware Configuration Register kurz HWCR)​

Zustand des MSRs: 01000018
dadurch gesetzte Register-Bits: 3, 4, 24

4.1.1. Beobachtung: Wie erwartet, ist das Register-Bit 3 gesetzt, das ja für den TLB-Bug Workaround (Erratum 298) zuständig ist (Register-Bit 4 und 24 sind hier unerheblich).

Details im
hex: [01] [00] [00] [18]
dez: [1] [0] [0] [24]
bin: [00000001] [00000000] [00000000] [00011000]
Register: [31 - 24] [16 - 23] [8 - 15] [7 - 0]

4.2. Zustand MSR C001_1023 (Bus Unit Configuration Register kurz BU_CFG):​

Zustand des MSRs: 00A00022
dadurch gesetzte Register-Bits: 1, 5, 21, 23

4.2.1. Beobachtung: Eigentlich wäre zu erwarten gewesen, dass hier erstmal nur das Register-Bit 1, welches für den eigentlichen TLB-Bug Workaround (Erratum 298) zuständig ist, gesetzt wird. Man sieht jedoch, dass die ASUS BIOS Programmierer über dieses MSR noch 2 weitere Workarounds aktivieren, nämlich Register-Bit 21 (Erratum 254) und Register-Bit 23 (Erratum 309).

Details im
hex: [00] [A0] [00] [22]
dez: [0] [160] [0] [34]
bin: [00000000] [10100000] [00000000] [00100010]
Register: [31 - 24] [16 - 23] [8 - 15] [7 - 0]

4.3. RW-Everything Skript​

Dieses Skript setzt die entsprechenden MSRs auf den unter Punkt 4. genannten Zustand.
>cpu 1
>wrmsr 0xc0010015 0 0x01000018
>wrmsr 0xc0011023 0 0x00A00022
>cpu 2
>wrmsr 0xc0010015 0 0x01000018
>wrmsr 0xc0011023 0 0x00A00022
>cpu 3
>wrmsr 0xc0010015 0 0x01000018
>wrmsr 0xc0011023 0 0x00A00022
>cpu 4
>wrmsr 0xc0010015 0 0x01000018
>wrmsr 0xc0011023 0 0x00A00022
>rwexit

5. Registerzustand mit inaktivem TLB-Fix (ASUS M3A32-MVP Bios 0801 und Vista 64 SP1)​

Hinweis: Die entsprechenden MSRs wurden via RW-Everything gesetzt und entsprechen dem Zustand vor Einführung des TLB-Fixes!

5.1. Zustand MSR C001_0015h (Hardware Configuration Register kurz HWCR)​

Zustand des MSRs: 01000010
dadurch gesetzte Register-Bits: 4, 24

5.1.1. Beobachtung: Wie erwartet ist das Register-Bit 3 nun nicht mehr gesetzt, der TLB-Bug Workaround (Erratum 298) ist inaktiv.

Details im
hex: [01] [00] [00] [10]
dez: [1] [0] [0] [16]
bin: [00000001] [00000000] [00000000] [00010000]
Register: [31 - 24] [16 - 23] [8 - 15] [7 - 0]

5.2. Zustand MSR C001_1023 (Bus Unit Configuration Register kurz BU_CFG):​

Zustand des MSRs: 00200020
dadurch gesetzte Register-Bits: 5, 21

5.2.1. Beobachtung: Die Besonderheit hier ist, dass das RW-Everything Skript neben dem Workaround für den TLB-Bug auch den für das Erratum 309 deaktiviert.

Details im
hex: [00] [20] [00] [20]
dez: [0] [32] [0] [32]
bin: [00000000] [00100000] [00000000] [00100000]
Register: [31 - 24] [16 - 23] [8 - 15] [7 - 0]

5.3. RW-Everything Skript​

Dieses Skript setzt die entsprechenden MSRs auf den unter Punkt 5. genannten Zustand.
>cpu 1
>wrmsr 0xc0010015 0 0x01000010
>wrmsr 0xc0011023 0 0x00200020
>cpu 2
>wrmsr 0xc0010015 0 0x01000010
>wrmsr 0xc0011023 0 0x00200020
>cpu 3
>wrmsr 0xc0010015 0 0x01000010
>wrmsr 0xc0011023 0 0x00200020
>cpu 4
>wrmsr 0xc0010015 0 0x01000010
>wrmsr 0xc0011023 0 0x00200020
>rwexit

6. Registerzustand um Workarounds für Errata 254, 298 und 309 zu deaktivieren​

Hinweis: Dieser "Tweak" versetzt die CPU in einen möglicherweise ziemlich instabilen Zustand, dürfte aber zum erreichen maximaler (Benchmark-)Werte die geeignetste sein!

6.1. Zustand MSR C001_0015h (Hardware Configuration Register kurz HWCR)​

Zustand des MSRs: 01000010
dadurch gesetzte Register-Bits: 4, 24

6.1.1. Beobachtung: siehe 5.1.1.

Details im
hex: [01] [00] [00] [10]
dez: [1] [0] [0] [16]
bin: [00000001] [00000000] [00000000] [00010000]
Register: [31 - 24] [16 - 23] [8 - 15] [7 - 0]

6.2. Zustand MSR C001_1023 (Bus Unit Configuration Register kurz BU_CFG):​

Zustand des MSRs: 00000020
dadurch gesetzte Register-Bits: 5

6.2.1. Beobachtung: -

Details im
hex: [00] [00] [00] [20]
dez: [0] [0] [0] [32]
bin: [00000000] [00000000] [00000000] [00100000]
Register: [31 - 24] [16 - 23] [8 - 15] [7 - 0]

6.3. RW-Everything Skript​

Dieses Skript setzt die entsprechenden MSRs auf den unter Punkt 6. genannten Zustand.
>cpu 1
>wrmsr 0xc0010015 0 0x01000010
>wrmsr 0xc0011023 0 0x00000020
>cpu 2
>wrmsr 0xc0010015 0 0x01000010
>wrmsr 0xc0011023 0 0x00000020
>cpu 3
>wrmsr 0xc0010015 0 0x01000010
>wrmsr 0xc0011023 0 0x00000020
>cpu 4
>wrmsr 0xc0010015 0 0x01000010
>wrmsr 0xc0011023 0 0x00000020
>rwexit

... wird noch erweitert!

7. User-FAQ[/H3](bisher keine Fragen)[H3]8. Threadhistorie​

  • 26.02.2008: erste Fassung
  • 27.02.2008: Fix: Errata -> Erratum (Danke Nero24)
  • 27.02.2008: Hinweis unter Punkt 3 eingefügt
  • 27.02.2008: Punkt 5 eingefügt
  • 27.02.2008: Detailinfos zu Punkt 3.1.1. eingefügt (Spoiler)
  • 28.02.2008: Hinweis zu Punkt 4 um das SP1 für Vista x64 ergänzt
  • 28.02.2008: Punkt 6 eingefügt
  • 28.02.2008: RW-Everything Skripte unter Punkt 4.3. / 5.3. / 6.3. eingefügt
  • 28.02.2008: RW-Everything Skripte als Anhang eingefügt (.txt Endung muss noch aus dem Dateinamen gelöscht werden!)
 
Zuletzt bearbeitet:
Wobei bestimmt nicht mehr alle Zutreffen dürften.
Aber gibt eben bestimmt mehrere Ansätze um das Problem zu fixen.
 
Wobei bestimmt nicht mehr alle Zutreffen dürften.
Aber gibt eben bestimmt mehrere Ansätze um das Problem zu fixen.

Was genau meinst du :)? Die gelisteten Errata sind sehr wohl real in ALLEN B2 Revisionen des Phenom vorhanden!
Zudem sind die genannten Fixes / Workarounds in den Spoilern direkt aus einem AMD Dokument. Ob es noch weitere Lösungsansätze gibt, die vielleicht unter einem NDA liegen weiß ich natürlich nicht.

Dia
 
Zuletzt bearbeitet:
^Weil du nicht sagen kannst, ab neuere Design geänderte Phenoms B2 das Problem so nach haben. Ich meine da nicht, das evtl alles gefixt ist, aber es ist sehr wohl denkbar das AMD an einigen Fehlern arbeitet. Wenn man nun einen alten NOV Phenom mit einem FEB Model Vergleich, würde sich meine Aussage stützen.
Und Deine Auflistungen sind halt für alle Phenoms.
 
^Weil du nicht sagen kannst, ab neuere Design geänderte Phenoms B2 das Problem so nach haben. Ich meine da nicht, das evtl alles gefixt ist, aber es ist sehr wohl denkbar das AMD an einigen Fehlern arbeitet. Wenn man nun einen alten NOV Phenom mit einem FEB Model Vergleich, würde sich meine Aussage stützen.
Und Deine Auflistungen sind halt für alle Phenoms.

Aber wie sollte das gehen, das BIOS erkennt eine CPU ja vermutlich auch am Stepping und ähnlichen Parametern, wenn sich diese aber nicht ändern bekommt ein November 07 Phenom die selben MSR Register-Bits gesetzt, wie ein Januar 08 Phenom. Oder etwa nicht?

Dia
 
Das kann ich dir nicht beantworten.
Deine Vermutung liegt aber nahe. Man muss ja den TLB Fix nicht aktivieren.
 
Sehr schöne Zusammenstellung. Sind die Infos nur aus dem revision guide, oder aus welchen Dokumenten sind die?

Man fühlt sich an die Zeiten der 486er und Sockel7-Zeiten zurückversetzt, als die Chipsatzdokumentationen mit allen Config-Registern noch frei zugänglich waren und man reichlich rumbasteln konnte.....Ob das nun ein Lob sein soll für AMD, dass es nun bei deren CPUs wieder interessant wird, an config-Registern zu schrauben, sei mal dahingestellt.....
 
Zuletzt bearbeitet:
Sehr schöne Zusammenstellung. Sind die Infos nur aus dem revision guide, oder aus welchen Dokumenten sind die?

Man fühlt sich an die Zeiten der 486er und Sockel7-Zeiten zurückversetzt, als die Chipsatzdokumentationen mit allen Config-Registern noch frei zugänglich waren und man reichlich rumbasteln konnte.....Ob das nun ein Lob sein soll für AMD, dass es nun bei deren CPUs wieder interessant wird, an config-Registern zu schrauben, sei mal dahingestellt.....

Die Beschreibung der Register-Bits habe ich aus dem Phenom BIOS and Kernel Developer’s Guide Rev 3.00 (ID# 31116). Allerdings ist dort eben nicht dokumentiert, was das Register C001_1023 (Bus Unit Configuration Register / BU_CFG) für Funktionen hat :(.

Dia
 
@Diapolo:
Hast Du Dir den Syntax von RW-Everything noch genauer angesehen?
Ich hatte es ja nicht hinbekommen, ein Register auszulesen, den Wert AND-zuverknüpfen und wieder zurückzuschreiben. Hast Du das geschafft? Sonst wollte ich mal dem Autor von RW-Everything mailen...
 
@Diapolo:
Hast Du Dir den Syntax von RW-Everything noch genauer angesehen?
Ich hatte es ja nicht hinbekommen, ein Register auszulesen, den Wert AND-zuverknüpfen und wieder zurückzuschreiben. Hast Du das geschafft? Sonst wollte ich mal dem Autor von RW-Everything mailen...

Bisher habe ich mir die Syntax nicht im Detail angesehen, willst du eine wenn-dann Lösung realisieren oder was genau hast du vor mit der AND-Verknüpfung? Evtl. schau ich heut Abend mal in die Doku rein.

Dia
 
Bisher habe ich mir die Syntax nicht im Detail angesehen, willst du eine wenn-dann Lösung realisieren oder was genau hast du vor mit der AND-Verknüpfung? Evtl. schau ich heut Abend mal in die Doku rein.

Dia

Eigentlich müsste man ja einzelne Bits löschen oder setzen, also
mov eax,MSR
or eax,0x0000001
mov MSR,eax

...und momentan schreiben wir ja nur feste Werte, was eigentlich etwas "unsauber" ist.
Es gibt ja jetzt die Version 0.29 von RW-Everything. Vielleicht gehts damit.
Mit v0.28 konnte ich nicht den ausgelesenen MSR-Wert weiterverarbeiten.
 
Eigentlich müsste man ja einzelne Bits löschen oder setzen, also
mov eax,MSR
or eax,0x0000001
mov MSR,eax

...und momentan schreiben wir ja nur feste Werte, was eigentlich etwas "unsauber" ist.
Es gibt ja jetzt die Version 0.29 von RW-Everything. Vielleicht gehts damit.
Mit v0.28 konnte ich nicht den ausgelesenen MSR-Wert weiterverarbeiten.

In der Doku zu 0.29 steht lediglich folgendes:

AND <operand1> <operand2>
And bit-operation

RDMSR <register#>
- Read CPU MSR register, LocalA, B, C, D=EAX, EBX, ECX, EDX

WRMSR <register#> <EDX> <EAX>
- Write CPU MSR register

Ich weiß allerdings noch nicht, wie man den Operand erhält bzw. definieren kann, hast du ne Idee?

Dia
 
Ich habe eben nochmal nen schnellen 3DMark06 Test gemacht, schön formatiert ist es nicht, aber es spricht für sich!

Errata-Workarounds aktiv Errata-Workarounds inaktiv Differenz
3DMarks 8459 9955 17,69
SM 2.0 3142 3912 24,51
SM 3.0 3968 4535 14,29
CPU 2657 3008 13,21
1 - Return to Proxycon 26,90 31,87 18,48
2 - Firefly Forest 25,46 33,33 30,91
CPU1 - Red Valley 0,90 1,00 11,11
CPU2 - Red Valley 1,25 1,45 16,00
1 - Canyon Flight (SM 3.0) 44,76 46,43 3,73
2 - Deep Freeze (SM 3.0) 34,60 44,27 27,95

Dia
 
Zurück
Oben Unten