目录
1. PCI设备
可以参考 :PCI/PCIe基础——配置空间分布_vc66vcc的博客-CSDN博客_pcie配置空间
2. PCI设备模拟
PCI 设备类型
pci_device_type_info,是抽象类型
TYPE_PCI_BUS
pci_device_class_init
pci_qdev_realize
TYPE_PCI_DEVICE
pci_register_bar: 注册 MR 为 BAR${region_num}, 如BAR0
PCIHostState: 北桥PCI部分
i440fx_pcihost_initfn: 北桥初始化,注册cfg 和 data 的MR动作
i440fx_pcihost_realize,北桥实例化,完成IO地址MR注册
pci_host_config_write:写CONFGADDR,选择PCI设备和寄存器
pci_host_data_write:写入CONFGDATA数据
pci_data_write
SEABIOS分配各种BAR/MMIO地址,写入PORT_PCI_DATA(PCI主桥的IO配置空间),QEMU响应函数是
pci_default_write_config
pci_update_mappings
3. PCI设备中断模拟
在实例化的时候写入PCI设备配置空间内0x3d处的一个字节,指明使用了哪个中断引脚 INTA-D
PCI设备使用的中断引脚与中断控制器的中断线连接起来,通常叫做PCI设备的中断路由。设计三个概念
- 中断引脚
- 中断线
- PC链接设备
中断路由两部分
- 设备INTA到LINA的交错连线
- PCI链接设备路由到具体的IRQ线上,BIOS设定
QEMU中PCI设备中断初始化
i440fx_init
pci_bus_irqs
pci_slot_get_pirq,得到LNK[A-D],调用piix3_set_irq,作为参数 pirq
piix3_set_irq
piix3_set_irq_level
piix3_set_irq_pic
QEMU中PCI设备触发中断
pci_set_irq,pci_intx得到INTX引脚编号(INTX[A-D])
pci_irq_handler
pci_change_irq_level