QEMU - устаревшее прерывание застряло - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь разработать устройство PCI, и мне нужно реализовать устаревшее прерывание (не MSI или MSIX). Я последовал примеру edu.c, но IRQ все еще повышается, когда я загружаю драйвер.

Я пытался посмотреть на другие устройства, но не повезло. Вот мой код:

static void xxx_pci_realize(...)
{
      // ....

    pci_config_set_interrupt_pin(pci_conf, 1);
    pci_set_irq(pdev, 0);

    // ....
}

Кто-нибудь имеет представление о том, что является неправильным? Спасибо!

Ответы [ 2 ]

1 голос
/ 05 марта 2019

Вы вообще не должны пытаться связываться с состоянием линий PCI в вашем методе реализации. Этот метод - то, где устройство создано, и происходит только один раз в начале моделирования. Строки прерываний должны подниматься и опускаться в ответ на события, происходящие во время работы системы - обычно гость записывает регистр, и это заставляет вас делать что-то, что означает, что вы затем вызываете прерывание. Затем гость получает это прерывание и сообщает устройству: «Хорошо, я разобрался с этим сейчас», а затем устройство понижает прерывание. Вы можете увидеть этот шаблон в упомянутом устройстве 'edu.c'.

0 голосов
/ 06 марта 2019

Кажется, что прерывание не было выдано с моего устройства: я где-то читал, что на устаревших IRQ устройства соединены в цепочку на выводах IRQ 10 и 11. Таким образом, процессор / ядро ​​не может сказать, какой из них выданIRQ.

Если я правильно понял, когда выдается IRQ, каждое устройство, имеющее устаревшие прерывания, должно сказать, было ли оно создано или нет.Это делается путем установки регистров, которые будут считываться драйвером, который сможет обрабатывать IRQ.И затем устройство, следующее за ним в списке, будет делать то же самое.

Поскольку я адаптировал свое устройство PCI QEMU, чтобы оно возвращало 0 для регистров, которые указывают, выдало ли устройство IRQ, IRQ проходит и отключается послетот.Поэтому я предполагаю, что это потому, что IRQ был выдан другим устройством.

Если кто-то считает, что это не настоящая причина, я был бы рад узнать, есть ли другая возможность:)

Спасибоснова @ peter-maydell за вашу помощь!

...