From patchwork Mon Jun 7 23:52:08 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anthony Liguori X-Patchwork-Id: 54911 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 66F57B7D43 for ; Tue, 8 Jun 2010 10:16:24 +1000 (EST) Received: from localhost ([127.0.0.1]:43898 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OLmRt-0008In-Nt for incoming@patchwork.ozlabs.org; Mon, 07 Jun 2010 20:13:45 -0400 Received: from [140.186.70.92] (port=44100 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OLm7P-0004Vy-LC for qemu-devel@nongnu.org; Mon, 07 Jun 2010 19:52:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OLm7I-0003D0-NX for qemu-devel@nongnu.org; Mon, 07 Jun 2010 19:52:35 -0400 Received: from e1.ny.us.ibm.com ([32.97.182.141]:37644) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OLm7I-0003Cv-Jm for qemu-devel@nongnu.org; Mon, 07 Jun 2010 19:52:28 -0400 Received: from d01relay07.pok.ibm.com (d01relay07.pok.ibm.com [9.56.227.147]) by e1.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id o57NkXPR015549 for ; Mon, 7 Jun 2010 19:46:33 -0400 Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay07.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o57NqRXh2310174 for ; Mon, 7 Jun 2010 19:52:27 -0400 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id o57NqRr3010995 for ; Mon, 7 Jun 2010 20:52:27 -0300 Received: from localhost.localdomain (sig-9-65-84-205.mts.ibm.com [9.65.84.205]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id o57NqDr9009965; Mon, 7 Jun 2010 20:52:27 -0300 From: Anthony Liguori To: qemu-devel@nongnu.org Date: Mon, 7 Jun 2010 18:52:08 -0500 Message-Id: <1275954730-8196-21-git-send-email-aliguori@us.ibm.com> X-Mailer: git-send-email 1.7.0.4 In-Reply-To: <1275954730-8196-1-git-send-email-aliguori@us.ibm.com> References: <1275954730-8196-1-git-send-email-aliguori@us.ibm.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) Cc: Glauber Costa , Anthony Liguori Subject: [Qemu-devel] [PATCH 20/22] machine: introduce machine core and split qemu_register_machine X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Signed-off-by: Anthony Liguori diff --git a/hw/boards.h b/hw/boards.h index 1097561..25881bb 100644 --- a/hw/boards.h +++ b/hw/boards.h @@ -5,18 +5,25 @@ #include "qdev.h" -typedef void QEMUMachineInitFunc(QemuOpts *opts); +typedef void QEMUCoreInitFunc(QemuOpts *opts); typedef struct QEMUMachine { - QEMUMachineInitFunc *init; + QEMUCoreInitFunc *init; QemuOptDesc *opts_desc; QemuOptValue *opts_default; - QTAILQ_ENTRY(QEMUMachine) node; } QEMUMachine; int qemu_register_machine(QEMUMachine *machine); + void machine_set_default(const char *name); +void machine_register_core(const char *name, + QEMUCoreInitFunc *init, + QemuOptDesc *opts_desc); + +int machine_create_from_core(const char *core, + QemuOptValue *opts_default); + #define QOPT_COMPAT(driver, property, value) \ QOPT_VALUE(driver "." property, value) diff --git a/vl.c b/vl.c index 7cb5865..150dd41 100644 --- a/vl.c +++ b/vl.c @@ -1590,38 +1590,105 @@ void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque) /***********************************************************/ /* machine registration */ -static QTAILQ_HEAD(, QEMUMachine) machine_list = +typedef struct MachineCore { + const char *name; + QEMUCoreInitFunc *init; + QemuOptDesc *desc; + QTAILQ_ENTRY(MachineCore) node; +} MachineCore; + +typedef struct Machine +{ + MachineCore *core; + QemuOptValue *defaults; + QTAILQ_ENTRY(Machine) node; +} Machine; + +static QTAILQ_HEAD(, MachineCore) machine_core_list = + QTAILQ_HEAD_INITIALIZER(machine_core_list); +static QTAILQ_HEAD(, Machine) machine_list = QTAILQ_HEAD_INITIALIZER(machine_list); static const char *default_machine = NULL; -int qemu_register_machine(QEMUMachine *n) +static const char *find_machine_defval(QemuOptValue *defaults, const char *name) { - QTAILQ_INSERT_TAIL(&machine_list, n, node); - return 0; + int i; + for (i = 0; defaults[i].name; i++) { + if (!strcmp(defaults[i].name, name)) { + return defaults[i].value; + } + } + return NULL; } -void machine_set_default(const char *name) +void machine_register_core(const char *name, + QEMUCoreInitFunc *init, + QemuOptDesc *desc) { - default_machine = name; + MachineCore *c; + + c = qemu_mallocz(sizeof(*c)); + c->name = strdup(name); + c->init = init; + c->desc = desc; + + QTAILQ_INSERT_TAIL(&machine_core_list, c, node); } -static const char *find_machine_defval(QEMUMachine *m, const char *name) +static MachineCore *machine_core_find(const char *core) { - int i; - for (i = 0; m->opts_default[i].name; i++) { - if (!strcmp(m->opts_default[i].name, name)) { - return m->opts_default[i].value; + MachineCore *c; + + QTAILQ_FOREACH(c, &machine_core_list, node) { + if (strcmp(c->name, core) == 0) { + return c; } } + return NULL; } -static QEMUMachine *find_machine(const char *name) +int machine_create_from_core(const char *core, + QemuOptValue *opts_default) +{ + MachineCore *c; + Machine *m; + + c = machine_core_find(core); + if (c == NULL) { + return -1; + } + + m = qemu_mallocz(sizeof(*m)); + m->core = c; + m->defaults = opts_default; + + QTAILQ_INSERT_TAIL(&machine_list, m, node); + + return 0; +} + +int qemu_register_machine(QEMUMachine *n) +{ + const char *name; + + name = find_machine_defval(n->opts_default, "name"); + machine_register_core(name, n->init, n->opts_desc); + + return machine_create_from_core(name, n->opts_default); +} + +void machine_set_default(const char *name) +{ + default_machine = name; +} + +static Machine *find_machine(const char *name) { - QEMUMachine *m; + Machine *m; QTAILQ_FOREACH(m, &machine_list, node) { - const char *val = find_machine_defval(m, "name"); + const char *val = find_machine_defval(m->defaults, "name"); if (strcmp(name, val) == 0) { return m; } @@ -1629,7 +1696,7 @@ static QEMUMachine *find_machine(const char *name) return NULL; } -static QEMUMachine *find_default_machine(void) +static Machine *find_default_machine(void) { return find_machine(default_machine); } @@ -2600,7 +2667,7 @@ static int machine_combine_opt(const char *name, const char *value, void *opaque static int machine_find(QemuOpts *opts, void *opaque) { - QEMUMachine **machinep = opaque; + Machine **machinep = opaque; const char *driver; driver = qemu_opt_get(opts, "driver"); @@ -2636,7 +2703,7 @@ int main(int argc, char **argv, char **envp) int optind; const char *optarg; const char *loadvm = NULL; - QEMUMachine *machine = NULL; + Machine *machine = NULL; const char *cpu_model; #ifndef _WIN32 int fds[2]; @@ -2764,14 +2831,14 @@ int main(int argc, char **argv, char **envp) switch(popt->index) { case QEMU_OPTION_M: if (strcmp(optarg, "?") == 0) { - QEMUMachine *m; + Machine *m; printf("Supported machines are:\n"); QTAILQ_FOREACH(m, &machine_list, node) { const char *name; const char *desc; - name = find_machine_defval(m, "name"); - desc = find_machine_defval(m, "desc"); + name = find_machine_defval(m->defaults, "name"); + desc = find_machine_defval(m->defaults, "desc"); printf("%-10s %s%s\n", name, desc, !strcmp(name, default_machine) ? @@ -3482,17 +3549,17 @@ int main(int argc, char **argv, char **envp) machine = find_default_machine(); } - if (machine->opts_default) { + if (machine->defaults) { opts = qemu_opts_create(&qemu_machine_opts, NULL, 0); - qemu_opts_set_defaults(opts, machine->opts_default); + qemu_opts_set_defaults(opts, machine->defaults); } /* Combine all -machine options into one option group */ machine_opts = qemu_opts_create(&qemu_machine_opts, NULL, 0); qemu_opts_foreach(&qemu_machine_opts, machine_combine_opts, machine_opts, 0); - if (machine->opts_desc) { - if (qemu_opts_validate(machine_opts, machine->opts_desc) < 0) { + if (machine->core->desc) { + if (qemu_opts_validate(machine_opts, machine->core->desc) < 0) { exit(1); } } else { @@ -3839,7 +3906,7 @@ int main(int argc, char **argv, char **envp) qemu_opt_set(machine_opts, "acpi", "off"); } - machine->init(machine_opts); + machine->core->init(machine_opts); qemu_opts_del(machine_opts);