Wie werden PCI (e) -Fehler im Fehlerfall an den Benutzer weitergegeben?

518
lxgr

PCIe unterstützt verschiedene Fehlerberichterstattungsmechanismen, und ich kann sehen, wie ein Gerätetreiber mit diesen Funktionen verbunden ist, um bestimmte Fehlertypen zu behandeln und das betreffende Gerät im Fehlerfall neu zu initialisieren.

Wie würde jedoch ein PCIe-Lesefehler einem Benutzerbereichsprogramm angezeigt, das aus dem Speicherbereich des Adressraums liest, falls der Lesevorgang nicht erfüllt werden kann, z. B. aufgrund eines Busfehlers oder eines nicht verbundenen Hot-Plug-Geräts?

Soweit ich es verstehe, gibt es zwei grundsätzliche Möglichkeiten: Entweder werden ungültige Daten an die Leseanwendung weitergegeben (z. B. würden alle Lesevorgänge 0x00 oder 0xFF zurückgeben) oder der PCI-Fehler führt zu einem Fehlerzustand oder zu einer Unterbrechung der CPU wird vom Kernel verarbeitet und in ein Signal übersetzt (wie SIGBUS unter Unix).

(Für Schreibvorgänge würde dies vermutlich nicht funktionieren, zumindest wenn sie als gepostete PCIe-Transaktionen implementiert sind, da die Userspace-Anwendung beim Speicherzugriff nicht blockiert wird: Ein Signal würde, wenn überhaupt, übermittelt, einige Zeit nach dem Fehlschlag asynchron ankommen schreiben.)

Letzteres scheint eine sicherere Wahl zu sein, aber ich habe festgestellt, dass sowohl ein Signal als auch ein spezieller Wert gesendet werden ( hier und hier ).

Meine Frage ist nicht auf ein bestimmtes System beschränkt, aber da die Implementierung von PCIe-Fehlern wahrscheinlich sehr stark von der Hardware- und Kernel-Architektur des jeweiligen Systems abhängt, sind auch systemspezifische Antworten sehr willkommen.

0
Ich habe gesehen, dass beide PCI-Fehler in syslog gemeldet wurden (daher wurde ein Interrupt ausgelöst) und "ff" beim Lesen zurückgegeben wurde. In diesem Fall gehe ich davon aus, dass die Antwort "beide" lautet. dirkt vor 6 Jahren 0
Ein in syslog gemeldeter Interrupt kann jedoch asynchron auftreten, wobei das Signal nicht an die lesende Anwendung gesendet wird, oder? lxgr vor 6 Jahren 0
IIRC, die Anwendung (lspci), hat kein Signal erhalten, aber dies ist ein Linux-Kernel-Implementierungsproblem, kein PCIe-Bus-Implementierungsproblem. Nichts hindert den Kernel daran, ein Signal zu senden. AFAIK die Adresse, die die Verletzung verursacht, wird protokolliert. dirkt vor 6 Jahren 0

0 Antworten auf die Frage