Closed mirrin00 closed 1 year ago
Для проверки лучше модифицировать ntb_hw_idt
модуль, и начать разбираться с выделением mw
.
Есть 2 типа окон: 1) DMA и 2) по таблице адресов LUT
2 случай сложен, поэтому лучше сконфигурировать 1 окно и попробовать оперделить его адрес. Затем проверить гипотезу о том, что этот адрес физический.
Согласно доке: https://www.renesas.com/eu/en/document/mah/89hpes32nt24bg2-device-user-manual (Раздел TLP Translation)
Любой адрес окна вычисляется относительно конкретного BAR, который в свою очередь имеет физический адрес (можно проверить посмотрев вызовы при аллокации BAR: https://elixir.bootlin.com/linux/latest/source/drivers/ntb/hw/idt/ntb_hw_idt.c#L2637)
Физический адрес маппится в виртуальную память. Поэтому нужно взять BAR адрес и получить смещение с помощью: https://elixir.bootlin.com/linux/latest/source/drivers/ntb/hw/idt/ntb_hw_idt.c#L1194
In the blogpost reffered to in #65, that hypothesis is checked via direct memory writes. Accordingly to that, all in-VM physical addresses match the offsets in the shared memory.
ok
In the blogpost reffered to in #65, that hypothesis is checked via direct memory writes. Accordingly to that, all in-VM physical addresses match the offsets in the shared memory.
But we need the matching of window addresses in the idt module. You need to check the same thing, but based on the data that the idt driver has
Here in lines 1319 and 1320, the address is written to device mapping table: https://elixir.bootlin.com/linux/latest/source/drivers/ntb/hw/idt/ntb_hw_idt.c#L1319
Проверить, как соответствуют адреса в qemu-процессе (смапленой памяти в shared mem) относительно адресов виртуальной машины.
Результат: драйвер в виртуальной машине, который пишет в DMA память (адреса DMA памяти должны быть физическими относительно 0 адреса) определенную информацию и печатает адрес этой памяти. На хосте нужно проверить, что начало shared mem памяти + offset (адрес, полученный из модуля ядра) даст указатель на туже саму информацию.