接前一篇文章:
3. PCI设备中断模拟
上一节介绍了操作系统驱动设备的MMIO/PIO基址以及QEMU是如何模拟该机制的。操作系统与设备通信的另一方面则是设备产生了事件,通过中断机制通知操作系统。设备寄存器和I/O端口提供操作系统向设备的通信,而中断机制则提供了设备向操作系统的通信。
前文书介绍了每个PCI设备都有4个引脚,都可以触发中断,单功能设备都用INTA#触发中断,只有多功能设备会用到INTB#、INTC#、INTD#等中断引脚。使用哪个引脚通常体现在QEMU在设备具现化的时候写入PCI设备配置空间内0x3d处的一个字节。比如下边的代码显示了e1000设备使用了INTA#引脚。
hw/net/e1000.c中:
static void pci_e1000_realize(PCIDevice *pci_dev, Error **errp)
{
DeviceState *dev = DEVICE(pci_dev);
E1000State *d = E1000(pci_dev);
uint8_t *pci_conf;
uint8_t *macaddr;
pci_dev->config_write = e1000_write_config;
pci_conf = pci_dev->config;
/* TODO: RST# value should be 0, PCI spec 6.2.4 */
pci_conf[PCI_CACHE_LINE_SIZE] = 0x10;
pci_conf[PCI_INTERRUPT_P