Merge remote-tracking branch 'remotes/afaerber/tags/qom-devices-for-peter' into staging
authorPeter Maydell <peter.maydell@linaro.org>
Mon, 2 Mar 2015 13:20:43 +0000 (13:20 +0000)
committerPeter Maydell <peter.maydell@linaro.org>
Mon, 2 Mar 2015 13:20:43 +0000 (13:20 +0000)
QOM infrastructure fixes and device conversions

* Assertion fix for device_add with non-device types
* Documentation fix
* qdev_init() error reporting cleanups

# gpg: Signature made Tue Feb 24 13:56:33 2015 GMT using RSA key ID 3E7E013F
# gpg: Good signature from "Andreas Färber <afaerber@suse.de>"
# gpg:                 aka "Andreas Färber <afaerber@suse.com>"

* remotes/afaerber/tags/qom-devices-for-peter:
  parallel: parallel_hds_isa_init() shouldn't fail
  parallel: Factor out common parallel_hds_isa_init()
  serial: serial_hds_isa_init() shouldn't fail
  serial: Factor out common serial_hds_isa_init()
  etsec: Replace qdev_init() by qdev_init_nofail()
  leon3: Replace unchecked qdev_init() by qdev_init_nofail()
  ide/isa: Replace unchecked qdev_init() by qdev_init_nofail()
  qdev: Improve qdev_init_nofail()'s error reporting
  qom: Fix typo, 'my_class_init' -> 'derived_class_init'
  qdev: Avoid type assertion in qdev_build_hotpluggable_device_list()

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
1  2 
hw/core/qdev.c
hw/i386/pc.c
hw/mips/mips_r4k.c
hw/sparc64/sun4u.c
include/hw/i386/pc.h

diff --combined hw/core/qdev.c
@@@ -373,10 -373,15 +373,15 @@@ void qdev_simple_device_unplug_cb(Hotpl
     way is somewhat unclean, and best avoided.  */
  void qdev_init_nofail(DeviceState *dev)
  {
-     const char *typename = object_get_typename(OBJECT(dev));
+     Error *err = NULL;
  
-     if (qdev_init(dev) < 0) {
-         error_report("Initialization of device %s failed", typename);
+     assert(!dev->realized);
+     object_property_set_bool(OBJECT(dev), true, "realized", &err);
+     if (err) {
+         error_report("Initialization of device %s failed: %s",
+                      object_get_typename(OBJECT(dev)),
+                      error_get_pretty(err));
          exit(1);
      }
  }
@@@ -818,13 -823,6 +823,13 @@@ static char *qdev_get_fw_dev_path_from_
      return d;
  }
  
 +char *qdev_get_own_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
 +{
 +    Object *obj = OBJECT(dev);
 +
 +    return fw_path_provider_try_get_dev_path(obj, bus, dev);
 +}
 +
  static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
  {
      int l = 0;
@@@ -995,7 -993,12 +1000,12 @@@ void qdev_alias_all_properties(DeviceSt
  static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
  {
      GSList **list = opaque;
-     DeviceState *dev = DEVICE(obj);
+     DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj),
+                                                           TYPE_DEVICE);
+     if (dev == NULL) {
+         return 0;
+     }
  
      if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
          *list = g_slist_append(*list, dev);
diff --combined hw/i386/pc.c
@@@ -41,7 -41,6 +41,7 @@@
  #include "hw/pci/msi.h"
  #include "hw/sysbus.h"
  #include "sysemu/sysemu.h"
 +#include "sysemu/numa.h"
  #include "sysemu/kvm.h"
  #include "kvm_i386.h"
  #include "hw/xen/xen.h"
@@@ -415,7 -414,7 +415,7 @@@ void pc_cmos_init(ram_addr_t ram_size, 
  
      set_boot_dev(s, boot_device, &local_err);
      if (local_err) {
 -        error_report("%s", error_get_pretty(local_err));
 +        error_report_err(local_err);
          exit(1);
      }
  
@@@ -1041,7 -1040,8 +1041,7 @@@ void pc_cpus_init(const char *cpu_model
          cpu = pc_new_cpu(cpu_model, x86_cpu_apic_id_from_index(i),
                           icc_bridge, &error);
          if (error) {
 -            error_report("%s", error_get_pretty(error));
 -            error_free(error);
 +            error_report_err(error);
              exit(1);
          }
      }
@@@ -1419,17 -1419,8 +1419,8 @@@ void pc_basic_device_init(ISABus *isa_b
          pcspk_init(isa_bus, pit);
      }
  
-     for(i = 0; i < MAX_SERIAL_PORTS; i++) {
-         if (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(isa_bus, i, parallel_hds[i]);
-         }
-     }
+     serial_hds_isa_init(isa_bus, MAX_SERIAL_PORTS);
+     parallel_hds_isa_init(isa_bus, MAX_PARALLEL_PORTS);
  
      a20_line = qemu_allocate_irqs(handle_a20_line_change, first_cpu, 2);
      i8042 = isa_create_simple(isa_bus, "i8042");
diff --combined hw/mips/mips_r4k.c
@@@ -165,8 -165,7 +165,8 @@@ void mips_r4k_init(MachineState *machin
      MemoryRegion *ram = g_new(MemoryRegion, 1);
      MemoryRegion *bios;
      MemoryRegion *iomem = g_new(MemoryRegion, 1);
 -    MemoryRegion *isa = g_new(MemoryRegion, 1);
 +    MemoryRegion *isa_io = g_new(MemoryRegion, 1);
 +    MemoryRegion *isa_mem = g_new(MemoryRegion, 1);
      int bios_size;
      MIPSCPU *cpu;
      CPUMIPSState *env;
      cpu_mips_irq_init_cpu(env);
      cpu_mips_clock_init(env);
  
 +    /* ISA bus: IO space at 0x14000000, mem space at 0x10000000 */
 +    memory_region_init_alias(isa_io, NULL, "isa-io",
 +                             get_system_io(), 0, 0x00010000);
 +    memory_region_init(isa_mem, NULL, "isa-mem", 0x01000000);
 +    memory_region_add_subregion(get_system_memory(), 0x14000000, isa_io);
 +    memory_region_add_subregion(get_system_memory(), 0x10000000, isa_mem);
 +    isa_bus = isa_bus_new(NULL, isa_mem, get_system_io());
 +
      /* The PIC is attached to the MIPS CPU INT0 pin */
 -    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(isa_bus, 2000, NULL);
  
 -    /* Register 64 KB of ISA IO space at 0x14000000 */
 -    memory_region_init_alias(isa, NULL, "isa_mmio",
 -                             get_system_io(), 0, 0x00010000);
 -    memory_region_add_subregion(get_system_memory(), 0x14000000, isa);
 -
 -    isa_mem_base = 0x10000000;
 -
      pit = pit_init(isa_bus, 0x40, 0, NULL);
  
-     for(i = 0; i < MAX_SERIAL_PORTS; i++) {
-         if (serial_hds[i]) {
-             serial_isa_init(isa_bus, i, serial_hds[i]);
-         }
-     }
+     serial_hds_isa_init(isa_bus, MAX_SERIAL_PORTS);
  
      isa_vga_init(isa_bus);
  
diff --combined hw/sparc64/sun4u.c
@@@ -596,8 -596,7 +596,8 @@@ pci_ebus_init1(PCIDevice *pci_dev
  {
      EbusState *s = DO_UPCAST(EbusState, pci_dev, pci_dev);
  
 -    isa_bus_new(&pci_dev->qdev, pci_address_space_io(pci_dev));
 +    isa_bus_new(DEVICE(pci_dev), get_system_memory(),
 +                pci_address_space_io(pci_dev));
  
      pci_dev->config[0x04] = 0x06; // command = bus master, pci mem
      pci_dev->config[0x05] = 0x00;
@@@ -850,17 -849,9 +850,9 @@@ static void sun4uv_init(MemoryRegion *a
                         NULL, 115200, serial_hds[i], DEVICE_BIG_ENDIAN);
          i++;
      }
-     for(; i < MAX_SERIAL_PORTS; i++) {
-         if (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(isa_bus, i, parallel_hds[i]);
-         }
-     }
+     serial_hds_isa_init(isa_bus, MAX_SERIAL_PORTS);
+     parallel_hds_isa_init(isa_bus, MAX_PARALLEL_PORTS);
  
      for(i = 0; i < nb_nics; i++)
          pci_nic_init_nofail(&nd_table[i], pci_bus, "ne2k_pci", NULL);
diff --combined include/hw/i386/pc.h
@@@ -107,23 -107,8 +107,8 @@@ struct PcGuestInfo 
  };
  
  /* parallel.c */
- static inline bool parallel_init(ISABus *bus, int index, CharDriverState *chr)
- {
-     DeviceState *dev;
-     ISADevice *isadev;
-     isadev = isa_try_create(bus, "isa-parallel");
-     if (!isadev) {
-         return false;
-     }
-     dev = DEVICE(isadev);
-     qdev_prop_set_uint32(dev, "index", index);
-     qdev_prop_set_chr(dev, "chardev", chr);
-     if (qdev_init(dev) < 0) {
-         return false;
-     }
-     return true;
- }
+ void parallel_hds_isa_init(ISABus *bus, int n);
  
  bool parallel_mm_init(MemoryRegion *address_space,
                        hwaddr base, int it_shift, qemu_irq irq,
@@@ -136,8 -121,8 +121,8 @@@ qemu_irq *i8259_init(ISABus *bus, qemu_
  qemu_irq *kvm_i8259_init(ISABus *bus);
  int pic_read_irq(DeviceState *d);
  int pic_get_output(DeviceState *d);
 -void pic_info(Monitor *mon, const QDict *qdict);
 -void irq_info(Monitor *mon, const QDict *qdict);
 +void hmp_info_pic(Monitor *mon, const QDict *qdict);
 +void hmp_info_irq(Monitor *mon, const QDict *qdict);
  
  /* Global System Interrupts */