qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 01/11] isa: give ISABus/ISADevice to isa_create(


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH 01/11] isa: give ISABus/ISADevice to isa_create(), isa_bus_irqs() and isa_get_irq() functions
Date: Mon, 12 Dec 2011 10:38:43 -0600
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.21) Gecko/20110831 Lightning/1.0b2 Thunderbird/3.1.13

On 10/24/2011 03:18 PM, Hervé Poussineau wrote:
NULL is a valid bus/device, so there is no change in behaviour.

Signed-off-by: Hervé Poussineau<address@hidden>

Reviewed-by: Anthony Liguori <address@hidden>

Regards,

Anthony Liguori

---
  arch_init.c        |    8 ++++----
  arch_init.h        |    2 +-
  hw/adlib.c         |    2 +-
  hw/alpha_dp264.c   |   10 ++++++----
  hw/alpha_typhoon.c |    7 ++++---
  hw/audiodev.h      |    8 ++++----
  hw/cs4231a.c       |    4 ++--
  hw/fdc.h           |    4 ++--
  hw/gus.c           |    4 ++--
  hw/i8254.c         |    2 +-
  hw/i8259.c         |    6 +++---
  hw/ide.h           |    2 +-
  hw/ide/isa.c       |    4 ++--
  hw/ide/piix.c      |    2 +-
  hw/ide/via.c       |    2 +-
  hw/isa-bus.c       |   18 +++++++++++-------
  hw/isa.h           |   10 +++++-----
  hw/m48t59.c        |    5 +++--
  hw/mc146818rtc.c   |    4 ++--
  hw/mc146818rtc.h   |    2 +-
  hw/mips_fulong2e.c |   16 +++++++++-------
  hw/mips_jazz.c     |   13 +++++++------
  hw/mips_malta.c    |   26 ++++++++++++++------------
  hw/mips_r4k.c      |   21 +++++++++++----------
  hw/nvram.h         |    3 ++-
  hw/pc.c            |   30 +++++++++++++++---------------
  hw/pc.h            |   35 ++++++++++++++++++-----------------
  hw/pc_piix.c       |   19 +++++++++++--------
  hw/pcspk.c         |    2 +-
  hw/ppc_prep.c      |   20 +++++++++++---------
  hw/sb16.c          |    4 ++--
  hw/sun4u.c         |   20 ++++++++++++--------
  qemu-common.h      |    1 +
  33 files changed, 171 insertions(+), 145 deletions(-)

diff --git a/arch_init.c b/arch_init.c
index a411fdf..3bc2a41 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -473,7 +473,7 @@ struct soundhw {
      int enabled;
      int isa;
      union {
-        int (*init_isa) (qemu_irq *pic);
+        int (*init_isa) (ISABus *bus, qemu_irq *pic);
          int (*init_pci) (PCIBus *bus);
      } init;
  };
@@ -628,7 +628,7 @@ void select_soundhw(const char *optarg)
      }
  }

-void audio_init(qemu_irq *isa_pic, PCIBus *pci_bus)
+void audio_init(ISABus *isa_bus, qemu_irq *isa_pic, PCIBus *pci_bus)
  {
      struct soundhw *c;

@@ -636,7 +636,7 @@ void audio_init(qemu_irq *isa_pic, PCIBus *pci_bus)
          if (c->enabled) {
              if (c->isa) {
                  if (isa_pic) {
-                    c->init.init_isa(isa_pic);
+                    c->init.init_isa(isa_bus, isa_pic);
                  }
              } else {
                  if (pci_bus) {
@@ -650,7 +650,7 @@ void audio_init(qemu_irq *isa_pic, PCIBus *pci_bus)
  void select_soundhw(const char *optarg)
  {
  }
-void audio_init(qemu_irq *isa_pic, PCIBus *pci_bus)
+void audio_init(ISABus *isa_bus, qemu_irq *isa_pic, PCIBus *pci_bus)
  {
  }
  #endif
diff --git a/arch_init.h b/arch_init.h
index a74187a..074f02a 100644
--- a/arch_init.h
+++ b/arch_init.h
@@ -27,7 +27,7 @@ void do_acpitable_option(const char *optarg);
  void do_smbios_option(const char *optarg);
  void cpudef_init(void);
  int audio_available(void);
-void audio_init(qemu_irq *isa_pic, PCIBus *pci_bus);
+void audio_init(ISABus *isa_bus, qemu_irq *isa_pic, PCIBus *pci_bus);
  int tcg_available(void);
  int kvm_available(void);
  int xen_available(void);
diff --git a/hw/adlib.c b/hw/adlib.c
index e4bfcc6..b5e1564 100644
--- a/hw/adlib.c
+++ b/hw/adlib.c
@@ -275,7 +275,7 @@ static void Adlib_fini (AdlibState *s)
      AUD_remove_card (&s->card);
  }

-int Adlib_init (qemu_irq *pic)
+int Adlib_init (ISABus *bus, qemu_irq *pic)
  {
      AdlibState *s =&glob_adlib;
      struct audsettings as;
diff --git a/hw/alpha_dp264.c b/hw/alpha_dp264.c
index fcc20e9..a87d6ef 100644
--- a/hw/alpha_dp264.c
+++ b/hw/alpha_dp264.c
@@ -50,6 +50,7 @@ static void clipper_init(ram_addr_t ram_size,
  {
      CPUState *cpus[4];
      PCIBus *pci_bus;
+    ISABus *isa_bus;
      qemu_irq rtc_irq;
      long size, i;
      const char *palcode_filename;
@@ -68,10 +69,11 @@ static void clipper_init(ram_addr_t ram_size,

      /* Init the chipset.  */
      pci_bus = typhoon_init(ram_size,&rtc_irq, cpus, clipper_pci_map_irq);
+    isa_bus = NULL;

-    rtc_init(1980, rtc_irq);
-    pit_init(0x40, 0);
-    isa_create_simple("i8042");
+    rtc_init(isa_bus, 1980, rtc_irq);
+    pit_init(isa_bus, 0x40, 0);
+    isa_create_simple(isa_bus, "i8042");

      /* VGA setup.  Don't bother loading the bios.  */
      alpha_pci_vga_setup(pci_bus);
@@ -79,7 +81,7 @@ static void clipper_init(ram_addr_t ram_size,
      /* Serial code setup.  */
      for (i = 0; i<  MAX_SERIAL_PORTS; ++i) {
          if (serial_hds[i]) {
-            serial_isa_init(i, serial_hds[i]);
+            serial_isa_init(isa_bus, i, serial_hds[i]);
          }
      }

diff --git a/hw/alpha_typhoon.c b/hw/alpha_typhoon.c
index c7608bb..113837d 100644
--- a/hw/alpha_typhoon.c
+++ b/hw/alpha_typhoon.c
@@ -791,11 +791,12 @@ PCIBus *typhoon_init(ram_addr_t ram_size, qemu_irq 
*p_rtc_irq,
      /* ??? Technically there should be a cy82c693ub pci-isa bridge.  */
      {
          qemu_irq isa_pci_irq, *isa_irqs;
+        ISABus *isa_bus;

-        isa_bus_new(NULL, addr_space_io);
+        isa_bus = isa_bus_new(NULL, addr_space_io);
          isa_pci_irq = *qemu_allocate_irqs(typhoon_set_isa_irq, s, 1);
-        isa_irqs = i8259_init(isa_pci_irq);
-        isa_bus_irqs(isa_irqs);
+        isa_irqs = i8259_init(isa_bus, isa_pci_irq);
+        isa_bus_irqs(isa_bus, isa_irqs);
      }

      return b;
diff --git a/hw/audiodev.h b/hw/audiodev.h
index 8e930b2..9aac3bc 100644
--- a/hw/audiodev.h
+++ b/hw/audiodev.h
@@ -2,19 +2,19 @@
  int es1370_init(PCIBus *bus);

  /* sb16.c */
-int SB16_init(qemu_irq *pic);
+int SB16_init(ISABus *bus, qemu_irq *pic);

  /* adlib.c */
-int Adlib_init(qemu_irq *pic);
+int Adlib_init(ISABus *bus, qemu_irq *pic);

  /* gus.c */
-int GUS_init(qemu_irq *pic);
+int GUS_init(ISABus *bus, qemu_irq *pic);

  /* ac97.c */
  int ac97_init(PCIBus *buf);

  /* cs4231a.c */
-int cs4231a_init(qemu_irq *pic);
+int cs4231a_init(ISABus *bus, qemu_irq *pic);

  /* intel-hda.c + hda-audio.c */
  int intel_hda_and_codec_init(PCIBus *bus);
diff --git a/hw/cs4231a.c b/hw/cs4231a.c
index a7e03a3..0238829 100644
--- a/hw/cs4231a.c
+++ b/hw/cs4231a.c
@@ -659,9 +659,9 @@ static int cs4231a_initfn (ISADevice *dev)
      return 0;
  }

-int cs4231a_init (qemu_irq *pic)
+int cs4231a_init (ISABus *bus, qemu_irq *pic)
  {
-    isa_create_simple ("cs4231a");
+    isa_create_simple (bus, "cs4231a");
      return 0;
  }

diff --git a/hw/fdc.h b/hw/fdc.h
index 09f73c6..30bd56e 100644
--- a/hw/fdc.h
+++ b/hw/fdc.h
@@ -7,11 +7,11 @@
  /* fdc.c */
  #define MAX_FD 2

-static inline void fdctrl_init_isa(DriveInfo **fds)
+static inline void fdctrl_init_isa(ISABus *bus, DriveInfo **fds)
  {
      ISADevice *dev;

-    dev = isa_try_create("isa-fdc");
+    dev = isa_try_create(bus, "isa-fdc");
      if (!dev) {
          return;
      }
diff --git a/hw/gus.c b/hw/gus.c
index b5eb548..17cceee 100644
--- a/hw/gus.c
+++ b/hw/gus.c
@@ -293,9 +293,9 @@ static int gus_initfn (ISADevice *dev)
      return 0;
  }

-int GUS_init (qemu_irq *pic)
+int GUS_init (ISABus *bus, qemu_irq *pic)
  {
-    isa_create_simple ("gus");
+    isa_create_simple (bus, "gus");
      return 0;
  }

diff --git a/hw/i8254.c b/hw/i8254.c
index 12571ef..cf9ed2f 100644
--- a/hw/i8254.c
+++ b/hw/i8254.c
@@ -525,7 +525,7 @@ static int pit_initfn(ISADevice *dev)
      s =&pit->channels[0];
      /* the timer 0 is connected to an IRQ */
      s->irq_timer = qemu_new_timer_ns(vm_clock, pit_irq_timer, s);
-    s->irq = isa_get_irq(pit->irq);
+    s->irq = isa_get_irq(dev, pit->irq);

      memory_region_init_io(&pit->ioports,&pit_ioport_ops, pit, "pit", 4);
      isa_register_ioport(dev,&pit->ioports, pit->iobase);
diff --git a/hw/i8259.c b/hw/i8259.c
index ab519de..4446339 100644
--- a/hw/i8259.c
+++ b/hw/i8259.c
@@ -518,7 +518,7 @@ void irq_info(Monitor *mon)
  #endif
  }

-qemu_irq *i8259_init(qemu_irq parent_irq)
+qemu_irq *i8259_init(ISABus *bus, qemu_irq parent_irq)
  {
      qemu_irq *irq_set;
      ISADevice *dev;
@@ -526,7 +526,7 @@ qemu_irq *i8259_init(qemu_irq parent_irq)

      irq_set = g_malloc(ISA_NUM_IRQS * sizeof(qemu_irq));

-    dev = isa_create("isa-i8259");
+    dev = isa_create(bus, "isa-i8259");
      qdev_prop_set_uint32(&dev->qdev, "iobase", 0x20);
      qdev_prop_set_uint32(&dev->qdev, "elcr_addr", 0x4d0);
      qdev_prop_set_uint8(&dev->qdev, "elcr_mask", 0xf8);
@@ -540,7 +540,7 @@ qemu_irq *i8259_init(qemu_irq parent_irq)

      isa_pic = DO_UPCAST(PicState, dev, dev);

-    dev = isa_create("isa-i8259");
+    dev = isa_create(bus, "isa-i8259");
      qdev_prop_set_uint32(&dev->qdev, "iobase", 0xa0);
      qdev_prop_set_uint32(&dev->qdev, "elcr_addr", 0x4d1);
      qdev_prop_set_uint8(&dev->qdev, "elcr_mask", 0xde);
diff --git a/hw/ide.h b/hw/ide.h
index 9059aae..7075170 100644
--- a/hw/ide.h
+++ b/hw/ide.h
@@ -7,7 +7,7 @@
  #define MAX_IDE_DEVS  2

  /* ide-isa.c */
-ISADevice *isa_ide_init(int iobase, int iobase2, int isairq,
+ISADevice *isa_ide_init(ISABus *bus, int iobase, int iobase2, int isairq,
                          DriveInfo *hd0, DriveInfo *hd1);

  /* ide-pci.c */
diff --git a/hw/ide/isa.c b/hw/ide/isa.c
index 01a9e59..219f3a4 100644
--- a/hw/ide/isa.c
+++ b/hw/ide/isa.c
@@ -73,13 +73,13 @@ static int isa_ide_initfn(ISADevice *dev)
      return 0;
  };

-ISADevice *isa_ide_init(int iobase, int iobase2, int isairq,
+ISADevice *isa_ide_init(ISABus *bus, int iobase, int iobase2, int isairq,
                          DriveInfo *hd0, DriveInfo *hd1)
  {
      ISADevice *dev;
      ISAIDEState *s;

-    dev = isa_create("isa-ide");
+    dev = isa_create(bus, "isa-ide");
      qdev_prop_set_uint32(&dev->qdev, "iobase",  iobase);
      qdev_prop_set_uint32(&dev->qdev, "iobase2", iobase2);
      qdev_prop_set_uint32(&dev->qdev, "irq",     isairq);
diff --git a/hw/ide/piix.c b/hw/ide/piix.c
index 08cbbe2..3473345 100644
--- a/hw/ide/piix.c
+++ b/hw/ide/piix.c
@@ -136,7 +136,7 @@ static void pci_piix_init_ports(PCIIDEState *d) {
          ide_bus_new(&d->bus[i],&d->dev.qdev, i);
          ide_init_ioport(&d->bus[i], NULL, port_info[i].iobase,
                          port_info[i].iobase2);
-        ide_init2(&d->bus[i], isa_get_irq(port_info[i].isairq));
+        ide_init2(&d->bus[i], isa_get_irq(NULL, port_info[i].isairq));

          bmdma_init(&d->bus[i],&d->bmdma[i], d);
          d->bmdma[i].bus =&d->bus[i];
diff --git a/hw/ide/via.c b/hw/ide/via.c
index 098f150..d4af968 100644
--- a/hw/ide/via.c
+++ b/hw/ide/via.c
@@ -160,7 +160,7 @@ static void vt82c686b_init_ports(PCIIDEState *d) {
          ide_bus_new(&d->bus[i],&d->dev.qdev, i);
          ide_init_ioport(&d->bus[i], NULL, port_info[i].iobase,
                          port_info[i].iobase2);
-        ide_init2(&d->bus[i], isa_get_irq(port_info[i].isairq));
+        ide_init2(&d->bus[i], isa_get_irq(NULL, port_info[i].isairq));

          bmdma_init(&d->bus[i],&d->bmdma[i], d);
          d->bmdma[i].bus =&d->bus[i];
diff --git a/hw/isa-bus.c b/hw/isa-bus.c
index 7c2c261..dcbb134 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -56,8 +56,9 @@ ISABus *isa_bus_new(DeviceState *dev, MemoryRegion 
*address_space_io)
      return isabus;
  }

-void isa_bus_irqs(qemu_irq *irqs)
+void isa_bus_irqs(ISABus *bus, qemu_irq *irqs)
  {
+    assert(!bus || bus == isabus);
      isabus->irqs = irqs;
  }

@@ -67,8 +68,9 @@ void isa_bus_irqs(qemu_irq *irqs)
   * This function is only for special cases such as the 'ferr', and
   * temporary use for normal devices until they are converted to qdev.
   */
-qemu_irq isa_get_irq(int isairq)
+qemu_irq isa_get_irq(ISADevice *dev, int isairq)
  {
+    assert(!dev || DO_UPCAST(ISABus, qbus, dev->qdev.parent_bus) == isabus);
      if (isairq<  0 || isairq>  15) {
          hw_error("isa irq %d invalid", isairq);
      }
@@ -79,7 +81,7 @@ void isa_init_irq(ISADevice *dev, qemu_irq *p, int isairq)
  {
      assert(dev->nirqs<  ARRAY_SIZE(dev->isairq));
      dev->isairq[dev->nirqs] = isairq;
-    *p = isa_get_irq(isairq);
+    *p = isa_get_irq(dev, isairq);
      dev->nirqs++;
  }

@@ -129,10 +131,11 @@ void isa_qdev_register(ISADeviceInfo *info)
      qdev_register(&info->qdev);
  }

-ISADevice *isa_create(const char *name)
+ISADevice *isa_create(ISABus *bus, const char *name)
  {
      DeviceState *dev;

+    assert(!bus || bus == isabus);
      if (!isabus) {
          hw_error("Tried to create isa device %s with no isa bus present.",
                   name);
@@ -141,10 +144,11 @@ ISADevice *isa_create(const char *name)
      return DO_UPCAST(ISADevice, qdev, dev);
  }

-ISADevice *isa_try_create(const char *name)
+ISADevice *isa_try_create(ISABus *bus, const char *name)
  {
      DeviceState *dev;

+    assert(!bus || bus == isabus);
      if (!isabus) {
          hw_error("Tried to create isa device %s with no isa bus present.",
                   name);
@@ -153,11 +157,11 @@ ISADevice *isa_try_create(const char *name)
      return DO_UPCAST(ISADevice, qdev, dev);
  }

-ISADevice *isa_create_simple(const char *name)
+ISADevice *isa_create_simple(ISABus *bus, const char *name)
  {
      ISADevice *dev;

-    dev = isa_create(name);
+    dev = isa_create(bus, name);
      qdev_init_nofail(&dev->qdev);
      return dev;
  }
diff --git a/hw/isa.h b/hw/isa.h
index 5eb9c78..4b58e37 100644
--- a/hw/isa.h
+++ b/hw/isa.h
@@ -27,14 +27,14 @@ struct ISADeviceInfo {
  };

  ISABus *isa_bus_new(DeviceState *dev, MemoryRegion *address_space_io);
-void isa_bus_irqs(qemu_irq *irqs);
-qemu_irq isa_get_irq(int isairq);
+void isa_bus_irqs(ISABus *bus, qemu_irq *irqs);
+qemu_irq isa_get_irq(ISADevice *dev, int isairq);
  void isa_init_irq(ISADevice *dev, qemu_irq *p, int isairq);
  void isa_qdev_register(ISADeviceInfo *info);
  MemoryRegion *isa_address_space(ISADevice *dev);
-ISADevice *isa_create(const char *name);
-ISADevice *isa_try_create(const char *name);
-ISADevice *isa_create_simple(const char *name);
+ISADevice *isa_create(ISABus *bus, const char *name);
+ISADevice *isa_try_create(ISABus *bus, const char *name);
+ISADevice *isa_create_simple(ISABus *bus, const char *name);

  /**
   * isa_register_ioport: Install an I/O port region on the ISA bus.
diff --git a/hw/m48t59.c b/hw/m48t59.c
index f318e67..6ef812c 100644
--- a/hw/m48t59.c
+++ b/hw/m48t59.c
@@ -665,13 +665,14 @@ M48t59State *m48t59_init(qemu_irq IRQ, target_phys_addr_t 
mem_base,
      return state;
  }

-M48t59State *m48t59_init_isa(uint32_t io_base, uint16_t size, int type)
+M48t59State *m48t59_init_isa(ISABus *bus, uint32_t io_base, uint16_t size,
+                             int type)
  {
      M48t59ISAState *d;
      ISADevice *dev;
      M48t59State *s;

-    dev = isa_create("m48t59_isa");
+    dev = isa_create(bus, "m48t59_isa");
      qdev_prop_set_uint32(&dev->qdev, "type", type);
      qdev_prop_set_uint32(&dev->qdev, "size", size);
      qdev_prop_set_uint32(&dev->qdev, "io_base", io_base);
diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c
index 2aaca2f..881d8d1 100644
--- a/hw/mc146818rtc.c
+++ b/hw/mc146818rtc.c
@@ -650,12 +650,12 @@ static int rtc_initfn(ISADevice *dev)
      return 0;
  }

-ISADevice *rtc_init(int base_year, qemu_irq intercept_irq)
+ISADevice *rtc_init(ISABus *bus, int base_year, qemu_irq intercept_irq)
  {
      ISADevice *dev;
      RTCState *s;

-    dev = isa_create("mc146818rtc");
+    dev = isa_create(bus, "mc146818rtc");
      s = DO_UPCAST(RTCState, dev, dev);
      qdev_prop_set_int32(&dev->qdev, "base_year", base_year);
      qdev_init_nofail(&dev->qdev);
diff --git a/hw/mc146818rtc.h b/hw/mc146818rtc.h
index 575968c..f119930 100644
--- a/hw/mc146818rtc.h
+++ b/hw/mc146818rtc.h
@@ -5,7 +5,7 @@

  #define RTC_ISA_IRQ 8

-ISADevice *rtc_init(int base_year, qemu_irq intercept_irq);
+ISADevice *rtc_init(ISABus *bus, int base_year, qemu_irq intercept_irq);
  void rtc_set_memory(ISADevice *dev, int addr, int val);
  void rtc_set_date(ISADevice *dev, const struct tm *tm);

diff --git a/hw/mips_fulong2e.c b/hw/mips_fulong2e.c
index 04921c1..e6e120c 100644
--- a/hw/mips_fulong2e.c
+++ b/hw/mips_fulong2e.c
@@ -266,6 +266,7 @@ static void mips_fulong2e_init(ram_addr_t ram_size, const 
char *boot_device,
      qemu_irq *cpu_exit_irq;
      int via_devfn;
      PCIBus *pci_bus;
+    ISABus *isa_bus;
      i2c_bus *smbus;
      int i;
      DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
@@ -342,11 +343,12 @@ static void mips_fulong2e_init(ram_addr_t ram_size, const 
char *boot_device,
          fprintf(stderr, "vt82c686b_init error\n");
          exit(1);
      }
+    isa_bus = NULL;

      /* Interrupt controller */
      /* The 8259 ->  IP5  */
-    i8259 = i8259_init(env->irq[5]);
-    isa_bus_irqs(i8259);
+    i8259 = i8259_init(isa_bus, env->irq[5]);
+    isa_bus_irqs(isa_bus, i8259);

      vt82c686b_ide_init(pci_bus, hd, PCI_DEVFN(FULONG2E_VIA_SLOT, 1));
      usb_uhci_vt82c686b_init(pci_bus, PCI_DEVFN(FULONG2E_VIA_SLOT, 2));
@@ -358,23 +360,23 @@ static void mips_fulong2e_init(ram_addr_t ram_size, const 
char *boot_device,
      smbus_eeprom_init(smbus, 1, eeprom_spd, sizeof(eeprom_spd));

      /* init other devices */
-    pit = pit_init(0x40, 0);
+    pit = pit_init(isa_bus, 0x40, 0);
      cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
      DMA_init(0, cpu_exit_irq);

      /* Super I/O */
-    isa_create_simple("i8042");
+    isa_create_simple(isa_bus, "i8042");

-    rtc_init(2000, NULL);
+    rtc_init(isa_bus, 2000, NULL);

      for(i = 0; i<  MAX_SERIAL_PORTS; i++) {
          if (serial_hds[i]) {
-            serial_isa_init(i, serial_hds[i]);
+            serial_isa_init(isa_bus, i, serial_hds[i]);
          }
      }

      if (parallel_hds[0]) {
-        parallel_init(0, parallel_hds[0]);
+        parallel_init(isa_bus, 0, parallel_hds[0]);
      }

      /* Sound card */
diff --git a/hw/mips_jazz.c b/hw/mips_jazz.c
index 14beea2..ef6c83f 100644
--- a/hw/mips_jazz.c
+++ b/hw/mips_jazz.c
@@ -120,6 +120,7 @@ static void mips_jazz_init(MemoryRegion *address_space,
      NICInfo *nd;
      DeviceState *dev;
      SysBusDevice *sysbus;
+    ISABus *isa_bus;
      ISADevice *pit;
      DriveInfo *fds[MAX_FD];
      qemu_irq esp_reset, dma_enable;
@@ -182,12 +183,12 @@ static void mips_jazz_init(MemoryRegion *address_space,
      memory_region_add_subregion(address_space, 0x8000d000, dma_dummy);

      /* ISA devices */
-    isa_bus_new(NULL, address_space_io);
-    i8259 = i8259_init(env->irq[4]);
-    isa_bus_irqs(i8259);
+    isa_bus = isa_bus_new(NULL, address_space_io);
+    i8259 = i8259_init(isa_bus, env->irq[4]);
+    isa_bus_irqs(isa_bus, i8259);
      cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
      DMA_init(0, cpu_exit_irq);
-    pit = pit_init(0x40, 0);
+    pit = pit_init(isa_bus, 0x40, 0);
      pcspk_init(pit);

      /* ISA IO space at 0x90000000 */
@@ -254,7 +255,7 @@ static void mips_jazz_init(MemoryRegion *address_space,
      fdctrl_init_sysbus(rc4030[1], 0, 0x80003000, fds);

      /* Real time clock */
-    rtc_init(1980, NULL);
+    rtc_init(isa_bus, 1980, NULL);
      memory_region_init_io(rtc,&rtc_ops, NULL, "rtc", 0x1000);
      memory_region_add_subregion(address_space, 0x80004000, rtc);

@@ -278,7 +279,7 @@ static void mips_jazz_init(MemoryRegion *address_space,

      /* Sound card */
      /* FIXME: missing Jazz sound at 0x8000c000, rc4030[2] */
-    audio_init(i8259, NULL);
+    audio_init(isa_bus, i8259, NULL);

      /* NVRAM */
      dev = qdev_create(NULL, "ds1225y");
diff --git a/hw/mips_malta.c b/hw/mips_malta.c
index bb49749..98177f3 100644
--- a/hw/mips_malta.c
+++ b/hw/mips_malta.c
@@ -774,6 +774,7 @@ void mips_malta_init (ram_addr_t ram_size,
      target_long bios_size;
      int64_t kernel_entry;
      PCIBus *pci_bus;
+    ISABus *isa_bus;
      CPUState *env;
      qemu_irq *i8259 = NULL, *isa_irq;
      qemu_irq *cpu_exit_irq;
@@ -941,37 +942,38 @@ void mips_malta_init (ram_addr_t ram_size,
      ide_drive_get(hd, MAX_IDE_BUS);

      piix4_devfn = piix4_init(pci_bus, 80);
+    isa_bus = NULL;

      /* Interrupt controller */
      /* The 8259 is attached to the MIPS CPU INT0 pin, ie interrupt 2 */
-    i8259 = i8259_init(env->irq[2]);
+    i8259 = i8259_init(isa_bus, env->irq[2]);

-    isa_bus_irqs(i8259);
+    isa_bus_irqs(isa_bus, i8259);
      pci_piix4_ide_init(pci_bus, hd, piix4_devfn + 1);
      usb_uhci_piix4_init(pci_bus, piix4_devfn + 2);
-    smbus = piix4_pm_init(pci_bus, piix4_devfn + 3, 0x1100, isa_get_irq(9),
-                          NULL, NULL, 0);
+    smbus = piix4_pm_init(pci_bus, piix4_devfn + 3, 0x1100,
+                          isa_get_irq(NULL, 9), NULL, NULL, 0);
      /* TODO: Populate SPD eeprom data.  */
      smbus_eeprom_init(smbus, 8, NULL, 0);
-    pit = pit_init(0x40, 0);
+    pit = pit_init(isa_bus, 0x40, 0);
      cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
      DMA_init(0, cpu_exit_irq);

      /* Super I/O */
-    isa_create_simple("i8042");
+    isa_create_simple(isa_bus, "i8042");

-    rtc_init(2000, NULL);
-    serial_isa_init(0, serial_hds[0]);
-    serial_isa_init(1, serial_hds[1]);
+    rtc_init(isa_bus, 2000, NULL);
+    serial_isa_init(isa_bus, 0, serial_hds[0]);
+    serial_isa_init(isa_bus, 1, serial_hds[1]);
      if (parallel_hds[0])
-        parallel_init(0, parallel_hds[0]);
+        parallel_init(isa_bus, 0, parallel_hds[0]);
      for(i = 0; i<  MAX_FD; i++) {
          fd[i] = drive_get(IF_FLOPPY, 0, i);
      }
-    fdctrl_init_isa(fd);
+    fdctrl_init_isa(isa_bus, fd);

      /* Sound card */
-    audio_init(NULL, pci_bus);
+    audio_init(isa_bus, NULL, pci_bus);

      /* Network card */
      network_init();
diff --git a/hw/mips_r4k.c b/hw/mips_r4k.c
index d0564d4..c078078 100644
--- a/hw/mips_r4k.c
+++ b/hw/mips_r4k.c
@@ -165,6 +165,7 @@ void mips_r4k_init (ram_addr_t ram_size,
      ResetData *reset_info;
      int i;
      qemu_irq *i8259;
+    ISABus *isa_bus;
      DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
      DriveInfo *dinfo;
      int be;
@@ -256,36 +257,36 @@ void mips_r4k_init (ram_addr_t ram_size,
      cpu_mips_clock_init(env);

      /* The PIC is attached to the MIPS CPU INT0 pin */
-    isa_bus_new(NULL, get_system_io());
-    i8259 = i8259_init(env->irq[2]);
-    isa_bus_irqs(i8259);
+    isa_bus = isa_bus_new(NULL, get_system_io());
+    i8259 = i8259_init(isa_bus, env->irq[2]);
+    isa_bus_irqs(isa_bus, i8259);

-    rtc_init(2000, NULL);
+    rtc_init(isa_bus, 2000, NULL);

      /* Register 64 KB of ISA IO space at 0x14000000 */
      isa_mmio_init(0x14000000, 0x00010000);
      isa_mem_base = 0x10000000;

-    pit = pit_init(0x40, 0);
+    pit = pit_init(isa_bus, 0x40, 0);

      for(i = 0; i<  MAX_SERIAL_PORTS; i++) {
          if (serial_hds[i]) {
-            serial_isa_init(i, serial_hds[i]);
+            serial_isa_init(isa_bus, i, serial_hds[i]);
          }
      }

-    isa_vga_init();
+    isa_vga_init(isa_bus);

      if (nd_table[0].vlan)
-        isa_ne2000_init(0x300, 9,&nd_table[0]);
+        isa_ne2000_init(isa_bus, 0x300, 9,&nd_table[0]);

      ide_drive_get(hd, MAX_IDE_BUS);
      for(i = 0; i<  MAX_IDE_BUS; i++)
-        isa_ide_init(ide_iobase[i], ide_iobase2[i], ide_irq[i],
+        isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i], ide_irq[i],
                       hd[MAX_IDE_DEVS * i],
                     hd[MAX_IDE_DEVS * i + 1]);

-    isa_create_simple("i8042");
+    isa_create_simple(isa_bus, "i8042");
  }

  static QEMUMachine mips_machine = {
diff --git a/hw/nvram.h b/hw/nvram.h
index 0f55b24..8924da4 100644
--- a/hw/nvram.h
+++ b/hw/nvram.h
@@ -34,7 +34,8 @@ typedef struct M48t59State M48t59State;
  void m48t59_write (void *private, uint32_t addr, uint32_t val);
  uint32_t m48t59_read (void *private, uint32_t addr);
  void m48t59_toggle_lock (void *private, int lock);
-M48t59State *m48t59_init_isa(uint32_t io_base, uint16_t size, int type);
+M48t59State *m48t59_init_isa(ISABus *bus, uint32_t io_base, uint16_t size,
+                             int type);
  M48t59State *m48t59_init(qemu_irq IRQ, target_phys_addr_t mem_base,
                           uint32_t io_base, uint16_t size, int type);
  void m48t59_set_addr (void *opaque, uint32_t addr);
diff --git a/hw/pc.c b/hw/pc.c
index f0802b7..3a1bb8e 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -849,13 +849,13 @@ static const int ne2000_irq[NE2000_NB_MAX] = { 9, 10, 11, 
3, 4, 5 };
  static const int parallel_io[MAX_PARALLEL_PORTS] = { 0x378, 0x278, 0x3bc };
  static const int parallel_irq[MAX_PARALLEL_PORTS] = { 7, 7, 7 };

-void pc_init_ne2k_isa(NICInfo *nd)
+void pc_init_ne2k_isa(ISABus *bus, NICInfo *nd)
  {
      static int nb_ne2k = 0;

      if (nb_ne2k == NE2000_NB_MAX)
          return;
-    isa_ne2000_init(ne2000_io[nb_ne2k],
+    isa_ne2000_init(bus, ne2000_io[nb_ne2k],
                      ne2000_irq[nb_ne2k], nd);
      nb_ne2k++;
  }
@@ -1070,7 +1070,7 @@ qemu_irq *pc_allocate_cpu_irq(void)
      return qemu_allocate_irqs(pic_irq_request, NULL, 1);
  }

-void pc_vga_init(PCIBus *pci_bus)
+void pc_vga_init(ISABus *isa_bus, PCIBus *pci_bus)
  {
      if (cirrus_vga_enabled) {
          if (pci_bus) {
@@ -1099,7 +1099,7 @@ void pc_vga_init(PCIBus *pci_bus)
          if (pci_bus) {
              pci_vga_init(pci_bus);
          } else {
-            isa_vga_init();
+            isa_vga_init(isa_bus);
          }
      }

@@ -1109,7 +1109,7 @@ void pc_vga_init(PCIBus *pci_bus)
       * For nographic case, sga is enabled at all times
       */
      if (display_type == DT_NOGRAPHIC) {
-        isa_create_simple("sga");
+        isa_create_simple(isa_bus, "sga");
      }
  }

@@ -1122,7 +1122,7 @@ static void cpu_request_exit(void *opaque, int irq, int 
level)
      }
  }

-void pc_basic_device_init(qemu_irq *gsi,
+void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
                            ISADevice **rtc_state,
                            bool no_vmport)
  {
@@ -1147,31 +1147,31 @@ void pc_basic_device_init(qemu_irq *gsi,
              rtc_irq = qdev_get_gpio_in(hpet, 0);
          }
      }
-    *rtc_state = rtc_init(2000, rtc_irq);
+    *rtc_state = rtc_init(isa_bus, 2000, rtc_irq);

      qemu_register_boot_set(pc_boot_set, *rtc_state);

-    pit = pit_init(0x40, 0);
+    pit = pit_init(isa_bus, 0x40, 0);
      pcspk_init(pit);

      for(i = 0; i<  MAX_SERIAL_PORTS; i++) {
          if (serial_hds[i]) {
-            serial_isa_init(i, serial_hds[i]);
+            serial_isa_init(isa_bus, i, serial_hds[i]);
          }
      }

      for(i = 0; i<  MAX_PARALLEL_PORTS; i++) {
          if (parallel_hds[i]) {
-            parallel_init(i, parallel_hds[i]);
+            parallel_init(isa_bus, i, parallel_hds[i]);
          }
      }

      a20_line = qemu_allocate_irqs(handle_a20_line_change, first_cpu, 2);
-    i8042 = isa_create_simple("i8042");
+    i8042 = isa_create_simple(isa_bus, "i8042");
      i8042_setup_a20_line(i8042,&a20_line[0]);
      if (!no_vmport) {
-        vmport_init();
-        vmmouse = isa_try_create("vmmouse");
+        vmport_init(isa_bus);
+        vmmouse = isa_try_create(isa_bus, "vmmouse");
      } else {
          vmmouse = NULL;
      }
@@ -1179,7 +1179,7 @@ void pc_basic_device_init(qemu_irq *gsi,
          qdev_prop_set_ptr(&vmmouse->qdev, "ps2_mouse", i8042);
          qdev_init_nofail(&vmmouse->qdev);
      }
-    port92 = isa_create_simple("port92");
+    port92 = isa_create_simple(isa_bus, "port92");
      port92_init(port92,&a20_line[1]);

      cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
@@ -1188,7 +1188,7 @@ void pc_basic_device_init(qemu_irq *gsi,
      for(i = 0; i<  MAX_FD; i++) {
          fd[i] = drive_get(IF_FLOPPY, 0, i);
      }
-    fdctrl_init_isa(fd);
+    fdctrl_init_isa(isa_bus, fd);
  }

  void pc_pci_device_init(PCIBus *pci_bus)
diff --git a/hw/pc.h b/hw/pc.h
index b8ad9a3..c43fa73 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -20,11 +20,12 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
                              target_phys_addr_t base, int it_shift,
                              qemu_irq irq, int baudbase,
                              CharDriverState *chr, enum device_endian);
-static inline bool serial_isa_init(int index, CharDriverState *chr)
+static inline bool serial_isa_init(ISABus *bus, int index,
+                                   CharDriverState *chr)
  {
      ISADevice *dev;

-    dev = isa_try_create("isa-serial");
+    dev = isa_try_create(bus, "isa-serial");
      if (!dev) {
          return false;
      }
@@ -39,11 +40,11 @@ static inline bool serial_isa_init(int index, 
CharDriverState *chr)
  void serial_set_frequency(SerialState *s, uint32_t frequency);

  /* parallel.c */
-static inline bool parallel_init(int index, CharDriverState *chr)
+static inline bool parallel_init(ISABus *bus, int index, CharDriverState *chr)
  {
      ISADevice *dev;

-    dev = isa_try_create("isa-parallel");
+    dev = isa_try_create(bus, "isa-parallel");
      if (!dev) {
          return false;
      }
@@ -62,7 +63,7 @@ bool parallel_mm_init(target_phys_addr_t base, int it_shift, 
qemu_irq irq,

  typedef struct PicState PicState;
  extern PicState *isa_pic;
-qemu_irq *i8259_init(qemu_irq parent_irq);
+qemu_irq *i8259_init(ISABus *bus, qemu_irq parent_irq);
  int pic_read_irq(PicState *s);
  int pic_get_output(PicState *s);
  void pic_info(Monitor *mon);
@@ -83,11 +84,11 @@ void gsi_handler(void *opaque, int n, int level);

  #define PIT_FREQ 1193182

-static inline ISADevice *pit_init(int base, int irq)
+static inline ISADevice *pit_init(ISABus *bus, int base, int irq)
  {
      ISADevice *dev;

-    dev = isa_create("isa-pit");
+    dev = isa_create(bus, "isa-pit");
      qdev_prop_set_uint32(&dev->qdev, "iobase", base);
      qdev_prop_set_uint32(&dev->qdev, "irq", irq);
      qdev_init_nofail(&dev->qdev);
@@ -105,9 +106,9 @@ void hpet_pit_disable(void);
  void hpet_pit_enable(void);

  /* vmport.c */
-static inline void vmport_init(void)
+static inline void vmport_init(ISABus *bus)
  {
-    isa_create_simple("vmport");
+    isa_create_simple(bus, "vmport");
  }
  void vmport_register(unsigned char command, IOPortReadFunc *func, void 
*opaque);
  void vmmouse_get_data(uint32_t *data);
@@ -139,11 +140,11 @@ void pc_memory_init(MemoryRegion *system_memory,
                      MemoryRegion *rom_memory,
                      MemoryRegion **ram_memory);
  qemu_irq *pc_allocate_cpu_irq(void);
-void pc_vga_init(PCIBus *pci_bus);
-void pc_basic_device_init(qemu_irq *gsi,
+void pc_vga_init(ISABus *isa_bus, PCIBus *pci_bus);
+void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
                            ISADevice **rtc_state,
                            bool no_vmport);
-void pc_init_ne2k_isa(NICInfo *nd);
+void pc_init_ne2k_isa(ISABus *bus, NICInfo *nd);
  void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
                    const char *boot_device,
                    BusState *ide0, BusState *ide1,
@@ -173,7 +174,7 @@ extern int no_hpet;

  /* pcspk.c */
  void pcspk_init(ISADevice *pit);
-int pcspk_audio_init(qemu_irq *pic);
+int pcspk_audio_init(ISABus *bus, qemu_irq *pic);

  /* piix_pci.c */
  struct PCII440FXState;
@@ -203,11 +204,11 @@ enum vga_retrace_method {

  extern enum vga_retrace_method vga_retrace_method;

-static inline int isa_vga_init(void)
+static inline int isa_vga_init(ISABus *bus)
  {
      ISADevice *dev;

-    dev = isa_try_create("isa-vga");
+    dev = isa_try_create(bus, "isa-vga");
      if (!dev) {
          fprintf(stderr, "Warning: isa-vga not available\n");
          return 0;
@@ -226,13 +227,13 @@ void pci_cirrus_vga_init(PCIBus *bus);
  void isa_cirrus_vga_init(MemoryRegion *address_space);

  /* ne2000.c */
-static inline bool isa_ne2000_init(int base, int irq, NICInfo *nd)
+static inline bool isa_ne2000_init(ISABus *bus, int base, int irq, NICInfo *nd)
  {
      ISADevice *dev;

      qemu_check_nic_model(nd, "ne2k_isa");

-    dev = isa_try_create("ne2k_isa");
+    dev = isa_try_create(bus, "ne2k_isa");
      if (!dev) {
          return false;
      }
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
index c89042f..6bc1f60 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -84,6 +84,7 @@ static void pc_init1(MemoryRegion *system_memory,
      int i;
      ram_addr_t below_4g_mem_size, above_4g_mem_size;
      PCIBus *pci_bus;
+    ISABus *isa_bus;
      PCII440FXState *i440fx_state;
      int piix3_devfn = -1;
      qemu_irq *cpu_irq;
@@ -143,17 +144,18 @@ static void pc_init1(MemoryRegion *system_memory,
                                 ? 0
                                 : ((uint64_t)1<<  62)),
                                pci_memory, ram_memory);
+        isa_bus = NULL;
      } else {
          pci_bus = NULL;
          i440fx_state = NULL;
-        isa_bus_new(NULL, system_io);
+        isa_bus = isa_bus_new(NULL, system_io);
          no_hpet = 1;
      }
-    isa_bus_irqs(gsi);
+    isa_bus_irqs(isa_bus, gsi);

      if (!xen_enabled()) {
          cpu_irq = pc_allocate_cpu_irq();
-        i8259 = i8259_init(cpu_irq[0]);
+        i8259 = i8259_init(isa_bus, cpu_irq[0]);
      } else {
          i8259 = xen_interrupt_controller_init();
      }
@@ -167,20 +169,20 @@ static void pc_init1(MemoryRegion *system_memory,

      pc_register_ferr_irq(gsi[13]);

-    pc_vga_init(pci_enabled? pci_bus: NULL);
+    pc_vga_init(isa_bus, pci_enabled ? pci_bus : NULL);

      if (xen_enabled()) {
          pci_create_simple(pci_bus, -1, "xen-platform");
      }

      /* init basic PC hardware */
-    pc_basic_device_init(gsi,&rtc_state, xen_enabled());
+    pc_basic_device_init(isa_bus, gsi,&rtc_state, xen_enabled());

      for(i = 0; i<  nb_nics; i++) {
          NICInfo *nd =&nd_table[i];

          if (!pci_enabled || (nd->model&&  strcmp(nd->model, "ne2k_isa") == 0))
-            pc_init_ne2k_isa(nd);
+            pc_init_ne2k_isa(isa_bus, nd);
          else
              pci_nic_init_nofail(nd, "e1000", NULL);
      }
@@ -198,13 +200,14 @@ static void pc_init1(MemoryRegion *system_memory,
      } else {
          for(i = 0; i<  MAX_IDE_BUS; i++) {
              ISADevice *dev;
-            dev = isa_ide_init(ide_iobase[i], ide_iobase2[i], ide_irq[i],
+            dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i],
+                               ide_irq[i],
                                 hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 
1]);
              idebus[i] = qdev_get_child_bus(&dev->qdev, "ide.0");
          }
      }

-    audio_init(gsi, pci_enabled ? pci_bus : NULL);
+    audio_init(isa_bus, gsi, pci_enabled ? pci_bus : NULL);

      pc_cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device,
                   idebus[0], idebus[1], rtc_state);
diff --git a/hw/pcspk.c b/hw/pcspk.c
index 7fa2d36..4d949fb 100644
--- a/hw/pcspk.c
+++ b/hw/pcspk.c
@@ -96,7 +96,7 @@ static void pcspk_callback(void *opaque, int free)
      }
  }

-int pcspk_audio_init(qemu_irq *pic)
+int pcspk_audio_init(ISABus *bus, qemu_irq *pic)
  {
      PCSpkState *s =&pcspk_state;
      struct audsettings as = {PCSPK_SAMPLE_RATE, 1, AUD_FMT_U8, 0};
diff --git a/hw/ppc_prep.c b/hw/ppc_prep.c
index f22d5b9..a7d73bf 100644
--- a/hw/ppc_prep.c
+++ b/hw/ppc_prep.c
@@ -523,6 +523,7 @@ static void ppc_prep_init (ram_addr_t ram_size,
      uint32_t kernel_base, initrd_base;
      long kernel_size, initrd_size;
      PCIBus *pci_bus;
+    ISABus *isa_bus;
      qemu_irq *i8259;
      qemu_irq *cpu_exit_irq;
      int ppc_boot_device;
@@ -628,10 +629,10 @@ static void ppc_prep_init (ram_addr_t ram_size,
          hw_error("Only 6xx bus is supported on PREP machine\n");
      }
      /* Hmm, prep has no pci-isa bridge ??? */
-    isa_bus_new(NULL, get_system_io());
-    i8259 = i8259_init(first_cpu->irq_inputs[PPC6xx_INPUT_INT]);
+    isa_bus = isa_bus_new(NULL, get_system_io());
+    i8259 = i8259_init(isa_bus, first_cpu->irq_inputs[PPC6xx_INPUT_INT]);
      pci_bus = pci_prep_init(i8259, get_system_memory(), get_system_io());
-    isa_bus_irqs(i8259);
+    isa_bus_irqs(isa_bus, i8259);
      //    pci_bus = i440fx_init();
      /* Register 8 MB of ISA IO space (needed for non-contiguous map) */
      memory_region_init_io(PPC_io_memory,&PPC_prep_io_ops, sysctrl,
@@ -642,10 +643,10 @@ static void ppc_prep_init (ram_addr_t ram_size,
      pci_vga_init(pci_bus);
      //    openpic = openpic_init(0x00000000, 0xF0000000, 1);
      //    pit = pit_init(0x40, 0);
-    rtc_init(2000, NULL);
+    rtc_init(isa_bus, 2000, NULL);

      if (serial_hds[0])
-        serial_isa_init(0, serial_hds[0]);
+        serial_isa_init(isa_bus, 0, serial_hds[0]);
      nb_nics1 = nb_nics;
      if (nb_nics1>  NE2000_NB_MAX)
          nb_nics1 = NE2000_NB_MAX;
@@ -654,7 +655,8 @@ static void ppc_prep_init (ram_addr_t ram_size,
            nd_table[i].model = g_strdup("ne2k_isa");
          }
          if (strcmp(nd_table[i].model, "ne2k_isa") == 0) {
-            isa_ne2000_init(ne2000_io[i], ne2000_irq[i],&nd_table[i]);
+            isa_ne2000_init(isa_bus, ne2000_io[i], ne2000_irq[i],
+&nd_table[i]);
          } else {
              pci_nic_init_nofail(&nd_table[i], "ne2k_pci", NULL);
          }
@@ -662,11 +664,11 @@ static void ppc_prep_init (ram_addr_t ram_size,

      ide_drive_get(hd, MAX_IDE_BUS);
      for(i = 0; i<  MAX_IDE_BUS; i++) {
-        isa_ide_init(ide_iobase[i], ide_iobase2[i], ide_irq[i],
+        isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i], ide_irq[i],
                       hd[2 * i],
                     hd[2 * i + 1]);
      }
-    isa_create_simple("i8042");
+    isa_create_simple(isa_bus, "i8042");

      cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
      DMA_init(1, cpu_exit_irq);
@@ -676,7 +678,7 @@ static void ppc_prep_init (ram_addr_t ram_size,
      for(i = 0; i<  MAX_FD; i++) {
          fd[i] = drive_get(IF_FLOPPY, 0, i);
      }
-    fdctrl_init_isa(fd);
+    fdctrl_init_isa(isa_bus, fd);

      /* Register speaker port */
      register_ioport_read(0x61, 1, 1, speaker_ioport_read, NULL);
diff --git a/hw/sb16.c b/hw/sb16.c
index f0658ac..88ad8e8 100644
--- a/hw/sb16.c
+++ b/hw/sb16.c
@@ -1385,9 +1385,9 @@ static int sb16_initfn (ISADevice *dev)
      return 0;
  }

-int SB16_init (qemu_irq *pic)
+int SB16_init (ISABus *bus, qemu_irq *pic)
  {
-    isa_create_simple ("sb16");
+    isa_create_simple (bus, "sb16");
      return 0;
  }

diff --git a/hw/sun4u.c b/hw/sun4u.c
index eaaefe3..1e45192 100644
--- a/hw/sun4u.c
+++ b/hw/sun4u.c
@@ -526,14 +526,17 @@ static void dummy_isa_irq_handler(void *opaque, int n, 
int level)
  }

  /* EBUS (Eight bit bus) bridge */
-static void
+static ISABus *
  pci_ebus_init(PCIBus *bus, int devfn)
  {
      qemu_irq *isa_irq;
+    ISABus *isa_bus;

      pci_create_simple(bus, devfn, "ebus");
+    isa_bus = NULL;
      isa_irq = qemu_allocate_irqs(dummy_isa_irq_handler, NULL, 16);
-    isa_bus_irqs(isa_irq);
+    isa_bus_irqs(isa_bus, isa_irq);
+    return isa_bus;
  }

  static int
@@ -744,6 +747,7 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
      unsigned int i;
      long initrd_size, kernel_size;
      PCIBus *pci_bus, *pci_bus2, *pci_bus3;
+    ISABus *isa_bus;
      qemu_irq *irq;
      DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
      DriveInfo *fd[MAX_FD];
@@ -764,7 +768,7 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
      pci_vga_init(pci_bus);

      // XXX Should be pci_bus3
-    pci_ebus_init(pci_bus, -1);
+    isa_bus = pci_ebus_init(pci_bus, -1);

      i = 0;
      if (hwdef->console_serial_base) {
@@ -774,13 +778,13 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
      }
      for(; i<  MAX_SERIAL_PORTS; i++) {
          if (serial_hds[i]) {
-            serial_isa_init(i, serial_hds[i]);
+            serial_isa_init(isa_bus, i, serial_hds[i]);
          }
      }

      for(i = 0; i<  MAX_PARALLEL_PORTS; i++) {
          if (parallel_hds[i]) {
-            parallel_init(i, parallel_hds[i]);
+            parallel_init(isa_bus, i, parallel_hds[i]);
          }
      }

@@ -791,12 +795,12 @@ static void sun4uv_init(MemoryRegion *address_space_mem,

      pci_cmd646_ide_init(pci_bus, hd, 1);

-    isa_create_simple("i8042");
+    isa_create_simple(isa_bus, "i8042");
      for(i = 0; i<  MAX_FD; i++) {
          fd[i] = drive_get(IF_FLOPPY, 0, i);
      }
-    fdctrl_init_isa(fd);
-    nvram = m48t59_init_isa(0x0074, NVRAM_SIZE, 59);
+    fdctrl_init_isa(isa_bus, fd);
+    nvram = m48t59_init_isa(isa_bus, 0x0074, NVRAM_SIZE, 59);

      initrd_size = 0;
      kernel_size = sun4u_load_kernel(kernel_filename, initrd_filename,
diff --git a/qemu-common.h b/qemu-common.h
index 5e87bdf..522f328 100644
--- a/qemu-common.h
+++ b/qemu-common.h
@@ -242,6 +242,7 @@ typedef struct VLANState VLANState;
  typedef struct VLANClientState VLANClientState;
  typedef struct i2c_bus i2c_bus;
  typedef struct i2c_slave i2c_slave;
+typedef struct ISABus ISABus;
  typedef struct SMBusDevice SMBusDevice;
  typedef struct PCIHostState PCIHostState;
  typedef struct PCIExpressHost PCIExpressHost;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]