Message ID | 1409344310-5441-3-git-send-email-ehabkost@redhat.com |
---|---|
State | New |
Headers | show |
Il 29/08/2014 22:31, Eduardo Habkost ha scritto: > Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> > --- > hw/core/Makefile.objs | 1 + > hw/core/accel.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++ This is not hw/core/, so please leave it in the root directory. > include/hw/accel.h | 32 ++++++++++++++ ... and please put this in include/sysemu/. Apart from this, Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> > vl.c | 81 +----------------------------------- > 4 files changed, 147 insertions(+), 80 deletions(-) > create mode 100644 hw/core/accel.c > create mode 100644 include/hw/accel.h > > diff --git a/hw/core/Makefile.objs b/hw/core/Makefile.objs > index 17845df..6e56e47 100644 > --- a/hw/core/Makefile.objs > +++ b/hw/core/Makefile.objs > @@ -14,3 +14,4 @@ common-obj-$(CONFIG_SOFTMMU) += machine.o > common-obj-$(CONFIG_SOFTMMU) += null-machine.o > common-obj-$(CONFIG_SOFTMMU) += loader.o > common-obj-$(CONFIG_SOFTMMU) += qdev-properties-system.o > +common-obj-$(CONFIG_SOFTMMU) += accel.o > diff --git a/hw/core/accel.c b/hw/core/accel.c > new file mode 100644 > index 0000000..04da696 > --- /dev/null > +++ b/hw/core/accel.c > @@ -0,0 +1,113 @@ > +/* > + * QEMU System Emulator, accelerator interfaces > + * > + * Copyright (c) 2003-2008 Fabrice Bellard > + * Copyright (c) 2014 Red Hat Inc. > + * > + * Permission is hereby granted, free of charge, to any person obtaining a copy > + * of this software and associated documentation files (the "Software"), to deal > + * in the Software without restriction, including without limitation the rights > + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell > + * copies of the Software, and to permit persons to whom the Software is > + * furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice shall be included in > + * all copies or substantial portions of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, > + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN > + * THE SOFTWARE. > + */ > + > +#include "hw/accel.h" > +#include "qemu-common.h" > +#include "sysemu/arch_init.h" > +#include "sysemu/sysemu.h" > +#include "sysemu/kvm.h" > +#include "sysemu/qtest.h" > +#include "hw/xen/xen.h" > + > +int tcg_tb_size; > +static bool tcg_allowed = true; > + > +static int tcg_init(MachineClass *mc) > +{ > + tcg_exec_init(tcg_tb_size * 1024 * 1024); > + return 0; > +} > + > +static struct { > + const char *opt_name; > + const char *name; > + int (*available)(void); > + int (*init)(MachineClass *mc); > + bool *allowed; > +} accel_list[] = { > + { "tcg", "tcg", tcg_available, tcg_init, &tcg_allowed }, > + { "xen", "Xen", xen_available, xen_init, &xen_allowed }, > + { "kvm", "KVM", kvm_available, kvm_init, &kvm_allowed }, > + { "qtest", "QTest", qtest_available, qtest_init_accel, &qtest_allowed }, > +}; > + > +int configure_accelerator(MachineClass *mc) > +{ > + const char *p; > + char buf[10]; > + int i, ret; > + bool accel_initialised = false; > + bool init_failed = false; > + > + p = qemu_opt_get(qemu_get_machine_opts(), "accel"); > + if (p == NULL) { > + /* Use the default "accelerator", tcg */ > + p = "tcg"; > + } > + > + while (!accel_initialised && *p != '\0') { > + if (*p == ':') { > + p++; > + } > + p = get_opt_name(buf, sizeof(buf), p, ':'); > + for (i = 0; i < ARRAY_SIZE(accel_list); i++) { > + if (strcmp(accel_list[i].opt_name, buf) == 0) { > + if (!accel_list[i].available()) { > + printf("%s not supported for this target\n", > + accel_list[i].name); > + break; > + } > + *(accel_list[i].allowed) = true; > + ret = accel_list[i].init(mc); > + if (ret < 0) { > + init_failed = true; > + fprintf(stderr, "failed to initialize %s: %s\n", > + accel_list[i].name, > + strerror(-ret)); > + *(accel_list[i].allowed) = false; > + } else { > + accel_initialised = true; > + } > + break; > + } > + } > + if (i == ARRAY_SIZE(accel_list)) { > + fprintf(stderr, "\"%s\" accelerator does not exist.\n", buf); > + } > + } > + > + if (!accel_initialised) { > + if (!init_failed) { > + fprintf(stderr, "No accelerator found!\n"); > + } > + exit(1); > + } > + > + if (init_failed) { > + fprintf(stderr, "Back to %s accelerator.\n", accel_list[i].name); > + } > + > + return !accel_initialised; > +} > diff --git a/include/hw/accel.h b/include/hw/accel.h > new file mode 100644 > index 0000000..5537d74 > --- /dev/null > +++ b/include/hw/accel.h > @@ -0,0 +1,32 @@ > +/* QEMU accelerator interfaces > + * > + * Copyright (c) 2014 Red Hat Inc > + * > + * Permission is hereby granted, free of charge, to any person obtaining a copy > + * of this software and associated documentation files (the "Software"), to deal > + * in the Software without restriction, including without limitation the rights > + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell > + * copies of the Software, and to permit persons to whom the Software is > + * furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice shall be included in > + * all copies or substantial portions of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, > + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN > + * THE SOFTWARE. > + */ > +#ifndef HW_ACCEL_H > +#define HW_ACCEL_H > + > +#include "qemu/typedefs.h" > + > +extern int tcg_tb_size; > + > +int configure_accelerator(MachineClass *mc); > + > +#endif > diff --git a/vl.c b/vl.c > index e49c115..911de91 100644 > --- a/vl.c > +++ b/vl.c > @@ -61,6 +61,7 @@ int main(int argc, char **argv) > #include "qemu/sockets.h" > #include "hw/hw.h" > #include "hw/boards.h" > +#include "hw/accel.h" > #include "hw/usb.h" > #include "hw/pcmcia.h" > #include "hw/i386/pc.h" > @@ -212,11 +213,9 @@ static NotifierList exit_notifiers = > static NotifierList machine_init_done_notifiers = > NOTIFIER_LIST_INITIALIZER(machine_init_done_notifiers); > > -static bool tcg_allowed = true; > bool xen_allowed; > uint32_t xen_domid; > enum xen_mode xen_mode = XEN_EMULATE; > -static int tcg_tb_size; > > static int has_defaults = 1; > static int default_serial = 1; > @@ -2674,84 +2673,6 @@ static MachineClass *machine_parse(const char *name) > exit(!name || !is_help_option(name)); > } > > -static int tcg_init(MachineClass *mc) > -{ > - tcg_exec_init(tcg_tb_size * 1024 * 1024); > - return 0; > -} > - > -static struct { > - const char *opt_name; > - const char *name; > - int (*available)(void); > - int (*init)(MachineClass *mc); > - bool *allowed; > -} accel_list[] = { > - { "tcg", "tcg", tcg_available, tcg_init, &tcg_allowed }, > - { "xen", "Xen", xen_available, xen_init, &xen_allowed }, > - { "kvm", "KVM", kvm_available, kvm_init, &kvm_allowed }, > - { "qtest", "QTest", qtest_available, qtest_init_accel, &qtest_allowed }, > -}; > - > -static int configure_accelerator(MachineClass *mc) > -{ > - const char *p; > - char buf[10]; > - int i, ret; > - bool accel_initialised = false; > - bool init_failed = false; > - > - p = qemu_opt_get(qemu_get_machine_opts(), "accel"); > - if (p == NULL) { > - /* Use the default "accelerator", tcg */ > - p = "tcg"; > - } > - > - while (!accel_initialised && *p != '\0') { > - if (*p == ':') { > - p++; > - } > - p = get_opt_name(buf, sizeof(buf), p, ':'); > - for (i = 0; i < ARRAY_SIZE(accel_list); i++) { > - if (strcmp(accel_list[i].opt_name, buf) == 0) { > - if (!accel_list[i].available()) { > - printf("%s not supported for this target\n", > - accel_list[i].name); > - break; > - } > - *(accel_list[i].allowed) = true; > - ret = accel_list[i].init(mc); > - if (ret < 0) { > - init_failed = true; > - fprintf(stderr, "failed to initialize %s: %s\n", > - accel_list[i].name, > - strerror(-ret)); > - *(accel_list[i].allowed) = false; > - } else { > - accel_initialised = true; > - } > - break; > - } > - } > - if (i == ARRAY_SIZE(accel_list)) { > - fprintf(stderr, "\"%s\" accelerator does not exist.\n", buf); > - } > - } > - > - if (!accel_initialised) { > - if (!init_failed) { > - fprintf(stderr, "No accelerator found!\n"); > - } > - exit(1); > - } > - > - if (init_failed) { > - fprintf(stderr, "Back to %s accelerator.\n", accel_list[i].name); > - } > - > - return !accel_initialised; > -} > - > void qemu_add_exit_notifier(Notifier *notify) > { > notifier_list_add(&exit_notifiers, notify); >
diff --git a/hw/core/Makefile.objs b/hw/core/Makefile.objs index 17845df..6e56e47 100644 --- a/hw/core/Makefile.objs +++ b/hw/core/Makefile.objs @@ -14,3 +14,4 @@ common-obj-$(CONFIG_SOFTMMU) += machine.o common-obj-$(CONFIG_SOFTMMU) += null-machine.o common-obj-$(CONFIG_SOFTMMU) += loader.o common-obj-$(CONFIG_SOFTMMU) += qdev-properties-system.o +common-obj-$(CONFIG_SOFTMMU) += accel.o diff --git a/hw/core/accel.c b/hw/core/accel.c new file mode 100644 index 0000000..04da696 --- /dev/null +++ b/hw/core/accel.c @@ -0,0 +1,113 @@ +/* + * QEMU System Emulator, accelerator interfaces + * + * Copyright (c) 2003-2008 Fabrice Bellard + * Copyright (c) 2014 Red Hat Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "hw/accel.h" +#include "qemu-common.h" +#include "sysemu/arch_init.h" +#include "sysemu/sysemu.h" +#include "sysemu/kvm.h" +#include "sysemu/qtest.h" +#include "hw/xen/xen.h" + +int tcg_tb_size; +static bool tcg_allowed = true; + +static int tcg_init(MachineClass *mc) +{ + tcg_exec_init(tcg_tb_size * 1024 * 1024); + return 0; +} + +static struct { + const char *opt_name; + const char *name; + int (*available)(void); + int (*init)(MachineClass *mc); + bool *allowed; +} accel_list[] = { + { "tcg", "tcg", tcg_available, tcg_init, &tcg_allowed }, + { "xen", "Xen", xen_available, xen_init, &xen_allowed }, + { "kvm", "KVM", kvm_available, kvm_init, &kvm_allowed }, + { "qtest", "QTest", qtest_available, qtest_init_accel, &qtest_allowed }, +}; + +int configure_accelerator(MachineClass *mc) +{ + const char *p; + char buf[10]; + int i, ret; + bool accel_initialised = false; + bool init_failed = false; + + p = qemu_opt_get(qemu_get_machine_opts(), "accel"); + if (p == NULL) { + /* Use the default "accelerator", tcg */ + p = "tcg"; + } + + while (!accel_initialised && *p != '\0') { + if (*p == ':') { + p++; + } + p = get_opt_name(buf, sizeof(buf), p, ':'); + for (i = 0; i < ARRAY_SIZE(accel_list); i++) { + if (strcmp(accel_list[i].opt_name, buf) == 0) { + if (!accel_list[i].available()) { + printf("%s not supported for this target\n", + accel_list[i].name); + break; + } + *(accel_list[i].allowed) = true; + ret = accel_list[i].init(mc); + if (ret < 0) { + init_failed = true; + fprintf(stderr, "failed to initialize %s: %s\n", + accel_list[i].name, + strerror(-ret)); + *(accel_list[i].allowed) = false; + } else { + accel_initialised = true; + } + break; + } + } + if (i == ARRAY_SIZE(accel_list)) { + fprintf(stderr, "\"%s\" accelerator does not exist.\n", buf); + } + } + + if (!accel_initialised) { + if (!init_failed) { + fprintf(stderr, "No accelerator found!\n"); + } + exit(1); + } + + if (init_failed) { + fprintf(stderr, "Back to %s accelerator.\n", accel_list[i].name); + } + + return !accel_initialised; +} diff --git a/include/hw/accel.h b/include/hw/accel.h new file mode 100644 index 0000000..5537d74 --- /dev/null +++ b/include/hw/accel.h @@ -0,0 +1,32 @@ +/* QEMU accelerator interfaces + * + * Copyright (c) 2014 Red Hat Inc + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef HW_ACCEL_H +#define HW_ACCEL_H + +#include "qemu/typedefs.h" + +extern int tcg_tb_size; + +int configure_accelerator(MachineClass *mc); + +#endif diff --git a/vl.c b/vl.c index e49c115..911de91 100644 --- a/vl.c +++ b/vl.c @@ -61,6 +61,7 @@ int main(int argc, char **argv) #include "qemu/sockets.h" #include "hw/hw.h" #include "hw/boards.h" +#include "hw/accel.h" #include "hw/usb.h" #include "hw/pcmcia.h" #include "hw/i386/pc.h" @@ -212,11 +213,9 @@ static NotifierList exit_notifiers = static NotifierList machine_init_done_notifiers = NOTIFIER_LIST_INITIALIZER(machine_init_done_notifiers); -static bool tcg_allowed = true; bool xen_allowed; uint32_t xen_domid; enum xen_mode xen_mode = XEN_EMULATE; -static int tcg_tb_size; static int has_defaults = 1; static int default_serial = 1; @@ -2674,84 +2673,6 @@ static MachineClass *machine_parse(const char *name) exit(!name || !is_help_option(name)); } -static int tcg_init(MachineClass *mc) -{ - tcg_exec_init(tcg_tb_size * 1024 * 1024); - return 0; -} - -static struct { - const char *opt_name; - const char *name; - int (*available)(void); - int (*init)(MachineClass *mc); - bool *allowed; -} accel_list[] = { - { "tcg", "tcg", tcg_available, tcg_init, &tcg_allowed }, - { "xen", "Xen", xen_available, xen_init, &xen_allowed }, - { "kvm", "KVM", kvm_available, kvm_init, &kvm_allowed }, - { "qtest", "QTest", qtest_available, qtest_init_accel, &qtest_allowed }, -}; - -static int configure_accelerator(MachineClass *mc) -{ - const char *p; - char buf[10]; - int i, ret; - bool accel_initialised = false; - bool init_failed = false; - - p = qemu_opt_get(qemu_get_machine_opts(), "accel"); - if (p == NULL) { - /* Use the default "accelerator", tcg */ - p = "tcg"; - } - - while (!accel_initialised && *p != '\0') { - if (*p == ':') { - p++; - } - p = get_opt_name(buf, sizeof(buf), p, ':'); - for (i = 0; i < ARRAY_SIZE(accel_list); i++) { - if (strcmp(accel_list[i].opt_name, buf) == 0) { - if (!accel_list[i].available()) { - printf("%s not supported for this target\n", - accel_list[i].name); - break; - } - *(accel_list[i].allowed) = true; - ret = accel_list[i].init(mc); - if (ret < 0) { - init_failed = true; - fprintf(stderr, "failed to initialize %s: %s\n", - accel_list[i].name, - strerror(-ret)); - *(accel_list[i].allowed) = false; - } else { - accel_initialised = true; - } - break; - } - } - if (i == ARRAY_SIZE(accel_list)) { - fprintf(stderr, "\"%s\" accelerator does not exist.\n", buf); - } - } - - if (!accel_initialised) { - if (!init_failed) { - fprintf(stderr, "No accelerator found!\n"); - } - exit(1); - } - - if (init_failed) { - fprintf(stderr, "Back to %s accelerator.\n", accel_list[i].name); - } - - return !accel_initialised; -} - void qemu_add_exit_notifier(Notifier *notify) { notifier_list_add(&exit_notifiers, notify);
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> --- hw/core/Makefile.objs | 1 + hw/core/accel.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++ include/hw/accel.h | 32 ++++++++++++++ vl.c | 81 +----------------------------------- 4 files changed, 147 insertions(+), 80 deletions(-) create mode 100644 hw/core/accel.c create mode 100644 include/hw/accel.h