Diff for /qemu/hw/qdev.c between versions 1.1.1.5 and 1.1.1.6

version 1.1.1.5, 2018/04/24 18:59:52 version 1.1.1.6, 2018/04/24 19:27:28
Line 36  static bool qdev_hot_removed = false; Line 36  static bool qdev_hot_removed = false;
   
 /* This is a nasty hack to allow passing a NULL bus to qdev_create.  */  /* This is a nasty hack to allow passing a NULL bus to qdev_create.  */
 static BusState *main_system_bus;  static BusState *main_system_bus;
   static void main_system_bus_create(void);
   
 DeviceInfo *device_info_list;  DeviceInfo *device_info_list;
   
Line 84  static DeviceState *qdev_create_from_inf Line 85  static DeviceState *qdev_create_from_inf
     DeviceState *dev;      DeviceState *dev;
   
     assert(bus->info == info->bus_info);      assert(bus->info == info->bus_info);
     dev = qemu_mallocz(info->size);      dev = g_malloc0(info->size);
     dev->info = info;      dev->info = info;
     dev->parent_bus = bus;      dev->parent_bus = bus;
     qdev_prop_set_defaults(dev, dev->info->props);      qdev_prop_set_defaults(dev, dev->info->props);
     qdev_prop_set_defaults(dev, dev->parent_bus->info->props);      qdev_prop_set_defaults(dev, dev->parent_bus->info->props);
     qdev_prop_set_globals(dev);      qdev_prop_set_globals(dev);
     QLIST_INSERT_HEAD(&bus->children, dev, sibling);      QTAILQ_INSERT_HEAD(&bus->children, dev, sibling);
     if (qdev_hotplug) {      if (qdev_hotplug) {
         assert(bus->allow_hotplug);          assert(bus->allow_hotplug);
         dev->hotplugged = 1;          dev->hotplugged = 1;
Line 110  DeviceState *qdev_create(BusState *bus,  Line 111  DeviceState *qdev_create(BusState *bus, 
   
     dev = qdev_try_create(bus, name);      dev = qdev_try_create(bus, name);
     if (!dev) {      if (!dev) {
         hw_error("Unknown device '%s' for bus '%s'\n", name, bus->info->name);          if (bus) {
               hw_error("Unknown device '%s' for bus '%s'\n", name,
                        bus->info->name);
           } else {
               hw_error("Unknown device '%s' for default sysbus\n", name);
           }
     }      }
   
     return dev;      return dev;
Line 180  int qdev_device_help(QemuOpts *opts) Line 186  int qdev_device_help(QemuOpts *opts)
         return 1;          return 1;
     }      }
   
     if (!qemu_opt_get(opts, "?")) {      if (!driver || !qemu_opt_get(opts, "?")) {
         return 0;          return 0;
     }      }
   
Line 201  int qdev_device_help(QemuOpts *opts) Line 207  int qdev_device_help(QemuOpts *opts)
         }          }
         error_printf("%s.%s=%s\n", info->name, prop->name, prop->info->name);          error_printf("%s.%s=%s\n", info->name, prop->name, prop->info->name);
     }      }
       for (prop = info->bus_info->props; prop && prop->name; prop++) {
           if (!prop->info->parse) {
               continue;           /* no way to set it, don't show */
           }
           error_printf("%s.%s=%s\n", info->name, prop->name, prop->info->name);
       }
     return 1;      return 1;
 }  }
   
Line 289  int qdev_init(DeviceState *dev) Line 301  int qdev_init(DeviceState *dev)
                                        dev->alias_required_for_version);                                         dev->alias_required_for_version);
     }      }
     dev->state = DEV_STATE_INITIALIZED;      dev->state = DEV_STATE_INITIALIZED;
       if (dev->hotplugged && dev->info->reset) {
           dev->info->reset(dev);
       }
     return 0;      return 0;
 }  }
   
Line 325  static int qdev_reset_one(DeviceState *d Line 340  static int qdev_reset_one(DeviceState *d
 BusState *sysbus_get_default(void)  BusState *sysbus_get_default(void)
 {  {
     if (!main_system_bus) {      if (!main_system_bus) {
         main_system_bus = qbus_create(&system_bus_info, NULL,          main_system_bus_create();
                                       "main-system-bus");  
     }      }
     return main_system_bus;      return main_system_bus;
 }  }
Line 394  void qdev_free(DeviceState *dev) Line 408  void qdev_free(DeviceState *dev)
         if (dev->opts)          if (dev->opts)
             qemu_opts_del(dev->opts);              qemu_opts_del(dev->opts);
     }      }
     QLIST_REMOVE(dev, sibling);      QTAILQ_REMOVE(&dev->parent_bus->children, dev, sibling);
     for (prop = dev->info->props; prop && prop->name; prop++) {      for (prop = dev->info->props; prop && prop->name; prop++) {
         if (prop->info->free) {          if (prop->info->free) {
             prop->info->free(dev, prop);              prop->info->free(dev, prop);
         }          }
     }      }
     qemu_free(dev);      g_free(dev);
 }  }
   
 void qdev_machine_creation_done(void)  void qdev_machine_creation_done(void)
Line 496  int qbus_walk_children(BusState *bus, qd Line 510  int qbus_walk_children(BusState *bus, qd
         }          }
     }      }
   
     QLIST_FOREACH(dev, &bus->children, sibling) {      QTAILQ_FOREACH(dev, &bus->children, sibling) {
         err = qdev_walk_children(dev, devfn, busfn, opaque);          err = qdev_walk_children(dev, devfn, busfn, opaque);
         if (err < 0) {          if (err < 0) {
             return err;              return err;
Line 546  static BusState *qbus_find_recursive(Bus Line 560  static BusState *qbus_find_recursive(Bus
         return bus;          return bus;
     }      }
   
     QLIST_FOREACH(dev, &bus->children, sibling) {      QTAILQ_FOREACH(dev, &bus->children, sibling) {
         QLIST_FOREACH(child, &dev->child_bus, sibling) {          QLIST_FOREACH(child, &dev->child_bus, sibling) {
             ret = qbus_find_recursive(child, name, info);              ret = qbus_find_recursive(child, name, info);
             if (ret) {              if (ret) {
Line 562  DeviceState *qdev_find_recursive(BusStat Line 576  DeviceState *qdev_find_recursive(BusStat
     DeviceState *dev, *ret;      DeviceState *dev, *ret;
     BusState *child;      BusState *child;
   
     QLIST_FOREACH(dev, &bus->children, sibling) {      QTAILQ_FOREACH(dev, &bus->children, sibling) {
         if (dev->id && strcmp(dev->id, id) == 0)          if (dev->id && strcmp(dev->id, id) == 0)
             return dev;              return dev;
         QLIST_FOREACH(child, &dev->child_bus, sibling) {          QLIST_FOREACH(child, &dev->child_bus, sibling) {
Line 595  static void qbus_list_dev(BusState *bus) Line 609  static void qbus_list_dev(BusState *bus)
     const char *sep = " ";      const char *sep = " ";
   
     error_printf("devices at \"%s\":", bus->name);      error_printf("devices at \"%s\":", bus->name);
     QLIST_FOREACH(dev, &bus->children, sibling) {      QTAILQ_FOREACH(dev, &bus->children, sibling) {
         error_printf("%s\"%s\"", sep, dev->info->name);          error_printf("%s\"%s\"", sep, dev->info->name);
         if (dev->id)          if (dev->id)
             error_printf("/\"%s\"", dev->id);              error_printf("/\"%s\"", dev->id);
Line 626  static DeviceState *qbus_find_dev(BusSta Line 640  static DeviceState *qbus_find_dev(BusSta
      *   (2) driver name       *   (2) driver name
      *   (3) driver alias, if present       *   (3) driver alias, if present
      */       */
     QLIST_FOREACH(dev, &bus->children, sibling) {      QTAILQ_FOREACH(dev, &bus->children, sibling) {
         if (dev->id  &&  strcmp(dev->id, elem) == 0) {          if (dev->id  &&  strcmp(dev->id, elem) == 0) {
             return dev;              return dev;
         }          }
     }      }
     QLIST_FOREACH(dev, &bus->children, sibling) {      QTAILQ_FOREACH(dev, &bus->children, sibling) {
         if (strcmp(dev->info->name, elem) == 0) {          if (strcmp(dev->info->name, elem) == 0) {
             return dev;              return dev;
         }          }
     }      }
     QLIST_FOREACH(dev, &bus->children, sibling) {      QTAILQ_FOREACH(dev, &bus->children, sibling) {
         if (dev->info->alias && strcmp(dev->info->alias, elem) == 0) {          if (dev->info->alias && strcmp(dev->info->alias, elem) == 0) {
             return dev;              return dev;
         }          }
Line 742  void qbus_create_inplace(BusState *bus,  Line 756  void qbus_create_inplace(BusState *bus, 
   
     if (name) {      if (name) {
         /* use supplied name */          /* use supplied name */
         bus->name = qemu_strdup(name);          bus->name = g_strdup(name);
     } else if (parent && parent->id) {      } else if (parent && parent->id) {
         /* parent device has id -> use it for bus name */          /* parent device has id -> use it for bus name */
         len = strlen(parent->id) + 16;          len = strlen(parent->id) + 16;
         buf = qemu_malloc(len);          buf = g_malloc(len);
         snprintf(buf, len, "%s.%d", parent->id, parent->num_child_bus);          snprintf(buf, len, "%s.%d", parent->id, parent->num_child_bus);
         bus->name = buf;          bus->name = buf;
     } else {      } else {
         /* no id -> use lowercase bus type for bus name */          /* no id -> use lowercase bus type for bus name */
         len = strlen(info->name) + 16;          len = strlen(info->name) + 16;
         buf = qemu_malloc(len);          buf = g_malloc(len);
         len = snprintf(buf, len, "%s.%d", info->name,          len = snprintf(buf, len, "%s.%d", info->name,
                        parent ? parent->num_child_bus : 0);                         parent ? parent->num_child_bus : 0);
         for (i = 0; i < len; i++)          for (i = 0; i < len; i++)
Line 760  void qbus_create_inplace(BusState *bus,  Line 774  void qbus_create_inplace(BusState *bus, 
         bus->name = buf;          bus->name = buf;
     }      }
   
     QLIST_INIT(&bus->children);      QTAILQ_INIT(&bus->children);
     if (parent) {      if (parent) {
         QLIST_INSERT_HEAD(&parent->child_bus, bus, sibling);          QLIST_INSERT_HEAD(&parent->child_bus, bus, sibling);
         parent->num_child_bus++;          parent->num_child_bus++;
Line 775  BusState *qbus_create(BusInfo *info, Dev Line 789  BusState *qbus_create(BusInfo *info, Dev
 {  {
     BusState *bus;      BusState *bus;
   
     bus = qemu_mallocz(info->size);      bus = g_malloc0(info->size);
     bus->qdev_allocated = 1;      bus->qdev_allocated = 1;
     qbus_create_inplace(bus, info, parent, name);      qbus_create_inplace(bus, info, parent, name);
     return bus;      return bus;
 }  }
   
   static void main_system_bus_create(void)
   {
       /* assign main_system_bus before qbus_create_inplace()
        * in order to make "if (bus != main_system_bus)" work */
       main_system_bus = g_malloc0(system_bus_info.size);
       main_system_bus->qdev_allocated = 1;
       qbus_create_inplace(main_system_bus, &system_bus_info, NULL,
                           "main-system-bus");
   }
   
 void qbus_free(BusState *bus)  void qbus_free(BusState *bus)
 {  {
     DeviceState *dev;      DeviceState *dev;
   
     while ((dev = QLIST_FIRST(&bus->children)) != NULL) {      while ((dev = QTAILQ_FIRST(&bus->children)) != NULL) {
         qdev_free(dev);          qdev_free(dev);
     }      }
     if (bus->parent) {      if (bus->parent) {
Line 795  void qbus_free(BusState *bus) Line 819  void qbus_free(BusState *bus)
         assert(bus != main_system_bus); /* main_system_bus is never freed */          assert(bus != main_system_bus); /* main_system_bus is never freed */
         qemu_unregister_reset(qbus_reset_all_fn, bus);          qemu_unregister_reset(qbus_reset_all_fn, bus);
     }      }
     qemu_free((void*)bus->name);      g_free((void*)bus->name);
     if (bus->qdev_allocated) {      if (bus->qdev_allocated) {
         qemu_free(bus);          g_free(bus);
     }      }
 }  }
   
Line 854  static void qbus_print(Monitor *mon, Bus Line 878  static void qbus_print(Monitor *mon, Bus
     qdev_printf("bus: %s\n", bus->name);      qdev_printf("bus: %s\n", bus->name);
     indent += 2;      indent += 2;
     qdev_printf("type %s\n", bus->info->name);      qdev_printf("type %s\n", bus->info->name);
     QLIST_FOREACH(dev, &bus->children, sibling) {      QTAILQ_FOREACH(dev, &bus->children, sibling) {
         qdev_print(mon, dev, indent);          qdev_print(mon, dev, indent);
     }      }
 }  }
Line 917  static int qdev_get_fw_dev_path_helper(D Line 941  static int qdev_get_fw_dev_path_helper(D
         if (dev->parent_bus->info->get_fw_dev_path) {          if (dev->parent_bus->info->get_fw_dev_path) {
             d = dev->parent_bus->info->get_fw_dev_path(dev);              d = dev->parent_bus->info->get_fw_dev_path(dev);
             l += snprintf(p + l, size - l, "%s", d);              l += snprintf(p + l, size - l, "%s", d);
             qemu_free(d);              g_free(d);
         } else {          } else {
             l += snprintf(p + l, size - l, "%s", dev->info->name);              l += snprintf(p + l, size - l, "%s", dev->info->name);
         }          }

Removed from v.1.1.1.5  
changed lines
  Added in v.1.1.1.6


unix.superglobalmegacorp.com