W jaki sposób błędy PCI (e) są propagowane w przestrzeni użytkownika w przypadku błędów?

0

PCIe obsługuje różne mechanizmy raportowania błędów , i widzę, jak sterownik urządzenia łączy się z tymi możliwościami, aby obsługiwać określone typy błędów i ponownie inicjować dane urządzenie w razie potrzeby w razie błędów.

Jednak w jaki sposób błąd odczytu PCIe byłby wskazywany programowi przestrzeni użytkownika czytającemu z przestrzeni adresowej odwzorowanej w pamięci, w przypadku, gdy odczyt nie może być spełniony, np. Z powodu błędu magistrali lub odłączonego urządzenia typu hot plug?

O ile rozumiem, istnieją dwie podstawowe możliwości: albo niepoprawne dane są propagowane do aplikacji do odczytu (np. Wszystkie odczyty zwrócą 0x00 lub 0xFF), lub błąd PCI spowoduje błąd lub przerwanie procesora, który będzie obsługiwane przez jądro i tłumaczone na sygnał (jak SIGBUS na Uniksie).

(W przypadku zapisu, prawdopodobnie nie zadziałałoby to, przynajmniej jeśli zostałyby zaimplementowane jako zaksięgowane transakcje PCIe, ponieważ aplikacja przestrzeni użytkownika nie byłaby blokowana w dostępie do pamięci: Sygnał, jeśli w ogóle dostarczony, przybyłby asynchronicznie jakiś czas po awarii pisać.)

To ostatnie wydaje się bezpieczniejszym wyborem, ale znalazłem wzmiankę o wysyłaniu zarówno sygnału, jak i specjalnej wartości ( tu i tutaj ).

Moje pytanie nie ogranicza się do konkretnego systemu, ale ponieważ implementacja błędów PCIe prawdopodobnie zależy w dużym stopniu zarówno od sprzętu, jak i architektury jądra danego systemu, odpowiedzi specyficzne dla systemu również byłyby bardzo mile widziane.

Lxgr
źródło
Widziałem oba błędy PCI zgłoszone w syslog (więc zgłoszono przerwanie) i ffwróciłem w tym przypadku do odczytu, więc zakładam, że odpowiedź brzmi „oba”.
bezpośrednio
Zgłoszenie przerwane w syslog może jednak nastąpić asynchronicznie, a sygnał nie zostanie wysłany do aplikacji czytającej, prawda?
lxgr
IIRC aplikacja (lspci) nie otrzymała sygnału, ale jest to problem z implementacją jądra Linuksa, a nie problem z implementacją magistrali PCIe. Nic nie powstrzymuje jądra przed wysłaniem sygnału, AFAIK adres powodujący naruszenie jest rejestrowany.
bezpośrednio