Commit 63ce9e0a42503fbdb40eb8fb4b0933a058213925
1 parent
e1c485be
pci empty device read fix - piix3 ide init
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@854 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
27 additions
and
8 deletions
hw/pci.c
| ... | ... | @@ -316,7 +316,18 @@ static uint32_t pci_data_read(void *opaque, uint32_t addr, |
| 316 | 316 | pci_dev = bus[(s->config_reg >> 8) & 0xff]; |
| 317 | 317 | if (!pci_dev) { |
| 318 | 318 | fail: |
| 319 | - val = 0; | |
| 319 | + switch(len) { | |
| 320 | + case 1: | |
| 321 | + val = 0xff; | |
| 322 | + break; | |
| 323 | + case 2: | |
| 324 | + val = 0xffff; | |
| 325 | + break; | |
| 326 | + default: | |
| 327 | + case 4: | |
| 328 | + val = 0xffffffff; | |
| 329 | + break; | |
| 330 | + } | |
| 320 | 331 | goto the_end; |
| 321 | 332 | } |
| 322 | 333 | config_addr = (s->config_reg & 0xfc) | (addr & 3); |
| ... | ... | @@ -682,16 +693,24 @@ static void pci_bios_init_device(PCIDevice *d) |
| 682 | 693 | int class; |
| 683 | 694 | PCIIORegion *r; |
| 684 | 695 | uint32_t *paddr; |
| 685 | - int i, pin, pic_irq; | |
| 696 | + int i, pin, pic_irq, vendor_id, device_id; | |
| 686 | 697 | |
| 687 | - class = d->config[0x0a] | (d->config[0x0b] << 8); | |
| 698 | + class = pci_config_readw(d, PCI_CLASS_DEVICE); | |
| 688 | 699 | switch(class) { |
| 689 | 700 | case 0x0101: |
| 690 | - /* IDE: we map it as in ISA mode */ | |
| 691 | - pci_set_io_region_addr(d, 0, 0x1f0); | |
| 692 | - pci_set_io_region_addr(d, 1, 0x3f4); | |
| 693 | - pci_set_io_region_addr(d, 2, 0x170); | |
| 694 | - pci_set_io_region_addr(d, 3, 0x374); | |
| 701 | + vendor_id = pci_config_readw(d, PCI_VENDOR_ID); | |
| 702 | + device_id = pci_config_readw(d, PCI_DEVICE_ID); | |
| 703 | + if (vendor_id == 0x8086 && device_id == 0x7010) { | |
| 704 | + /* PIIX3 IDE */ | |
| 705 | + pci_config_writew(d, PCI_COMMAND, PCI_COMMAND_IO); | |
| 706 | + pci_config_writew(d, 0x40, 0x8000); // enable IDE0 | |
| 707 | + } else { | |
| 708 | + /* IDE: we map it as in ISA mode */ | |
| 709 | + pci_set_io_region_addr(d, 0, 0x1f0); | |
| 710 | + pci_set_io_region_addr(d, 1, 0x3f4); | |
| 711 | + pci_set_io_region_addr(d, 2, 0x170); | |
| 712 | + pci_set_io_region_addr(d, 3, 0x374); | |
| 713 | + } | |
| 695 | 714 | break; |
| 696 | 715 | case 0x0300: |
| 697 | 716 | /* VGA: map frame buffer to default Bochs VBE address */ | ... | ... |