Przykładowe urządzenie PCI

Przykładowe urzadzenie służy do sprzętowego liczenia sumy kontrolnej Adler-32. Dostarczamy je jako zmodyfikowaną wersję qemu.

Sterownik do przykładowego urządzenia: adlerdev.tar.gz

QEMU

Do użycia przykładowego urządzenia wymagana jest zmodyfikowana wersja qemu, dostępna w wersji źródłowej.

Aby skompilować zmodyfikowaną wersję qemu, należy:

  1. Sklonować repozytorium https://github.com/mwkmwkmwk/qemu

  2. git checkout adlerdev

  3. Upewnić się, że są zainstalowane zależności: ncurses, libsdl, curl, a w niektórych dystrybucjach także ncurses-dev, libsdl-dev, curl-dev (nazwy pakietów mogą się nieco różnić w zależności od dystrybucji)

  4. Uruchomić ./configure z opcjami wedle uznania (patrz ./configure --help). Oficjalna binarka była kompilowana z:

    --target-list=x86_64-softmmu
    
  5. Wykonać make

  6. Zainstalować wykonując make install, lub uruchomić bezpośrednio (binarka to x86_64-softmmu/qemu-system-x86_64).

Urządzenie

Urządzenie jest podłączane do komputera przez szynę PCI – identyfikator producenta to 0x0666, a identyfikator urządzenia to 0x0a32.

Urządzenie ma 5 rejestrów:

BAR0 + 0x0000: INTR

Rejestr stanu przerwań. Przy odczycie, ma wartość 1 jeśli urządzenie zgłasza przerwanie, bądź 0, jeśli nie zgłasza. Aby odpowiedzieć na przerwanie (i spowodować, że urządzenie przestanie zgłaszać przerwanie), należy zapisać 1 do tego rejestru. Należy też zapisać 1 do tego rejestru przy starcie urządzenia (urządzenie może na starcie zgłaszać przerwanie).

BAR0 + 0x0004: INTR_ENABLE

Rejestr włączenia przerwań, do odczytu i zapisu. Jeśli ma wartość 1, urządzeniu wolno zgłaszać przerwanie. Jeśli ma wartość 0, urządzenie nie będzie zgłaszało przerwania PCI (przerwanie wciąż będzie widoczne w rejestrze INTR).

BAR0 + 0x0008: DATA_PTR

Wskaźnik na dane do przetworzenia, do odczytu i zapisu. W trakcie przetwarzania danych, urządzenie będzie automatycznie zwiększało ten wskaźnik.

BAR0 + 0x000c: DATA_SIZE

Rozmiar danych do przetworzenia, do odczytu i zapisu. Zapisanie do tego rejestru niezerowej wartośći spowoduje natychmiastowe rozpoczęcie przetwarzania danych. W trakcie przetwarzania, urzadzenie będzie automatycznie zmniejszało ten rejestr. Gdy całe dane zostaną przetworzone (i ten rejestr spadnie do zera), zostanie zgłoszone przerwanie (INTR będzie miał wartość 1).

BAR0 + 0x0010: SUM

Obecna suma. Przed przetworzeniem danych, należy tu wpisać wartość początkową sumy. W miarę przetwarzania danych, urządzenie aktualizuje sumę.

Aby przetworzyć dane, należy:

  • upewnić się że INTR jest wyzerowany, a INTR_ENABLE włączony

  • zapisać do SUM wartość początkową sumy

  • zapisać do DATA_PTR wskaźnik na dane

  • zapisać do DATA_SIZE rozmiar danych

  • czekać na przerwanie

  • wyzerować przerwanie (zapisać 1 do INTR)