Commit 63ce9e0a42503fbdb40eb8fb4b0933a058213925

Authored by bellard
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 */
... ...