qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: minyard@acm.org
To: qemu-devel@nongnu.org
Cc: Corey Minyard <cminyard@mvista.com>
Subject: [Qemu-devel] [PATCH 09/18] qdev: Add a pre-firmware init capability
Date: Thu, 19 Jul 2012 13:53:24 -0500	[thread overview]
Message-ID: <1342724013-1633-10-git-send-email-minyard@acm.org> (raw)
In-Reply-To: <1342724013-1633-1-git-send-email-minyard@acm.org>

From: Corey Minyard <cminyard@mvista.com>

Some devices may need to do some firmware-type initialization before
the firmware itself is initialized.  For instance, any device that
adds SMBIOS table entries (like IPMI) will need to do that before
the BIOS is initialized.

So add a list of devices that get initialized before the firmware
initialization.  Since those devices get removed from the list so
they don't get initialized twice, convert the qemu_opt_foreach() to
use the safe list traversal.

Signed-off-by: Corey Minyard <cminyard@mvista.com>
---
 hw/pc.c           |    2 ++
 hw/qdev-monitor.c |   52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 hw/qdev.h         |    3 +++
 qemu-option.c     |    4 ++--
 4 files changed, 59 insertions(+), 2 deletions(-)

diff --git a/hw/pc.c b/hw/pc.c
index bedd5be..811d99c 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -1010,6 +1010,8 @@ void *pc_bios_init(const char *kernel_filename,
     void *fw_cfg;
     int linux_boot, i;
 
+    qdev_prefw_init_check();
+
     /* Initialize PC system firmware */
     pc_system_firmware_init(rom_memory);
 
diff --git a/hw/qdev-monitor.c b/hw/qdev-monitor.c
index 7915b45..bb8e955 100644
--- a/hw/qdev-monitor.c
+++ b/hw/qdev-monitor.c
@@ -486,6 +486,58 @@ DeviceState *qdev_device_add(QemuOpts *opts)
     return qdev;
 }
 
+/*
+ * Some devices may need to be initialized before the firmware is
+ * initialized, so they may add information to the firmware
+ * structures.
+ */
+typedef struct prefw_list {
+    const char *name;
+    struct prefw_list *next;
+} prefw_list;
+
+prefw_list *prefw_init;
+
+void qdev_add_prefw_init(const char *name)
+{
+    prefw_list *e = g_malloc(sizeof(*e));
+    e->name = name;
+    e->next = prefw_init;
+    prefw_init = e;
+}
+
+static int prefw_check_func(QemuOpts *opts, void *opaque)
+{
+    DeviceState *dev;
+    const char *driver;
+    prefw_list *e;
+
+    driver = qemu_opt_get(opts, "driver");
+    if (!driver) {
+        return 0;
+    }
+
+    for (e = prefw_init; e; e = e->next) {
+        if (strcmp(driver, e->name) == 0) {
+            dev = qdev_device_add(opts);
+            if (!dev) {
+                return -1;
+            }
+            qemu_opts_del(opts);
+            break;
+        }
+    }
+    return 0;
+}
+
+void qdev_prefw_init_check(void)
+{
+    /* init generic devices */
+    if (qemu_opts_foreach(qemu_find_opts("device"),
+                          prefw_check_func, NULL, 1) != 0) {
+        exit(1);
+    }
+}
 
 #define qdev_printf(fmt, ...) monitor_printf(mon, "%*s" fmt, indent, "", ## __VA_ARGS__)
 static void qbus_print(Monitor *mon, BusState *bus, int indent);
diff --git a/hw/qdev.h b/hw/qdev.h
index f4683dc..2be4c95 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -167,6 +167,9 @@ int qdev_simple_unplug_cb(DeviceState *dev);
 void qdev_machine_creation_done(void);
 bool qdev_machine_modified(void);
 
+void qdev_add_prefw_init(const char *name);
+void qdev_prefw_init_check(void);
+
 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n);
 void qdev_connect_gpio_out(DeviceState *dev, int n, qemu_irq pin);
 
diff --git a/qemu-option.c b/qemu-option.c
index bb3886c..1d000f8 100644
--- a/qemu-option.c
+++ b/qemu-option.c
@@ -709,10 +709,10 @@ int qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val)
 int qemu_opt_foreach(QemuOpts *opts, qemu_opt_loopfunc func, void *opaque,
                      int abort_on_failure)
 {
-    QemuOpt *opt;
+    QemuOpt *opt, *next_opt;
     int rc = 0;
 
-    QTAILQ_FOREACH(opt, &opts->head, next) {
+    QTAILQ_FOREACH_SAFE(opt, &opts->head, next, next_opt) {
         rc = func(opt->name, opt->str, opaque);
         if (abort_on_failure  &&  rc != 0)
             break;
-- 
1.7.4.1

  parent reply	other threads:[~2012-07-19 18:54 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-19 18:53 [Qemu-devel] Third shot at adding IPMI to qemu minyard
2012-07-19 18:53 ` [Qemu-devel] [PATCH 01/18] smbios: Add a function to directly add an entry minyard
2012-07-30 15:37   ` Anthony Liguori
2012-07-30 16:44     ` Corey Minyard
2012-07-30 17:25       ` Anthony Liguori
2012-07-30 17:40         ` Corey Minyard
2012-08-02  1:15         ` Kevin O'Connor
2012-08-02  2:11           ` Corey Minyard
2012-08-02  2:40             ` Anthony Liguori
2012-08-02 12:17               ` Corey Minyard
2012-08-02 18:32                 ` Anthony Liguori
2012-08-02 19:20                   ` Corey Minyard
2012-08-02 21:05                     ` Anthony Liguori
2012-08-06 15:38                       ` Corey Minyard
2012-07-19 18:53 ` [Qemu-devel] [PATCH 02/18] pc: move SMBIOS setup to after device init minyard
2012-07-19 18:53 ` [Qemu-devel] [PATCH 03/18] vl: Move init_timer_alarm() earlier minyard
2012-07-19 18:53 ` [Qemu-devel] [PATCH 04/18] qemu-char: Allocate CharDriverState in qemu_chr_new_from_opts minyard
2012-07-19 18:53 ` [Qemu-devel] [PATCH 05/18] qemu-char: Allow a chardev to reconnect if disconnected minyard
2012-07-19 18:53 ` [Qemu-devel] [PATCH 06/18] qemu-char: Fix a race reporting opens and closes minyard
2012-07-19 18:53 ` [Qemu-devel] [PATCH 07/18] qemu-char: remove free of chr from win_stdio_close minyard
2012-07-19 18:53 ` [Qemu-devel] [PATCH 08/18] qemu-char: Close fd at end of file minyard
2012-07-19 18:53 ` minyard [this message]
2012-07-30 14:36   ` [Qemu-devel] [PATCH 09/18] qdev: Add a pre-firmware init capability Andreas Färber
2012-07-30 15:27     ` Corey Minyard
2012-07-30 15:40   ` Anthony Liguori
2012-07-19 18:53 ` [Qemu-devel] [PATCH 10/18] qom: release previous object when setting minyard
2012-07-30 13:51   ` Andreas Färber
2012-09-10 14:34     ` Andreas Färber
2012-07-19 18:53 ` [Qemu-devel] [PATCH 11/18] Add a base IPMI interface minyard
2012-07-19 18:53 ` [Qemu-devel] [PATCH 12/18] IPMI: Add a PC ISA type structure minyard
2012-07-30 13:45   ` Andreas Färber
2012-07-30 17:09     ` Corey Minyard
2012-07-19 18:53 ` [Qemu-devel] [PATCH 13/18] IPMI: Add a KCS low-level interface minyard
2012-07-19 18:53 ` [Qemu-devel] [PATCH 14/18] IPMI: Add a BT " minyard
2012-07-19 18:53 ` [Qemu-devel] [PATCH 15/18] IPMI: Add a local BMC simulation minyard
2012-07-19 18:53 ` [Qemu-devel] [PATCH 16/18] IPMI: Add an external connection simulation interface minyard
2012-07-19 18:53 ` [Qemu-devel] [PATCH 17/18] IPMI: Add tests minyard
2012-07-19 18:53 ` [Qemu-devel] [PATCH 18/18] IPMI: Add documentation minyard
2012-07-20  6:48 ` [Qemu-devel] Third shot at adding IPMI to qemu Paolo Bonzini
2012-07-30 13:34 ` Corey Minyard
2012-07-30 14:05   ` Andreas Färber
2012-07-30 15:17     ` Corey Minyard
2012-09-10 14:48 ` Andreas Färber
2012-09-10 16:52   ` Corey Minyard

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1342724013-1633-10-git-send-email-minyard@acm.org \
    --to=minyard@acm.org \
    --cc=cminyard@mvista.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).