From 7c2c5ae72cab906dc1ae2f71e3620db9df984753 Mon Sep 17 00:00:00 2001 From: acevest Date: Thu, 11 Nov 2021 14:29:51 +0800 Subject: [PATCH] =?utf8?q?fix=E5=9C=A8qemu=E4=B8=ADpci=20ide=20ata?= =?utf8?q?=E7=A1=AC=E7=9B=98DMA=E8=AF=BB=E4=B8=8D=E5=88=B0=E6=95=B0?= =?utf8?q?=E6=8D=AE=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- drivers/ide.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/ide.c b/drivers/ide.c index d7ea5a2..fed4c4b 100644 --- a/drivers/ide.c +++ b/drivers/ide.c @@ -141,6 +141,15 @@ void ide_pci_init(pci_device_t *pci) { v = pci_read_config_word(pci_cmd(pci, PCI_COMMAND)); printk(" ide pci command %04x\n", v); + // 这一句非常重要,如果不加这一句 + // 在qemu中用DMA的方式读数据就会读不到数据,而只触是发中断,然后寄存器(Bus Master IDE Status + // Register)的值会一直是5 也就是INTERRUPT和和ACTIVE位是1,正常应该是4,也就是只有INTERRUPT位为1 + // 在bochs中则加不加这一句不会有影响,都能正常读到数据 + pci_write_config_word(v | PCI_COMMAND_MASTER, pci_cmd(pci, PCI_COMMAND)); + + v = pci_read_config_word(pci_cmd(pci, PCI_COMMAND)); + printk(" ide pci command %04x\n", v); + v = pci_read_config_byte(pci_cmd(pci, PCI_PROGIF)); printk(" ide pci program interface %02x\n", v); -- 2.44.0