Трассировка операций ввода/вывода памяти устройства PCI в среде QEMU/VFIO

Я пытаюсь реконструировать какое-то устройство PCI в среде QEMU / VFIO и хотел бы отслеживать все операции ввода-вывода в физической памяти, выполняемые картой. Карта использует управление шиной PCI и записывает данные на другие устройства и, скорее всего, считывает некоторые данные, предварительно обработанные драйвером, из оперативной памяти хоста. На данный момент мне удалось отследить только все операции чтения и записи в пространство MMIO карты (передача данных с хоста на устройство), к сожалению, мне не хватает второго направления операций R/W (извлечение данных устройством с хоста).

Есть ли возможность отслеживать операции ввода-вывода, которые устройство PCI выполняет с физической памятью, т. е. прямые операции ввода-вывода и/или передачи DMA в среде QEMU / VFIO? Я включил трассировку для следующих событий:

vfio_pci_read_config vfio_pci_write_config vfio_region_write vfio_region_read vfio_intx_interrupt vfio_intx_eoi vfio_intx_update vfio_intx_enable vfio_intx_disable vfio_msi_interrupt vfio_populate_device_config vfio_region_mmap

Есть ли какое-либо событие, позволяющее сделать такое, которое можно зарегистрировать в QEMU? Заранее спасибо.


person cafebabe_t    schedule 03.04.2020    source источник


Ответы (1)


Устройство PCI считается периферийным устройством, что означает, что оно имеет собственный процессор и собственную прошивку. Доступ к области mmio происходит на периферийном устройстве и поэтому не отслеживается с помощью QEMU.

Можно отследить чтение/запись в mmio в виртуальной машине QEMU, поскольку выполняемая инструкция памяти вызывает функцию обратного вызова для обработки доступа к mmio в VFIO.

Поскольку PCI-устройство читает/записывает область mmio в своей прошивке (выполняется процессором устройства), вы не можете отслеживать события на стороне хоста.

Я думаю, что вы можете сравнить значения mmio_read со значениями mmio_write во время обратного проектирования.

person Bruce Shen    schedule 03.06.2020